FHEM > Codeschnipsel

automatisiertes Definieren und Einbinden von Feiertagen/Schulferien als ical

(1/11) > >>

Ralli:
Hallo zusammen,

um zukünftige iCals von Feiertagen oder/und Ferien einzubinden (vorausgesetzt, sie sind an der entsprechenden URL zu finden), habe ich mir folgende at-Definitionen gebastelt:


--- Code: ---define Neuer_Ferien_Kalender_Check at *10:00 {if ((strftime "%d-%m",localtime) eq "30-12"){fhem ("define Ferien".((strftime "%Y",localtime)+1)." Calendar ical url http://www.schulferien.org/iCal/Ferien/icals/Ferien_Rheinland_Pfalz_".((strftime "%Y",localtime)+1).".ics");; fhem("save")}}

--- Ende Code ---


--- Code: ---define Neuer_Feiertags_Kalender_Check at *10:00 {if ((strftime "%d-%m",localtime) eq "30-12"){fhem ("define Feiertage".((strftime "%Y",localtime)+1)." Calendar ical url http://www.schulferien.org/iCal/Feiertage/icals/Feiertage_Rheinland_Pfalz_".((strftime "%Y",localtime)+1).".ics");; fhem("save")}}

--- Ende Code ---

Damit wird erreicht, dass jeden Tag um 10 Uhr geprüft wird, ob wir den 30.12. haben (at oder DOIF unterstützen bis jetzt keine Datums-Definitionen). Ist dies der Fall, wird ein neues Calendar-Device mit Namen Ferien20xy bzw. Feiertage20xy angelegt - allerdings ohne entsprechende Prüfung, wir gehen einfach aus, dass der Link bzw. das iCal-File existiert!

Die Auswertung bezüglich eines tatsächlichen Ferien- oder Feiertages läuft dann angelehnt an Wiki wie folgt:


--- Code: ---define Feiertag dummy
define Feiertag_Check notify Feiertage[0-9]*:modeStart.* {ReadingsVal("Feiertage".(strftime "%Y",localtime), "modeStart", "") =~ "schulferien"? fhem("set Feiertag 1"): fhem("set Feiertag 0")}

--- Ende Code ---


--- Code: ---define Ferientag dummy
define Ferientag_Check notify Ferien[0-9]*:modeStart.* {ReadingsVal("Ferien".(strftime "%Y",localtime), "modeStart", "") =~ "schulferien"? fhem("set Ferientag 1"): fhem("set Ferientag 0")}

--- Ende Code ---

FHEMAN:
Hi Ralli,

danke, dass du den Code hier veröffentlichst!
Für die Faulen: das aktuelle Jahr wird erstellt mit

--- Code: ---{fhem ("define Feiertage".((strftime "%Y",localtime))." Calendar ical url http://www.schulferien.org/iCal/Feiertage/icals/Feiertage_Sachsen_Anhalt_".((strftime "%Y",localtime)).".ics")}

--- Ende Code ---
in der Kommandozeile oben + SAVE nicht vergessen.
Übrigens sind schon jetzt die Feiertag ics Dateien für die nächsten hundert Jahre verfügbar :)

Prof. Dr. Peter Henning:
Hm, dieses Codebeispiel hat den Nachteil, dass in jedem Jahr ein neues Calendar-Device aufgemacht wird. Das bedeutet, dass alle weiteren Routinen umgeschrieben werden müssen.

Also besser: Am 30.12. das alte löschen. Dann neu anlegen mit den Daten vom kommenden Jahr.

Auch erschließt sich mir nicht der Sinn eines getrennten Dummy für Feiertage und Ferientage, die jeweils nur einen booleschen Wert haben. M.E: besser, eine Funktion "getDayStatus()" einzuführen, die Werte "Feiertag", "Ferientag" etc. liefern kann und ggf. auch als Argument ein beliebiges Datum bekommt.

Zweite Schwäche: so wird jede Stunde der gesamte Kram geholt...

LG

pah

Ralli:
Nein, es muss keine Routine umgeschrieben werden, da der von mir verwendete Notify auf Events in den Readings modeStart aller dem Suchmuster entsprechenden Kalender reagiert, dabei das aktuelle Jahr allerdings für die Readingsabfrage verwendet, um dann entweder Ferientag oder Feiertag zu setzen.

Der zweite "Nachteil" ist auch nicht vorhanden, da Du im jeweiligen Calendar-Device das Poll-Intervall variieren kannst.

Prof. Dr. Peter Henning:
Ich habe mich doch eigentlich klar ausgedrückt: Erstens geht es nicht um den kleinen notify oben - sondern in einer komplexen FHEM-Installation greifen sicher mehr Routinen auf den Kalender zu.

Zweitens ist es unprofessionell, Mengen von alten Daten (etwa die Feiertage des abgelaufenen Jahres...) vorzuhalten (sogar in der Konfigurationsdatei steht davon noch etwas). _Wenn_ man das schon unbedingt in einem FHEM-Skript statt in einer ordentlichen und viel besser wartbaren Perl-Subroutine abhandeln will, sollte deshalb das andere Device mindestens deaktiviert, besser komplett gelöscht werden.

Drittens habe ich keinerlei Verständnis für das automatische Anlegen von Devices, wenn diese hinterher noch manuell bearbeitet werden müssen, um ihre Abfragefrequenz zu reduzieren.

Damit ich nicht nur kritisiere, sondern auch hier etwas Positives beitrage:

1. Zu Jahresbeginn wird (einmal, aber durchaus wiederholbar) der aktuelle Ferien- und Feiertagskalender geholt.
2. Diese beiden Dateien werden im FHEM-Verzeichnis abgelegt, können von dort aus einmal pro Tag überprüft und ggf. neu geladen werden.

Einen entsprechende Code werde ich in den nächsten Tagen mal hier posten.

LG

pah


Navigation

[0] Themen-Index

[#] Nächste Seite

Zur normalen Ansicht wechseln