Wochenende, Feiertage und Schulferien

Aus FHEMWiki
Zur Navigation springen Zur Suche springen

FHEM bietet mehrere Möglichkeiten, Komponenten in Abhängigkeit von Wochenenden, Feiertagen oder sogar Schulferien zu steuern.

Eine simple Rollladensteuerung um 7 Uhr morgens sieht beispielsweise wie folgt aus:

define RolloHoch at *07:00 set Rollo hoch

Um am Wochenende (Samstag und Sonntag) länger schlafen zu können, kann diese Steuerung durch Nutzung der Variable $we erweitert werden. Diese hat am Wochenende den Wert 1, an sonstigen Tagen den Wert 0. In if-Abfragen wird die 0 als false/falsch interpretiert, andere numerische Werte als true/wahr. Man kann mittels if ($we) also ganz einfach prüfen, ob Wochenende ist und entsprechend steuern (oder auch nicht). Das o.a. Beispiel kann entsprechend ergänzt werden, so dass am Wochenende nicht um 7 Uhr das Rollo nach oben gefahren wird:

define RolloHoch at *07:00 { if (!($we)) { fhem("set Rollo hoch");; } }

Das ! in der if-Abfrage negiert den dahinter folgenden Ausdruck in der Klammer, quasi ein "ist nicht Wochenende". Der Inhalt der äußeren geschweiften Klammern stellt echten Perl-Code dar (welche hinter jeder Anweisung gerne ein Semikolon stehen hat, welches in FHEM durch ein weiteres Semikolon maskiert/escaped werden muss). Aus dem Perl-Code kann man mittels des Befehls fhem() wiederum FHEM-Code ausführen (hier der Befehl, um das Rollo nach oben zu fahren). Das (Doppel-)Semikolon ist in diesem Beispiel nicht zwingend notwendig, da es sich nur um eine einzige (und somit letzte) Anweisung handelt - man sollte sich jedoch aneignen, jede Anweisung im Perl-Code mit einem (Doppel-)Semikolon abzuschließen (eine schließende geschweifte Klammer stellt auch das Ende eine Anweisung bzw. eines Anweisungsblocks dar).

Samstags und Sonntags bleibt das Rollo nun unten und man kann länger schlafen. Um diesen Komfort auch an Feiertagen zu haben, können in FHEM mittels holiday-Dateien Feiertage definiert werden. Sinnvollerweise erstellt man sich für sein jeweiliges Bundesland eine eigene Datei, welche Definitionen für feste Feiertage (z.B. Weihnachten oder der Tag der Deutschen Einheit) und solche in Abhängigkeit zu Ostern (z.B. Ostermontag oder Pfingsten, im Rheinland auch der Karneval) beinhaltet. Eine gutes Beispiel mit Erklärung findet sich in der FHEM-Übersicht für Anfänger. Nachdem beispielsweise die NRW_Feiertag.holiday-Datei im FHEM-Ordner erstellt/abgelegt wurde, kann diese in die Konfiguration eingebunden werden. Mittels holiday2we können die darin definierten Feiertage mit der Variable $we "verheiratet" werden. if ($we) ist danach immer wahr, sobald Wochenende oder ein Feiertag ist:

attr global holiday2we NRW_Feiertag
define NRW_Feiertag holiday

Theoretisch kann man in o.a. Datei auch seine persönlichen Urlaube oder die Schulferien definieren. Hier eignet sich jedoch die Calendar-Funktion wesentlich besser. V.a. die Schulferien der einzelnen Bundesländer sind im Internet (z.B. unter schulferien.org) als iCal-Datei verfügbar und können wie folgt in FHEM eingebunden werden:

define NRW_Ferien Calendar ical url http://www.schulferien.org/iCal/Ferien/icals/Ferien_Nordrhein_Westfalen_2013.ics 43200

Das Intervall von 43200 Sekunden (entspricht 12 Stunden) für die Aktualisierung der Schulferien sollte im Normalbetrieb mehr als ausreichen. Wenn eigene Kalender (z.B. bei Google) für Urlaubstage genutzt werden, muss man individuell abwägen, wie oft dieser aktualisiert werden soll.

Um nun diesen Kalender nun nutzen zu können, benötigt FHEM einen dummy, welcher entsprechend abgefragt werden kann:

define NRW_Ferientag dummy
define NRW_Ferien.notify notify NRW_Ferien { \
 fhem "set NRW_Ferientag " . (ReadingsVal("NRW_Ferien", "modeStart", "") =~ "schulferien" ? 1: 0) }

Der NRW_Ferientag ist in diesem Beispiel der angesprochene dummy und kann mittels Value("NRW_Ferientag") abgefragt werden. Im notify wird der Wert gesetzt, sobald der Kalender aktualisiert wird: Eine 1für einen Tag, an dem der Text "schulferien" in einem Ereignis vorkommt, welches sich im modeStartModus (vgl. CommandRef - The start time has passed but the end time of the calendar event is not yet reached.) befindet, ansonsten 0. Das Vorkommen des Textes ist in den Ereignissen der oben genutzten Quelle immer der Fall.

Um ein Rollo nun weder am Wochenende, an Feiertagen, noch zu Schulferien morgens hochfahren zu lassen, lautet das Beispiel:

define RolloHoch at *07:00 { if ( !($we) && !(Value("NRW_Ferientag")) ) { fhem("set Rollo hoch");; } }

Ausgehend von diesem Artikel ist unter Google-Kalender zur Steuerung von Dummies eine Vorgehensweise zur Steuerung von FHEM mit dem Google-Kalender veröffentlicht.