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??
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden