NEWS
Telegram Nachrichten doppelt
-
Hallo zusammen!
Ich nutze den Telegram-Adapter um zum einen Zustände wie Temperaturen, etc. abzufragen, das klappt super. Zum anderen läuft auch ein Skript, welches reagiert sobald die Haustür geöffnet wird (Aqara Tür-Fenster-Kontakt über Zigbee-Adapter - CC2531 Stick am Pi) und noch ein Fenster (ebenfalls Aqara TFK) offen ist. Als Reaktion habe ich im Skript die Ausgabe einer Nachricht über den Telegram-Adapter erstellt.
Jetzt mein Problem, ich bekomme die Push-Nachrichten in Telegram immer doppelt im selben Moment. Trotz nachträglich eingebautem time out, kommen die Nachrichten weiterhin doppelt an.
Skript mit blockly erstellt:
/* -- do not edit following lines - START -- { "expert": true, "engineType": "Blockly", "debug": false, "verbose": false } -- do not edit previous lines - END --*/ var timeout; on({id: 'zigbee.0.00158d00025811ae.opened', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); if (getState("zigbee.0.00158d0002580ef4.opened").val == true || getState("zigbee.0.00158d00025811cc.opened").val == true || getState("zigbee.0.00158d0002e6b5d2.opened").val == true) { sendTo("telegram", "send", { text: (['ACHTUNG!','\n','Fenster oben offen!'].join('')) }); } timeout = setTimeout(function () { }, 60000); });
Ihr habt doch sicher eine Idee woran es liegt, bzw. wie ich es abstellen kann?
Lieben Dank vorab!
-
@kluge86 Dein Timeout ist eine leere Funktion und bringt rein gar nichts...
Das löschen vom Timeout geht wesentlich leichter.var timeout; on({id: 'zigbee.0.00158d00025811ae.opened', change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; log("Neuer Wert: " + value); clearTimeout(timeout); timeout = setTimeout(() => { if (getState("zigbee.0.00158d0002580ef4.opened").val == true || getState("zigbee.0.00158d00025811cc.opened").val == true || getState("zigbee.0.00158d0002e6b5d2.opened").val == true) { sendTo("telegram", "send", { text: 'ACHTUNG!\nFenster oben offen!' }); } }, 6000); });
Kann es vll sein, dass der State "opened" kurz auf true gestellt wird und sofort wieder auf false?
Ich hab mal ein debug eingebaut, der den Wert ausgibt. -
Ich probiere es nachher aus. Mal gucken was im log zu sehen ist.
Die Time-Out-Funktion war so gedacht, dass innerhalb z.B. einer Minute nicht das Öffnen und Schließen der Tür das Skript triggert. Also quasi als Block für Leerlaufzeit. Habe ich dabei einen Denkfehler?
-
@kluge86 sagte:
als Block für Leerlaufzeit. Habe ich dabei einen Denkfehler?
Dann muss auch die Variable timeout abgefragt werden
falls nicht timeout
und nach Ablauf der Zeit in der Timer-Callback-Funktion zurück gesetzt werden
setze timeout auf null
Etwa so
Übrigens: Da die Haustür selbst nicht abgefragt wird, wird sowohl beim Öffnen als auch beim Schließen der Haustür gesendet.
-
@kluge86 :
So sollte es auch ohne doppeltes Senden funktionieren:on({id: 'zigbee.0.00158d00025811ae.opened', change: "ne", val: true}, function () { if (getState("zigbee.0.00158d0002580ef4.opened").val || getState("zigbee.0.00158d00025811cc.opened").val || getState("zigbee.0.00158d0002e6b5d2.opened").val) { sendTo("telegram", "send", { text: 'ACHTUNG!\nFenster oben offen!' }); } });
-
@paul53 Danke!
Ich probiere eure Vorschläge gerne nachher aus
@paul53 said in Telegram Nachrichten doppelt:
Übrigens: Da die Haustür selbst nicht abgefragt wird, wird sowohl beim Öffnen als auch beim Schließen der Haustür gesendet.
Mein Problem ist nicht, dass beim zeitversetzen Schließen eine erneute Nachricht käme, diese kommt aktuell erst wenn der Zustand sich nach größer einer Minute wieder verändert. Die doppelte Nachricht kommt sofort, es kommt quasi zwei mal die gleiche im selben Moment.
-
Ich meine, das hätte was mit ack = true zu tun.
Das Thema gibt es hier schonmal, da wurde das imho als Lösung genannt. -
@paul53 said in Telegram Nachrichten doppelt:
@kluge86 :
So sollte es auch ohne doppeltes Senden funktionieren:on({id: 'zigbee.0.00158d00025811ae.opened', change: "ne", val: true}, function () { if (getState("zigbee.0.00158d0002580ef4.opened").val || getState("zigbee.0.00158d00025811cc.opened").val || getState("zigbee.0.00158d0002e6b5d2.opened").val) { sendTo("telegram", "send", { text: 'ACHTUNG!\nFenster oben offen!' }); } });
Funktioniert super, vielen Dank!
-