NEWS
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. -
@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.
-
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.
-
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! -
@bongo
Warum haben Deine beiden Trigger unten unterschiedliche Signaturen?
Der erste triggert bei jeder Aktualisierung, der zweite nur bei "größer als". -
@codierknecht
Das kommt von meiner großen Testerei. Die unteren beiden Trigger werden eigentlich nicht benötigt. -
@bongo
Start den Javascript-Adapter mal neu. Das sieht nach doppelt laufenden Scripten aus.Edit: Wie editierst du skripte?
-
@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.
-
@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. -
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
-
@ticaki sagte in Homematic HM-RPC - Fenster öffnen zählt doppelt:
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.