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? -
@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?
-
@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.
-
@paul53 Vielen Dank! Das hilft mir weiter. Again what learned