[Diskussion mit Boris] Kalenderliste aus webDav Server auslesen

Begonnen von betateilchen, 15 Februar 2019, 20:54:47

Vorheriges Thema - Nächstes Thema

betateilchen

Zitat von: Dr. Boris Neubert am 15 Februar 2019, 17:19:07
Gerne Udo, weißt Du wie das geht? Wäre der WebDAV-Layer nicht was für in die HttpUtils?

Wir brauchen nicht den kompletten webDAV Layer für das Kalendermodul.
Was wir brauchen, ist eine Abfrage, um vom Server eine entsprechende Liste zu bekommen, aus der wir dann einzelne Kalender generieren können.
Das Abfragen der Liste geht jetzt schon mit  HttpUtils.pm und liefert ein brauchbares Ergebnis.


<?xml version="1.0"?>
<d:multistatus xmlns:d="DAV:" xmlns:s="http://sabredav.org/ns" xmlns:cal="urn:ietf:params:xml:ns:caldav" xmlns:cs="http://calendarserver.org/ns/" xmlns:oc="http://owncloud.org/ns">
<d:response>
  <d:href>/remote.php/dav/calendars/udo/</d:href>
  <d:propstat>
    <d:prop>
      <d:resourcetype>
        <d:collection/>
      </d:resourcetype>
    </d:prop>
    <d:status>HTTP/1.1 200 OK</d:status>
  </d:propstat>
</d:response>

<d:response>
  <d:href>/remote.php/dav/calendars/udo/personal/</d:href>
  <d:propstat>
    <d:prop>
      <d:resourcetype>
        <d:collection/>
        <cal:calendar/>
      </d:resourcetype>
      <cs:getctag>http://sabre.io/ns/sync/305</cs:getctag>
      <s:sync-token>305</s:sync-token>
      <cal:supported-calendar-component-set><cal:comp name="VEVENT"/><cal:comp name="VTODO"/></cal:supported-calendar-component-set>
      <cal:schedule-calendar-transp><cal:opaque/></cal:schedule-calendar-transp>
      <d:displayname>personal</d:displayname>
      <cal:calendar-timezone>
      BEGIN:VCALENDAR
      VERSION:2.0
      PRODID:-//Apple Inc.//Mac OS X 10.13.5//EN
      CALSCALE:GREGORIAN
      BEGIN:VTIMEZONE
        TZID:Europe/Berlin
        BEGIN:DAYLIGHT
          TZOFFSETFROM:+0100
          RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU
          DTSTART:19810329T020000
          TZNAME:MESZ
          TZOFFSETTO:+0200
        END:DAYLIGHT
        BEGIN:STANDARD
          TZOFFSETFROM:+0200
          RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU
          DTSTART:19961027T030000
          TZNAME:MEZ
          TZOFFSETTO:+0100
        END:STANDARD
      END:VTIMEZONE
    END:VCALENDAR
    </cal:calendar-timezone>
    <x1:calendar-order xmlns:x1="http://apple.com/ns/ical/">1</x1:calendar-order>
    <x1:calendar-color xmlns:x1="http://apple.com/ns/ical/">#E7E774FF</x1:calendar-color></d:prop>
    <d:status>HTTP/1.1 200 OK</d:status>
  </d:propstat>
</d:response>



<d:response><d:href>/remote.php/dav/calendars/udo/dienstplan/</d:href>

... usw. ...

</d:multistatus>'


Davon sind die interessanten Zeilen eigentlich nur:


<d:resourcetype>
  <d:collection/>
  <cal:calendar/>
</d:resourcetype>

<d:href>/remote.php/dav/calendars/udo/personal/</d:href>
<d:displayname>personal</d:displayname>


Damit könnte Calendar.pm dann automatisch die zwei einzelnen Kalender "personal" und "dienstplan" erzeugen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

#1
Ich habe mal eben einen neuen FHEM Befehl "caldav" gebaut, der am 17.02.2019 per update kommt :)

caldav https://<user>:<password>@server.url/remote.php/dav/calendars/<user>/ /?export 1800

liest zuerst alle auf dem Server gefundenen Kalender des angegebenen users und erzeugt daraus automatisch einzelne Calendar-devices.
Übergeben werden zwei Parameter: Zum einen die URL, und als zweiten (optionalen) Parameter Optionen, die an die endgültige URL angehängt werden, die an das Calendar-Modul übergeben werden.


2019.02.16 01:54:21 caldav: Creating Calendar: define caldav_personal Calendar ical url https://.../remote.php/dav/calendars/udo/personal/?export 1800
2019.02.16 01:54:21 caldav: Creating Calendar: define caldav_dienstplan Calendar ical url https://.../remote.php/dav/calendars/udo/dienstplan/?export 1800
2019.02.16 01:54:21 caldav: Creating Calendar: define caldav_events Calendar ical url https://.../remote.php/dav/calendars/udo/events/?export 1800


Kommt am 17.02.2019 per regulärem update.

Wichtig: der Befehl caldav benutzt die perl library XML::LibXML die aber auf den meisten FHEM Installationen vorhanden sein sollte, da XML in FHEM nichts Neues ist.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

betateilchen

Zitat von: Dr. Boris Neubert am 20 Februar 2019, 20:57:48
ich habe einen persönlichen Kalender bei Google und einen Familienkalender. Und ich will in meinem RSS-Frame die Termine aus beiden angezeigt bekommen.

Zitat von: Dr. Boris Neubert am 21 Februar 2019, 20:25:33
Ich lese die Termine aus dem einem Kalender, lese die Termine aus dem anderen Kalender. Fertig. Muss ich "nur" programmieren in 57_Calendar.

Hallo Boris,

prinzipiell geht sowas schon jetzt, wenn man das Abholen der Kalender per cronjob auf Betriebssystemebene verlegt und in FHEM dann einen Kalender aus dem file erzeugt.


#!/bin/bash
echo line1 > /opt/fhem/log/collection.ics
curl https://<url1>/remote.php/caldav/calendars/udo/fhem_test?export     >>  /opt/fhem/log/collection.ics
curl https://<url2>/remote.php/caldav/calendars/udo/fhem_schalter?export >> /opt/fhem/log/collection.ics
curl https://<url3>/remote.php/caldav/calendars/udo/fhem_heizung?export  >> /opt/fhem/log/collection.ics

sed -i /VCALENDAR/d /opt/fhem/log/collection.ics
sed -i 's/line1/BEGIN:VCALENDAR/' /opt/fhem/log/collection.ics
echo END:VCALENDAR >> /opt/fhem/log/collection.ics




define oc_test_all Calendar ical file ./log/collection.ics

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!