Re: Regel Sonnenaufgang mit Zeitverzögerung
Verfasst: 24. Mai 2019 19:11
Wenn Du mehrere Rules mit identischem Trigger hast, ist es besser, diese Rules zu einer Rule zusammenzufassen. openHAB kann maximal fünf Rules zeitgleich ausführen. Wenn Du schon allein drei Rules hast, die immer zeitgleich triggern, steigt die Gefahr, dass andere Rules nicht ausgeführt werden können, stark an.
Wenn Du innerhalb einer Rule einen Timer erzeugst, läuft der Code dieser Rule ohne Verzögerung weiter. Es wird nur das Lambda gemeinsam mit dem Startzeitpunkt an den Scheduler übertragen, der im Gegenzug einen Zeiger zurück liefert. Diesen kann man in einer Timer Variablen speichern und hat damit einen Handler, mit dem man den Timer abbrechen oder auch neu planen kann (solange der Timer noch nicht abgelaufen und die Ausführung des Lambdas beendet ist).
Wenn Du also zu drei verschiedenen Zeitpunkten, die sich fix auf den Sonnenaufgang beziehen, Läden verfahren willst, schreibst Du eine Rule, die drei Timer anlegt. Erzeuge dazu drei Timer Variablen, für jeden Timer eine.
Alternativ kannst Du auch eine Statemachine bauen. Die Statemachine nutzt einen Timer und einen Zähler. Beim Anlegen der Statemachine wird der Timer auf den ersten Zeitpunkt gesetzt und der Zähler auf den Startwert gesetzt. Wird der Code ausgeführt, zählt das Lambda den Zähler um eins nach oben, führt die passenden Befehle aus und rescheduled den Timer zum Abschluss auf den nächsten Ausführungszeitpunkt. Dabei können bei jedem Durchlauf beliebige Befehle ausgeführt werden, auch der gewählte Zeitpunkt ist komplett wahlfrei, nur muss er nach dem aktuellen Zeitpunkt liegen (Zeitmaschine geht leider immer noch nicht).
Wenn Du die Itemnamen geschickt wählst, kannst Du mit einer Rule, einer Gruppe und zwei Triggern alles erschlagen. Dabei läuft das Ganze dann so ab:
Die Rule triggert sowohl auf Sonnenauf- wie Sonnenuntergang. In der Rule wird geprüft, ob es nach 12 Uhr mittags ist (darüber kann man zuverlässig entscheiden, ob die Sonne steigt oder sinkt).
Es wird ein passender Timer angelegt. Im Lambda wird die Gruppe durchlaufen, wobei ein Filter die Itemnamen auf passende Items einschränkt (z.B. ost, sued oder west als Bestandteil des Namens) und diese Items dann passend verfährt, sowie zum Abschluss den nächsten Schritt vorbereitet. Eine Rule, eine Gruppe, ein Schrittzähler.
Mit etwas Aufwand könnte man sogar noch individuelle Höhen für die Läden vorgeben, obwohl die Steuerung über eine Gruppe läuft. Man muss dafür die Sollhöhen in einer Art Tabelle vorhalten (z.B. mit einem Array oder einer Hash Table), hier kann man sich natürlich die Frage stellen, ob sich der Aufwand dafür lohnt.
Wenn Du innerhalb einer Rule einen Timer erzeugst, läuft der Code dieser Rule ohne Verzögerung weiter. Es wird nur das Lambda gemeinsam mit dem Startzeitpunkt an den Scheduler übertragen, der im Gegenzug einen Zeiger zurück liefert. Diesen kann man in einer Timer Variablen speichern und hat damit einen Handler, mit dem man den Timer abbrechen oder auch neu planen kann (solange der Timer noch nicht abgelaufen und die Ausführung des Lambdas beendet ist).
Wenn Du also zu drei verschiedenen Zeitpunkten, die sich fix auf den Sonnenaufgang beziehen, Läden verfahren willst, schreibst Du eine Rule, die drei Timer anlegt. Erzeuge dazu drei Timer Variablen, für jeden Timer eine.
Alternativ kannst Du auch eine Statemachine bauen. Die Statemachine nutzt einen Timer und einen Zähler. Beim Anlegen der Statemachine wird der Timer auf den ersten Zeitpunkt gesetzt und der Zähler auf den Startwert gesetzt. Wird der Code ausgeführt, zählt das Lambda den Zähler um eins nach oben, führt die passenden Befehle aus und rescheduled den Timer zum Abschluss auf den nächsten Ausführungszeitpunkt. Dabei können bei jedem Durchlauf beliebige Befehle ausgeführt werden, auch der gewählte Zeitpunkt ist komplett wahlfrei, nur muss er nach dem aktuellen Zeitpunkt liegen (Zeitmaschine geht leider immer noch nicht).
Wenn Du die Itemnamen geschickt wählst, kannst Du mit einer Rule, einer Gruppe und zwei Triggern alles erschlagen. Dabei läuft das Ganze dann so ab:
Die Rule triggert sowohl auf Sonnenauf- wie Sonnenuntergang. In der Rule wird geprüft, ob es nach 12 Uhr mittags ist (darüber kann man zuverlässig entscheiden, ob die Sonne steigt oder sinkt).
Es wird ein passender Timer angelegt. Im Lambda wird die Gruppe durchlaufen, wobei ein Filter die Itemnamen auf passende Items einschränkt (z.B. ost, sued oder west als Bestandteil des Namens) und diese Items dann passend verfährt, sowie zum Abschluss den nächsten Schritt vorbereitet. Eine Rule, eine Gruppe, ein Schrittzähler.
Mit etwas Aufwand könnte man sogar noch individuelle Höhen für die Läden vorgeben, obwohl die Steuerung über eine Gruppe läuft. Man muss dafür die Sollhöhen in einer Art Tabelle vorhalten (z.B. mit einem Array oder einer Hash Table), hier kann man sich natürlich die Frage stellen, ob sich der Aufwand dafür lohnt.