ganztägige Termine (iCal) werden mit hideOlderThan nicht gefiltert

Begonnen von fornax76, 12 August 2017, 13:15:36

Vorheriges Thema - Nächstes Thema

fornax76

Verlangen tue ich natürlich nichts  ;)

Es lässt mir aber auch keine Ruhe...

In der ics-Datei startet der ganztägige Termin so:

BEGIN:VEVENT
DTSTART;VALUE=DATE:20170807


Interpretiert vom calview wird es folgendermaßen:

t_001_bdate 07.08.2017
t_001_btime 00:00:00


Es wird also die fehlende Uhrzeit als 00:00:00 gesetzt.
Leider fehlt tatsächlich nur das reading t_001_etime

Währe es nicht sinnvoll bei einem Termin ohne Endzeit etime ebenfalls einfach auf 00:00:00 zu setzen?

chris1284

#16
Zitat
Es wird also die fehlende Uhrzeit als 00:00:00 gesetzt.
vom calendar....

ZitatWähre es nicht sinnvoll bei einem Termin ohne Endzeit etime ebenfalls einfach auf 00:00:00 zu setzen?
ja, wenn diese regel des RFC-5545 allgemeingültig für alle ical-calendar ist würde nichts dagegen sprechen. müsste aber durch jemanden in calendar implementiert werden.

ändere doch den titel in etwas sprechendes was auf das calendar-problem hinweist und verschiebe den post in Unterstuetzende Dienste/Kalendermodule. boris liest dort in der regel mit

StefanD

Ich bin vorhin bei der Suche nach genau dem gleichen Problem auf diesen Thread aufmerksam geworden. Es scheint sich wohl inzwischen das Weglassen des DTEND durchzusetzen, was wohl mehr der Bequemlichkeit als der Reduzierung von Daten geschuldet ist. Nach meinem Verständnis der RFC 5545 (3.8.2.2) wäre die DTEND immer anzugeben. Dass viele Applikationen eine entsprechende Implementierung inne haben, die die fehlende Endzeit kompensieren, unterstützt das Ganze nur noch. Erinnert mich irgendwie an die Toleranz der Browser, die fast noch jeden HTML-Schrott einigermaßen brauchbar darstellen...  >:(

Genug gejammert, ich habe eine recht einfache Lösung gefunden, wie ich mit dem Problem leben kann ohne dabei, für mich erkennbare Nachteile in Kauf nehmen zu müssen. Ich habe den Kalender einfach über die Url in meinen Google Kalender aufgenommen, den Zugriff öffentlich erlaubt und die Url aus dem Google Kalender verwendet. Jetzt ist auch DTEND in der Datenstruktur und die Datenbasis stimmt.  :)

VG
Stefan
HW: Intel NUC8i5 mit ESXi7 mit Ubuntu Server 18.04 LTS und FHEM als DockerContainer

Dr. Boris Neubert

Hallo,

dieses Thema ist zwar schon ein bisschen älter, aber ich antworte noch: es ist am einfachsten, wenn Du mit einem onCreateEvent fehlende Endezeitpunkte ersetzt. In der morgen per Update erhältlichen Version ist das sogar in der (englischen) Commandref zu Calendar beschrieben.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

plin

Hallo Boris,

Ich nutze einen Google Kalender für Geburtstage.  hideOlderThan steht auf 1d.

Ich habe wie vorgeschlagen
attr myCalendar onCreateEvent { $e->{end}= $e->{start}+86400 unless(defined($e->{summary})) }
gesetzt, die alten Termine werden aber immer noch angezeigt.

Die Kalender-Einträge haben wie im Thread erläutert kein DTEND:
BEGIN:VEVENT
DTSTART;VALUE=DATE:20180425
RRULE:FREQ=YEARLY
DTSTAMP:20180920T175810Z
UID:Ical0be23d51ed3f0069ab0ba986ba2b86e3
CREATED:20180918T195537Z
DESCRIPTION:
LAST-MODIFIED:20180919T155247Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:John Doe - Birthday
TRANSP:TRANSPARENT
END:VEVENT


