mich hat die ganze Zeit geärgert, das ich Ferienzeiten und Feiertage nicht automatisch von einer zuverlässigen Quelle in mein openHab importiert bekomme. Ich konnte keinen kostenfreien und zuverlässigen Webservice finden, der diese Informationen in brauchbarer Form liefert. "Feiertag API's" gibt es eine Menge, aber Feiertage könnte ich auch berechnen. Schulferien sind nicht zu berechnen und die einzig zuverlässigen Quellen bieten keine API , sondern ICAL Downloads an.
Also habe ich mich für http://www.schulferien.org entschieden. Auf dieser sehr gut gepflegten Seite können diverse ICAL Kalender mit Ferienterminen und Feiertagen heruntergeladen werden.
Hier also meine Lösung:
1) Die Items die ich verwende:
Die beiden ICAL Items laden in meinem Fall alle zwei Stunden (Millisekunden: 7200000) via http binding den jeweils gewünschten ICAL Kalender.
Bei mir Ferien in NRW für das aktuelle Jahr ("%1$tY") und die Feiertage in NRW für das aktuelle Jahr ("%1$tY"). Die geladenen ICAL Informationen werden für die weitere Transformation an den Java Script transformation service (Bei mir Script: ical_holiday.js) von openHab übergeben.
Für mich war dies der einfachste Weg, da mit ein paar Zeilen Javascript die Aufgabe zu erledigen ist.
Der Schalter "GlobalHoliday" wird für weitere Regeln etc. genutzt und das String Item "GlobalHolidayName" enthält entweder den Namen des Feiertags oder der Ferien.
Code: Alles auswählen
String GlobalSpecialDayICAL
{http="<[http://www.schulferien.org/iCal/Feiertage/icals/Feiertage_Nordrhein_Westfalen_%1$tY.ics:7200000:JS(ical_holiday.js)]"}
String GlobalHolidayICAL
{http="<[http://www.schulferien.org/iCal/Ferien/icals/Ferien_Nordrhein_Westfalen_%1$tY.ics:7200000:JS(ical_holiday.js)]"}
Switch GlobalHoliday
(gSystem)
String GlobalHolidayName
Wie so oft habe ich auch hier das Rad nicht komplett neu erfunden. Ich habe den iCalendar javascript parser (https://code.google.com/p/ijp/) ijp als Basis verwendet. Auf dieser Basis liefert das Transformation Script ein false zurück, wenn das aktuelle Datum (heute) kein Event im übergebenen Kalender enthält. Wenn ein Event gefunden wird, entspricht der Rückgabewert dem Namen (summary) des entsprechenden Elements.
Im angefügten Textfile findet Ihr die vollständige Transformations Funktion.
3) Die passende Rule:
Die Regel übersetzt die Rückmeldung aus dem Transformations Script auf die Items GlobalHoliday und GlobalHolidayName.
Sobald sich der Wert der balden ICAL Items ändert, prüfe ich den Status und setze die entsprechenden Items.
Code: Alles auswählen
/**
* Ferien und Feiertage prüfen
*/
rule "Event_Holiday"
when
Item GlobalHolidayICAL changed or
Item GlobalSpecialDayICAL changed
then
//Prüfen ob ein Feiertag ist
if (GlobalSpecialDayICAL.state != "false" && GlobalSpecialDayICAL.state != "Uninitialized"){
postUpdate(GlobalHoliday,ON)
postUpdate(GlobalHolidayName,GlobalSpecialDayICAL.state)
logInfo("HomeBox.SystemRules:Event_Holiday", "GlobalSpecialDayICAL changed: Updated Holiday Status: " + GlobalHoliday.state + " (" + GlobalHolidayName.state + ")")
}
// Prüfen ob Ferien sind
else if (GlobalHolidayICAL.state != "false" && GlobalHolidayICAL.state != "Uninitialized"){
postUpdate(GlobalHoliday,ON)
postUpdate(GlobalHolidayName,GlobalHolidayICAL.state)
logInfo("HomeBox.SystemRules:Event_Holiday", "GlobalHolidayICAL changed: Updated Holiday Status: " + GlobalHoliday.state + " (" + GlobalHolidayName.state + ")")
} else {
postUpdate(GlobalHoliday,OFF)
postUpdate(GlobalHolidayName,"false")
logInfo("HomeBox.SystemRules:Event_Holiday", "Updated Holiday Status: " + GlobalHoliday.state + " (false)")
}
end
Ich hoffe es nutzt noch jemand anderem und funktioniert zuverlässig. Wenn jemand Anmerkungen hat ... immer her damit!
Viele Grüße,
Seppy