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?
-
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. -
@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? -
@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". ;) -
@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 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!
-
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 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
-
@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 :)
-
@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
-
@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-variableum 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? :-)
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden