iobroker-community-adapters / ioBroker.ical

Read information from google calender and from iCal files into ioBroker.
MIT License
45 stars 32 forks source link

iCal zeigt bestimmte Termine am Ereignistag nicht an #81

Closed ArneDoe closed 5 years ago

ArneDoe commented 5 years ago

Mein iCal (v1.6.6) Kalender zeigt die Termine aus dem Abfallkalender (.ics Datei) nur bis zum Vortag des Ereignisses an. Beim Wechsel auf den Ereignistag wird der Termin entfernt, somit zu früh, da damit ein HEUTE-Termin fehlt. Ähnliche (Ganztagestermine) aus dem Google-Kalender werden hingegen korrekt bis zum Tagesende angezeigt. Beim Abfallkalender ist für Start und Ende dasselbe Datum eingetragen:

...
SUMMARY:Restmüll
DTSTART;VALUE=DATE:20181115
DTEND;VALUE=DATE:20181115
...

Möglicherweise führt das beim Parsen zur Annahme eines "0-Sekunden-Events" und wird deshalb unmittelbar beim Tageswechsel gelöscht. Für Tests: Der Original-Kalender liegt hier: http://www.abfallkalender-gifhorn.de/2018/muell_mit_ics.php

Gerade festgestellt: Mit einschalten der Option "Start-Endzeiten verbergen" wird der Termin korrekt angezeigt. Ist das Zweck dieser Option? (Ich habe leider keine Doku dazu gefunden...)

twonky4 commented 5 years ago

Hm, das ist ein interessantes Problem.

Die Option "Start-Endzeiten verbergen" wird als "Erzwinge ganze Tage" für Events interpretiert.

Das heißt aus deinem Beispiel wird:

...
SUMMARY:Restmüll
DTSTART;VALUE=DATE:20181115
DTEND;VALUE=DATE:20181116
...

Ich habe mal etwas mit dem google Kalender rumgespielt. Den Beispiel Termin importiert mit Start/Ende 2018-11-15. Daraus ist ein ganztages Event geworden. Als ich es dann wieder exportierte habe ich Start 2018-11-15 und Ende 2018-11-16 bekommen.

Ich habe mal in den RFC 5545 geschaut. Dort steht ganz klar zur Beschreibung des DTEND:

The value MUST be later in time than the value of the "DTSTART" property.

Also der Kalender der Seite abfallkalender-gifhorn.de ist definitiv falsch 😭 Ich habe den Inhaber der Seite mal angeschrieben, glaube aber nicht das dort schnell was passiert. Die Änderung bezahlt denen ja niemand.

@Apollon77: Wie wollen wir in Zukunft mit solchen definitiv falschen Terminen umgehen? Wie der google Kalender, als ganztages Event interpretieren (evtl. auch eine Warnung schreiben oder verwirrt das nur)? Einen zusätzlichen Konfigurationsschalter finde ich hierfür nicht notwendig.

Apollon77 commented 5 years ago

Also wie befürchtet wird das Event als "0:00-0:00" interpretiert. Das Problem hier ist das das scheinbar ein "externer" kalender ist (@ArneDoe korrekt?) ... naja man könnte es machen wir google. Ein Termin mit DTSTART=DTEND ohne uhrzeit behandeln als 00:00 bis folgetag 00:00?

ArneDoe commented 5 years ago

@Apollon: korrekt. @twonky4: Laut iCalender Validator: https://icalendar.org/validator.html sind die "0:00-0:00" (also Event mit der Länge 0 Sekunden) KEIN Fehler nach RFC5545. (Nach Umwandlung LF --> CRLF ist alles gut). Wenn es in iCal keinen Anwendungsfall für einen solchen Event gibt, dann kann man wie von Dir vorgeschlagen, die falschen Termine tatsächlich als Ganztagesevent interpretieren.

twonky4 commented 5 years ago

@ArneDoe: Vlt. prüft https://icalendar.org nur syntaktisch aber nicht symantisch 😉

Ich mache mal ein fix dafür fertig.

twonky4 commented 5 years ago

@ArneDoe: Kannst du die aktuelle Version 1.7.0 hier aus dem repo testen?

ArneDoe commented 5 years ago

Soooo. Also issue #81 scheint hiermit behoben zu sein. Danke!

