Digitalisierung

openHAB XI: Müllkalender per ical einbinden – OH 3.0

Geschätzte Lesezeit: 8 Minuten.

Mein Haus soll mich erinnern, wann ich Mülltonnen herausrollen soll. In einem vorigen Artikel hatte ich meine Bemühungen ausführlich dokumentiert, wie ich dieses Szenario für openHAB 2 implementiert hatte. Das hat auch funktioniert – und dann habe ich beschlossen, auf openHAB 3 zu aktualisieren. Seitdem geht nichts mehr, denn das zugrunde liegende Binding binding-caldav-personal1 (1.14.0) existiert nicht mehr. Also muss ich einmal von vorne beginnen.

Tag 1: Langenfeld ist doof

Bisher hatte die Stadt Langenfeld einen schönen ics-Kalender angeboten, in dem sämtliche Abfall-Abholungs-Termine vorhanden waren. Leider gibt es das nicht mehr, ich muss also als erstes sämtliche Termine händisch in meinen Kalender eintragen. Das ist doof, aber letztlich nur Fleißarbeit.

Kommen wir zu openHAB.

Es gibt ein neues Binding: iCalendar (3.0.1). Und es gibt auch einen kleinen Guide im openHAb-Forum. Ich installiere das Binding. Anschließend erzeuge ich ein neues Thing, indem ich Things > + wähle. Ich wähle das iCalendar-Binding, und den Typ Kalender (mit blauem Bridge-Label). So weit, so einfach.

Nun folgt die Konfiguration des Abfallkalenders. Ich vergebe das Label „Abfallkalender“. Außerdem gibt es einige Felder zu füllen. Der folgende Screenshot zeigt die bei mir funktionierende Lösung, aber es hat einige Versuche benötigt, bis ich das alles herausgefunden habe.

Grundsätzlich liegt mein Kalender in einer ownCloud-Instanz, im zugehörigen Kalender-Modul. Daher kann ich Benutzername und Passwort leicht korrekt ausfüllen – dabei hilft mir mein Passwortmanager1Du benutzt keinen Passwortmanager? Dann höre jetzt sofort auf, diesen Artikel zu lesen, und installiere dir einen Passwortmanager. Es ist simpel, und es erhöht deine Sicherheit im Internet extrem. Warte nicht mehr länger, mache dies genau jetzt. Los!. Die maximale Größe lasse ich bei 16 Mebibytes, das sollte schon passen. Das sind ungefähr 16 MB, und meine Kalenderdateien sind viel kleiner. Das Aktualisierungsintervall werde ich während des folgenden Testens immer mal wieder verändern, aber im Endeffekt ist 60 Minuten ein guter Wert. Das ginge sogar noch seltener, denn mein Abfallkalender ändert sich ja nicht regelmäßig.

So. Kommen wir zur Herausforderung, der URL. Und, oh je, das war wirklich schwierig. Denn hier versuche ich zwei Dinge zu verheiraten, die eigentlich nicht zusammenpassen: Ein openHAB-Binding, das ical-Dateien haben will, und eine ownCloud-Kalender-Instan, die WebDAV kommunizieren möchte. ical und WebDAV sind aber zwei völlig verschiedene Dinge, weshalb mein erster Versuch, die Adresse einzugeben, kollossal scheiterte. Analog zum letzten Mal gab ich nämlich folgende Adresse ein:

https://***/remote.php/dav/calendars/***/testkalender/

Der Status des Kalenders blieb offline, und in den Logs sah ich folgendes:

 [WARN ] [g.icalendar.internal.handler.PullJob] - Not able to read downloaded iCal. Validation failed or file not readable. Error message is: No calendar was parsed.

Ich muss ganz ehrlich sagen, ich habe hier viele Dinge ausprobiert, die ich mir nicht alle merken konnte. Irgendwann kam mal die Fehlermeldung, dass der Download abgebrochen wurde, weil die Downloadzeit zu lang war, oder so etwas in der Art. Ich kann meine Versuche nicht mehr alle nachvollziehen. Daher springe ich direkt zur Lösung des Problems.

