NEWS
Telegram wenn Bedingung eine bestimmte Zeit wahr
-
Hallo zusammen,
ich habe da ein kleines Verständnissproblem bei den Verzögerungen:Folgende Situation:
Ich messe per Steckdose die Leistung meiner Spülmaschine, wenn die >10W ist dann setze ich mir
eine Variable: Spuelmaschine_aktiv
Nun möchte ich, dass wenn die Spülmaschine 10 Minuten <5W ist, mir eine Telegramnachricht geschickt wird.Der einfache Part ist der mit <5W, nun meine Frage: Wie setze ich das mit den 10 Minuten um?
Mein Ansatz ist folgender, ich bin mir aber nicht sicher ob das so richtig ist:var Spuelmaschine_aktiv, timeout; Spuelmaschine_aktiv = false; on({id: 'alias.0.Steckdosen.Spuelmaschine.ENERGY_Power', change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : "") > 10 && Spuelmaschine_aktiv == false) { Spuelmaschine_aktiv = true; } else if ((obj.state ? obj.state.val : "") < 5 && Spuelmaschine_aktiv == true) { timeout = setTimeout(async function () { sendTo("telegram", "send", { text: 'Die Spülmaschine ist fertig!' }); Spuelmaschine_aktiv = false; }, 300000); } else if ((obj.state ? obj.state.val : "") >= 5) { (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); } });
Mein Problem aktuell ist, dass ich Mehrfachmeldungen bekomme, und da könnten es halt zwei Verursacher sein:
- Die Timeoutzeit ist zu kurz gewählt
- Ein Denkfehler im Script
Vielleicht habt ihr ja eine Idee?
-
@markusn78
Ich glaube Du bekommst aktuell immer eine Nachricht, wenn der Wert unter 5W fällt...nur halt mit 5 Minuten Verzögerung.
Nimm mal den telegram-Block aus dem timeout-Block raus und pack es separat mit einer if-Abfrage auf spuelmaschine aktiv = false, dann telegram senden (außerhalt deiner if-Abfragen). In dem timeout Block musst du dann nur noch das spuelmaschine = false setzen drinn lassen. Und ich würde innerhalb des timeout-Blocks nochmal abfragen, ob der Wert immer noch <5W ist und danach erst spuelmaschine auf false setzen.
So kriegst Du nur eine Nachricht, wenn die Spuelmaschine wirklich fertig ist und nciht jedesmal wenn der Wert unter 5W fällt. -
@badsnoopy667
Ich dachte eigentlich der else if block, der auf >5 abfragt, würde den Timeout wieder löschen, und er würde dann wieder von neuem starten, solange bis halt irgendwann der Time-out mal abgelaufen ist? -
@markusn78
Ja, da kann ich jetzt gar nicht so viel gegen sagen... das sehe ich auch so... sorry, hab den letzten Teil irgendwie "übersehen". -
@markusn78 Achso, kannst Du das Blockly mal als Blockly-Export posten? Du hast nur das Javascrip gepostet, das kann man nicht wieder importieren. Würd mal gerne was testen!
-
@markusn78 du hast ein ganz großes Problem:
Dein Timeout kann mehrfach gestartet werden, ohne dass der Timeout vorher beendet wird.
Danach kann der Timeout nicht mehr gestoppt werden, weil er mehrfach läuftBei zwei (und mehr) unterschiedlichen Messungen <5 kommt es jedesmal zum Start des Timeouts
-
@homoran
Danke, das ist auf jedenfall schon mal richtig.
Ich habe das nun wie folgt geändert:var Spuelmaschine_aktiv, Timeout_laeuft, timeout; Spuelmaschine_aktiv = false; on({id: 'alias.0.Steckdosen.Spuelmaschine.ENERGY_Power', change: "ne"}, async function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : "") > 10 && Spuelmaschine_aktiv == false) { Spuelmaschine_aktiv = true; } else if ((obj.state ? obj.state.val : "") < 5 && Spuelmaschine_aktiv == true && Timeout_laeuft == false) { Timeout_laeuft = true; timeout = setTimeout(async function () { sendTo("telegram", "send", { text: 'Die Spülmaschine ist fertig!' }); Spuelmaschine_aktiv = false; }, 300000); } else if ((obj.state ? obj.state.val : "") >= 5 && Timeout_laeuft == true) { (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); Timeout_laeuft = false; } });
Damit startet der Timeout nur einmalig.
Mal schauen ob es dass jetzt war... erstmal die Spülmaschine voll bekommen
-
@markusn78 sagte in Telegram wenn Bedingung eine bestimmte Zeit wahr:
Mal schauen ob es dass jetzt war... erstmal die Spülmaschine voll bekommen
sieht gut aus
-
@homoran sagte: sieht gut aus
Aber sehr kompliziert. Es sollte auch so funktionieren:
Anmerkung: Wichtig ist
else if not timer-variable
um den Mehrfachstart des Timers zu verhindern.
-
@paul53 sagte:
Aber sehr kompliziert.
richtig. Aber ich wollte erst einmal nicht zu viel auf einmal ändern.
@paul53 sagte in Telegram wenn Bedingung eine bestimmte Zeit wahr:
Es sollte auch so funktionieren:
Ist das eine Witz?