NEWS
Script Licht vergessen / Bewegungsmelder
-
Hallo,
da die Kinder häufig das Licht vergessen, habe ich ein kleines Script geschrieben und genau dies zu tun. Getriggert wird dieses durch den Bewegungmelder der beim verlassen des Raumes eine 0 sendet.
Solange ich die Zeit auf 30Sekunden, also 30000 habe läuft es auch. Nun wollte ich es aber auf 15Minuten stellen, und dann geht es nicht mehr. Ich kann auch so keinen Fehler erkennen. Wäre toll wenn ihr mal einen Blick auf das Script werft und mir eine Rückmeldung gebt.
// Script zum automatischen Ausschalten wenn das Licht vergessen wurde. // Variablen var melder= "knx.0.Bewegungsüberwachung.EG.Anwesend_K_WC"/*Anwesend K WC*/; // Melder der die Bewegung im Raum überwacht var raum= "WC"; // Bezeichung des Raumes für die Logausgaben var schalten= "knx.0.Beleuchtungssteuerung_EG.WC.Licht_WC_Schalten"/*Licht WC Schalten*/; // Schaltobjekt des Lichtes var schaltenruck= "knx.0.Beleuchtungssteuerung_EG.WC.Licht_WC_Rück"/*Licht WC 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=5*60*1000; // 5min Verzögerung, nach der das Licht ausgeschaltet werden soll //var zeit=30*1000; // 30s zum Testen var loggen=true; // Logausgaben aktiveren var anwesend=false; // Variable die die Anwesenheit darstellt // Bewegung wurde im Raum erkannt, Ausschalttimer wird gelöscht on ({id: melder, val: 1}, function () { if (loggen) {log("Bewegung wurde erkannt ("+raum+"), Ausschalttimer gelöscht")} anwesend=true; if (timer) { clearTimeout(timer); 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: 0}, 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"); setState(schalten,false); } else { if (loggen) {log("Licht ("+raum+") war bereits aus")} } }
-
Was funktioniert denn nicht?
Licht wird ausgeschaltet obwohl Bewegung im Raum ist?
Licht wird gar nicht ausgeschaltet?
Gruß
-
Was funktioniert denn nicht?
Licht wird ausgeschaltet obwohl Bewegung im Raum ist?
Licht wird gar nicht ausgeschaltet?
Gruß `
ich müsste nach Ablauf der Zeit ja eine Log Rückmeldung der Funktion Licht bekommen. Und falls vergessen müsste das Licht ausgehen. Ich bekomme aber weder einen Log Eintrag noch geht das Licht aus. So als ob die Funktion Licht nicht ausgeführt wird. Bei 30 sekunden klappt alles wie es soll
-
Bekommst du denn die Logmeldung "Ausschattimer abgelaufen in raum …."??
Ich kann da eigentlich keine großartigen Fehler feststellen..
Variablen die in mehreren Funktionen verwendet würden, sollten aber immer global deklariert werden.. Wenn man eine Variable gegen true oder false checkt verwendet man besser === statt == ..
Desweiteren würde ich "timer" in der Funktion Licht auf false setzen, und nicht in der Timeout Funktion selber..
Ungefähr so:
// Script zum automatischen Ausschalten wenn das Licht vergessen wurde. // Variablen var melder= "knx.0.Bewegungsüberwachung.EG.Anwesend_K_WC"/*Anwesend K WC*/; // Melder der die Bewegung im Raum überwacht var raum= "WC"; // Bezeichung des Raumes für die Logausgaben var schalten= "knx.0.Beleuchtungssteuerung_EG.WC.Licht_WC_Schalten"/*Licht WC Schalten*/; // Schaltobjekt des Lichtes var schaltenruck= "knx.0.Beleuchtungssteuerung_EG.WC.Licht_WC_Rück"/*Licht WC 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=5*60*1000; // 5min Verzögerung, nach der das Licht ausgeschaltet werden soll //var zeit=30*1000; // 30s zum Testen var loggen=true; // Logausgaben aktiveren var anwesend=false; // Variable die die Anwesenheit darstellt var timer=null; // Timer Variable wird global deklariert // Bewegung wurde im Raum erkannt, Ausschalttimer wird gelöscht on ({id: melder, val: 1}, function () { if (loggen) { log("Bewegung wurde erkannt ("+raum+"), Ausschalttimer gelöscht"); } anwesend=true; if (timer) { clearTimeout(timer); 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: 0}, function () { if (loggen) { log("Keine Bewegung ("+raum+") mehr erkannt, starte Ausschalttimer " + zeit); } timer = setTimeout(function () { if (loggen) { log("Ausschalttimer abgelaufen ("+raum+")"); } anwesend=false; licht(); }, zeit); }); licht(); // Licht wird ausgeschaltet function licht(){ timer=false; if (loggen) { log("Funktion Licht ANFANG!"); log("Wert Anwesend: "+anwesend); log("Wert Rückmeldung: "+getState(schaltenruck).val); } if ((anwesend===false) && (getState(schaltenruck).val===true)) { log("Licht ("+raum+") wurde vergessen und ausgeschaltet"); setState(schalten,false); } else { if (loggen) { log("Licht ("+raum+") war bereits aus."); } } if (loggen) { log("Funktion Licht ENDE!"); } }
Gruß
-
Es kam gar nichts, so als ob das timeout vergessen wurde. Habe es nun auf 5 Minuten, also 5601000 und es geht wieder
-
Hast du es mal mit dem Script versucht das ich gepostet habe?
Habe nicht viel verändert außer if boolean abfragen mit === auszustatten, die timer Variable als global deklariert und ein paar fehlende ; hinzugefügt.
Gruß