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.
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.
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