Allerdings hast Du in die V1.7.0 weitere Änderungen einfließen lassen und damit ein merkwürdiges Verhalten ausgelöst. Für die in meinem Google-Kalender eingetragenen EVENTS (zB [IOB]Urlaub) wurden 17 neue Objekte erzeugt (sorry für "Insert Code", aber ein Upload der Logdatei hat nicht funktioniert, noch nicht einmal 10kB): 2018-11-19 19:22:01.973 - info: ical.0 Event "ical.0.events.0.later.[IOB]urlaub" created 2018-11-19 19:22:01.974 - info: ical.0 Event "ical.0.events.0.today.[IOB]urlaub" created 2018-11-19 19:22:01.975 - info: ical.0 Event "ical.0.events.0.now.[IOB]urlaub" created 2018-11-19 19:22:01.975 - info: ical.0 Event "ical.0.events.1.[IOB]urlaub" created 2018-11-19 19:22:01.976 - info: ical.0 Event "ical.0.events.2.[IOB]urlaub" created 2018-11-19 19:22:01.977 - info: ical.0 Event "ical.0.events.3.[IOB]urlaub" created 2018-11-19 19:22:01.978 - info: ical.0 Event "ical.0.events.4.[IOB]urlaub" created 2018-11-19 19:22:01.979 - info: ical.0 Event "ical.0.events.5.[IOB]urlaub" created 2018-11-19 19:22:01.979 - info: ical.0 Event "ical.0.events.6.[IOB]urlaub" created 2018-11-19 19:22:01.980 - info: ical.0 Event "ical.0.events.7.[IOB]urlaub" created 2018-11-19 19:22:02.130 - info: ical.0 Event "ical.0.events.8.[IOB]urlaub" created 2018-11-19 19:22:02.131 - info: ical.0 Event "ical.0.events.9.[IOB]urlaub" created 2018-11-19 19:22:02.131 - info: ical.0 Event "ical.0.events.10.[IOB]urlaub" created 2018-11-19 19:22:02.132 - info: ical.0 Event "ical.0.events.11.[IOB]urlaub" created 2018-11-19 19:22:02.132 - info: ical.0 Event "ical.0.events.12.[IOB]urlaub" created 2018-11-19 19:22:02.133 - info: ical.0 Event "ical.0.events.13.[IOB]urlaub" created 2018-11-19 19:22:02.133 - info: ical.0 Event "ical.0.events.14.[IOB]urlaub" created Dafür fehlt das ursprüngliche Event-Objekt "ical.0.events.[IOB]urlaub". Außerdem wurde heute jedes von mir in iCal definierte Ereignis ausgelöst, so zB ein "[IOB]Urlaub"-Event, obwohl für heute gar kein solches definiert ist.: 2018-11-19 16:30:54.893 - warn: javascript.0 getState "ical.0.events.[IOB]urlaub" not found (3) 2018-11-19 16:30:54.896 - warn: javascript.0 at SteuereUrlaubsLampen (script.js.Haussteuerung.Ical_Ereignisse_steuern:114:17) 2018-11-19 16:30:54.896 - warn: javascript.0 at Object.<anonymous> (script.js.Haussteuerung.Ical_Ereignisse_steuern:201:57) 2018-11-19 16:30:54.898 - info: javascript.0 script.js.Haussteuerung.Ical_Ereignisse_steuern: <span style="color:green;">## (info): SteuereUrlaubsLampen: Check at: 2018-11-19 16:30:54. CHECK is:null</span> 2018-11-19 16:30:54.898 - warn: javascript.0 getState "ical.0.events.[IOB]urlaub" not found (3) 2018-11-19 16:30:54.900 - warn: javascript.0 at SteuereUrlaubsLampen (script.js.Haussteuerung.Ical_Ereignisse_steuern:118:9) 2018-11-19 16:30:54.900 - warn: javascript.0 at Object.<anonymous> (script.js.Haussteuerung.Ical_Ereignisse_steuern:201:57) 2018-11-19 16:30:54.901 - info: javascript.0 script.js.Haussteuerung.Ical_Ereignisse_steuern: <span style="color:green;">## (info): SteuereUrlaubsLampen: Es ist Urlaubszeit, Lampen werden gesteuert</span> ...

twonky4 commented 5 years ago

Das ist korrekt. In 1.7.0 gibt es einige Änderungen. Was die Events betrifft gehört Issue #41 dazu.

So ist das ehemals ical.0.events.[IOB]urlaub nun ical.0.events.0.today.[IOB]urlaub.

Die Meldung 2018-11-19 16:30:54.893 - �[33mwarn�[39m: javascript.0 getState "ical.0.events.[IOB]urlaub" not found (3) kam wohl, weil der State gelöscht wurde und deinem js script nicht umgehen konnte.

ArneDoe commented 5 years ago

Danke. Ich werde meine Events anpassen. Hinweise auf das neue Verhalten und Co sollten noch in die Doku... Und: Was ist das eigentliche Verhalten der Option "Start-Endzeiten verbergen"?

twonky4 commented 5 years ago

"Start-Endzeiten verbergen" -> Bei Terminen wird die Zeit ignoriert und sie werden alle als ganztages Ereignis eingelesen.

Das neue Verhalten mit den Event States steht in der Doku. Aber diese muss eh überarbeitet und ins englische übersetzt werden 😭

ArneDoe commented 5 years ago

Danke. Ich mach hier mal zu. Es geht unter #41 weiter mit Eventhandling.