NEWS
Bewegungsmelder & Zeitsteuerung
-
auf die klammersetzung kommt es an und semikol
; schliesst immer eine Zeile ab kommt aber nicht am ende des If
if (was weiss ich ) { } else { }
//Tagsüber 6-22 Uhr if (stunde > 6 && stunde < 22) { on('hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', function (dp) { if(dp.state.val) log('Bewegung im Bad EG erkannt'); setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', dp.state.val); }); } // Nachts if (stunde > 22 && stunde < 6) { on('hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', function (dp1) { if(dp1.state.val) log('Bewegung im Bad EG erkannt'); setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', dp1.state.val); setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).level', 50); }); }
wobei ich würde garnicht hier mit else arbeiten..Fragst eh die Uhrzeit nochmal ab
-
Wenn ich das richtig verstehe, willst du bei Auslösen des Bewegungsmelders in Abhängigkeit der Uhrzeit verschiedene Aktionen ausführen.
Dann sollte die Struktur des Skripts das auch wiedergeben:
Auslöser => Uhrzeit prüfen => Aktionen ausführen
Etwa so (ungetestet):
on('hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', function (dp) { var stunde = (new Date()).getHours(); // es wird immer geschaltet, entweder an oder aus, je nach Bewegung setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', dp.state.val); if (dp.state.val) { // Bewegungsmelder hat was gesehen log('Bewegung im Bad EG erkannt'); // Abhängig von Uhrzeit die Helligkeit anpassen if (stunde > 6 && stunde < 22) { // tagsüber hell setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).level', 100); } else { // nachts dunkler setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).level', 50); } } else { // länger keine Bewegung log('Keine Bewegung mehr im Bad EG'); } });
P.S.: Deine If-ElseIf-Bedingung hatte eine Lücke, von 6:00 bis 6:59 und 22:00 bis 22:59 würde es gar nichts tun. Entweder if-else oder if-elseif mit < und >=
-
Super…vielen vielen Dank!!! Irgendwie war dieses Thema für mich der Script-Durchbruch, bei dem sich der Knoten gelöst hat.
Die Steuerung läuft und ich habe zusätzlich noch eine Überprüfung der Helligkeit eingebaut. Und jetzt ist meine Frau sogar zufrieden mit der Automatisierung.
Danke!
-
Ich muss das Thema nochmal aufmachen. Ich hatte seit Nutzung der Skripte immer mal wieder das Problem, dass sich die Bewegungsmelder nicht zurückgesetzt haben bzw. teilweise auch die korrekte Statusänderung zwar in iobroker erfasst (Objekte), aber im Programm nicht sauber ausgewertet wurde.
Deshalb würde ich gerne das Zurücksetzen bzw. die Zeitsteuerung im Skript machen. Das ist mein aktueller Stand:
on ('hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', function () { //Definitionen var zeit1 = 4; //6 Uhr, da +2 Stunden var zeit2 = 18; //20 Uhr, da +2 Stunden var illu_ziel = 150; //Zeit auslesen var stunde = (new Date()).getHours(); log('Zeit: ' + stunde); //Helligkeit auslesen var illu = getState('javascript.0.helligkeiten.illu_eg_bad').val; log('Helligkeit: ' + illu); //Lampen schalten if (illu >= illu_ziel) { log('Bewegung erkannt, aber zu hell, keine Aktion'); } else { setState ('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', true); if (stunde > zeit1 && stunde < zeit2) { // tagsüber hell und weiß setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).level', 100); setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).ct', 350); log('Tag'); } else { // nachts dunkler und warmweiß setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).level', 40); setState('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).ct', 500); log('Nacht'); } } //Lampen werden nach 120s wieder ausgeschalten setTimeout(function(){ setState ('hue.1.Bridge_-_EG_2.a.Badezimmer_(Decke).on', false) }, 120000); });
Hier habe ich zwei Fragen und hoffe, jemand kann mir helfen…
1. weshalb wird die Zeit mit -2 Stunden ausgegeben?
2. wenn das Licht bereits an ist, gehen die Lampen nicht erneut an. Da die Helligkeit ja in diesem Moment noch ausreichend ist. Ich wollte eine Abfrage einbauen, dass wenn eine Bewegung erkannt wird, geprüft wird, ob die Lichter bereits an sind und wenn ja, der Timer wieder zurückgesetzt wird. Aber ich bekomme das nicht hin.
-
1. weshalb wird die Zeit mit -2 Stunden ausgegeben? `
Läuft dein Skript auf einem Raspberry Pi? Wenn ja, ist die richtige Zeitzone eingestellt? -
Hallo Seehofweg,
schau mal hier zum Thema clearTimeout;
https://www.w3schools.com/jsref/met_win … imeout.asp
das müsste es sein, was du für Frage 2 brauchst.
-
Servus,
ich bräuchte wohl genau das Gegenteil…ich würde das Timeout bei einer erneuten Bewegung gerne auf den ursprünglichen Anfangswert zurück setzen.
Ahhh...die Zeit wird auf der Raspberry ausgelesen. Werd ich gleich mal checken. Dank!
-
Hallo,
habs mal so gebaut:
! ````
//Lampen werden nach 120s wieder ausgeschalten
var idStatusHue = 'hue.1.Bridge_-EG_2.a.Badezimmer(Decke).on';
var timer = null; // Timer leer
! //Definitionen
var zeit1 = 4; //6 Uhr, da +2 Stunden
var zeit2 = 18; //20 Uhr, da +2 Stunden
var illu_ziel = 150;
! on ('hm-rpc.1.000C17099A04A9.1.PRESENCE_DETECTION_STATE', function () {
! //Zeit auslesen
var stunde = (new Date()).getHours();
log('Zeit: ' + stunde);//Helligkeit auslesen
var illu = getState('javascript.0.helligkeiten.illu_eg_bad').val;
log('Helligkeit: ' + illu);//Lampen schalten
if (illu >= illu_ziel) {
log('Bewegung erkannt, aber zu hell, keine Aktion');} else if (illu < illu_ziel || getState(idStatusHue).val === true ) { // Helligkeit niedriger als Grenzwert oder Lampe bereits an setState (idStatusHue, true);
! if (stunde > zeit1 && stunde < zeit2) {
// tagsüber hell und weiß
setState('hue.1.Bridge_-EG_2.a.Badezimmer(Decke).level', 100);
setState('hue.1.Bridge_-EG_2.a.Badezimmer(Decke).ct', 350);
log('Tag');
} else {
// nachts dunkler und warmweiß
setState('hue.1.Bridge_-EG_2.a.Badezimmer(Decke).level', 40);
setState('hue.1.Bridge_-EG_2.a.Badezimmer(Decke).ct', 500);
log('Nacht');
}
}//Lampen werden nach 120s wieder ausgeschaltet
if (timer) clearTimeout(timer); // wenn aktuell Timer läuft (weil letzte Bewegung vor weniger als 120s, dann Timer löschen
timer = setTimeout(function() { // sofort neuen Timer starten
timer = null; // zuerst nach Ablauf Timer wieder auf null
if (getState(idStatusHue).val) setState (idStatusHue, false); // nach Ablauf Licht aus, wenn vorher an
}, 1000 * 120); // 120s});
Wenn Bewegung und Helligkeit ist größer als Grenzwert, dann keine Aktion (außer Timer). Wenn Bewegung und Helligkeit ist niedriger als Grenzwert oder Wenn Bewegung und Lampe schon an, dann nochmal Licht an (mit neuen Farbwerten). Timer wird nach Ablauf gelöscht und bei Bewegung neu gestartet. Gruß Pix
-
ich würde das Timeout bei einer erneuten Bewegung gerne auf den ursprünglichen Anfangswert zurück setzen. `
Schematisch geht das so:var timer; // ursprünglicher Timeout timer = setTimeout(...) [...] // "Reset" des Timers: if (timer != null) clearTimeout(timer); timer = setTimeout(...)
-
Hey…ich danke euch! Und natürlich ganz besonders pix!
Das Skript funktioniert super. Da ich mir gesagt habe, dass ich kein Skript einbaue, welches ich nicht verstehe, bin ich inzwischen auch damit durch. Ja, schön gelöst.
Euch noch einen schönen Abend!