Vorwort
beflügelt vom Projekt der Mülltonnenabfuhranzeige, hatte ich mich entschlossen, dass will ich auch haben. Das die Tonnen im Wechsel alle 2 Wochen bei uns geleert werden, ist mir ja bekannt. Wichtig war für mich allerdings, dass ich weiß wann die Abfuhr im Falle von Feiertagen kommt. Da gab es dann so Projekte, wo Statusbausteine mit allen Abfuhrterminen gefüttert werden etc. Nein, dass ist mir zu umständlich. Man muss das schon irgendwie global und einfach eingeben können. Dies brachte mich zurück zum uralten Wunsch einer Kalenderanbindung für den MiniServer. Da ich Zugriff auf einen privaten Cloud Kalender (OwnCloud und vorher Davical) habe und diese das gebräuchliche Caldav-Protokoll unterstützen, überlegte ich mir, wie man das umsetzen könnte. Die Möglichkeiten des MiniServer selbst sind bekanntlich begrenzt, was mich wieder zu meinem, Ihr ahnt es schon, RaspberryPi brachte. Mein bevorzugter Weg ist hier eigentlich ein PHP/Perl Script, was die Arbeit macht und dann die relevanten Daten per UDP an den MiniServer schickt. Allerdings habe ich beim letzten Projekt mit Christian Fenzl auch noch einen anderen Gesichtspunkt kennengelernt und diese Projekt daran ausgerichtet. Hierbei geht es darum, dass Christian zurecht sagt, dass bei meiner Lösung ja auch immer etwas am Script für den RaspberryPi angepasst werden muss, was für Leute, die nicht fit in Programmierung sind, schwerer werden könnte. So habe ich nun dieses Projekt auch so aufgebaut, dass die Scripte für die RaspberryPi keiner Änderung bedürfen und die "Konfiguration" vom MiniServer ausgeht. Hier werden virtuelle HTTP-Eingänge mit ihren Eingangsbefehlen benutzt.
Ich hatte das ganze auch schon fertig und auch gelesen, dass Google auch Caldav "spricht" und war mir sicher, dass so auch der Google Kalender benutzt werden kann. Kurz bevor ich dieses Tutorial hier begonnen habe, dachte ich mir dann, dass ich die Verbindung zu Google mal teste und so dann den Google Kalender mit aufführen kann. Hmm ... es stellte sich dann heraus, dass das Thema Google Kalender doch nicht so einfach, aber dennoch machbar ist. Hierzu musste ich für den Google Kalenlder mein Script erweitern, was zu dieser Verzögerung führte.
Voraussetzung
- ein Webserver mit PHP5.3 oder höher (z.B. RaspberryPi mit Apache und PHP5)
- ein Caldav- oder Google Kalender
Umsetzung
- auf dem Webserver wird im Webserver-Root-Verzeichnis die caldav.tgz per 'tar xfz caldav.tgz' entpackt
auf dem Raspberry mit Raspbian wäre das das Verzeichnis /var/www Nach belieben kann man auch noch ein
Unterverzeichnis anlegen (z.B. caldav) in welches man das zur besseren Übersicht entpackt. So habe ich es gemacht,
da ich auf meinem RaspberryPi weitere Ding laufen habe.
damit wäre hier schon die Arbeit erledigt.
Tutorials, wie man einen RaspberryPi einrichtet, gibt es im Internet genug. Daher möchte ich das hier nicht weiter
erörtern. Vielleicht nur, dass die Installation des Apache mit PHP über 'sudo apt-get install apache2 php5' zu
bewerkstelligen ist
- in der LoxConfig legt man einen virtuellen HTTP-Eingang an.
als URL gibt man dann sowas wie: 'http://raspberrypi/caldav.php?calURL=https%3A//caldav.your.server/PfadzumKalender&user=<user>&pass=<password>&fwdays =2&events=Muellabfuhr|MSTest' an
die einzelnen Parameter bedeuten folgendes:
- http://raspberrypi/caldav.php? - ist die Adresse Eures Raspberry o.ä. mit dem Pfad zum Script
- calURL ist die URL des entsprechenden Kalenders so wie sie z.B. im Thunderbird/Lightning anzugeben ist
- user Euer Benutzername für den Kalender
- pass Euer Passwort für den Kalender
- fwdays da man keine Möglichkeit hat eine flexible Zeitspanne in die URL einzufügen, habe ich diese Variante
hier gebt Ihr die Anzahl der Tage an, für die im Voraus im Kalender nachgesehen werden soll. Vom aktuellen Datum
der Anfrage an. Null für nur den aktuellen Tag.
- delay (im Beispiel nicht benutzt) ist die Anzahl der Minuten, die vor und nach der aktuellen Zeit nachgesehen wird.
Wird der Parameter nicht angegeben, wird 60 bentzt. (Beispiel: Anfrage wird im 14:30Uhr gestellt, Dann werden
Termine zwischen 13:30Uhr und 15:30Uhr angezeigt.
- events eine Liste der Terminnamen im Kalender, nach denen gesucht werden soll mit Pipe/senkrechter Strich getrennt
(ich habe keine Leerzeichen/Sonderzeichen getestet, doch ich denke mal, man sollte darauf verzichten)
- als Ergebnis kommt dann sowas wie:
{
"Muellabfuhr": {
"Start": 194832000,
"End": 194918400,
"Description": "gelbe Tonne=1",
"fwDay": 1,
"wkDay": 5
}
"MSTest": {
"Start": 194802300,
"End": 194804100,
"Description": "",
"fwDay": 0,
"wkDay": 4
}
"now": 194801634
}
Das Ergebnis ist dann im JSON Format. Für jeden Suchbegriff gibt es ein Objekt. Gibt es zu dem Suchbegriff keine aktuellen Termin, so sind die Werte -1 und Description "". Die zurückgegebenen Zeitwerte sind Loxone Zeitwerte und können über <v.u> humanreadable angezeigt werden. Description sind die Notizen zum Termin ... hier kann man weitere Infos eingeben. Hier unterscheide ich z.B. welche Tonne abgeholt wird. fwDay ist der Tag in der Zukunft, an dem der Termin stattfindet. Rufst Du Montags ab und hast fwdays=5 angegeben und der Termin, der gefunden wurde ist am Mittwoch, so ist der Wert 2. wkDay ist der Wochentag des Termins 1=Mo - 7=So. Im vorigen Beispiel wäre das also 3.
now ist die aktuelle Zeit zur Antwortzeit. Diese kann für Vergleiche/Berechnungen im Programm verwendet werden.
In der anhängenden Demo sind noch Beispiele für die Verarbeitung vorhanden.
Hier noch ein paar Infos für die Google Jünger.
So wie ich recherchiert habe, ist eine richtige Caldav Abfrage gegen den Google Kalender nicht so einfach. Daher habe ich 2 andere Möglichkeiten ausfindig gemacht. Die eine Adresse ist "https%3A//www.google.com/calendar/dav/[Kalender ID]/events". Diese Variante benötigt user und pass jeweils die Daten, die zur Anmeldung an den Kalender nötig sind.
Als 2. Variante ist die Privatadresse des Kalenders, die unter den Kalendereinstellungen zu finden ist. hier ist keine user und pass notwendig.
für alle URL's gilt, dass der Doppelpunkt gegen %3A ersetzt werden muss (Danke an Christian, der das herausgefunden hat)
Nun viel Erfolg und Freude.
Nachtrag: habe gerade festgestellt, dass man keine tgz hochladen kann. Daher musste ich das nochmal in eine zip packen.
12.03.2015: Debugmode eingefügt (mit dem weiteren Parameter debug=1 werden Datumangaben auch lesbar ausgegeben)
Fehler in der Berechnung der Ganztagesereignisse beseitigt
Fehler bei mehreren Terminen mit gleichen Namen im selben Überwachungszeitraum behoben (es wurde nicht immer der nächste auftretende Termin ausgegeben.
weitere Optimierungen
17.03.2015: Fehler in der Berechnung wiederkehrender, nicht ganztägiger Termine.
21.03.2015:
- Optimierungen in den Abfragen
- Danke an Christian Fenzl -> Google Kalender wird nun mit PHP eigenen Mitteln geholt und ist damit
auch Windows tauglich
- Danke an Christian Fenzl -> Abfrage des Google Kalenders kann nun gecached werden
- neuer Parameter eingefügt cache (...&cache=<Minuten>..) - hier kann die Anzahl der Minuten
angegeben werden, die der Kalender nicht von Google sondern aus dem Cache (lokale Datei)
geladen wird
- wenn man durch den Delay Parameter Termine auch noch nach Ablauf anzeigen lässt, wird jetzt bei
Tageswechsel korrekt ein negativer Wert angezeigt
31.03.2015:
- Christian -> Cachedatei bekommt nun einen eindeutigen Namen, damit auch das Abrufen verschiedener Kalender funktioniert
- Nach Wunsch von Christian wird nun nicht nur am Anfang des Titels nach dem Suchwort gesucht. (Termin Muellabfuhr wird über
über das Suchwort abfuhr ebenso gefunden)
- Verbesserungen bei der Verarbeitung verschiedener Zeitzonen (RaspberryPi und MiniServer müssen gleiche Zeitzoneneinstellungen
haben
Gruß Sven
Kommentar