NEWS
js timer hölle soft start :)
-
Ausgangssituation:
Im Eingangsbereich ist eine (IKEA|Osram|Aldi) RGB-Lampe, welche zwischen Sonnenuntergang und Sonnenaufgang automatisch eingeschaltet wird. Allerdings mit einer bestimmten Farbe und reduzierter Helligkeit.Ich suche eine Idee oder einen eleganten Lösungsansatz für folgende Anforderung:
Ein (aqara/xiaomi) Türsensor soll das Licht im Eingangsbereich ansteuern.
Wird die Tür geöffnet, soll das Licht auf 100% Helligkeit und weiß umgeschaltet werden, nach dem Schließen der Türe nach x Sekunden wieder auf den ursprünglichen Zustand umschalten, also entweder aus oder gedimmtes, farbiges Licht.Die Umschaltung soll mit einer gewissen transition_time erfolgen, d.h. falls voher eine Farbe eingestellt war, wird auf weiß geschaltet, dann mit ca. 0.5 bis 1. Sekunden die Helligkeit hochgefahren. Analog dazu soll nach dem Schließen der Türe das Licht wieder langsam auf die ursprüngliche Helligkeit runtergefahren werden und dann auf die ursprüngliche Farbe umschalten. Die transition_time habe ich auf 0.5 Sek. eingestellt, daher die 700ms delay.
Wenn zwischen dem Öffnen und Schließen der Tür genug Zeit vergeht, klappt alles prima.
Wird die Türe allerdings kurz auf und wieder zu gemacht, dann wird der zweite Event getriggert, noch bevor der erste beendet ist. Problematisch sind die Timer der aufeinander folgenden setStateDelayed().
Hier mal ein bischen Code:
var lampe_brightness, lampe_color, lampe_state; var timeout; var lamp = "zigbee.0.xxx"; var door = "zigbee.0.yyy.opened"; var processing = false; on({id: door, change: "ne"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; if (compareTime(getAstroDate("sunset", undefined, 0).toLocaleTimeString(), getAstroDate("sunrise", undefined, 0).toLocaleTimeString(), "between")) { (function () {if (timeout) {clearTimeout(timeout); timeout = null;}})(); setState(lamp+".transition_time", 0.5); if (value) { lampe_brightness = getState(lamp+".brightness").val; lampe_color = getState(lamp+".colortemp").val; lampe_state = getState(lamp+".state").val; setState(lamp+".colortemp", 100,false); setStateDelayed(lamp+".brightness", 100,700,false); } else { timeout = setTimeout(function () { if (lampe_state === false) { setState(lamp+".state", false); setState(lamp+".brightness", lampe_brightness,true); setState(lamp+".colortemp", lampe_color,true); }else{ setState(lamp+".brightness", lampe_brightness); setStateDelayed(lamp+".colortemp", lampe_color, 1000, false); } }, 500); } } });
Ich könnte jetzt natürlich ein paar weitere Abfragen für die setStateDelayed() Timer machen, frage mich aber, ob es nicht irgendwie eleganter geht. Evtl. mit einer Rekursion?!
Hat hier jemand so etwas schon sauber implementiert oder kann mir einen Tip geben??