Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [gelöst] on{... , change: "any"} läuft immer 2x mal

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    16
    1
    355

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    4.8k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.3k

[gelöst] on{... , change: "any"} läuft immer 2x mal

Scheduled Pinned Locked Moved JavaScript
javascript
19 Posts 5 Posters 1.6k Views 3 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • D Dado

    Da kann ich helfen ;-)
    Das hier ...

    on({id: sourceIDs , change: "any", ack: true}, function (obj) {
       log("oldState.val: "  + JSON.stringify(obj.oldState.val), "warn");
       log("newState.ack: "  + JSON.stringify(obj.newState.ack), "warn");
       log("state.val: "  + JSON.stringify(obj.state.val), "warn");
    //    light_control(obj.id);
    });
    

    ...ergibt bei einmal durch den Sensor laufen

    4.5.2020, 15:23:23.868	[info ]: javascript.0 (689) Stop script script.js.common.Light.motion-light1
    4.5.2020, 15:23:23.958	[info ]: javascript.0 (689) Start javascript script.js.common.Light.motion-light1
    4.5.2020, 15:23:23.962	[info ]: javascript.0 (689) script.js.common.Light.motion-light1: Subcribe folgende source IDs: ["deconz.0.Sensors.24.presence","deconz.0.Sensors.3.open"]
    4.5.2020, 15:23:23.962	[info ]: javascript.0 (689) script.js.common.Light.motion-light1: subscribe: {"pattern":{"id":"deconz.0.Sensors.24.presence","change":"any","ack":true,"q":0},"name":"script.js.common.Light.motion-light1"}
    4.5.2020, 15:23:23.962	[info ]: javascript.0 (689) script.js.common.Light.motion-light1: subscribe: {"pattern":{"id":"deconz.0.Sensors.3.open","change":"any","ack":true,"q":0},"name":"script.js.common.Light.motion-light1"}
    4.5.2020, 15:23:23.963	[info ]: javascript.0 (689) script.js.common.Light.motion-light1: registered 2 subscriptions and 0 schedules
    4.5.2020, 15:23:34.165	[warn ]: javascript.0 (689) script.js.common.Light.motion-light1: oldState.val: false
    4.5.2020, 15:23:34.165	[warn ]: javascript.0 (689) script.js.common.Light.motion-light1: newState.ack: true
    4.5.2020, 15:23:34.166	[warn ]: javascript.0 (689) script.js.common.Light.motion-light1: state.val: true
    4.5.2020, 15:23:34.168	[warn ]: javascript.0 (689) script.js.common.Light.motion-light1: oldState.val: true
    4.5.2020, 15:23:34.171	[warn ]: javascript.0 (689) script.js.common.Light.motion-light1: newState.ack: true
    4.5.2020, 15:23:34.172	[warn ]: javascript.0 (689) script.js.common.Light.motion-light1: state.val: true
    
    J.A.R.V.I.S.J Offline
    J.A.R.V.I.S.J Offline
    J.A.R.V.I.S.
    Developer
    wrote on last edited by
    #7

    @Dado du könntest 'change' in 'ne' ändern, dann wird er nur getriggert, wenn der Wert ungleich des alten Wertes ist.

    Bleibt der Wert eine gewisse Zeit auf true oder geht er danach wieder auf false?

    D 1 Reply Last reply
    0
    • D Dado

      Da kann ich helfen ;-)
      Das hier ...

      on({id: sourceIDs , change: "any", ack: true}, function (obj) {
         log("oldState.val: "  + JSON.stringify(obj.oldState.val), "warn");
         log("newState.ack: "  + JSON.stringify(obj.newState.ack), "warn");
         log("state.val: "  + JSON.stringify(obj.state.val), "warn");
      //    light_control(obj.id);
      });
      

      ...ergibt bei einmal durch den Sensor laufen

      4.5.2020, 15:23:23.868	[info ]: javascript.0 (689) Stop script script.js.common.Light.motion-light1
      4.5.2020, 15:23:23.958	[info ]: javascript.0 (689) Start javascript script.js.common.Light.motion-light1
      4.5.2020, 15:23:23.962	[info ]: javascript.0 (689) script.js.common.Light.motion-light1: Subcribe folgende source IDs: ["deconz.0.Sensors.24.presence","deconz.0.Sensors.3.open"]
      4.5.2020, 15:23:23.962	[info ]: javascript.0 (689) script.js.common.Light.motion-light1: subscribe: {"pattern":{"id":"deconz.0.Sensors.24.presence","change":"any","ack":true,"q":0},"name":"script.js.common.Light.motion-light1"}
      4.5.2020, 15:23:23.962	[info ]: javascript.0 (689) script.js.common.Light.motion-light1: subscribe: {"pattern":{"id":"deconz.0.Sensors.3.open","change":"any","ack":true,"q":0},"name":"script.js.common.Light.motion-light1"}
      4.5.2020, 15:23:23.963	[info ]: javascript.0 (689) script.js.common.Light.motion-light1: registered 2 subscriptions and 0 schedules
      4.5.2020, 15:23:34.165	[warn ]: javascript.0 (689) script.js.common.Light.motion-light1: oldState.val: false
      4.5.2020, 15:23:34.165	[warn ]: javascript.0 (689) script.js.common.Light.motion-light1: newState.ack: true
      4.5.2020, 15:23:34.166	[warn ]: javascript.0 (689) script.js.common.Light.motion-light1: state.val: true
      4.5.2020, 15:23:34.168	[warn ]: javascript.0 (689) script.js.common.Light.motion-light1: oldState.val: true
      4.5.2020, 15:23:34.171	[warn ]: javascript.0 (689) script.js.common.Light.motion-light1: newState.ack: true
      4.5.2020, 15:23:34.172	[warn ]: javascript.0 (689) script.js.common.Light.motion-light1: state.val: true
      
      paul53P Offline
      paul53P Offline
      paul53
      wrote on last edited by paul53
      #8

      @Dado
      Offenbar ist es eine Eigenheit des Deconz-Adapters, dass unmittelbar nach einer Wertänderung nochmal aktualisiert wird. Triggern auf change: "ne" sollte das Problem beheben.

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

      D 1 Reply Last reply
      0
      • J.A.R.V.I.S.J J.A.R.V.I.S.

        @Dado du könntest 'change' in 'ne' ändern, dann wird er nur getriggert, wenn der Wert ungleich des alten Wertes ist.

        Bleibt der Wert eine gewisse Zeit auf true oder geht er danach wieder auf false?

        D Offline
        D Offline
        Dado
        wrote on last edited by
        #9

        @J-A-R-V-I-S
        Der Wert bleibt auf true stehen und geht nach 90 Sekunden wieder auf false...
        Was etwas seltsam ist, da ist das Teil so modifiziert habe, dass er nur noch eine Totzeit von 5 Sekunden hat (Standard sind 2 Min)

        mickymM J.A.R.V.I.S.J 2 Replies Last reply
        0
        • D Dado

          @J-A-R-V-I-S
          Der Wert bleibt auf true stehen und geht nach 90 Sekunden wieder auf false...
          Was etwas seltsam ist, da ist das Teil so modifiziert habe, dass er nur noch eine Totzeit von 5 Sekunden hat (Standard sind 2 Min)

          mickymM Offline
          mickymM Offline
          mickym
          Most Active
          wrote on last edited by
          #10

          @Dado Ich habe die Dinger auch. Meines Erachtens sind das 2 verschiedene Paar Stiefel - das Löten heißt nur, dass er den Status mit einem minimalen Zeitpunkt von 5 Sek. auflöst.
          Die 90s kommen, wenn Du in occupancy_timeout nichts eingetragen hast. Trag da einfach mal einen Wert ein, aber ich würde den nicht zu klein wählen

          Jeder Flow bzw. jedes Script, das ich hier poste implementiert jeder auf eigene Gefahr. Flows und Scripts können Fehler aufweisen und weder der Seitenbetreiber noch ich persönlich können hierfür haftbar gemacht werden. Das gleiche gilt für Empfehlungen aller Art.

          1 Reply Last reply
          0
          • paul53P paul53

            @Dado
            Offenbar ist es eine Eigenheit des Deconz-Adapters, dass unmittelbar nach einer Wertänderung nochmal aktualisiert wird. Triggern auf change: "ne" sollte das Problem beheben.

            D Offline
            D Offline
            Dado
            wrote on last edited by
            #11

            @paul53
            Ja und nein...
            Ja, ich bekomme nur noch einmal getriggert
            Nein, jetzt triggert er nur noch bei Flankenwechsel (was bei != ja auch erwartbar ist)

            Das ist bei einem Bewegungsmelder aber ein "schwieriges" Verhalten oder anders ausgedrückt, der WAF ist dann gleich Null ;-)

            paul53P 1 Reply Last reply
            0
            • D Dado

              @paul53
              Ja und nein...
              Ja, ich bekomme nur noch einmal getriggert
              Nein, jetzt triggert er nur noch bei Flankenwechsel (was bei != ja auch erwartbar ist)

              Das ist bei einem Bewegungsmelder aber ein "schwieriges" Verhalten oder anders ausgedrückt, der WAF ist dann gleich Null ;-)

              paul53P Offline
              paul53P Offline
              paul53
              wrote on last edited by paul53
              #12

              @Dado sagte:

              Das ist bei einem Bewegungsmelder aber ein "schwieriges" Verhalten

              Dann verwende "entprellen".

              var timer;
              on({id: sourceIDs}, function(dp) {
                  if(!timer) {
                      timer = setTimeout(function() {
                          timer = null;
                      }, 100);
                      // Aktionen
                  }
              });
              

              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

              D 1 Reply Last reply
              0
              • D Dado

                @J-A-R-V-I-S
                Der Wert bleibt auf true stehen und geht nach 90 Sekunden wieder auf false...
                Was etwas seltsam ist, da ist das Teil so modifiziert habe, dass er nur noch eine Totzeit von 5 Sekunden hat (Standard sind 2 Min)

                J.A.R.V.I.S.J Offline
                J.A.R.V.I.S.J Offline
                J.A.R.V.I.S.
                Developer
                wrote on last edited by J.A.R.V.I.S.
                #13

                @Dado die Frage ist, möchtest du, wenn du in der Zeit noch einmal den Bewegungsmelder triggerst, das Skript nochmal ausführen? Das wäre mit "ne" dann nicht möglich. Dann müsstest du "any" und dann den Timestamp prüfen, ob z.B. größer eine Sekunde zum letzten mal.

                D 1 Reply Last reply
                0
                • paul53P paul53

                  @Dado sagte:

                  Das ist bei einem Bewegungsmelder aber ein "schwieriges" Verhalten

                  Dann verwende "entprellen".

                  var timer;
                  on({id: sourceIDs}, function(dp) {
                      if(!timer) {
                          timer = setTimeout(function() {
                              timer = null;
                          }, 100);
                          // Aktionen
                      }
                  });
                  
                  D Offline
                  D Offline
                  Dado
                  wrote on last edited by
                  #14

                  @paul53
                  Stand da nicht gerade noch was mit Suche im Forum? :-)
                  Ja, sowas hatte ich gerade im Forum gefunden. Aber danke nochmal fürs Rein'paste'n!
                  Das hilft mir weiter. Werde beizeiten noch mal Rückmeldung geben, ob das dann wie gewüscht funktioniert

                  Danke!

                  1 Reply Last reply
                  0
                  • J.A.R.V.I.S.J J.A.R.V.I.S.

                    @Dado die Frage ist, möchtest du, wenn du in der Zeit noch einmal den Bewegungsmelder triggerst, das Skript nochmal ausführen? Das wäre mit "ne" dann nicht möglich. Dann müsstest du "any" und dann den Timestamp prüfen, ob z.B. größer eine Sekunde zum letzten mal.

                    D Offline
                    D Offline
                    Dado
                    wrote on last edited by
                    #15

                    @J-A-R-V-I-S
                    Brauche zweiteres. Das Licht soll ja länger anbleiben, wenn man im Sensorbereich steht. Werde diese Idee mal mit dem Snippet von paul angehen.

                    Danke!

                    1 Reply Last reply
                    0
                    • D Offline
                      D Offline
                      Dado
                      wrote on last edited by
                      #16

                      Sieht gut aus! Eine (eventuell dumme) Frage hätte ich noch:
                      Das Skript soll ja auf verschiedene Sensoren reagieren. Wenn jetzt 2 verschiedene Sensoren innerhalb des Timeout Fensters triggern, dann würde der 2. nicht ausgeführt, oder?

                      Macht es Sinn, dass dann ggf. so zu modifizieren (und timer als array zu initialisieren)?

                          if(!timer[obj.id]) {
                              timer[obj.id] = setTimeout(function() {timer[obj.id] = null;}, 100);
                      //      light_control(obj.id);
                          }
                      
                      
                      paul53P 1 Reply Last reply
                      0
                      • D Dado

                        Sieht gut aus! Eine (eventuell dumme) Frage hätte ich noch:
                        Das Skript soll ja auf verschiedene Sensoren reagieren. Wenn jetzt 2 verschiedene Sensoren innerhalb des Timeout Fensters triggern, dann würde der 2. nicht ausgeführt, oder?

                        Macht es Sinn, dass dann ggf. so zu modifizieren (und timer als array zu initialisieren)?

                            if(!timer[obj.id]) {
                                timer[obj.id] = setTimeout(function() {timer[obj.id] = null;}, 100);
                        //      light_control(obj.id);
                            }
                        
                        
                        paul53P Offline
                        paul53P Offline
                        paul53
                        wrote on last edited by paul53
                        #17

                        @Dado sagte:

                        Wenn jetzt 2 verschiedene Sensoren innerhalb des Timeout Fensters triggern, dann würde der 2. nicht ausgeführt, oder?

                        Richtig. Wie wahrscheinlich ist es ? Man kann sicherlich auch die Sperrzeit verringern (z.B. 20 ms) , um die Wahrscheinlichkeit weiter zu verringern.

                        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                        D 1 Reply Last reply
                        0
                        • paul53P paul53

                          @Dado sagte:

                          Wenn jetzt 2 verschiedene Sensoren innerhalb des Timeout Fensters triggern, dann würde der 2. nicht ausgeführt, oder?

                          Richtig. Wie wahrscheinlich ist es ? Man kann sicherlich auch die Sperrzeit verringern (z.B. 20 ms) , um die Wahrscheinlichkeit weiter zu verringern.

                          D Offline
                          D Offline
                          Dado
                          wrote on last edited by
                          #18

                          @paul53
                          Vermutlich weit weniger wahrscheinlich, als ich denke... Ist ja jetzt nicht so, dass ich damit ein komplettes Hochhaus steuere. ;-)
                          Danke für den Realitätscheck.
                          Werde ggf mal den Timeout zart reduzieren und stelle das hier mal auf "gelöst"

                          1 Reply Last reply
                          0
                          • T Do not disturb
                            T Do not disturb
                            ticaki
                            wrote on last edited by ticaki
                            #19

                            Würde gerne noch etwas einbringen. Soweit ich sehe verwendest du obj.state.val nicht. Dann könntest du val:true benutzen.

                            Ob das mit dem timer[obj.id] Sinn macht. Ja ist doch kaum Arbeit. Ich würde es dann aber eher so lösen:

                            var devices = {};
                            on(...(obj)=> {
                             devices[obj.id] = true;
                             //hier entprellen
                             setTimeout(meineFunktion,100);
                            })
                            
                            function meineFunktion() {
                             for (let dev in devices){...}
                             devices = {};
                            }
                            

                            Kann Syntaxfehler enthalten. :)

                            Weather-Warnings Espresense NSPanel-Lovelace-ui Tagesschau

                            Spenden

                            1 Reply Last reply
                            0
                            Reply
                            • Reply as topic
                            Log in to reply
                            • Oldest to Newest
                            • Newest to Oldest
                            • Most Votes


                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            419

                            Online

                            32.7k

                            Users

                            82.5k

                            Topics

                            1.3m

                            Posts
                            Community
                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                            ioBroker Community 2014-2025
                            logo
                            • Login

                            • Don't have an account? Register

                            • Login or register to search.
                            • First post
                              Last post
                            0
                            • Home
                            • Recent
                            • Tags
                            • Unread 0
                            • Categories
                            • Unreplied
                            • Popular
                            • GitHub
                            • Docu
                            • Hilfe