LoxBerry: CalDAV-4-Lox Plugin verfügbar.
Einklappen
X
-
Ja, ganz klar. Microsoft meint da sich mal wieder nicht an Standards zu halten. Die von Microsoft angegeben TZID (Timezone Information ID) gibt es gar nicht. Aus dem Grund bricht die Verarbeitung des Kalenders ab. Gültige TZID‘s für Dich wären WET oder Europe/Lisboa, oder halt alles was da liegt. Ob das jetzt Dein Client so blöd da einträgt, oder der Exchange 2010 das macht, kann ich Dir nicht sagen. Kannst versuchen den Kalender auf UTC umzustellen.Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-) -
Guten Morgen svethi ,
ich habe die Terminserie Montag-Freitag täglich 13:30 - 22:00 Uhr umgestellt auf UTC.
Dann siehts so aus.
Code:BEGIN:VCALENDAR METHOD:PUBLISH PRODID:Microsoft Exchange Server 2010 VERSION:2.0 X-WR-CALNAME:Kalender BEGIN:VTIMEZONE TZID:UTC BEGIN:STANDARD DTSTART:16010101T000000 TZOFFSETFROM:+0000 TZOFFSETTO:+0000 END:STANDARD BEGIN:DAYLIGHT DTSTART:16010101T000000 TZOFFSETFROM:+0000 TZOFFSETTO:+0000 END:DAYLIGHT END:VTIMEZONE BEGIN:VEVENT DESCRIPTION:\n RRULE:FREQ=DAILY;UNTIL=20191130T133000Z;INTERVAL=1 UID:040000008200E00074C5B7101A82E0080000000010F006AC8617D501000000000000000 01000000081A1A8B98ABE3947B6117DC73461EB27 SUMMARY:Spätschicht DTSTART;TZID=UTC:20190527T133000 DTEND;TZID=UTC:20190527T220000 CLASS:PUBLIC PRIORITY:5 DTSTAMP:20190531T060933Z TRANSP:TRANSPARENT STATUS:CONFIRMED SEQUENCE:0 LOCATION: X-MICROSOFT-CDO-APPT-SEQUENCE:0 X-MICROSOFT-CDO-BUSYSTATUS:FREE X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY X-MICROSOFT-CDO-ALLDAYE VENT:FALSE X-MICROSOFT-CDO-IMPORTANCE:1 X-MICROSOFT-CDO-INSTTYPE:1 X-MICROSOFT-DONOTFORWARDMEETING:FALSE X-MICROSOFT-DISALLOW-COUNTER:FALSE END:VEVENT END:VCALENDAR
Rückmeldung von CalDav4Lox:
{ "Spätschicht": { "Start": 328455000, "End": 328492800, "Summary": "Spätschicht", "Description": "\n", "fwDay": -0, "wkDay": 4 }, "now": 328522199 }
Zumindestens kommt jetzt eine Rückmeldung.
Auf dieser Seite https://unicode.org/cldr/charts/late...zone_tzid.html findet man eine "Mapping for Windows" Table :-) Warum das Microsoft wieder macht. Ist ja genau verdreht drum
Könntest evtl. die Table in deine APP übernehmen?
Allerdings frage ich mich noch, warums denn funktioniert, wenn man einen Termin von Montag-Freitag ganztägig erstellt und warum nicht, wenn man einen Termin Montag-Freitag 13:30-22:00 erstellt. Wegen der Zeitangabe. Spielt die Zeitzone evtl. nur dann eine Rolle? Muss ja dran liegen, weils mit UTC ja geht.
Gruß
MichaelKommentar
-
Ich meine schon, das das schon so passt. Wenn ich die Weboberfläche auf UTC stelle, aber ich vorher mit Outlook Desktop UTC+1 einen Termin eingestellt habe, wird mir der Termin in OUtlook Desktop korrekt angezeigt und in der Weboberfläche aber falsch. Aber der Termineintrag ist in der ics trotzdem UTC+1, da ich diesen ja im Outlook Desktop erstellt habe. Wo müsste ich denn da in der php ansetzen, das es wenigstens für mich läuft. Ich kann leider kein php ;-) -
Wenn Du den Termin als UTC+2 anlegst und die Weboberfläche auf UTC umstellst, dann muss im ical-File bei der Angabe UTC auch die UTC Zeit stehen und nicht die UTC + 2 Zeit
Du müsstest im ical file alle TZID auf den richtigen Wert ändern, bevor das verarbeitet wird -
Nein, so macht er es eben nicht. Ich lege den Termin mit UTC+2 in Outlook Desktop an, die Weboberfläche stelle ich auf UTC. Dann werden die Termine zeitlich für UTC korrekt angezeigt, also 11:30. Aber in der ics steht trotzdem UTC+2, also W. Europe Standard Time.
-
-
Ich habe mir jetzt mit folgendem Code geholfen.
if ($estart[1] == "W. Europe Standard Time") {
$estart[1] = "Europe/Berlin";
}
if ($eend[1] == "W. Europe Standard Time") {
$eend[1] = " Europe/Berlin";
}
Kann man das so lassen? Was meinst du?
Code:if (preg_match("/SUMMARY:(.*($search)[^\r\n]*)/",$event,$ematch)) { $countevents +=1; $teststart = $ustart; if(preg_match("/DTSTART;.*TZID=(.*);(VALUE=DATE):(.*)\b/",$event,$estart)) { if ($estart[1] == "W. Europe Standard Time") { $estart[1] = "Europe/Berlin"; } $teststart = $vdstart; $estart[3] .= "T000000"; $estart = DateTime::createFromFormat('YmdHis',str_replace("T","",$estart[3]),new DateTimeZone($estart[1])); } elseif (preg_match("/DTSTART;.*TZID=(.*):(.*)\b/",$event,$estart)) { $estart = DateTime::createFromFormat('YmdHis',str_replace("T","",$estart[2])); } elseif (preg_match("/DTSTART(:)(.*)Z\b/",$event,$estart)) { $estart = DateTime::createFromFormat('YmdHis',str_replace("T","",$estart[2]),new DateTimeZone("UTC")); } elseif (preg_match("/DTSTART;(VALUE=DATE):(.*)\b/",$event,$estart)) { $teststart = $vdstart; $estart[2] .= "T000000"; $estart = DateTime::createFromFormat('YmdHis',str_replace("T","",$estart[2])); } if (preg_match("/DTEND;.*TZID=(.*);(VALUE=DATE):(.*)\b/",$event,$eend)) { if ($eend[1] == "W. Europe Standard Time") { $eend[1] = " Europe/Berlin"; } $eend[3] .= "T000000"; $eend = DateTime::createFromFormat('YmdHis',str_replace("T","",$eend[3]),new DateTimeZone($eend[1])); } elseif (preg_match("/DTEND;.*TZID=(.*):(.*)\b/",$event,$eend)) { if ($eend[1] == "W. Europe Standard Time") { $eend[1] = " Europe/Berlin"; } $eend = DateTime::createFromFormat('YmdHis',str_replace("T","",$eend[2]),new DateTimeZone($eend[1])); } elseif (preg_match("/DTEND(:)(.*)Z\b/",$event,$eend)) { $eend = DateTime::createFromFormat('YmdHis',str_replace("T","",$eend[2]),new DateTimeZone("UTC")); } elseif (preg_match("/DTEND;(VALUE=DATE):(.*)\b/",$event,$eend)) { $eend[2] .= "T000000"; $eend = DateTime::createFromFormat('YmdHis',str_replace("T","",$eend[2])); } date_timezone_set($estart,$localTZ); date_timezone_set($eend,$localTZ);
Kommentar
-
Ich glaube nicht, dass das reicht, denn die TZID steht oft in mehreren Angaben. Ich habe mir mal den Microsoft Kalender angesehen und habe auch Dein Problem nachstellen können. Zeitzone des Accounts UTC. Zeitzone des Kalenders Berlin (UTC+1 ist hier ja auch schon falsch). Einen Termin angelegt, der steht richtig im Kalender. Exportiere ich den Kalender, steht im ics UTC aber mit der Zeit UTC+2 das ist alles total falsch und absoluter Murks. Vergiss Microsoft. iCal wurde von Apple entwickelt. Das funktioniert halt nicht.Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)Kommentar
-
Weiter unten im Code der caldav.php kommen auch nochmal 4 DateTimeZone. Diese habe ich jetzt ebenso noch angepasst, das es für Outlook.com passt. Ich stelle da nie was rum, an der Zeitzone. Es läuft jetzt für mich. Ich muss halt jetzt jedesmal die caldav.php anpassen, wenn du eine neue Version rausbringst, aber das hält sich in Grenzen.
-
-
Ich kann das nicht einfach nur so mal eben für einen machen. Der LB wird in vielen Zeitzonen eingesetzt. Wenn ich das mache, muss es für alle sein. Das heißt, dass Deine komplette Mappingliste integriert werden müsste.Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)Kommentar
-
Ok, das verstehe ich schon. Dann könnt ich ja die Mappingtable komplett abtippen.
Hilf mir mal bitte mit deinen php Kenntnissen weiter.
Bei den Terminen Frühschicht gibts noch ein Problem. Und zwar beim Parameter EXDATE.
Ich vermute mal, das das Suchpattern nicht klar kommt mit dem Punkt in "W. Europe Standard Time".
Code://echo "$timeend - Wiederholung gefunden, RRULE starten.\n"; preg_match_all("/EXDATE.*:(.*)\s/iU",$event,$resExDates, PREG_PATTERN_ORDER); foreach ($resExDates[1] AS $d => $ExDate) { $ExDates[] = $ExDate; }
Code:"/EXDATE.*:(.*)\s/iU"
Code:BEGIN:VCALENDAR METHOD:PUBLISH PRODID:Microsoft Exchange Server 2010 VERSION:2.0 X-WR-CALNAME:Kalender BEGIN:VTIMEZONE TZID:W. Europe Standard Time BEGIN:STANDARD DTSTART:16010101T030000 TZOFFSETFROM:+0200 TZOFFSETTO:+0100 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=10 END:STANDARD BEGIN:DAYLIGHT DTSTART:16010101T020000 TZOFFSETFROM:+0100 TZOFFSETTO:+0200 RRULE:FREQ=YEARLY;INTERVAL=1;BYDAY=-1SU;BYMONTH=3 END:DAYLIGHT END:VTIMEZONE BEGIN:VEVENT DESCRIPTION:\n RRULE:FREQ=WEEKLY;UNTIL=20191122T040000Z;INTERVAL=2;BYDAY=MO,TU,WE,TH,FR;WK ST=MO EXDATE;TZID=W. Europe Standard Time:20190422T050000,20190423T050000,2019042 4T050000,20190425T050000,20190426T050000,20190617T050000,20190618T050000,2 0190619T050000,20190620T050000,20190621T050000,20190812T050000,20190813T05 0000,20190814T050000,20190815T050000,20190816T050000,20191007T050000,20191 008T050000,20191009T050000,20191010T050000,20191011T050000 UID:040000008200E00074C5B7101A82E008000000003063AAE3BD17D501000000000000000 0100000007C821FFFA5DE6044A440448A3A7C5CD9 SUMMARY:Frühschicht DTSTART;TZID=W. Europe Standard Time:20190228T050000 DTEND;TZID=W. Europe Standard Time:20190228T133000 CLASS:PUBLIC PRIORITY:5 DTSTAMP:20190531T124524Z TRANSP:OPAQUE STATUS:CONFIRMED SEQUENCE:0 LOCATION: X-MICROSOFT-CDO-APPT-SEQUENCE:0 X-MICROSOFT-CDO-BUSYSTATUS:BUSY X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY X-MICROSOFT-CDO-ALLDAYEVENT:FALSE X-MICROSOFT-CDO-IMPORTANCE:1 X-MICROSOFT-CDO-INSTTYPE:1 X-MICROSOFT-DONOTFORWARDMEETING:FALSE X-MICROSOFT-DISALLOW-COUNTER:FALSE END:VEVENT
Kommentar
-
Deshalb habe ich ja gesagt, dass es einfacher ist die Namen vorher auszutauschen.
Okay, dann gib die Mappingtabelle als JSON ein.
Code:{ "Windowsname":"TZID", "nächster":"...", ., ., . }
Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)Kommentar
-
Kommentar
-
Anbei die gewünschte Datei.
Daten hab ich von hier genommen:
https://unicode.org/cldr/charts/late...zone_tzid.html
Bräuchtest die Region nicht auch noch in der Datei?
W.Europe Standard Time gibts ja öfters.
"W. Europe Standard Time":"Europe/Berlin",
"W. Europe Standard Time":"Europe/Andorra",
"W. Europe Standard Time":"Europe/Vienna",
"W. Europe Standard Time":"Europe/Zurich",
"W. Europe Standard Time":"Europe/Berlin Europe/Busingen",
"W. Europe Standard Time":"Europe/Gibraltar",
"W. Europe Standard Time":"Europe/Rome",
"W. Europe Standard Time":"Europe/Vaduz",
"W. Europe Standard Time":"Europe/Luxembourg",
"W. Europe Standard Time":"Europe/Monaco",
"W. Europe Standard Time":"Europe/Malta",
"W. Europe Standard Time":"Europe/Amsterdam",
"W. Europe Standard Time":"Europe/Oslo",
"W. Europe Standard Time":"Europe/Stockholm",
"W. Europe Standard Time":"Arctic/Longyearbyen",
"W. Europe Standard Time":"Europe/San_Marino",
"W. Europe Standard Time":"Europe/Vatican",
Hab noch eine Datei angehängt, die die Region auch noch enthält. Ich hoffe es passt so.
Hab grad noch was gefunden. https://github.com/mj1856/TimeZoneConverter
evtl. gibts sowas schon passend für den loxberry.Angehängte DateienZuletzt geändert von blacksun; 31.05.2019, 19:02.Kommentar
-
Sorry, aber jetzt muss ich noch auf den regulären Ausdruck
Code:"/EXDATE.*:(.*)\s/iU"
Der Fehler liegt anscheinend an dem Ausdruck und nicht an der Zeitzone.
Wie bin ich vorgegangen. Ich habe einen Termin Frühschicht 05:00 - 13:30 Uhr Wöchentlich Mo-Fr, Wiederholung alle 2 Wochen für das ganze Jahr erstellt. Ich habe manchmal in den Frühschicht Wochen Nachtschicht, also habe ich in den Frühschicht Wochen die Frühschicht Termine gelöscht, nur diese Einträge, nicht die Serie. Das führt dann zu Exdate Einträgen im *.ics.
Code:BEGIN:VEVENT DESCRIPTION:\n RRULE:FREQ=WEEKLY;UNTIL=20191122T040000Z;INTERVAL=2;BYDAY=MO,TU,WE,TH,FR;WK ST=MO EXDATE;TZID=W. Europe Standard Time:20190422T050000,20190423T050000,2019042 4T050000,20190425T050000,20190426T050000,20190617T050000,20190618T050000,2 0190619T050000,20190620T050000,20190621T050000,20190812T050000,20190813T05 0000,20190814T050000,20190815T050000,20190816T050000,20191007T050000,20191 008T050000,20191009T050000,20191010T050000,20191011T050000 UID:040000008200E00074C5B7101A82E008000000003063AAE3BD17D501000000000000000 0100000007C821FFFA5DE6044A440448A3A7C5CD9 SUMMARY:Frühschicht DTSTART;TZID=W. Europe Standard Time:20190228T050000 DTEND;TZID=W. Europe Standard Time:20190228T133000 CLASS:PUBLIC PRIORITY:5 DTSTAMP:20190531T173318Z TRANSP:OPAQUE STATUS:CONFIRMED SEQUENCE:0 LOCATION: X-MICROSOFT-CDO-APPT-SEQUENCE:0 X-MICROSOFT-CDO-BUSYSTATUS:BUSY X-MICROSOFT-CDO-INTENDEDSTATUS:BUSY X-MICROSOFT-CDO-ALLDAYEVENT:FALSE X-MICROSOFT-CDO-IMPORTANCE:1 X-MICROSOFT-CDO-INSTTYPE:1 X-MICROSOFT-DONOTFORWARDMEETING:FALSE X-MICROSOFT-DISALLOW-COUNTER:FALSE END:VEVENT
Habs grad nochmal mit dem Google Kalender getestet, hier wird pro gelöschtem Termin ein Eintrag erstellt, und nicht durch Komma getrennt. Toll.
Code:BEGIN:VCALENDAR PRODID:-//Google Inc//Google Calendar 70.9054//EN VERSION:2.0 CALSCALE:GREGORIAN METHOD:PUBLISH X-WR-CALNAME:Kalender X-WR-TIMEZONE:Europe/Berlin BEGIN:VTIMEZONE TZID:Europe/Berlin X-LIC-LOCATION:Europe/Berlin BEGIN:DAYLIGHT TZOFFSETFROM:+0100 TZOFFSETTO:+0200 TZNAME:CEST DTSTART:19700329T020000 RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=-1SU END:DAYLIGHT BEGIN:STANDARD TZOFFSETFROM:+0200 TZOFFSETTO:+0100 TZNAME:CET DTSTART:19701025T030000 RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=-1SU END:STANDARD END:VTIMEZONE BEGIN:VEVENT DTSTART;TZID=Europe/Berlin:20190429T050000 DTEND;TZID=Europe/Berlin:20190429T133000 RRULE:FREQ=WEEKLY;WKST=MO;INTERVAL=2;BYDAY=MO,TU,WE,TH,FR EXDATE;TZID=Europe/Berlin:20190823T050000 EXDATE;TZID=Europe/Berlin:20190821T050000 EXDATE;TZID=Europe/Berlin:20190709T050000 EXDATE;TZID=Europe/Berlin:20190710T050000 EXDATE;TZID=Europe/Berlin:20190711T050000 EXDATE;TZID=Europe/Berlin:20190726T050000 EXDATE;TZID=Europe/Berlin:20190722T050000 DTSTAMP:20190531T182835Z UID:6csvsib3v7lenc2p2df6i4os12@google.com CREATED:20190531T182716Z DESCRIPTION: LAST-MODIFIED:20190531T182716Z LOCATION: SEQUENCE:0 STATUS:CONFIRMED SUMMARY:Frühschicht TRANSP:OPAQUE END:VEVENT END:VCALENDAR
Zuletzt geändert von blacksun; 31.05.2019, 20:34.Kommentar
-
Weißt Du, so langsam reicht es mir. Ich werde nicht das ganze Plugin für Deinen blöden Exchangeserver umbauen.Miniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)Kommentar
-
Ich habe mich jetzt mit meinem "blöden" Exchange Kalender noch beschäftigt. Mit diesem Code funktionierts nun. Nicht perfekt, daber dieser Code geht für beide Kalender, google und outlook.com.
Code:/* Überprüfe, welcher Kalender abgefragt wird */ preg_match_all("/(BEGIN:VCALENDAR.*BEGIN:STANDARD)/isU",$Datei,$gvtimezones, PREG_PATTERN_ORDER); foreach ($gvtimezones[1] as $e => $vtimezone) { if (preg_match("/PRODID:(.*(Microsoft Exchange Server)[^\r\n]*)/",$vtimezone,$ematch)) { // echo "Exchange Kalender"; $caltype="Exchange"; } elseif (preg_match("/PRODID:(.*(Google)[^\r\n]*)/",$vtimezone,$ematch)) { // echo "Google Kalender"; $caltype="Google"; } else { echo "Pech gehabt, noch so ein blöder Kalender"; } } if ($caltype=="Exchange") { /* Anpassung für Outlook.com bzw. Microsoft Exchange */ preg_match("/EXDATE;[^:]+:([\S\s]+?)UID:/", $event, $resExDates); /* Zeilenumbrüche und Leerzeichen entfernen */ $resExDates[1] = preg_replace('/\s| /','',$resExDates[1]); /* String enthält alle Exdates getrennt durch ',' */ $resExDates[1] = explode(',', $resExDates[1]); } else { /* originaler Code für Googlekalender */ preg_match_all("/EXDATE.*:(.*)\s/iU",$event,$resExDates, PREG_PATTERN_ORDER); }
Code:if (preg_match("/RDATE.*:(.*)\s/",$event,$resRDates)) { $RDates = explode(",",$resRDates[1]); }
MichaelKommentar
-
Ich habe mir das noch nicht gelöste Problem mit den verschobenen Terminen aus einer Serie über recurrence-id mal angesehen und werde diesbezüglich auch auf eine andere Lib ausweichen. Bei der Gelegenheit wird dann auch das Microsoft Problem beseitigtMiniserver; KNX; Vitogate; EnOcean (EnOceanPi); Loxone Air; Caldav-Kalenderanbindung; RaspberryPi und für keine Frickellösung zu schade :-)Kommentar
-
Servus svethi ,
ich schon wieder :-) Habe einen Termin Schulferien (Pfingsferien) vom 11.6-21.6 ganztägig erstellt. Wenn ich jetzt mittels fwdays=0 abfrage erhalte ich
{ "Schulferien": { "Start": 329443200, "End": 330393600, "Summary": "Schulferien", "Description": "Pfingstferien", "fwDay": -2, "wkDay": 2 }, "now": 329659831 }
Warum wird hier dann fwdays -2 ausgegeben? Jetzt erkennt Loxone nur die Schulferien am 1. Tag. Ich frage im Miniserver auf fwdays=0 und Schulferien ab. fwdays=-2 vermutlich, weil die Ferien am Dienstag angefangen haben. Wie könnte ich das am Besten abfragen?Kommentar
Kommentar