NEWS
Licht vergessen funktioniert nicht mehr korrekt
-
Hallo,
ich habe mir ein Skript geschrieben, welches das Licht in den Zimmern ausschaltet wenn keine Bewegung mehr erkannt wird. Hat auch immer super funktioniert. Nun bin ich auf die neue Node JS 16 Version, nun schaltet das Licht auch aus, wenn noch Bewegung vorhanden ist. Erkennt ihr einen Fehler im Skript der mit der aktuellen Version erst auftritt?// Script zum automatischen Ausschalten wenn das Licht vergessen wurde. // Variablen var melder= "knx.0.Bewegungsüberwachung.OG.Anwesend_K_Kind_1"/*Anwesend K Kind 2*/; // Melder der die Bewegung im Raum überwacht var raum= "Kind 1"; // Bezeichung des Raumes für die Logausgaben var schalten= "knx.0.Beleuchtungssteuerung_OG.Kind_1.Licht_Kind_1_Schalten"/*Licht Kind 1 Schalten*/; // Schaltobjekt des Lichtes var schaltenruck= "knx.0.Beleuchtungssteuerung_OG.Kind_1.Licht_Kind_1_Rück"/*Licht Kind 1 Rück*/; // Rückmeldeobjekt des Lichtes falls vorhanden sonst wie schalten var schalten2= "knx.0.Beleuchtungssteuerung_OG.Kind_1.Licht_Kind_1_Wand_Schalten"/*Licht Kind 1 Wand Schalten*/; // Schaltobjekt des Lichtes var schaltenruck2= "knx.0.Beleuchtungssteuerung_OG.Kind_1.Licht_Kind_1_Wand_Rück"/*Licht Kind 1 Wand Rück*/; // Rückmeldeobjekt des Lichtes falls vorhanden sonst wie schalten //var zeit=60*60*1000; // 1h Verzögerung, nach der das Licht ausgeschaltet werden soll var zeit=10*60*1000; // 5min Verzögerung, nach der das Licht ausgeschaltet werden soll //var zeit=30*1000; // 30s zum Testen var loggen=false; // Logausgaben aktiveren var anwesend=false; // Variable die die Anwesenheit darstellt var timer=false; // Bewegung wurde im Raum erkannt, Ausschalttimer wird gelöscht on ({id: melder, val: true}, function () { if (loggen) {log("Bewegung wurde erkannt ("+raum+"), Ausschalttimer gelöscht")} anwesend=true; if (timer) { clearTimeout(timer); timer = false; if (loggen) {log("Erneute Bewegung erkannt Ausschalttimer gelöscht")} } else { if (loggen) {log("Bewegung erkannt Timer war nicht vorhanden")} } }); // Keine Bewegung im Raum erkannt, Ausschalttimer wird gestartet on ({id: melder, val: false}, function () { if (loggen) {log("Keine Bewegung ("+raum+") mehr erkannt, starte Ausschalttimer " + zeit)} timer = setTimeout(function () { timer = false; if (loggen) {log("Ausschalttimer abgelaufen ("+raum+")")} anwesend=false; licht(); }, zeit); }); licht(); // Licht wird ausgeschaltet function licht(){ if (loggen) {log("Wert Anwesend: "+anwesend)} if (loggen) {log("Wert Rückmeldung: "+(getState(schaltenruck).val==true))} if ((anwesend==false) && (getState(schaltenruck).val==true)) { log("Licht ("+raum+") wurde vergessen und ausgeschaltet","warn"); setState(schalten,false); } else { if (loggen) {log("Licht ("+raum+") war bereits aus")} } if ((anwesend==false) && (getState(schaltenruck2).val==true)) { log("Licht2 ("+raum+") wurde vergessen und ausgeschaltet","warn"); setState(schalten2,false); } else { if (loggen) {log("Licht2 ("+raum+") war bereits aus")} } }
-
@fuchs1978
Bin zwar nicht der Profi, aber ich würde die Variable „timer“ nicht zweimal verwenden. Den Timer würde ich z.B. „Wartezeit“ nennen. Zeile 22 und 33 -
@fuchs1978 sagte: Erkennt ihr einen Fehler im Skript
Es muss auf Änderung getriggert werden, da sonst mehrere Timer gestartet werden können, die sich nicht mehr löschen lassen. Außerdem verwendet man nur einen Trigger pro Datenpunkt (Ressourcen).
on (melder, function (dp) { // Trigger auf Wertänderung if (dp.state.val) { // Aktionen bei Bewegung } else { // Aktionen ohne Bewegung } });
@tt-tom sagte in Licht vergessen funktioniert nicht mehr korrekt:
Variable „timer“ nicht zweimal verwenden.
Sie wird nur einmal verwendet: In einem Teil gesetzt und in einem anderen Teil gelöscht. Da Timer-Variablen spezielle Objekte sind, setzt man Timer-Variablen auf null anstatt auf false.
-
@tt-tom sagte in Licht vergessen funktioniert nicht mehr korrekt:
Variable „timer“ nicht zweimal verwenden.
Sie wird nur einmal verwendet: In einem Teil gesetzt und in einem anderen Teil gelöscht. Da Timer-Variablen spezielle Objekte sind, setzt man Timer-Variablen auf null anstatt auf false.
Dann habe ich da noch eine Verständnisfrage: Zeile 21-23
Das If bezieht sich doch auf die Variable timer, die in 23 auf false gesetzt wird. Um das Objekt timer in 22 zu löschen.Sollte nicht Objekt und Variable unterschiedliche Namen haben?
-
@tt-tom sagte: Variable timer, die in 23 auf false gesetzt wird. Um das Objekt timer in 22 zu löschen.
clearTimeout(timer) stoppt den Timer mit der Referenz timer, setzt aber nicht die Variable zurück. Damit man mit if(timer) die Variable abfragen kann, wird sie nach dem Stoppen auf false (besser null) gesetzt.
-
Okay so weit verstanden. Müssen also beide den gleichen Namen timer haben, oder?
-
@tt-tom sagte: Müssen also beide den gleichen Namen timer haben, oder?
Ja, es gibt nur ein setTimeout(), das die Variable timer setzt.
-
Danke, wieder etwas dazu gelernt. Schönes Wochenende
-
@paul53 said in Licht vergessen funktioniert nicht mehr korrekt:
@fuchs1978 sagte: Erkennt ihr einen Fehler im Skript
Es muss auf Änderung getriggert werden, da sonst mehrere Timer gestartet werden können, die sich nicht mehr löschen lassen. Außerdem verwendet man nur einen Trigger pro Datenpunkt (Ressourcen).
on (melder, function (dp) { // Trigger auf Wertänderung if (dp.state.val) { // Aktionen bei Bewegung } else { // Aktionen ohne Bewegung } });
Mache ich das nicht? Ich habe ja die Trigger mit Val unterschieden. Wir würdest du den Rest aufbauen. Komisch nur, das es erst seit kurzem nicht mehr korrekt funktioniert. Ich meine Seite node 16
-
@fuchs1978 sagte: Mache ich das nicht? Ich habe ja die Trigger mit Val unterschieden.
Nein. Wenn ein zweiter Trigger mit val: false kommt ohne vorherige Wertänderung?
-
@paul53 said in Licht vergessen funktioniert nicht mehr korrekt:
@fuchs1978 sagte: Mache ich das nicht? Ich habe ja die Trigger mit Val unterschieden.
Nein. Wenn ein zweiter Trigger mit val: false kommt ohne vorherige Wertänderung?
Also dort noch eine Abfrage rein If Timer und damit nicht auf zwei reagieren