DOIF/Zeitschaltuhr mit Calendar: Unterschied zwischen den Versionen

Aus FHEMWiki
Zur Navigation springen Zur Suche springen
(Triggern auf Calendar Ereignisse)
(Triggern auf Calendar Status)
Zeile 1: Zeile 1:
{{Baustelle}}
{{Baustelle}}


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 Aktionan auslösen lassen.
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.
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 ==
== 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 ===
=== Calendar Ereignisse ===
Zeile 34: Zeile 36:
  ([calendar:"^end: event123xyz$"])
  ([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:
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])
  (["^calendar$":"^end: (.*)$":$1,""] eq [$SELF:uid])
Zeile 51: Zeile 53:


== Schalten in Abhängigkeit des Calendar Status ==
== 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'))

Version vom 12. September 2020, 14:32 Uhr


Clock - Under Construction.svg An dieser Seite wird momentan noch gearbeitet.


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'))