Wann zieht hideOlderThan? Vor oder nach dem onCreateEvent ?

VG Peter
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

Dr. Boris Neubert

Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

plin

ok, wie wär's alternativ mit einem

diff 57_Calendar.pm 57_Calendar.pm.orig
2421,2424c2421
<             if(defined($t1)) {
<                   next if(defined($event->end()) && $event->end() < $t1);
<                   next if(!defined($event->end()) && $event->start()+86400 < $t1);
<           }
---
>             if(defined($t1)) { next if(defined($event->end()) && $event->end() < $t1); }


Bei mir werden die Termine ohne DTEND dann korrekt gefiltert.

VG Peter
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

Dr. Boris Neubert

Passt nicht zu meiner Aussage. Ich muss der Sache nachgehen anhand Deines Beispielkalendereintrags. Bitte Geduld, weil ich noch nicht sagen kann, ob ich dieses Wochenende dazu komme.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

Zitat von: plin am 20 September 2018, 20:03:58

Ich habe wie vorgeschlagen
attr myCalendar onCreateEvent { $e->{end}= $e->{start}+86400 unless(defined($e->{summary})) }
gesetzt, die alten Termine werden aber immer noch angezeigt.


Das ist ja auch nicht richtig. Richtig ist:

attr myCalendar onCreateEvent { $e->{end}= $e->{start}+86400 unless(defined($e->{end})) }

Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

plin

ok, danke für den Hinweis. Habe wohl aus der Quelle falsch kopiert.

Trotzdem die Frage: Warum ein Workaround via attr/onCreateEvent  statt den Case im Coding abzufangen? Wenn kein DTEND vorhanden ist kann ein  hideOlderThan nie funktionieren.

VG Peter
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

plin

Zitat von: plin am 22 September 2018, 17:35:31
ok, danke für den Hinweis. Habe wohl aus der Quelle falsch kopiert.

Hallo Boris,

war kein Kopierfehler. In der englischen Command-Ref ist noch ein Typo:

Plug-ins

<snip>

    To add a missing end time, the following plug-in can be used:

    attr MyCalendar onCreateEvent { $e->{end}= $e->{start}+86400 unless(defined($e->{summary})) }


VG Peter
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

Dr. Boris Neubert

Zitat von: plin am 22 September 2018, 17:48:30
war kein Kopierfehler. In der englischen Command-Ref ist noch ein Typo

Danke, Peter, hab's gefixt. Will nicht noch mehr in die Irre schicken. Sorry.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

Zitat von: plin am 22 September 2018, 17:35:31
Trotzdem die Frage: Warum ein Workaround via attr/onCreateEvent  statt den Case im Coding abzufangen? Wenn kein DTEND vorhanden ist kann ein  hideOlderThan nie funktionieren.

Genau.

Was soll denn passieren, wenn kein Endedatum angegeben wird? Wie soll sich hideOlderThan dann verhalten? Im Moment verhält es sich so, als wäre es nicht angegeben für diesen Termin.
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

plin

Zitat von: Dr. Boris Neubert am 22 September 2018, 20:08:28
Was soll denn passieren, wenn kein Endedatum angegeben wird? Wie soll sich hideOlderThan dann verhalten? Im Moment verhält es sich so, als wäre es nicht angegeben für diesen Termin.

Morgen Boris,

Die Eingangsfrage ist: Soll hideOlderThan DTSTART oder DTEND abfragen?
Da ein Termin in Vergangenheit beginnen und in der Zukunft enden kann, möchte man natürlich auch diese Termine noch sehen. Folglich ist DTEND der korrekte Ansatz.

