Anregung fuer 57_Calendar zur Nutzung von ferienwiki.de

Begonnen von Adimarantis, 10 Februar 2019, 12:30:06

Vorheriges Thema - Nächstes Thema

Adimarantis

Hallo 57_Calendar Maintainer,

Ich nutze ferienwiki.de um Ferientermine und Feiertage zu holen.
Zum einen haben dort 1-tägige Termine leider den Fehler keine Ende zu haben (das mag falsch sein, aber ich werde die Plattform kaum dazu bringen das zu korrigieren), zum anderen möchte ich nicht jedes Jahr die URL ändern müssen.

Daher habe ich bei mir folgende Änderungen im Modul implementiert (diff Ausgabe gegen aktuelle Version 2019-02-08):

1346,1349d1345
<     } else {
<       #mod Joerg: if DTEND and DURATION is missing assume 1 day event
<         my $duration= 86400;
<         $event->{end}= $nextstart + $duration;
1720,1725c1716
<   #Change Joerg: Retrieve current year and enable %y replacement for URL
<   my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime();
<   $year=$year+1900;
<   $url=~s/\%y/$year/ig;


- Termine ohne korrektes Ende bekommen einfach die Länge eines Tages.
- In der URL wird %y gegen das aktuelle Jahr ersetzt

Es wird z.B. mit
define Ferien Calendar ical url http://www.ferienwiki.de/exports/ferien/%y/de/bayern 86400
immer der Kalendar des aktuellen Jahres geholt.

Wäre schön wenn ihr diese Änderungen (zumindest funktional - bin jetzt nicht der Perl Experte) in die Release aufnehmen könntet, damit ich das nicht nach jedem Update wieder reinpatchen muss.

Gruß,
Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

betateilchen

Über die Ersetzung in der URL könnte man ja noch reden (auch wenn ich dazu keine zwingende Notwendigkeit sehe, denn es ist eher eine Frage, inwieweit man die Faulheit der Anwender unterstützen will)

Aber einen Kalendereintrag, der keinen korrekten Ende-Eintrag hat, einfach auf 1 Tag zu zwingen, halte ich für nicht sinnvoll. Denn das muss nicht immer richtig sein. Deshalb bin ich dagegen, diese Änderung modulseitig vorzunehmen.

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

Otto123

Alternative Lösung:
Einmal Jährlich den Ferienwiki Kalender in einen Google Kalender importieren (bekommt man sicher auch mit einem kleinen Programm hin?) und den Google Kalender einbinden.
1. Google Kalender heilt das Problem mit dem Termin ohne Ende
2. Ferienwiki wird nicht mit unnötigen Anfragen bombardiert.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Dr. Boris Neubert

Zitat von: Adimarantis am 10 Februar 2019, 12:30:06
- Termine ohne korrektes Ende bekommen einfach die Länge eines Tages.

Im RFC zu ICAL steht tatsächlich:

ZitatPage 53
For cases where a "VEVENT" calendar component
specifies a "DTSTART" property with a DATE value type but no
"DTEND" nor "DURATION" property, the event's duration is taken to
be one day. For cases where a "VEVENT" calendar component
specifies a "DTSTART" property with a DATE-TIME value type but no
"DTEND" property, the event ends on the same calendar date and
time of day specified by the "DTSTART" property.

Daher habe ich diese Erweiterung auch auf meiner Todo-Liste. Ich werde diese nicht vor Ende März zusammen mit den restlichen Einträgen in einem Rutsch abarbeiten.

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

betateilchen

#4
na, wenn es dort geschrieben steht ...  8)

Aber das hier

Zitat von: Dr. Boris Neubert am 10 Februar 2019, 16:22:48
For cases where a "VEVENT" calendar component specifies a "DTSTART" property with a DATE-TIME value type  but no "DTEND" property,
the event ends on the same calendar date and time of day specified by the "DTSTART" property.

habe ich jetzt jetzt mindestens 5 Mal gelesen, aber ich glaube, noch nicht verstanden.

Heißt das im Endeffekt, dass es events ohne eine Dauer gibt?

Wenn ja - wie will das Modul dann start/stop triggern?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Dr. Boris Neubert

Hallo,

ich interpretiere das so:

Wenn weder DTEND noch DURATION angegeben sind:
Fall 1) DTSTART ist ein Datum (20190210) und kein Zeitpunkt (20190210T123432Z): Beginn um 00:00, Ende um 24:00 (Dauer 1 Tag)
Fall 2) DTSTART ist kein Datum (20190210) sondern ein Zeitpunkt (20190210T123432Z): Beginn UND Ende an diesem Zeitpunkt (Dauer 0 s)

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

betateilchen

ja, ich bin bei beiden Punkten bei Dir.

Aber was triggert dann FHEM, wenn die Dauer = 0 Sekunden ist?

Dann gibt es 4 Events alle exakt zur gleichen Zeit? Das kann FHEM doch gar nicht abbilden, weil zumindest "change" dann ein duplicate ist.