Also, die Lösung. ownCloud kann ical-Dateien exportieren und zum Download anbieten. In meiner ownCloud-Instanz klicke ich dazu auf drei Punkte rechts neben des Kalenders, und klicke dann auf „Herunterladen“. Anschließend wird mir der Download einer ics-Datei mit dem heutigen Datum angeboten, aber diese hilft mir nicht, denn ich möchte ja, dass es immer aktualisiert wird. In der Adresszeile meines Browsers erscheint aber kurz folgende Adresse:

https://***/remote.php/dav/calendars/***/testkalender?export

Und das ist die Lösung. Das ermöglicht den Direktzugriff von openHAB auf das Exportmodul von ownCloud. Damit kann openHAB nun eine ical-Datei herunterladen, und diese verarbeiten. Natürlich hat auch das nicht auf Anhieb funktioniert – irgendwie hatte mein openHAB Schluckauf oder so. Die Anzeige des Kalenderstatus wollte einfach nur „offline“ sein. Aber in diesem Falle hat es einfach geholfen, das System ein paar Tage in Ruhe zu lassen, denn beim nächsten Nachsehen war der Status plötzlich grün.

Ich weiß, dass das albern klingt, aber ich habe wirklich nichts mehr geändert. openHAB hat sich selbst repariert. Vielleicht war irgendwo etwas im Cache, oder so, aber jetzt funktioniert es.

Tag 2: Die Regeln

Jetzt habe ich viel über die Einbindung des Things geschrieben, und das war auch definitiv die größte Herausforderung. Aber eigentlich möchte ich ja Nachrichten bekommen, wenn ich die Mülltonnen herausrollen muss. Dazu brauche ich eine Regel. Und Items. Also schaue ich mir die Channels des Abfallkalenders mal etwas genauer an.

Man sieht an dem Screenshot, dass ich die Tendenz dazu habe, einfach alle Channels erstmal mit Items zu verknüpfen, die irgendwie sinnvoll klingen, und danach zu überlegen, was ich wirklich brauche.

Der Trigger für meine Regel wird der Switch „Präsenz eines aktuellen Eintrags“. Den verknüpfe ich mit dem Item Abfallkalender_PrasenzeinesaktuellenEintrags. Dieser Switch schaltet nämlich von OFF zu ON, sobald ein Event des Kalenders beginnt. Wenn also mein Kalender sagt, dass ich heute um 07:00 die Papiermülltonnen herausrollen soll, dann schaltet dieser Switch genau um 07:00 Uhr von OFF auf ON. Und genau das triggert dann meine Regel.

Außerdem brauche ich noch den Titel des aktuellen Eintrages, denn ich will ja wissen, welche Mülltonne ich herausrollen soll. Ich verlinke also den entsprechenden Channel mit dem Item Abfallkalender_TiteldesaktuellenEintrags. Und dann kann ich auch schon die Regel überarbeiten, die ich bereits das letzte Mal benutzt habe.

zur Erinnerung, so sah die Regel in openHAB 2 mit dem calDAV-Binding aus:

rule "Abfallkalender"
when
   Item CalDav_Muelltonne changed
then
   if (CalDav_Muelltonne.state != UNDEF) {
      sendNotification("<E-Mail-Adresse>", "Abholung heute: " + CalDav_Muelltonne.state) 
   }
end

Eigentlich muss ich nicht viel ändern. CalDav_Muelltonne wird zu Abfallkalender_PrasenzeinesaktuellenEintrags. Die Statuskontrolle != UNDEF ändere ich zu == ON. Und ganz zum Schluss brauche ich noch das Item Abfallkalender_TiteldesaktuellenEintrags. Und schon sieht es so aus:

rule "Abfallkalender"
when
    Item Abfallkalender_PrasenzeinesaktuellenEintrags changed
then
    if (Abfallkalender_PrasenzeinesaktuellenEintrags.state == ON) {
        sendNotification("<E-Mail-Adresse>", "Abholung heute: " + Abfallkalender_TiteldesaktuellenEintrags.state) 
    }
end

Nun folgt der Wahnsinn: Es funktioniert. Einfach so. Ohne dass ich noch etwas anpassen oder ändern müsste. Es funktioniert!

Schreiben Sie einen Kommentar