DOIF/Zeitschaltuhr mit Calendar

Aus FHEMWiki
Wechseln zu: Navigation, Suche

Das DOIF Modul erlaubt es, durch Ereignisse oder zeitgesteuert, wenn bestimmte Bedingungen erfüllt sind, bestimmte Aktionen auszuführen. Eine mögliche Quelle für solche Ereignisse oder Bedingungen ist das Calendar Modul, das einen Kalender repräsentiert. Die folgenden Beispiele zeigen, wie man innerhalb von DOIF auf Ereignisse, die von Calendar erzeugt werden, reagieren kann, und wie man aus Calendar Bedingungen ableiten kann, in Abhängigkeit derer sich Aktionen auslösen lassen.

Im folgenden soll angenommen werden, dass es ein Gerät von Typ Calendar namens calendar gibt, auf das reagiert werden soll. Alle Beispiele benutzen den FHEM Modus des DOIF, können aber auch auf den Perl-Modus umgeschrieben werden.

Schalten mit Calendar Ereignissen

Die folgenden Beispiele zeigen, wie man mittels DOIF auf Ereignisse eines Calendar Gerätes reagieren kann. Diese werden ausgelöst, wenn ein Kalendereintrag seinen Status ändert.

Calendar Ereignisse

Wenn ein Eintrag im Kalender seinen Status ändert, werden zwei Ereignisse erzeugt:

changed: <UID> <mode>
<mode>: <UID>

Hier ist <UID> die UID des Kalendereintrags und <mode> der neue Status (upcoming, alarm, start oder end).

Triggern auf alle Kalendereinträge

Soll auf alle Statuswechsel von Kalendereinträgen getriggert werden, so geht dies mit

([calendar:"^changed:"])

Soll dagegen z.B. nur auf startende Kalendereinträge getriggert werden, geht dies mit

([calendar:"^start:"])

Innerhalb des Ausführungsteils lässt sich dann $EVENT auswerten, wie dies in Google-Kalender zur Steuerung von Dummies mittels Notify dargestellt ist.

Triggern auf eine bestimmte UID

Soll dagegen nur auf einen Eintrag mit einer bestimmten, bekannten UID getriggert werden, geht dies z.B. mit

([calendar:"^end: event123xyz$"])

Ist die UID dagegen nicht bekannt, wenn das DOIF programmiert wird, sondern wird z.B. in einem Reading namens uid des DOIF abgelegt, lässt sich wie folgt auf das Ende des Kalendereintrags triggern:

(["^calendar$":"^end: (.*)$":$1,""] eq [$SELF:uid])

Hier wird mittels Rückgabewert die UID des Kalendereintrags ermittelt und mit dem gespeicherten Reading verglichen.

Triggern auf Einträge mit bestimmten Eigenschaften

Soll nicht die UID überprüft werden, sondern der Inhalt eines Kalendereintrags, so lässt sich dafür die Ausgabeformatierung des DOIF Moduls nutzen, um den Inhalt abzufragen. Um z.B. zu triggern, wenn ein Event beginnt, dass in Feld summary das Wort "Erna" enthält:

(["^calendar$":"^start: (.*) end$":fhem("get calendar events filter:uid==\"$1\" format:custom=\"\$S\""),""] =~ "Erna")

Triggern beim Ende aller Einträge, die als "PUBLIC" klassifiziert sind:

(["^calendar$":"^end: (.*) end$":fhem("get calendar events filter:uid==\"$1\" format:custom=\"\$CL\""),""] eq "PUBLIC")

Schalten in Abhängigkeit des Calendar Status

Soll nicht zum Zeitpunkt eines Statuswechsels reagiert werden, sondern durch einen anderen Auslöser, aber in Abhängigkeit von Kalendereinträgen, so kann dies wie folgt realisiert werden.

Abfragen von Kalendereinträgen

Das Calendar Modul bietet den folgenden, sehr umfangreichen Befehl zum Abruf von Kalendereinträgen:

get <name> events [format:<formatSpec>] [timeFormat:<timeFormatSpec>] [filter:<filterSpecs>] [series:next[=<max>]] [limit:<limitSpecs>] [include:<names>] [returnType:<returnTypeSpec>]

Diese lässt sich mittels der Perl-Funktion fhem() auch innerhalb von DOIF nutzen. Hier ist zu beachten, dass die Funktion undef zurückgibt, wenn keine Einträge vorhanden sind, die auf die gefragten Kriterien passen, was sich mittels defined überprüfen lässt.

Triggern auf Einträge heute oder morgen

Um jeden Tag um 6:00 zu triggern, wenn an diesem Tag "Schule" (zu einer beliebigen Uhrzeit) im Kalender steht:

([06:00] and defined fhem('get calendar filter:field(summary)=="Schule" limit:when=today'))

Um jeden Tag um 21:00 zu triggern, wenn am nächsten Tag etwas mit "Tonne" im Kalender steht:

([21:00] and defined fhem('get calendar filter:field(summary)=~"Tonne" limit:when=tomorrow'))

Triggern, wenn Kalendereintrag aktiv ist

Um jeden Tag um 7:00 zu triggern, wenn der Kalender einen Eintrag "Arbeitstag" enthält (als ganztägigen Eintrag, mit Anfang und Ende jeweils im Mitternacht, sodass sich das Ereignis den ganzen Tag im Status start befindet):

([07:00] and defined fhem('get calendar filter:mode=="start",field(summary)=="Arbeitstag"'))

Soll dagegen an markierten Tagen nicht getriggert werden, z.B. von 7:00-8:00, aber nicht an Ferientagen:

([07:00-08:00] and !defined fhem('get calendar filter:mode=="start",field(summary)=="Ferientag"'))

Trigger zur vollen Stunde, außer zu Ruhezeiten:

([:00] and !defined fhem('get calendar filter:mode=="start",field(summary)=="Ruhezeit"'))

Trigger auf Frost, aber nur, wenn zu dieser Zeit geheizt werden soll:

([temperature < 0] and defined fhem('get calendar filter:mode=="start",field(summary)=="Heizung"'))

Triggern, wenn Ereignis bevorsteht oder stattgefunden hat

Wenn ein Trigger ausgelöst werden soll, bevor ein Kalendereintrag aktiv wird, oder nachdem das Ereignis vorbei ist (z.B. um vor einer Party die Heizung einzuschalten, und danach den Staubsauger) kann man den Zeitfilter benutzen. Um zu jeder vollen Stunde zu testen, ob innerhalb der nächsten 6 Stunden eine Party beginnt:

([:00] and defined fhem('get calendar events filter:mode=~"alarm|upcoming",field(summary)=~"Party" limit:from=05:00,to=06:00'))

Entsprechendes, wenn die Party seit 4 Stunden vorbei ist:

([:00] and defined fhem('get calendar events filter:mode=="end",field(summary)=~"Party" limit:from=-04:00,to=0'))

Komplexere Beispiele

Die folgenden Beispiele zeigen ein paar Anwendungen.

Heizung einschalten 6 Stunden bevor Besuch kommt, ausschalten wenn Besuch geht

([:00] and defined fhem('get calendar events filter:mode=~"alarm|upcoming",field(summary)=~"Besuch" limit:from=0,to=06:00'))
	(set heating on)
DOELSEIF (["^calendar$":"^end: (.*)$":fhem("get calendar events filter:uid==\"$1\" format:custom=\"\$S\""),""] =~ "Besuch")
	(set heating off)

Links