Gelöst: Aktualisierung Kalenderjahr bei Schulferien

Begonnen von Pjg, 13 Oktober 2014, 20:39:33

Vorheriges Thema - Nächstes Thema

Pjg

Die von Schulferien.org zur Verfügung gestellten Kalender haben ja die Herausforderung, immer nur pro Jahr definiert zu sein.
Somit muss man sich überlegen, wie man in FHEM jeweils den richtigen Kalender automatisch erwischt.

Aus einem anderen Thread, wo diese Thema bereits gelöst wurde, der aber schon zu ist, stammt dieses Zitat:

Zitatin fhem selbst würde ich mir ein notify anlegen, das auf global:INITIALIZED reagiert und nach dem vollständigen fhem Start diese Funktion aufruft:

Wenn ich mir die Definition in der commandref von INITIALIZED anschaue, und diesen Satz lese, stellt sich mir folgende Frage:

Wie kann das funktionieren, wenn ich FHEM nur alle paar Wochen oder Monate einmal neu starten muss, da es ja rund läuft?
Muss ich nicht besser immer am 1.1. eines jeden Jahres die Funktion aufrufen, und wie könnte ein entsprechender Aufruf aussehen?

Evtl. ein notify auf den Jahreswechsel?
BananaPI, CUL 433, Somfy RTS, Hue LWL001, Hue LWB004, HM-CFG-LAN, HM-LC-SW2-FM

Baumi

Theoretisch könntest Du doch auch ein at-Kommando nutzen, das einmal pro Tag (z.B. kurz nach Mitternacht) den Ferienkalender des aktuellen Jahres einstellt. Der Befehl würde zwar 364 mal im Jahr umsonst laufen, aber ressourcentechnisch wäre das, glaube ich, kein besonders großes Problem.

Pjg

#2
Da bin ich mir jetzt nicht so sicher.
Wenn ich einen define schon habe, sagen wir mal am 1.1. erstellt, dann müsste FHEM aber eigentlich meckern, wenn ich den gleichen define am 2.1. schon wieder machen will. Oder etwa nicht?

Wie's ausschaut, funktioniert die Lösung von betateilchen nur auf den ersten Blick:
Da ja mit restart noch keine Defiition vorhanden ist, sondern diese ja erst quasi beim hochfahren von FHEM erstellt wird. Somit muss zuvor auch nichts gelöscht werden.
Problem ist jedoch, das dies nur funktioniert, wenn am 1.1. um kurz nach 0:00 auch wirklich ein Restart durchgeführt wird.
Wenn dieser restart erst am 2.2. erfolgt, sind die Weihnachtsferien schon vorbei :-)

Ein zusätzlicher defineFerien(2015) am 1.1. funktioniert jedoch nicht, da schon ein Kalender für 2014 vorhanden ist. Die Defintion wird in diesem Fall nicht geändert, aber auch nicht weiter kommentiert.

Ich wewrde es einmal bei Gelegenheit mit CommandModify probieren.
Also anstatt so:
Zitatsub defineFerien($) {
  my ($year) = @_;
  my $url = "http://www.schulferien.org/iCal/Ferien/icals/Ferien_Bayern_$year.ics";
  CommandDefine(undef, "Bayern_Ferien Calendar ical url $url 21600");
  return;
}

so:
sub defineFerien($) {
  my ($year) = @_;
  my $url = "http://www.schulferien.org/iCal/Ferien/icals/Ferien_Bayern_$year.ics";
  CommandModify(undef, "Bayern_Ferien Calendar ical url $url 21600");
  return;
}

Ich hoffe, das er dann die bestehende Definition ändert, und somit über einen täglichen Aufruf aktualisiert werden kann.
Mal sehen.
BananaPI, CUL 433, Somfy RTS, Hue LWL001, Hue LWB004, HM-CFG-LAN, HM-LC-SW2-FM

Pjg

Die Hoffnung stirbt zuletzt. Also gerade eben...
Leider ändert ein CommandModify ebenfalls nicht eine bestehende Definition.

Ich gebe auf und habe zwei Kalender definiert.
Jeweils für's aktuelle und Folgejahr. Ich muss nun immer manuell eingreifen und das Jahr abändern.

Schade, aber ich komme mit meinen Mitteln nicht weiter.
BananaPI, CUL 433, Somfy RTS, Hue LWL001, Hue LWB004, HM-CFG-LAN, HM-LC-SW2-FM

Baumi

Mit CommandDefine() und Co habe ich noch nie gearbeitet, aber die folgende Konstruktion funktioniert bei mir ganz gut, um FHEM-Dummys oder -Funktionen ggf. neu zu definieren:

{
fhem("delete auto_weather_repeat") if (Value("auto_weather_repeat") ne "");;
fhem("define auto_weather_repeat at +00:10:00 {alertWeather(1)}");;
}


Ließe sich das evtl. so anpassen, dass es bei Dir klappt?

Pjg

Baumi, Du bist mein Held :-)

So funktioniert es:

Zitatsub defineFerien($) {
  my ($year) = @_;
  my $url = "http://www.schulferien.org/iCal/Ferien/icals/Ferien_Bayern_$year.ics";
  fhem("delete Bayern_Ferien");
  CommandDefine(undef, "Bayern_Ferien Calendar ical url $url 21600");
  return;
}

