automatisiertes Definieren und Einbinden von Feiertagen/Schulferien als ical

Begonnen von Ralli, 13 April 2015, 15:32:55

Vorheriges Thema - Nächstes Thema

derHeimwerker

#45
Hallo Zusammen,

ich muss dieses alte Thema einmal hervor holen.
Ich habe die Routine getDayStatus zu übernommen und es funktioniert auch alles problemlos. Nun habe ich ein komplettes System Update gemacht. Der Ferienkalender wird anscheinend immer noch richtig verarbeitet.

Nur wird mir jetzt angezeigt, dass heute ein Feiertag ist, weil heute Neujahr 01-01-1017 ist ?!

Was haut da nicht hin ?


sub getCalendar(){
   my $ret;
   my $year=strftime("%Y",localtime);
   $ret = system("wget -O ferien.ics https://www.ferienwiki.de/exports/ferien/".$year."/de/niedersachsen");
   $ret = system("wget -O feiertage.ics https://www.ferienwiki.de/exports/feiertage/".$year."/de/niedersachsen");
}

# Der Tagesstatus (Text des Ereignisses) und der Tagesmode (Ferien, Feiertag, Wochenende, Wochentag)
# wird aus den Kalendern ermittelt. Aufruf aus FHEM um 03:15 -->  TagesstatusCheck_at

sub getDayStatus(){
   my $ret;
   my $msg;
   my @lines;
   my $date;
   my $desc;
   #strftime "%d-%m",localtime
   
   $ret = fhem("get Ferien_cal text modeAlarmOrStart");
   if( $ret ne ""){
     @lines = split('\n',$ret);
     $date  = substr($lines[0],0,8);
     $desc  = substr($lines[0],15);
     $msg = "$desc $date";
     fhem("set Tagesstatus_du $desc");
     fhem("set Tagesmode_du Ferien");

   }else{
     $ret = fhem("get Feiertage_cal text modeAlarmOrStart");
     if( $ret ne ""){
       @lines = split('\n',$ret);
       $date  = substr($lines[0],0,8);
       $desc  = substr($lines[0],15);
       $msg = "$desc $date";
       fhem("set Tagesstatus_du $desc");
       fhem("set Tagesmode_du Feiertag");
     }else{
       if( strftime("%u",localtime) > 5 ){
         $msg = "Wochenende";
         fhem("set Tagesstatus_du $msg");
         fhem("set Tagesmode_du $msg");
       }else{
         $msg = "Wochentag";
         fhem("set Tagesstatus_du $msg");
         fhem("set Tagesmode_du $msg");
       }
     }
   }
   return $msg;
}


Der Auszug aus der fhem.cfg


define Ferien_cal Calendar ical file ferien.ics 86400
attr Ferien_cal event-on-change-reading modeStarted,modeEnded,modeChanged,modeUpcoming
attr Ferien_cal group Kalender
attr Ferien_cal hideOlderThan 1
attr Ferien_cal room 9.4_Kalendar
attr Ferien_cal verbose 5

define Feiertage_cal Calendar ical file feiertage.ics 86400
attr Feiertage_cal event-on-change-reading modeStarted,modeEnded,modeChanged,modeUpcoming
attr Feiertage_cal group Kalender
attr Feiertage_cal hideOlderThan 1
attr Feiertage_cal room 9.4_Kalendar
attr Feiertage_cal verbose 5

define TagesstatusCheck_at at *03:15:00 {getDayStatus()};;
attr TagesstatusCheck_at group Kalender
attr TagesstatusCheck_at room 9.4_Kalendar

define Tagesstatus_du dummy
attr Tagesstatus_du group Kalender
attr Tagesstatus_du room 9.4_Kalendar

define Tagesmode_du dummy
attr Tagesmode_du group Kalender
attr Tagesmode_du room 9.4_Kalendar

derHeimwerker

Hat sich erledigt. Der Fehler lag in der ical Datei. Die Feiertage hatten dort keinen End-Termin eingetragen. Also war der 01.01. immer noch ein gestarteter aktueller Termin.