change - start - change - end

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

betateilchen

#7
Für das Ersetzen von Platzhaltern durch Zeitangaben (gemäß POSIX::strftime) gibt es in FHEM bereits bewährte Mechanismen, das macht die Sache recht einfach.


Internals:
   DEF        ical url https://irgendeineurl.de/%Y/test.ics
...
   .fhem:
...
     url        https://irgendeineurl.de/2019/test.ics
...



Index: 57_Calendar.pm
===================================================================
--- 57_Calendar.pm      (revision 18547)
+++ 57_Calendar.pm      (working copy)
@@ -1709,7 +1709,8 @@

   my $name      = $a[0];
   my $type      = $a[3];
-  my $url       = $a[4];
+  my @t         = localtime;
+  my $url       = ResolveDateWildcards($a[4], @t);
   my $interval  = 3600;

   $interval= $a[5] if($#a==5);
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

nils_

Zitat von: betateilchen am 10 Februar 2019, 20:49:39
Für das Ersetzen von Platzhaltern durch Zeitangaben (gemäß POSIX::strftime) gibt es in FHEM bereits bewährte Mechanismen, das macht die Sache recht einfach.


Internals:
   DEF        ical url https://irgendeineurl.de/%Y/test.ics
...
   .fhem:
...
     url        https://irgendeineurl.de/2019/test.ics
...



Index: 57_Calendar.pm
===================================================================
--- 57_Calendar.pm      (revision 18547)
+++ 57_Calendar.pm      (working copy)
@@ -1709,7 +1709,8 @@

   my $name      = $a[0];
   my $type      = $a[3];
-  my $url       = $a[4];
+  my @t         = localtime;
+  my $url       = ResolveDateWildcards($a[4], @t);
   my $interval  = 3600;

   $interval= $a[5] if($#a==5);


frage dazu (kannte den mechanismus noch nicht):
wann wird das jahr ersetzt???
vermutlich einmal beim anlegen des devices.... und dann im nächsten jahr??
viele Wege in FHEM es gibt!

betateilchen

Zitat von: nils_ am 20 Februar 2019, 12:55:10
wann wird das jahr ersetzt???
vermutlich einmal beim anlegen des devices.... und dann im nächsten jahr??

Bei jedem Neustart von FHEM wird das define ausgeführt und %Y durch das dann aktuelle Jahr ersetzt.

Aber Vorsicht: der vorgeschlagene patch ist noch nicht im Modul eingebaut!

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

nils_

Zitat von: betateilchen am 20 Februar 2019, 13:32:06
Bei jedem Neustart von FHEM wird das define ausgeführt und %Y durch das dann aktuelle Jahr ersetzt.
also d.h. man müsste dann dafür sorgen, je nach genutzen wildcards (könnte ja auch ein %d sein), fhem neuzustarten ?! im beispiel reicht es ja jeden 1. januar.
(mir ist durchaus bewusst, das ein täglicher kalender keinen wirklichen sinn macht, aber wer weiß schon was manchen leutchen so einfällt :) )


Zitat von: betateilchen am 20 Februar 2019, 13:32:06
Aber Vorsicht: der vorgeschlagene patch ist noch nicht im Modul eingebaut!
ja, ist mir bewusst :)
viele Wege in FHEM es gibt!

Beta-User

Ein defmod oder reload dürften auch reichen. Trotzdem ist der regelmäßige online-Zugriff völlig überflüssig.
Just my2ct.
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Otto123

Hallo,

Auch wenn das bei dem Thema leicht OT ist, aber jetzt wird ja hier eh schon die eine oder andere Entwicklung besprochen:

Ich hätte noch die Anregung, die Auswirkung der Angabe [<interval>] so zu ändern, dass die 0 nicht ein ständiges automatisches neu laden, sondern kein automatisches neu laden mehr bewirkt.
Keine Angabe setzt ja (leider) den Standardwert 3600.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

betateilchen

attr <calendarName> update none

Steht übrigens in der Doku zum Calendar-Modul. Aber wer kommt schon auf die völlig abwegige Idee, einen Blick in die Doku zu werfen...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Adimarantis

Zitat von: betateilchen am 20 Februar 2019, 13:32:06
Bei jedem Neustart von FHEM wird das define ausgeführt und %Y durch das dann aktuelle Jahr ersetzt.

Das würde jetzt an meinem use case vorbei gehen.
Ich würde den Calendar möglichst am 1. Januar um 0:00 neu einlesen, damit er erkennt, dass der 1. Januar ein Feiertag ist und somit z.B. die Rollos erst später hochfährt. Daher sollte so eine Ersetzung (wie in meinem Vorschlag) adhoc bei jedem Zugriff durchgeführt werden. Wann der nächste Neustart ist, steht in den Sternen und bis dahin fehlen ggf. die Infos.

Gruß,
Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)