Wochenende, Feiertage und Schulferien: Unterschied zwischen den Versionen

Aus FHEMWiki
Zur Navigation springen Zur Suche springen
K (Vorlage Link2CmdRef)
K ("Schulferien" exitiert nicht im iCal von Ferienwiki.de. Das war früher bei schulferien.org der Fall. Jetzt tauchen dort nur Osterferien, Pfingstferien, Sommerferien auf. Daher die Suchmatrix auf "ferien")
Zeile 34: Zeile 34:
   define BW_Ferientag dummy
   define BW_Ferientag dummy
   define BW_Ferien.notify notify BW_Ferien { \
   define BW_Ferien.notify notify BW_Ferien { \
         fhem "set BW_Ferientag " . (ReadingsVal("BW_Ferien", "modeStart", "") =~ "schulferien" ? 1: 0) }
         fhem "set BW_Ferientag " . (ReadingsVal("BW_Ferien", "modeStart", "") =~ "ferien" ? 1: 0) }


Der ''BW_Ferientag'' ist in diesem Beispiel der angesprochene ''dummy'' und kann mittels ''Value("BW_Ferientag")'' abgefragt werden. Im ''notify'' wird der Wert gesetzt, sobald der Kalender aktualisiert wird: Eine ''1'' für einen Tag, an dem der Text "schulferien" in einem Ereignis vorkommt, das sich im ''modeStart''Modus (vgl. {{Link2CmdRef|Anker=Calendar}} - ''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.
Der ''BW_Ferientag'' ist in diesem Beispiel der angesprochene ''dummy'' und kann mittels ''Value("BW_Ferientag")'' abgefragt werden. Im ''notify'' wird der Wert gesetzt, sobald der Kalender aktualisiert wird: Eine ''1'' für einen Tag, an dem der Text "ferien" in einem Ereignis vorkommt, das sich im ''modeStart''Modus (vgl. {{Link2CmdRef|Anker=Calendar}} - ''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:
Um ein Rollo nun weder am Wochenende, an Feiertagen, noch zu Schulferien morgens hochfahren zu lassen, lautet das Beispiel:

Version vom 18. März 2018, 21:33 Uhr

FHEM bietet die Möglichkeit, Komponenten in Abhängigkeit von Wochenenden und Schulferien sowie Feiertagen zu steuern. Hier soll beschrieben werden, wie Schulferien einbezogen werden.

Wochenendermittlung mit $we

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

Eine simple Rollladensteuerung um 7 Uhr morgens für jeden Tag sieht beispielsweise wie folgt aus:

define RolloHoch at *07:00 set Rollo hoch

Dieses 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, ist also "nicht Wochenende". Der Inhalt der äußeren geschweiften Klammern stellt echten Perl-Code dar (der hinter jeder Anweisung gerne ein Semikolon stehen hat, das 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).

Feiertage mittels holiday-Datei

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, die 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 BW_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 BW_Feiertag
 define BW_Feiertag holiday

Feiertage mittels Internet-Kalender

Info green.pngAlle x Stunden -wie hier dargestellt- einen unveränderten Jahres-Ferienkalender aus dem Internet erneut abzurufen ist nicht sinnvoll, da unnötige Abhängigkeiten des FHEM-Servers zur Verfügbarkeit des externen Servers entstehen. Zudem erzeugt dies unnötige Last auf dem externen Server. Besser ist es, nur einmal jährlich den Ferienkalender abzurufen und auf dem eigenen FHEM-Server zu speichern. Das Vorgehen ist beispielhaft in Beitrag beschrieben.

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 ferienwiki.de) als iCal-Datei verfügbar und können wie folgt in FHEM eingebunden werden:

 define BW_Ferien Calendar ical url https://www.ferienwiki.de/exports/ferien/2017/de/baden-wuerttemberg 86400

Das Intervall von 86400 Sekunden (entspricht 24 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, der entsprechend abgefragt werden kann:

 define BW_Ferientag dummy
 define BW_Ferien.notify notify BW_Ferien { \
        fhem "set BW_Ferientag " . (ReadingsVal("BW_Ferien", "modeStart", "") =~ "ferien" ? 1: 0) }

Der BW_Ferientag ist in diesem Beispiel der angesprochene dummy und kann mittels Value("BW_Ferientag") abgefragt werden. Im notify wird der Wert gesetzt, sobald der Kalender aktualisiert wird: Eine 1 für einen Tag, an dem der Text "ferien" in einem Ereignis vorkommt, das sich im modeStartModus (vgl. commandref/Calendar - 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("BW_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.

Diese Methode unterstützt jedoch nicht die Feiertagserkennung des DOIF-Moduls, speziell im Abschnitt Wochentagssteuerung. Hier wird nur der Status der $we-Variable abgefragt und die Methode mit dem eigenen Holiday-Kalender empfohlen.