Wochenende, Feiertage und Schulferien: Unterschied zwischen den Versionen

Aus FHEMWiki
Zur Navigation springen Zur Suche springen
K (schulferien.org durch Ferienwiki.de ersetzt, siehe https://forum.fhem.de/index.php?topic=65155.0)
(→‎Feiertage mittels Internet-Kalender: -> Hinweis auf Zwischenspeicherung des Ferienkalenders auf dem eigenen Server)
Zeile 21: Zeile 21:


== Feiertage mittels Internet-Kalender ==
== Feiertage mittels Internet-Kalender ==
{{Randnotiz|RNText=Alle 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 {{Link2Forum|Topic=36244|Message=299631}} 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 [http://www.ferienwiki.de ferienwiki.de]) als iCal-Datei verfügbar und können wie folgt in FHEM eingebunden werden:
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 [http://www.ferienwiki.de ferienwiki.de]) als iCal-Datei verfügbar und können wie folgt in FHEM eingebunden werden:



Version vom 27. Februar 2017, 16:14 Uhr

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

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

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 NRW_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 NRW_Ferientag dummy
 define NRW_Ferien.notify notify NRW_Ferien { \
        fhem "set BW_Ferientag " . (ReadingsVal("BW_Ferien", "modeStart", "") =~ "schulferien" ? 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 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("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.