Ephemeris bietet die Möglichkeit eigene "Feiertage" in XML-Dateien anzulegen. In der Dokumentation (https://www.openhab.org/docs/configura…m-bank-holidays) ist ein Beispiel mit Geburtstagen. Da ich die Geburtstage aktuell schon im Google-Kalender pflege, habe ich mir gedacht ein kleines Script zu erstellen, dass diese aus dem Kalender in eine Ephemeris-XML-Datei überführt. Das Script ist ziemlich "quick and dirty" also steinigt mich bitte nicht. Für mich erfüllt es seinen Zweck und vielleicht ist es für andere auch interessant. Es ist egal welcher Kalender verwendet wird, solange es einen iCalender-Export gibt (habe es auch mit dem Müllabfuhr-Kalender der Stadt getestet).
Ich nutze das Script direkt auf meinem Raspberry Pi mit openHABian. Dort war, node und npm vorinstalliert, was die Voraussetzungen sind. Warum ich jetzt Node genutzt habe, war zufällig. Habe erstmal geschaut, was auf dem Pi schon installiert ist und auf Python hatte ich keine Lust. Man kann das Script natürlich auch lokal ausführen und dann auf openHAB kopieren.
Hier das Script:
const ICS = require('node-ical');
const FS = require('fs');
const MONTHS = [
'JANUARY', 'FEBRUARY', 'MARCH', 'APRIL', 'MAY', 'JUNE', 'JULY', 'AUGUST', 'SEPTEMBER', 'OCTOBER', 'NOVEMBER',
'DECEMBER'];
const ICS_FILE_URL = 'https://xxx.ics';
const OUTPUT_FILE_PATH = '/srv/openhab2-conf/services/wichtige-tage.xml';
ICS.fromURL(ICS_FILE_URL, {}, function (err, data) {
let xmlFileContent = '<?xml version="1.0" encoding="UTF-8"?>\n' +
'<tns:Configuration hierarchy="us" description="United States"\n' +
'\txmlns:tns="http://www.example.org/Holiday" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n' +
'\txsi:schemaLocation="http://www.example.org/Holiday /Holiday.xsd">\n' +
'\t<tns:Holidays>\n';
for (let k in data) {
if (data.hasOwnProperty(k)) {
const ev = data[k];
if (data[k].type === 'VEVENT') {
console.[definition='1','0']log[/definition]("Monat: " + MONTHS[ev.start.getMonth()] + " Tag: " + ev.start.getDate() +
" Zusammenfassung: " + ev.summary);
xmlFileContent += '\t\t<tns:Fixed month="' + MONTHS[ev.start.getMonth()] + '" day="' +
ev.start.getDate() + '" descriptionPropertiesKey="' + ev.summary + '" />\n';
}
}
}
xmlFileContent += '\t</tns:Holidays>\n' +
'</tns:Configuration>\n';
FS.writeFile(OUTPUT_FILE_PATH, xmlFileContent, function (err) {
if (err) throw err;
});
});
Alles anzeigen
Im Script muss bei ICS_FILE_URL die URL zur iCalendar-Datei angegeben werden. Im Google-Kalender findet man das in den Kalender-Einstellungen ganz unten unter "Privatadresse im iCal-Format". Außerdem kann man bei OUTPUT_FILE_PATH noch den Pfad und Dateinamen anpassen, falls man denn möchte. Danach legt man das Script in einem extra Ordner ab (bei mir /home/openhabian/iCal-Ephemeris). Übers Terminal führt man dann in diesem Ordner npm init und npm install node-ical (Abhängigkeit) einmalig aus. Danach kann man mit node wichtige-tage.js das Script ausführen. Wenn man weitere XML-Dateien und Kalender nutzen möchte, kann man natürlich die Datei einfach kopieren und die Konstanten anpassen. Ich nutze es aktuell noch für den Müllabfuhrkalender (obwohl es bzgl. Feiertage) nicht ganz sinngemäß ist. Für diesen Mühllabfuhr-Kalender musste ich das Script aber leicht anpassen, da der Aufbau etwas abweicht. Man könnte das Script auch über einen Cronjob laufen lassen, falls sich der Kalender regelmäßig ändert. Dabei ist jedoch zu beachten, dass openHAB die XML-Dateien im Cache hält, sodass ein Neustart (sudo systemctl restart openhab2.service) bei Änderungen nötig ist. Zur Vervollständigung hänge ich hier noch Items, Sitemap und Rule an. Wer mag, kann ja hier aufhören zu lesen… Anmerkungen, Ideen, Verbessungen, usw. sind erwünscht!
// Wichtige Tage
Group WichtigeTage (Allgemein)
String WichtigeTage_NaechstesEvent "Nächstes Event [%s]" <error> (WichtigeTage)
Number WichtigeTage_TagesBisNaechstesEvent "Nächstes Event in [%s Tagen]" <error> (WichtigeTage)
Frame label="Wichtige Tage" {
Text item=WichtigeTage_NaechstesEvent
Text item=WichtigeTage_TagesBisNaechstesEvent valuecolor=[<3="red", <8="orange"]
}
rule "Aktualisiere Wichtige Tage Daten (Systemstart oder täglich 1 Uhr)"
when
System started or Time cron "0 0 1 1/1 * ? *"
then
val NAECHSTES_EVENT = Ephemeris.getNextBankHoliday(XML_WICHTIGE_TAGE)
WichtigeTage_NaechstesEvent.sendCommand(NAECHSTES_EVENT)
logInfo("Nächstes Event", NAECHSTES_EVENT)
val TAGE_BIS_NAECHSTES_EVENT = Ephemeris.getDaysUntil(NAECHSTES_EVENT, XML_WICHTIGE_TAGE)
WichtigeTage_TagesBisNaechstesEvent.sendCommand(TAGE_BIS_NAECHSTES_EVENT)
logInfo("Tage bis nächstes Event", "" + TAGE_BIS_NAECHSTES_EVENT)
end
Alles anzeigen