NEWS
[Gelöst] Probleme mit clearTimer
-
Hallo zusammen,
mich treibt das Abbrechen eines setTimers in den Wahnsinn.
Ich möchte folgendes:- Einen 5 minütigen Timer starten, wenn ein Bewegungsmelder false meldet
- Diesen Timer abbrechen wenn der Bewegungsmelder true meldet oder ich einen Schalter drücke.
Das Problem: Das Abbrechen des Timers funktioniert irgendwie nicht.
Folgend mein Code:var block = false, time; var timeout = null; on ({id: BewSensor_Bad, val: true}, function(){ (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer abgebrochen durch sensor mit if (1)")}})(); // clearTimeout(timeout); // timeout = null; // clearTimeout(timeout); if (compareTime('5:00', '23:00', "between", null)) { setState(Shelly_Bad_Spiegel, true); console.log("Licht an (Sensor)"); } }); on ({id: BewSensor_Bad, val: false}, function(){ if (block == false){ console.log("Bad: Keine Bewegung, starte kurzen Timer"); time = 300000; timeout = setTimeout(function () { setState(Shelly_Bad_Spiegel, false); // Stelle eins // (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer (kurz) beendet, Licht aus (2)")}})(); // clearTimeout(timeout); // timeout = null; },time); } else{ console.log("Bad: Keine Bewegung, starte langen Timer"); time = 1800000; timeout = setTimeout(function () { setState(Shelly_Bad_Spiegel, false); // Stelle zwei // (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer (lang) beendet, Licht aus (3)")}})(); // clearTimeout(timeout); // timeout = null; },time); } if(timeout){ console.log ("Timer läuft: Dauer: " + time/60000 +" Minuten") } }); on ({id: SchalterKleinBadDoppel, val: true}, function(){ setState(Shelly_Bad_Spiegel, false); console.log("Licht aus durch Schalter"); block = false; (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer beendet (4)")}})(); } ); on ({id: SchalterKleinBadEinfach, val: true}, function(){ setState(Shelly_Bad_Spiegel, true); console.log("Licht an durch Schalter"); block = true; (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Haendisch an, Timer abbrechen (5)")}})(); console.log ("Block = " + block) } );Laut Console komm ich auch in die Funktion zum Abbrechen:
(function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer abgebrochen durch sensor mit if (1)")}})();Aber trotzdem geht das Licht zu früh aus.
An diversen Stellen habe ich auch den Timer mit clearTimeout und timer = null innerhalb des setTimeouts gesetzt (siehe z.B. auskommentierte "Stelle eins" und "Stelle zwei".In meinem Konsolen-Log erscheinen Einträge seltsamerweise doppelt:
javascript.0 2019-07-14 11:55:28.428 info script.js.Beleuchtung.Bad: Status: Licht ging aus
javascript.0 2019-07-14 11:55:28.393 info script.js.Beleuchtung.Bad: Status: Licht ging aus
javascript.0 2019-07-14 11:53:27.969 info script.js.Beleuchtung.Bad: Status: Bewegungsmelder meldet false
javascript.0 2019-07-14 11:53:27.969 info script.js.Beleuchtung.Bad: Timer läuft: Dauer: 5 Minuten
javascript.0 2019-07-14 11:53:27.968 info script.js.Beleuchtung.Bad: Bad: Keine Bewegung, starte kurzen Timer
javascript.0 2019-07-14 11:51:28.244 info script.js.Beleuchtung.Bad: Status: Bewegungsmelder meldet false
javascript.0 2019-07-14 11:51:28.244 info script.js.Beleuchtung.Bad: Timer läuft: Dauer: 5 Minuten
javascript.0 2019-07-14 11:51:28.243 info script.js.Beleuchtung.Bad: Bad: Keine Bewegung, starte kurzen Timer
javascript.0 2019-07-14 11:50:28.383 info script.js.Beleuchtung.Bad: Status: Bewegungsmelder meldet false
javascript.0 2019-07-14 11:50:28.382 info script.js.Beleuchtung.Bad: Timer läuft: Dauer: 5 Minuten
javascript.0 2019-07-14 11:50:28.382 info script.js.Beleuchtung.Bad: Bad: Keine Bewegung, starte kurzen Timer
javascript.0 2019-07-14 11:48:28.647 info script.js.Beleuchtung.Bad: Licht an (Sensor)In diversen Einträgen im Forum lese ich unterschiedliches bezüglich des Abbrechen eines Timers:
Mal mit timeout = null UND clearTimeout, mal nur clearTimeout.
Blockly packt beides in eine function.
Was mache ich falsch?
An welchen Stellen muss ich den Timer clearen und nullen? -
Hallo zusammen,
mich treibt das Abbrechen eines setTimers in den Wahnsinn.
Ich möchte folgendes:- Einen 5 minütigen Timer starten, wenn ein Bewegungsmelder false meldet
- Diesen Timer abbrechen wenn der Bewegungsmelder true meldet oder ich einen Schalter drücke.
Das Problem: Das Abbrechen des Timers funktioniert irgendwie nicht.
Folgend mein Code:var block = false, time; var timeout = null; on ({id: BewSensor_Bad, val: true}, function(){ (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer abgebrochen durch sensor mit if (1)")}})(); // clearTimeout(timeout); // timeout = null; // clearTimeout(timeout); if (compareTime('5:00', '23:00', "between", null)) { setState(Shelly_Bad_Spiegel, true); console.log("Licht an (Sensor)"); } }); on ({id: BewSensor_Bad, val: false}, function(){ if (block == false){ console.log("Bad: Keine Bewegung, starte kurzen Timer"); time = 300000; timeout = setTimeout(function () { setState(Shelly_Bad_Spiegel, false); // Stelle eins // (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer (kurz) beendet, Licht aus (2)")}})(); // clearTimeout(timeout); // timeout = null; },time); } else{ console.log("Bad: Keine Bewegung, starte langen Timer"); time = 1800000; timeout = setTimeout(function () { setState(Shelly_Bad_Spiegel, false); // Stelle zwei // (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer (lang) beendet, Licht aus (3)")}})(); // clearTimeout(timeout); // timeout = null; },time); } if(timeout){ console.log ("Timer läuft: Dauer: " + time/60000 +" Minuten") } }); on ({id: SchalterKleinBadDoppel, val: true}, function(){ setState(Shelly_Bad_Spiegel, false); console.log("Licht aus durch Schalter"); block = false; (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer beendet (4)")}})(); } ); on ({id: SchalterKleinBadEinfach, val: true}, function(){ setState(Shelly_Bad_Spiegel, true); console.log("Licht an durch Schalter"); block = true; (function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Haendisch an, Timer abbrechen (5)")}})(); console.log ("Block = " + block) } );Laut Console komm ich auch in die Funktion zum Abbrechen:
(function () {if (timeout) {clearTimeout(timeout); timeout = null;console.log("Timer abgebrochen durch sensor mit if (1)")}})();Aber trotzdem geht das Licht zu früh aus.
An diversen Stellen habe ich auch den Timer mit clearTimeout und timer = null innerhalb des setTimeouts gesetzt (siehe z.B. auskommentierte "Stelle eins" und "Stelle zwei".In meinem Konsolen-Log erscheinen Einträge seltsamerweise doppelt:
javascript.0 2019-07-14 11:55:28.428 info script.js.Beleuchtung.Bad: Status: Licht ging aus
javascript.0 2019-07-14 11:55:28.393 info script.js.Beleuchtung.Bad: Status: Licht ging aus
javascript.0 2019-07-14 11:53:27.969 info script.js.Beleuchtung.Bad: Status: Bewegungsmelder meldet false
javascript.0 2019-07-14 11:53:27.969 info script.js.Beleuchtung.Bad: Timer läuft: Dauer: 5 Minuten
javascript.0 2019-07-14 11:53:27.968 info script.js.Beleuchtung.Bad: Bad: Keine Bewegung, starte kurzen Timer
javascript.0 2019-07-14 11:51:28.244 info script.js.Beleuchtung.Bad: Status: Bewegungsmelder meldet false
javascript.0 2019-07-14 11:51:28.244 info script.js.Beleuchtung.Bad: Timer läuft: Dauer: 5 Minuten
javascript.0 2019-07-14 11:51:28.243 info script.js.Beleuchtung.Bad: Bad: Keine Bewegung, starte kurzen Timer
javascript.0 2019-07-14 11:50:28.383 info script.js.Beleuchtung.Bad: Status: Bewegungsmelder meldet false
javascript.0 2019-07-14 11:50:28.382 info script.js.Beleuchtung.Bad: Timer läuft: Dauer: 5 Minuten
javascript.0 2019-07-14 11:50:28.382 info script.js.Beleuchtung.Bad: Bad: Keine Bewegung, starte kurzen Timer
javascript.0 2019-07-14 11:48:28.647 info script.js.Beleuchtung.Bad: Licht an (Sensor)In diversen Einträgen im Forum lese ich unterschiedliches bezüglich des Abbrechen eines Timers:
Mal mit timeout = null UND clearTimeout, mal nur clearTimeout.
Blockly packt beides in eine function.
Was mache ich falsch?
An welchen Stellen muss ich den Timer clearen und nullen? -
@tropisch sagte:
Abbrechen eines Timers:
Mal mit timeout = null UND clearTimeout, mal nur clearTimeout.Nur clearTimeout(timer) bricht den Timer ab. timer = null dient für die Abfrage if(timer), ob der Timer läuft.
-
@paul53 Danke für den Hinweis!
Hast du auch eine Idee was bei meinem Skript sonst falsch läuft?@tropisch sagte:
Hast du auch eine Idee
Kann es sein, dass der BWM zyklisch seinen Status sendet ? Dann sollte auf Wertänderung getriggert werden.
Z.B. sovar time = 600000; var timeout = null; on (BewSensor_Bad, function(dp){ if(dp.state.val) { if(timeout) { clearTimeout(timeout); timeout = null; log("Timer abgebrochen durch sensor mit if (1)") } if (compareTime('5:00', '23:00', "between")) { setState(Shelly_Bad_Spiegel, true); log("Licht an (Sensor)"); } } else { log("Bad: Keine Bewegung"); timeout = setTimeout(function () { setState(Shelly_Bad_Spiegel, false); }, time); } }); on ({id: SchalterKleinBadDoppel, val: true}, function() { setState(Shelly_Bad_Spiegel, false); log("Licht aus durch Schalter"); time = 300000; if (timeout) { clearTimeout(timeout); timeout = null; log("Timer beendet (4)") } }); on ({id: SchalterKleinBadEinfach, val: true}, function(){ setState(Shelly_Bad_Spiegel, true); log("Licht an durch Schalter"); time = 1800000; if (timeout) { clearTimeout(timeout); timeout = null; log("Haendisch an, Timer abbrechen (5)"); } }); -
Vielen Dank für Deine Lösung. Sie scheint soweit zu funktionieren :)
Scheinbar sendet der Melder (seit neustem) zyklisch.Ich bin aber ein wenig verwirrt:
Ich dachte bisher die on (Id, val:true) geschichte wird nur bei einer Änderung getriggert.
Verstehe ich das jetzt richtig, dass der trigger jetzt bei Änderung und Aktualisierung mit selben Wert getriggert wird?Außerdem: Die dp.state.val Sache entpsricht quasi dem Wert des Objekts, welches den Trigger ausgelöst hat (BewSensor_Bad). Zu dem Ganzen konnte ich aber in keiner Doku etwas finden. Unter welchem Schlagwort gibt es denn Doku dazu?
-
Vielen Dank für Deine Lösung. Sie scheint soweit zu funktionieren :)
Scheinbar sendet der Melder (seit neustem) zyklisch.Ich bin aber ein wenig verwirrt:
Ich dachte bisher die on (Id, val:true) geschichte wird nur bei einer Änderung getriggert.
Verstehe ich das jetzt richtig, dass der trigger jetzt bei Änderung und Aktualisierung mit selben Wert getriggert wird?Außerdem: Die dp.state.val Sache entpsricht quasi dem Wert des Objekts, welches den Trigger ausgelöst hat (BewSensor_Bad). Zu dem Ganzen konnte ich aber in keiner Doku etwas finden. Unter welchem Schlagwort gibt es denn Doku dazu?
@tropisch sagte:
Ich dachte bisher die on (Id, val:true) geschichte wird nur bei einer Änderung getriggert.
Nein, wenn das Muster als Objekt {id: meineID, val: true} angegeben wird, erfolgt die Triggerung bei jeder Aktualisierung des Zeitstempels, wenn man nicht zusätzlich change: 'ne' angibt.
@tropisch sagte in Probleme mit clearTimer:
konnte ich aber in keiner Doku etwas finden
Funktionsbeschreibung auf Github.
-
@tropisch sagte:
Ich dachte bisher die on (Id, val:true) geschichte wird nur bei einer Änderung getriggert.
Nein, wenn das Muster als Objekt {id: meineID, val: true} angegeben wird, erfolgt die Triggerung bei jeder Aktualisierung des Zeitstempels, wenn man nicht zusätzlich change: 'ne' angibt.
@tropisch sagte in Probleme mit clearTimer:
konnte ich aber in keiner Doku etwas finden
Funktionsbeschreibung auf Github.
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