von Schedules und Triggern

Regelmässige Ausführung mit Schedule

In den vorherigen Posts habe ich häufig folgenden Ausdruck verwendet:

schedule({'* * * * *'}, function(){})

Dies bewirkt, dass die als zweites Argument genannte Funktion zu Zeiten ausgeführt wird, die das erste Argument vorgibt. Dabei stehen die Sterne von rechts nach links für Wochentag, Monat, Tag im Monat, Stunde, Minute. Wenn noch ein sechster Stern vorhanden ist, dann steht der ganz links für Sekunden.

So bedeutet beispielsweise "10 * * * *", dass etwas jeden Tag jede Stunde zur 10. Minute ausgeführt wird. Oder "10 7 * * *", dass etwas jeden Tag um 07:10 Uhr dran ist. Wichtig ist, dass man die "10" in obigem Beispiel nicht mit "alle 10 Minuten" verwechselt. Dies wurde man mit "10,20,30,40,50 * * * *" oder mit
 "*/10 * * * * " erreichen.

Glücklicherweise muss man sich mit derartigen Codes nicht wirklich herumschlagen, ein Klick auf "Cron" rechts oben lässt einen komfortabel einstellen, wann die Funktion ausgeführt wird.

Wie auch immer. Was wir hier tun ist: wir sehen in regelmässigen Abständen nach, ob ein interessierender Zustand ("Fernseher läuft") eingetreten ist. Das erscheint ein wenig übertrieben aufwändig. Wieso kann uns das System nicht einfach mitteilen, wenn der Fernseher eingeschaltet wurde?

Genau das kann man mit "Triggern" oder "Subscriptions" machen.

Fernsehlicht zweite Version, mit Triggern



Anstatt in einer Schleife immer wieder zu fragen, ob eines der interessierenden Ereignisse (Sonne untergegangen, Fernseher an) eingetreten ist, können wir ioBroker anweisen, uns immer dann zu informieren, wenn ein solches Ereignis eintritt. Dies erledigt die Funktion 'on' oder 'subscribe'.

Im ersten Block ab Zeile 8 setzen wir einen Timer, der jeden Tag, wenn der Zeitpunkt "15 Minuten vor Sonnenuntergang" eingetreten ist, prüft, ob der Fernseher an ist. Wenn ja, schalten wir das Licht ein.

In der zweiten Abfrage ab Zeile 15 sehen wir eine Subscription auf das Ereignis "Fernseher wird eingeschaltet". Dann prüfen wir, ob nicht mehr Tag ist und schalten ggf. das Licht ein.

Der Grund für diese doppelte Abfrage ist: Wenn man den Fernseher erst nach Sonnenuntergang einschaltet, würde er von der ersten Bedingung nicht erfasst, und wenn die Sonne untergeht, während der Fernseher schon eingeschaltet ist, würde das von der zweiten Bedingung nicht erfasst, Es braucht also beide.

Die Subscription ab Zeile 22 schaltet das Licht wieder aus, wenn der Fernseher ausgeschaltet wird, und die Schedule ab Zeile 27 tut dasselbe, wenn der Zeitpunkt "Sonnenaufgang" erreicht ist.

Also: "Schedules" warten auf bestimmte Zeitpunkte oder Serien von Zeitpunkten, um die übergebene Funktion auszuführen, während "Subscriptions" auf Ereignisse warten.

Es gibt eine Vielzahl von Ereignissen, die Sie per Subscriptions abonnieren können. Eine ausführliche Liste finden Sie hier.

In gewisser Weise ist dieses Script eleganter, als das Erste mit der Schedule-Schleife. Im Grunde spielt es aber keine Rolle, welche Methode man bevorzugt. "Unter der Haube" werden manche Subscriptions ohnehin als Schedules ausgeführt. (ioBroker kann nur dann "echte" Ereignisse melden, wenn der entsprechende Adapter solche Ereignisse liefert. Andernfalls muss er den Adapter immer wieder abfragen ("pollen"), ob ein Zustand eingetreten ist, und daraus dann eine Trigger-Meldung erstellen.)


zum ersten Teil - zum vorigen Teil - zum nächsten Teil




Kommentare

Beliebte Posts aus diesem Blog

myStrom WiFi Button an ioBroker anbinden

Einfache Script-Beispiele