my-engel

Hallo Zusammen,

ich muss dieses Thema auch noch einmal hervor holen.
Habe das gleiche Problem, die Feiertage haben keinen End-Termin und der 01.01. steht noch als aktueller Termin.
Nur der Feiertagskalender macht Probleme, der Ferienkalender funktioniert...
Ein herumspielen mit den attr hideOlderThan usw. brachte nichts.
Habt ihr eine andere Kalenderquelle eingesetzt ? bzw.
Welche Lösung setzt ihr ein???

MfG Uwe

Prof. Dr. Peter Henning

Selbst mit XSLT generierte ical-Dateien. Garantiert fehlerfrei.

LG

pah

my-engel

Hallo pah,

Danke für Deine Antwort, ich werde mich mal damit beschäftigen...

Mit dem "Garantiert fehlerfrei" ist so eine Sache,
da der Fehler40 immer 40cm vor dem Ding sitzt ;-)

Habe vorerst eine andere Quelle für den Feiertagskalender eingesetzt:
"wget -O feiertage.ics http://www.ifeiertage.de/sn-.ics"
dann in der Datei mal von Hand den 1.5. auf 8.4. geändert, und siehe da
... Hurra heute ist "Feiertag" ....
und ich geh jetzt in den Garten.

MfG
Uwe

Prof. Dr. Peter Henning

ZitatMit dem "Garantiert fehlerfrei" ist so eine Sache,
da der Fehler40 immer 40cm vor dem Ding sitzt ;-)
Sicher nicht.

pah

nils_

Zitat von: my-engel am 07 April 2018, 13:37:21
Habe das gleiche Problem, die Feiertage haben keinen End-Termin und der 01.01. steht noch als aktueller Termin.
Nur der Feiertagskalender macht Probleme, der Ferienkalender funktioniert...

beim letzten calendar update sollte das eigentlich kein problem mehr sein (also fehlende end-zeiten bei den terminen)


dieses forum hier ist eigentlich nur für code-schnipsel gedacht :)
guck einfach mal dort:
https://forum.fhem.de/index.php/board,85.0.html
viele Wege in FHEM es gibt!

pnewman

Zitat von: Prof. Dr. Peter Henning am 31 Mai 2015, 17:56:05

Die erste Routine wird einmal zu Jahresbeginn gerufen, holt die Ferienkalender. Eine Datei muell.ics wird manuall erzeugt oder sonstwie generiert.


LG

pah

Vielen Dank für den Code und die Idee den Kalender nur einmal im Jahr zu holen.
Das finde ich aus mehreren Gründen als beste Idee.

Nun habe ich kleine Wissenslücken:
Wohin werden die Kalender denn gespeichert?
Wohin muss ich den Kalender Müll.ics speichern?

Ich habe schon auf dem Raps gesucht, aber nichts gefunden.

Gruß

Ralf

Edit:
Ich habe die .ics Dateien in den Ordner /opt/fhem kopiert.
Dort werden sie dann gefunden wenn man  set Feiertage reload eingibt.
Raspberry Pi3B+ / Nano-Cul 868 - MAX!=Heizung, HM-Lan - Rollo+Licht, JeeLink-Clone 868 - LaCrosse, JeeLink-Clone 868 - PCA301, CUL 434 - IT-Steckdosen+Fernbedienung

my-engel

Hallo,

Seit dem letzten Update von 57_Calendar.pm funktionieren die Abfragen wie
get Ferienkalender text modeAlarmOrStart
standardmässig nicht mehr.

Lösung vorerst:
Im zugehörigen Kalender dann das Attribut
hasModeReadings
auf 1 setzen

So wie ich es verstanden habe sollte man aber auf Abfragen wie
get Ferienkalender events limit:when=today
get Ferienkalender events limit:when=0

umbauen.
Hat dieses evtl. schon jemand getan und könnte dies kurz mitteilen?

VG
Uwe