Auf der Basis kann man nun auch ein doif aufbauen, welches bei (jedem neustart) oder (um 0:05 Uhr am 1. eines jeden monats (hauptsächlich natürlich am 1.1.)) diese defineFerien aufruft.
Oder eben ein at für den 1. eines Monats, und ein notify wie bei betateilchen für den neustart.

Danke.
BananaPI, CUL 433, Somfy RTS, Hue LWL001, Hue LWB004, HM-CFG-LAN, HM-LC-SW2-FM

Puschel74

#6
Hallo,

wenn die Frage gelöst ist dann bitte dem Betreff noch ein Gelöst vorne dran.
Danke.


Grüße

Edith: Ich muss mal meinen Bildschirm putzen  ::)
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

Spartacus

Hi Pjg,
kannst Du die komplette Lösung mal posten?

Danke,
Spartacus.
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Pjg

#8
fhem.cfg

Zitat# Schulferien
define Ferientag dummy
define makeFerien notify global:INITIALIZED {defineFerien($year)}
define makeFerien2 at *00:05 { if ( $mday == 1) {defineFerien($year)}}
define Job_Ferien_Check notify Ferien { fhem "set Ferientag " . (ReadingsVal("Ferien", "modeStart", "") =~ "schulferien" ? 1: 0) }

myutils
Zitatsub defineFerien($) {
  my ($year) = @_;
  my $url = "http://www.schulferien.org/iCal/Ferien/icals/Ferien_Rheinland_Pfalz_$year.ics";
  fhem("delete Ferien");
  CommandDefine(undef, "Ferien Calendar ical url $url 86400");
  return;
}

BananaPI, CUL 433, Somfy RTS, Hue LWL001, Hue LWB004, HM-CFG-LAN, HM-LC-SW2-FM

Spartacus

Halo,
Danke für Deinen Post. Du fragst mit mday=1 den ersten Tag eines Monats ab. Müsste man hier nicht auch den Monat mon=0 für Januar abfragen? Sonst läuft Dein at doch jeden 1. eines Monats um 5 nach 12.

Oder was übersehe ich gerade....
Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Pjg

Siehst Du fast richtig. $month ==1 könnte man noch rein nehmen.
Hab ich jetzt aber mal gelassen. Wird dann halt 11 mal zuviel aufgerufen.
BananaPI, CUL 433, Somfy RTS, Hue LWL001, Hue LWB004, HM-CFG-LAN, HM-LC-SW2-FM

Deen

Frohes neues Jahr an alle!
Für die Steuerung meine Rollladen habe ich die Lösung von Pjg Angewendet, das hat Funktioniert bis Jahreswechselt jetzt wird nach neues Jahr kein Feiertag erkannt.
Weiß es jemand mehr drüber?
Vielen Dank.

Spartacus

#12
Hallo zusammen
das Problem von Deen habe ich auch. Der Code von oben hat einen Haken:

Wenn die Ferien um 00:05:00 Uhr an Neujahr auf das neue Kalenderjahr aktualisiert werden, dann sind die aktuellen Weihnachtsferien futsch, denn diese sind im Kalender für 2015 angegeben (22.12.2015-07.01.2016).

Hat dafür jemand eine Lösung?
Spartacus
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R

Baumi

Es müsste mit Hilfe der internen FHEM-Variablen für Tag und Monat gehen. (Nicht getestet!)

sub defineFerien($) {
  my ($year) = @_;
  my $url = "http://www.schulferien.org/iCal/Ferien/icals/Ferien_Rheinland_Pfalz_$year.ics";
  if ($month > 1 || $mday > 15) {
    fhem("delete Ferien");
    CommandDefine(undef, "Ferien Calendar ical url $url 86400");
  }
  return;
}


(Die Kombination aus delete und CommandDefine ließe sich inzwischen auch durch ein defmod ersetzen.)

Mit dieser Routine wird (wenn ich mich nicht vertippt habe) der Kalender zwischen dem 1. und 15. Januar nicht aktualisiert. Und ich glaube, am 15.01. sind nirgendwo mehr Ferien.

Alternativ könnte man die Abfrage auch auf einen einzelnen Zeitraum beschränken (z.B. ändere das Define nur am soundsovielten Januar), aber das birgt die Gefahr, dass ausgerechnet in der Minute, in der die Funktion aufgerufen werden müsste, aus irgendwelchen Gründen gerade fhem nicht läuft und man das ganze Jahr über den falschen Kalender hat. Ein einzelnes define pro Tag kostet nicht viel Rechenzeit und beugt diesem Problem vor.

Spartacus

#14
Hallo Baumi,
das ist es noch nicht ganz, denn durch:
define makeFerien notify global:INITIALIZED {defineFerien($year)}
werden die Ferien bei jedem Booten mit dem aktuellen Jahr angelegt. Das muss man noch irgendwie abfangen...
Christian

NACHTRAG:
das if ($month > 1 || $mday > 15) {
    fhem("delete Ferien");

funktioniert noch nicht! Der Befehl wird ausgeführt.
Fhem-System: 1 x raspberry PI Typ B, 1 x enOcean PI Typ B | Enocean: PTM210, FMS61NP, FAM14, 2 x FSR14-4x, FTS14-EM | LaCrosse: 2 x TX29D über Jeelink V3 | 1-Wire: 2 x DS18B20 über DS9490R