Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Homematic HM-RPC - Fenster öffnen zählt doppelt

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Homematic HM-RPC - Fenster öffnen zählt doppelt

    This topic has been deleted. Only users with topic management privileges can see it.
    • B
      Bongo last edited by Bongo

      Für meine Lüftungsempfehlung prüfe ich wie oft an einem Tag das Fenster geöffnet wurde.
      Leider zählt mein Script immer doppelt, weil der Trigger innerhalb von 1/1000 Sek. 2x auslöst.

      on({id: triggersOpenWindow, change: `ne`}, obj => {
          const room = rooms[triggersOpenWindow.indexOf(obj.id)];
          const openWindow = getState(room.openWindow).val;
          const openWindowCount = getState(`${namespace ? `${namespace}.` : ''}${room.roomName}.openWindowCount`).val;
          if (openWindow) {
                  console.log(room.openWindow+" gezählt: "+openWindow)
              setState(`${namespace ? `${namespace}.` : ''}${room.roomName}.openWindowCount`, openWindowCount + 1, true);        
          }
      });
      
      
      javascript.0	2023-12-01 10:36:56.804	info	script.js.common.Lüftungsempfehlung: hm-rpc.2.INT0000012.1.WINDOW_STATE gezählt: 1
      javascript.0	2023-12-01 10:36:56.803	info	script.js.common.Lüftungsempfehlung: hm-rpc.2.INT0000012.1.WINDOW_STATE gezählt: 1
      

      Ist das bei euch auch so? Kennt das Jemand? Gibt es einen Vorschlag für eine Lösung?
      Aktuell prüfe ich die Fensteröffnung über die Heizgruppe. Aber direkt über den Datenpunkt des Fensterkontakts ist es das selbe Problem.

      ubecker paul53 2 Replies Last reply Reply Quote 0
      • ubecker
        ubecker @Bongo last edited by

        @bongo
        ja, wenn du auf Aktualisierung triggerst. Die erste Aktualisierung ist der State, die zweite die Aktualisierung des Lowbat.

        B 1 Reply Last reply Reply Quote 0
        • paul53
          paul53 @Bongo last edited by paul53

          @bongo sagte: on({id: triggersOpenWindow, change: ne}, obj => {

          Nimm mal Hochkommata für 'ne'

          on({id: triggersOpenWindow, change: 'ne'}, obj => {
          

          oder einfacher

          on(triggersOpenWindow, obj => {
          
          1 Reply Last reply Reply Quote 0
          • B
            Bongo @ubecker last edited by

            @ubecker sagte in Homematic HM-RPC - Fenster öffnen zählt doppelt:

            @bongo
            ja, wenn du auf Aktualisierung triggerst. Die erste Aktualisierung ist der State, die zweite die Aktualisierung des Lowbat.

            Hatte ich nicht erwähnt. Auf Aktualisieren hatte ich schon als Erstes versucht. Aber damit wird auch 2x getriggert.
            Aber auf Ändern triggern ist doch das richtigere. Weil mich interessieren ja nur Änderungen.
            Aber was meinst du mit "die zweite die Aktualisierung des Lowbat"? Was hat das mit Lowbat zu tun?

            @paul53 sagte in Homematic HM-RPC - Fenster öffnen zählt doppelt:

            @bongo sagte: on({id: triggersOpenWindow, change: ne}, obj => {

            Nimm mal Hochkommata für 'ne'

            on({id: triggersOpenWindow, change: 'ne'}, obj => {
            

            oder einfacher

            on(triggersOpenWindow, obj => {
            

            Das mit den umgekehrten Hochkommas hatte ich von einem anderen Programm so kopiert.
            Ich hatte es jetzt nochmal mit meinem Code versucht und ein Fenster geöffnet. Jetzt hat es nur 1x getriggert. Irgendwie ist es nicht 100% nachvollziehbar.
            Habe es trotzdem jetzt mit richtigen Hochkommas versucht und ein anderes Fenster geöffnet. Da hat es auch mit 1x getriggert funktioniert.
            Jetzt muss ich mal beobachten ob es immer funktioniert.

            Codierknecht 1 Reply Last reply Reply Quote 0
            • Codierknecht
              Codierknecht Developer Most Active @Bongo last edited by

              @bongo
              Und wenn Du auf 'gt' triggerst?
              Du willst ja vermutlich nur den Wechsel von 0 auf 1 mitkriegen.

              B 1 Reply Last reply Reply Quote 0
              • B
                Bongo @Codierknecht last edited by

                @paul53
                Gestern hat es mit den richtigen Hochkommas funktioniert. Heute hat es wieder 2.x gezählt. 😠

                @codierknecht sagte in Homematic HM-RPC - Fenster öffnen zählt doppelt:

                @bongo
                Und wenn Du auf 'gt' triggerst?
                Du willst ja vermutlich nur den Wechsel von 0 auf 1 mitkriegen.

                Jetzt versuche ich es mit gt. Gerade hat es funktioniert und nur 1x gezählt. Aber ich muss es beobachten.

                1 Reply Last reply Reply Quote 0
                • B
                  Bongo last edited by

                  Mit 'gt' hat es gestern funktioniert. Heute wird wieder 2x getriggert.
                  Ich habe mir den alten und neuen Wert ausgeben lassen und 2x wechselt der Wert von 0 auf 1.

                  on({id: triggersOpenWindow, change: 'gt'}, obj => {
                      var value = obj.state.val;
                      var oldValue = obj.oldState.val;
                      const room = rooms[triggersOpenWindow.indexOf(obj.id)];
                      const openWindow = getState(room.openWindow).val;
                      const openWindowCount = getState(`${namespace ? `${namespace}.` : ''}${room.roomName}.openWindowCount`).val;
                      console.log(room.openWindow+". Alt: "+oldValue+" Neu: "+value)
                      if (openWindow) {
                              console.log(room.openWindow+" gezählt: "+openWindow)
                          setState(`${namespace ? `${namespace}.` : ''}${room.roomName}.openWindowCount`, openWindowCount + 1, true);        
                      }
                  });
                  
                  javascript.0	2023-12-03 14:39:59.480	info	script.js.common.Lüftungsempfehlung: hm-rpc.2.INT0000012.1.WINDOW_STATE gezählt: 1
                  javascript.0	2023-12-03 14:39:59.480	info	script.js.common.Lüftungsempfehlung: hm-rpc.2.INT0000012.1.WINDOW_STATE. Alt: 0 Neu: 1
                  javascript.0	2023-12-03 14:39:59.479	info	script.js.common.Lüftungsempfehlung: hm-rpc.2.INT0000012.1.WINDOW_STATE gezählt: 1
                  javascript.0	2023-12-03 14:39:59.478	info	script.js.common.Lüftungsempfehlung: hm-rpc.2.INT0000012.1.WINDOW_STATE. Alt: 0 Neu: 1
                  

                  Jetzt wäre natürlich interessant ob dieses Verhalten bei euch auch auftritt.

                  1 Reply Last reply Reply Quote 0
                  • B
                    Bongo last edited by

                    Ich versuche jetzt schon Tage lang auf einem „grünen Zweig“ zu kommen.
                    Ich habe auch untersucht ob es mal mit und mal ohne dem bestätigt-Flag ausgelöst wird. Aber es ist immer bestätigt.

                    Meine Lösung ist jetzt, dass ich den Timestamp meines Zähl-Datenpunktes auswerte und nur zähle, wenn der Zähl-Datenpunkt älter als 2 Sekunden ist.
                    Ich habe dann gleich noch Öffnungszeiten der einzelnen Fenster mit protokolliert.

                    on(triggersOpenWindow, obj => {
                        var value = obj.state.val;
                        var oldValue = obj.oldState.val;
                        var room = rooms[triggersOpenWindow.indexOf(obj.id)];
                        var openWindow = getState(room.openWindow).val;
                        var openWindowCount = getState(`${namespace ? `${namespace}.` : ''}${room.roomName}.openWindowCount`).val;
                        var ventilationSec = getState(`${namespace ? `${namespace}.` : ''}${room.roomName}.ventilationSec`).val;
                        console.log(room.openWindow+". Alt oldValue: "+oldValue+", Neu value: "+value+
                        ", obj.state.ts: "+obj.state.ts+", obj.oldState.ts: "+obj.oldState.ts+
                        ", obj.state.ack: "+obj.state.ack+", obj.oldState.ack: "+obj.oldState.ack+
                        ", obj.state.lc: "+obj.state.lc+", obj.oldState.lc: "+obj.oldState.lc+
                        ", obj.state.from: "+obj.state.from+", obj.oldState.from: "+obj.oldState.from);
                        // Problem öffnen zählt 2x --> Lösung: nur zählen wenn Timestamp älter als 2 Sekunden.
                        if (openWindow) {
                            // Fenster geöffnet
                            var curTime = new Date().getTime();
                            var stateTs = getState(`${namespace ? `${namespace}.` : ''}${room.roomName}.openWindowCount`).ts;
                            console.log(curTime+" - "+stateTs+" = "+(curTime - stateTs));
                            if ((curTime - stateTs) > 2000) {   // Wenn älter als 2 Sekunden
                                console.log(room.openWindow+" gezählt: "+openWindow);
                                setState(`${namespace ? `${namespace}.` : ''}${room.roomName}.openWindowCount`, openWindowCount + 1, true);                        
                            }
                        } else {
                            // Fenster geschlossen --> Öffnungszeit eintragen
                            var curTime = new Date().getTime();
                            var stateTs = getState(`${namespace ? `${namespace}.` : ''}${room.roomName}.ventilationSec`).ts;
                            console.log(curTime+" - "+stateTs+" = "+(curTime - stateTs));
                            if ((curTime - stateTs) > 2000) {   // Wenn älter als 2 Sekunden
                                console.log(room.openWindow+" zeit: "+Math.floor(((obj.state.lc-obj.oldState.lc)/1000)));
                                setState(`${namespace ? `${namespace}.` : ''}${room.roomName}.ventilationSec`, ventilationSec + Math.floor(((obj.state.lc-obj.oldState.lc)/1000)), true);
                            }
                        }
                    });
                    on('hm-rpc.2.INT0000012.1.WINDOW_STATE', obj => {
                        var value = obj.state.val;
                        var oldValue = obj.oldState.val;
                        console.log(obj.id +". Alt2: "+oldValue+" Neu2: "+value)
                    });
                    on({id: 'hm-rpc.2.INT0000014.1.WINDOW_STATE', change: 'gt'}, obj => {
                        var value = obj.state.val;
                        var oldValue = obj.oldState.val;
                        console.log(obj.id +". Alt2: "+oldValue+" Neu2: "+value)
                    });
                    

                    Diese Lösung funktioniert bisher ganz gut. Durch meine Console.logs sehe ich wann 1x oder 2x getriggert wird. Seit dem ich den Code so wie er jetzt ist abgeändert habe wurde immer nur 1x geriggert.
                    Mysteriös!

                    Codierknecht 1 Reply Last reply Reply Quote 0
                    • Codierknecht
                      Codierknecht Developer Most Active @Bongo last edited by

                      @bongo
                      Warum haben Deine beiden Trigger unten unterschiedliche Signaturen?
                      Der erste triggert bei jeder Aktualisierung, der zweite nur bei "größer als".

                      B 1 Reply Last reply Reply Quote 0
                      • B
                        Bongo @Codierknecht last edited by

                        @codierknecht
                        Das kommt von meiner großen Testerei. Die unteren beiden Trigger werden eigentlich nicht benötigt.

                        T 1 Reply Last reply Reply Quote 0
                        • T
                          ticaki Developer @Bongo last edited by ticaki

                          @bongo
                          Start den Javascript-Adapter mal neu. Das sieht nach doppelt laufenden Scripten aus.

                          Edit: Wie editierst du skripte?

                          B 1 Reply Last reply Reply Quote 0
                          • B
                            Bongo @ticaki last edited by

                            @ticaki sagte in Homematic HM-RPC - Fenster öffnen zählt doppelt:

                            @bongo
                            Start den Javascript-Adapter mal neu. Das sieht nach doppelt laufenden Scripten aus.

                            Edit: Wie editierst du skripte?

                            Ich benutze Visual Studio Code mit der ioBroker-Integration. Da kann man ja auch Scripte starten und stoppen. Vielleicht wurde da das Script 2x gestartet.
                            Das wäre natürlich eine Fehlermöglichkeit.

                            Im Moment wird immer nur 1x getriggert. Somit ist es im Moment gut. Aber falls es wieder vorkommt, dass es 2x triggert, kann man überprüfen ob das Script 2x gestartet ist? In den Prozessen (ps -ax) sieht man nur die Adapter.

                            T 2 Replies Last reply Reply Quote 0
                            • T
                              ticaki Developer @Bongo last edited by

                              @bongo
                              Nein, da kannst du, wenn du den Verdacht hast, nur den Scriptadapter neu starten. Passt hervorragend zu deinen Fehlerbild. Kannst das Script auch anhalten und auf die nächste Logausgabe von ihm warten.

                              1 Reply Last reply Reply Quote 1
                              • T
                                ticaki Developer @Bongo last edited by ticaki

                                @bongo

                                ich weiß nicht ob das hier funktionieren könnte. Da aber bei doppelt laufenden Skripts die Variablen geteilt werden sollte es eigentlich gehen.

                                // am Anfang
                                var myScripts;
                                if (!myScripts) myScripts = 0;
                                myScripts++
                                
                                // irgendwo im Code
                                if (myScripts > 1) log(myScripts);
                                

                                war ein Tippfehler drin 🙂

                                B 1 Reply Last reply Reply Quote 0
                                • B
                                  Bongo @ticaki last edited by

                                  @ticaki sagte in Homematic HM-RPC - Fenster öffnen zählt doppelt:

                                  @bongo

                                  ich weiß nicht ob das hier funktionieren könnte. Da aber bei doppelt laufenden Skripts die Variablen geteilt werden sollte es eigentlich gehen.

                                  // am Anfang
                                  var myScripts;
                                  if (!myScripts) myScripts = 0;
                                  myScripts++
                                  
                                  // irgendwo im Code
                                  if (myScripts > 1) log(myScripts);
                                  

                                  war ein Tippfehler drin 🙂

                                  Danke, ich habs eingebaut und werde es beobachten.

                                  1 Reply Last reply Reply Quote 0
                                  • First post
                                    Last post

                                  Support us

                                  ioBroker
                                  Community Adapters
                                  Donate

                                  510
                                  Online

                                  31.9k
                                  Users

                                  80.1k
                                  Topics

                                  1.3m
                                  Posts

                                  5
                                  15
                                  478
                                  Loading More Posts
                                  • Oldest to Newest
                                  • Newest to Oldest
                                  • Most Votes
                                  Reply
                                  • Reply as topic
                                  Log in to reply
                                  Community
                                  Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                  The ioBroker Community 2014-2023
                                  logo