Onlinekalender? Warum nicht! Caldav/GoogleKalender Anbindung für den MiniServer

Einklappen
X
 
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge
  • svethi
    Lebende Foren Legende
    • 25.08.2015
    • 6292

    Onlinekalender? Warum nicht! Caldav/GoogleKalender Anbindung für den MiniServer

    Hi,

    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
    Angehängte Dateien
    Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)
  • Dietmar Wimmer
    Smart Home'r
    • 29.08.2015
    • 74

    #2
    Hallo,

    ich habe folgendes Problem beim einlesen der Kalenderdaten aus einem Google Kalender in die Loxone.
    Ich kann die Daten aus der php Datei im Browser sehen.
    Sobald ich diese aber versuche mittels virtuellen Eingangsverbinder einzulesen funktioniert es nicht.
    Den Doppelpunkt habe ich bereits gegen %3A ausgetauscht.

    Weis jemand wo hier der fehler liegt?

    Gruß Dietmar
    Angehängte Dateien

    Kommentar

    • svethi
      Lebende Foren Legende
      • 25.08.2015
      • 6292

      #3
      Ich gehe mal davon aus, dass Du den virtuelle HTTP Eingang benutzt?!
      Hast Du denn darin dann auch entsprechende Befehle angelegt, die dann die Daten einlesen?
      Bitte unbedingt den Quelltext im Browser ansehen, da das, was Du da siehst nicht der Orginal Output ist.
      Was hast Du denn z.B. Bei Befehlserkennung so eingegeben?

      Gruß Sven


      Mal eben von unterwegs ...
      Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

      Kommentar

      • Dietmar Wimmer
        Smart Home'r
        • 29.08.2015
        • 74

        #4
        Hallo Sven,

        habe bei Muellabfuhr z.B. \iMuellabfuhr\i\iStart": \i\v im virtuellen HTTP Eingangsbefehl eingegeben. Hab mir auch den Quelltext im Browser angesehen.
        Beim aufrufen des Kalender Script (Google Calender) dauert es jedoch eine weile bis ich eine Ausgabe erhalte. Ist das vielleicht ein Problem?

        Gruß Dietmar

        Kommentar

        • svethi
          Lebende Foren Legende
          • 25.08.2015
          • 6292

          #5
          Hallo Dietmar,

          in meinen Beispielen habe ich aber auch solche Kombinationen nicht stehen. Versuche es doch einfach mal mit Muellabfuhr": {\n\t\t"Start": \v oder Muellabfuhr": {\ifwDay\i": \v

          Gruß Sven
          Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

          Kommentar

          • wavemaster01
            Extension Master
            • 10.09.2015
            • 113

            #6
            Hallo Sven,

            das mit dem Google-Kalender ist ein spitze Idee!!!
            Ich habe mich auch gleich daran gemacht das Ganze umzusetzen. Ich bekomme, nachdem ich mir meine URL zusammengebaut habe, auch Events im Browser zurückgeliefert:

            Ausgabe:

            { "Muellabfuhr": { "Start": -1, "End": -1, "Summary": "", "Description": "", "fwDay": -1, "wkDay": -1 } "MSTest": { "Start": 211303800, "End": 211307400, "Summary": "MSTest", "Description": "", "fwDay": 0, "wkDay": 6 } "now": 211285313 }

            -> es gibt einen MSTest-Termin in meinem Kalender

            ich habe nun einen HTTP-Eingangsbefehl mit folgender Befehlserkennung angelegt: MSTest": {\n\t\t"Start": \v
            und visualisiert.

            Im Frontend bekomme ich aber nur 2009-01-01:00:00:00 angezeigt. Scheint das gleiche oder ein ähnliches Problem wie bei Dietmar.

            Für Hilfe schon einmal besten Dank!

            Gruß Matthias
            Zuletzt geändert von wavemaster01; 12.09.2015, 11:38.

            Kommentar

            • wavemaster01
              Extension Master
              • 10.09.2015
              • 113

              #7
              ... so habe es geschafft, der richtige Parameter für die Startzeit scheint: MSTest": \iStart\i": \v
              ... jetzt habe ich nur ein weiteres Problem:

              - Der Testtermin steht im Google Kalender von 21:30 bis 22:30
              - Im Debug Modus des Browsers dauert der Termin auf einmal von 20:30 bis 21.30 (die aktuelle Zeit wird aber korrekt angezeigt)
              - Im Loxone Interface wird das ganze dann zu einer Dauer von 19:30 bis 20:30 ???

              scheint irgendwo mit Zeitzonen der Wurm drinnen zu sein. Kann mir jmd. helfen?

              Danke Matthias

              Kommentar

              • svethi
                Lebende Foren Legende
                • 25.08.2015
                • 6292

                #8
                Huch, ich hatte Dir heute vormittag schonmal geschrieben, das ist hier irgendwie nicht angekommen.
                Ja, Du musst natürlich überall, das gilt auch für den Google Kalender, die richtige Zeitzone eingestellt haben.
                2 Stunden Versatz sehen zur MESZ stark nach UTC aus. Gib mal an der Commandline des Raspi date<enter> ein. Da sollte was von CEST drin stehen. Wenn nicht, ist das kein Wunder.

                Gruß Sven
                Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

                Kommentar

                • wavemaster01
                  Extension Master
                  • 10.09.2015
                  • 113

                  #9
                  Hallo Sven,

                  danke für deine Antwort. Im Google Kalender habe ich GMT +2 eigenstellt. Dein Skript läuft auf meinem Webspace (deutscher Server). Schaue ich mir mit debug=1 bei deinem Skript die aktuelle Zeit an, passt die auch. Nur letztendlich kommt es dann zu dem Zeit-Versatz!? Kann ich bei dir im Skript versch. Zeitzonen einstellen, dann würde ich da probieren?

                  Danke schon mal!!

                  Gruß Matthias

                  Kommentar

                  • svethi
                    Lebende Foren Legende
                    • 25.08.2015
                    • 6292

                    #10
                    Nein, das Script benutzt die System-Timezone des Servers, auf dem es ausgeführt wird.
                    Eine Nutzung auf einem öffentlichen Webspace würde ich Dir nicht raten. Es ist nicht gegen hacking und gezielter Falscheingaben gesichert. Es ist für den lokalen geschützten Einsatz auf einem Raspberry o.ä. konzipiert. Die Nutzung des Scripts geschieht auf eigene Gefahr und ich übernehme keinerlei Gewährleistung auf irgendwelche Schäden die durch die Benutzung des Scripts entstehen.

                    Gruß Sven


                    Mal eben von unterwegs ...
                    Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

                    Kommentar

                    • wavemaster01
                      Extension Master
                      • 10.09.2015
                      • 113

                      #11
                      Hallo Sven, kein Problem, das ist mir bewusst.
                      Habe das Skript jetzt aber auf meine Synology gelegt und lasse es dort ausführen. Also es klappt, aber ich habe wieder dasselbe Zeitzonen-Problem.

                      Ausgabe auf dem Server:

                      "Muellabfuhr": { "hStart": "31.12.2008 23:59:59", "hEnd": "31.12.2008 23:59:59", "Start": -1, "End": -1, "Summary": "", "Description": "", "fwDay": -1, "wkDay": -1 } "MSTest": { "hStart": "13.09.2015 19:30:00", "hEnd": "13.09.2015 19:45:00", "Start": 211401000, "End": 211401900, "Summary": "MSTest", "Description": "mal gucken", "fwDay": 0, "wkDay": 7 } "hnow": "13.09.2015 09:39:42", "now": 211365582 }

                      die lokale Zeit ist korrekt, nur der Termin steht in Google von 20:30-20:45
                      Anzeige Loxone: 18:30 -18:45

                      Zeitzone ist bei Google GMT+2 Berlin, kann man aber für Deutschland nicht anders wählen?!?!
                      Auf der Synology bezieht er die Zeit über den Google Server. Zone GMT +1 (Berlin)
                      Loxone PLZ ist korrekt

                      Hast du vielleicht noch eine Idee?

                      Danke Matthias

                      Kommentar


                      • Gast
                        Gast kommentierte
                        Kommentar bearbeiten
                        Hallo Matthias
                        Du hast den CalkDav Dienst über Synology gelöst. Musstest du den Script von Post#1 anpassen, damit es über Synology läuft?

                        Ich bekomme fogende Meldung über http:
                        { &quot;1Test&quot;: { &quot;Start&quot;: -1, &quot;End&quot;: -1, &quot;Summary&quot;: &quot;&quot;, &quot;Description&quot;: &quot;&quot;, &quot;fwDay&quot;: -1, &quot;wkDay&quot;: -1 }, &quot;2Test&quot;: { &quot;Start&quot;: -1, &quot;End&quot;: -1, &quot;Summary&quot;: &quot;&quot;, &quot;Description&quot;: &quot;&quot;, &quot;fwDay&quot;: -1, &quot;wkDay&quot;: -1 }, &quot;now&quot;: 223117400 }

                        Die URL habe so eingestellt:


                        Das ganze will ich lokal laufen lassen, da mein MS vom Internet abgeschottet ist. Auf Syno den CalDav Dienst laufen lassen und über Thunderboard lokal die Kalendereinträge erstellen und mit Syno synchronisieren. Das mit Syno CalDav & Thunderboard funktioniert soweit, aber die PHP Scripte können nicht die Einträge laden.
                        Beste Grüsse
                        Miro

                      • svethi
                        svethi kommentierte
                        Kommentar bearbeiten
                        Hallo miro,

                        Bitte immer alles lesen und an die Anleitung halten. Bei calURL muss der Doppelpunkt hinter dem https in %3A umgewandelt werden die anderen &quot;Sonderzeichen&quot; können und müssen teilweise im Orginal bleiben.
                        Du gibst https an, läuft der Server denn auch tatsächlich auf ssl?

                        Gruß Sven
                    • svethi
                      Lebende Foren Legende
                      • 25.08.2015
                      • 6292

                      #12
                      Siehst Du, GMT/UTC +1 der Synology stimmt ja schonmal nicht. Da fehlt die Sommerzeit. Ich kenne die Synology nicht, da muss man aber sicher auch die Sommerzeit aktivieren können. PLZ im MiniServer reicht nicht. Da musst Du schon auch die richtige Zeitzone einstellen. Sieh mal unter HTTP://MiniServerIP:Port/admin nach.


                      Mal eben von unterwegs ...
                      Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

                      Kommentar

                      • wavemaster01
                        Extension Master
                        • 10.09.2015
                        • 113

                        #13
                        Hallo, danke dir für die schnelle Antwort. Zeitzone Loxone passt, Google wie gehabt und die Synolgy synct die Zeit automatisch. Ich habe mal einen Screenshot davon angehängt... Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Synology.PNG
Ansichten: 3748
Größe: 12,2 KB
ID: 3872 Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Synology.PNG
Ansichten: 3439
Größe: 12,2 KB
ID: 3873

                        Kommentar

                        • svethi
                          Lebende Foren Legende
                          • 25.08.2015
                          • 6292

                          #14
                          Hallo Matthias,

                          Hast Du Dir mal die Version aus dem alten Forum herunter geladen? Nicht dass ich aus Versehen die falsche/alte Version hier hochgeladen habe.
                          Du kannst auch das caching mal aktivieren. Da wird im Verzeichnis dann eine Datei mit dem Output von Google angelegt. Die könntest Du mir sonst mal zukommen lassen, dann kann ich da mal reinschauen.

                          Gruß Sven


                          Mal eben von unterwegs ...
                          Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)

                          Kommentar

                          • wavemaster01
                            Extension Master
                            • 10.09.2015
                            • 113

                            #15
                            Es geht! Das Skript aus dem alten Forum hat geholfen, anscheinend hast du hier wirklich eine alte Version erwischt. PHPs getauscht und es läuft. Danke nochmals!!

                            Gruß Matthias

                            Kommentar

                            Lädt...