Wann kommt es zu dem Fehler, dass kein DTEND angegeben ist?
Nun, ich habe die mir bekannten Geburtstage in den Google-Kalender importiert. Ein manuell angelegter und dann exportierter Datensatz für ein ganztägiges Ereignis zeigte
DTSTART;VALUE=DATE:20181026
DTEND;VALUE=DATE:20181027
Es wurde also der Folgetag als Ende des Ereignisses angenommen. Beim Generieren des Import-Files war ich faul und habe
DTSTART;VALUE=DATE:20181026
DTEND;VALUE=DATE:20181026
erzeugt. Bei einem ganztägigen Ereignis ist meiner Ansicht nach die Angabe des gleichen Datums für Start und Ende nicht falsch.
Google importierte mein File erfolgreich ohne Fehlermeldung. Offensichtlich speichert der Google-Kalender dieses Event aber nur mit einer DTSTART-Angabe ohne DTEND. Deshalb der Fehler beim Rausfiltern mittels hideOlderThan.

Wie könnte man also ein Event ohne DTEND interpretieren?
a)   Als Augenblick (Start = 20181026000000, Ende = 20181026000000) oder
b)   Als Ganztages-Event (Start = 20181026000000, Ende = 20181026235959)
Wenn DTEND nicht angegeben ist, würde ich erwarten, dass DTEND auf jeden Fall noch innerhalb desselben Tages liegt wie DTSTART.

Wäre es falsch bei der Anwendung von hideOlderThan DTEND auf Basis von DTSTART+86400 zu setzen?
Meiner Meinung nach wäre es weniger falsch diese Annahme zu treffen als veraltete Termine (bei mir z.B. -226 Tage) auszulesen/anzuzeigen.
Wenn jemand einen falsch ausgeblendeten Termin sehen will, muss er nur DTEND setzen = den Fehler an der Quelle korrigieren. Google scheint dies bei Ganztagesevents noch nicht zu tun ...

Soweit meine Gedanken zu dem Thema.

VG Peter

P.S.: habe gerade mal geschaut was RFC 5545 sagt

"The "DTSTART" property for a "VEVENT" specifies the inclusive start of the event. For recurring events, it also specifies the very first instance in the recurrence set. The "DTEND" property for a "VEVENT" calendar component specifies the non-inclusive end of the event. "

Demnach ist mein gefühlter Ansatz falsch und ich hätte DTEND=DTSTART+1d einliefern müssen. Dann hätten die Jungs bei Google diesen Fehler aber im Importer abfangen können ...
FHEM1 (Main) Raspi4 mit CUL, Homematic, SDUINO 433/OOK, zentrale Steuerung
FHEM2 (Keller) x86 mit CUL/hmland, IP-basierte Module
FHEM3 (Erdgeschoss) Raspi2 mit SDUINO 868/GFSK
FHEM4 (Hausanschlussraum), USV und OBIS-Modul
FHEM5 (Docker) mit FHEM2FHEM, InfluxDB

Dr. Boris Neubert

Hallo Peter,

vielen Dank für Deine Überlegungen, die ich (post Edit) teile.

Ich interpretiere einen DTSTART oder DTEND immer als Zeitpunkt. Wenn Keine Uhrzeit angegeben ist, nehme ich 00:00:00 an (Beginn des Tages an). Ein Ereignis, das einen Tag dauert, wäre wie von Dir beschrieben mit DTEND=DTSTART+1d einzuliefern.

Ich habe mir eine Notiz gemacht, diesen doch sehr häufigen Fall mit einem Attribut autoend abzufangen. Entweder als

attr <name> autoend [duration]

attr myCalendar autoend
attr myCalendar autoend 86400


oder in das bisher nur angedachte quirks-Attribut, das individuelle Workarounds für zahlreiche Situationen aktivieren soll.

attr <name> quirks <list>

<list> is a comma-separated list of settings:
autoend[:duration]
timeout:duration
...


Du kommst mit onCreateEvent jetzt erstmal zum gewünschten Ergebnis?

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!