Um regelmäßig seine Mülltonnen am Entsorgungstag am Straßenrand zu stellen, haben die meisten Personen einen Papierkalender im Haus. Viele Entsorger stellen aber auch die Abholdaten der Mülltonnen online oder per Kalender bereit
Für den Landkreis Dachau gibt es eine App (DAH-Müll) und eine Oberfläche zur Visualisierung. Leider kann man auf die Daten dort nicht direkt per ICS / iCalendar zugreifen (da haben sich die Zuständigen etwas sehr gutes einfallen lassen).
Deswegen muss man jetzt manuell einmal die Kalenderdaten pro Jahr dort exportieren und sie in einen eigenen Kalender importieren (geht auch, aber Anwenderfreundlich ist etwas anderes).
Der Anwendungsfall ist also einen Kalender auszulesen und am Vortag eine Erinnerung an die digitalen Endgeräte, Sprachsteuerungen oder Kalender zu senden. Dazu wird in openHAB das CalDAV-Binding verwendet.
Beispiele für die Verwendung findet Ihr hier bei onesmarthome.de oder im openhabforum.de.
Kalendereinrichtung
Im ersten Schritt besorgt man sich die iCalendar-Daten aus seinem jeweiligen Landkreis / Ort. Bei mir waren die Daten hier.
Leider musste ich die Inhalte noch etwas “umformatieren”:
- DTEND-Tag fehlt in den Kalenderdaten (ohne diese können die Daten nicht in der ownCloud verwendet werden)
- DTEND-Tag muss einen Tag nach dem DTSTART-Tag gesetzt sein (sonst können die Daten nicht in der ownCloud verwendet werden)
Danach habe ich in meinem System (hier ownCloud) einen Kalender “Müll” erstellt und die oben beschriebenen Daten importiert.
Danach kann ich folgenden Link für die weitere Integration verwenden:
https://URL/remote.php/dav/calendars/USER/CALENDAR/
Die URL, USER und CALENDAR müsst Ihr an eure Anforderungen anpassen.
Binding
Das CalDAV1-Binding wird wie folgt installiert:
Paper UI – Add-ons – Bindings – CalDAV Binding (personal) – INSTALL
ACHTUNG: Das CalDAV Binding (command) wird zur Steuerung und Präsenzmeldung verwendet und ist für diesen Beitrag nicht notwendig.
Services (caldavio.cfg)
Es wird die Datei services/caldavio mit folgendem Inhalt erstellt:
caldavio:Muell:url=https://URL/remote.php/dav/calendars/USER/CALENDAR/
caldavio:Muell:username=USER
caldavio:Muell:password=PASSWORD
caldavio:Muell:reloadInterval=60
caldavio:Muell:preloadTime=2880
caldavio:Muell:disableCertificateVerification=true
caldavio:Muell:charset=utf8
Die groß geschriebenen Wörter bitte mit euren Daten ergänzen. Wichtig war in meiner Konfiguration noch disableCertificateVerification (wahrscheinlich wegen meinen kostenlosen Zertifikaten) und charset auf UTF-8.
Den reloadInterval kann man zum Testen auch auf 1 Minute stellen.
Items (CalDAV.items)
Ich habe für zwei Kalendereinträge und Datumswerte die Items generiert (es können bei mir zwei Tonnen zum gleichen Tag abgeholt werden):
/* Müllkalender */
String CalDAV_Muell_1 "Erste Tonne [%s]" <calendar> { caldavPersonal="calendar:Muell type:EVENT eventNr:1 value:NAME" }
DateTime CalDAV_Muell_1_Date "Datum der Abholung [%1$td.%1$tm.%1$tY]" <calendar> { caldavPersonal="calendar:Muell type:EVENT eventNr:1 value:START" }
String CalDAV_Muell_2 "Zweite Tonne [%s]" <calendar> { caldavPersonal="calendar:Muell type:EVENT eventNr:2 value:NAME" }
DateTime CalDAV_Muell_2_Date "Datum der Abholung [%1$td.%1$tm.%1$tY]" <calendar> { caldavPersonal="calendar:Muell type:EVENT eventNr:2 value:START" }
Sitemap
In der Sitemap habe ich das recht einfach so dargestellt:
Frame label="Informationen" {
Frame label="Müllkalender"{
Text item=CalDAV_Muell_1
Text item=CalDAV_Muell_1_Date
Text item=CalDAV_Muell_2
Text item=CalDAV_Muell_2_Date
}
}
Rules (CalDAV.rules)
Nun erfolgt die Automatisierung und die Benachrichtigung in der Regel (das kann man bestimmt noch etwas eleganter “scripten”):
rule "Müllkalender"
when
//Time cron "0 * * ? * *" //every 1 Minute
Time cron "0 15 17 * * ?" //once per Day 17:15
//Item date_today changed
then
var String muelltonne_1
muelltonne_1 = CalDAV_Muell_1.state.toString
var String muelltonne_2
muelltonne_2 = CalDAV_Muell_2.state.toString
// Prüfung ob der Wert gefüllt ist (damit beim cast auf DateTimeType keine Fehlermeldung erscheint)
if (muelltonne_1 != "UNDEF") {
// Datum der Abholung wird mit dem aktuellen Datum verglichen
// die erste Bedingung prüft, ob das aktuelle Datum vor dem Ablaufdatum + 24 Std. liegt
// die zweite Bedingung prüft, ob das aktuelle Datum nach dem Datum der Abholung liegt
if (now.isBefore(new DateTime((CalDAV_Muell_1_Date.state as DateTimeType).getCalendar().getTime()).plusHours(24)) &&
now.isAfter(new DateTime((CalDAV_Muell_1_Date.state as DateTimeType).getCalendar().getTime()))) {
// Benachrichtigung per Telegram an Bot senden
if(muelltonne_2 == "UNDEF") {
sendTelegram("xxx_bot", "Müllkalender: %s", muelltonne_1)
logInfo("INFO","CalDAV.rules - Müllkalender: %s", muelltonne_1)
} else {
sendTelegram("xxx_bot", "Müllkalender: %s & %s", muelltonne_1, muelltonne_2)
logInfo("INFO","CalDAV.rules - Müllkalender: %s & %s", muelltonne_1, muelltonne_2)
}
}
}
end
Fazit
Die Anbindung des Kalenders in openHAB war relativ einfach. Etwas schwieriger hat sich die Anpassung der ICS-Datei aus meinem Landkreis gestaltet. Danach hat man recht einfach (nach ein paar Tests) seine Kalenderdaten angebunden.
In der Regel waren dann noch ein paar Workarounds notwendig, aber dann waren die Daten auch richtig vorhanden. Die Konvertierung in UTF-8 / Unicode war nicht so einfach in der cfg zu finden. Auch den CRON-Job nur einmal am Tag zu einer bestimmten Zeit auszuführen war für einen “Nicht-UNIXer” nicht das einfachste 😉
Nun bekomme ich aber am Vortag um 17:15 Uhr eine Information per Telegram, dass die Müllabfuhr am nächsten Tag kommt.
Habt Ihr noch Ideen für die weitere Anbindung von Kalenderdaten? Habt Ihr eine Präsenzmeldung oder Steuerung eures SmartHome damit realisiert?