Gelöst: vom 01.12 bis zum ersten Sonntag nach dem Dreikönigstag

Begonnen von xavier, 08 Januar 2021, 22:39:33

Vorheriges Thema - Nächstes Thema

xavier

Hallo,

Ich weiß, dass die Saison jetzt fast vorbei ist, aber hier wollen sie die Weihnachtsbeleuchtung bis zum ersten Sonntag nach dem 6. Januar anhalten.

Ich hatte diesen einfachen DOIF geschrieben:


([{sunset("HORIZON=-1.5")}-{sunrise("HORIZON=-11")}] and ($md ge "12-01" or $md le "01-06")) (set blabla on)
DOELSE (set blabla off)


und für dieses Jahr könnte ich einfach "01-06" in "01-10" ändern, aber jedes Jahr müsste ich den Code ändern.

Gibt es eine elegante Möglichkeit, den ersten Sonntag nach dem 6. Januar eines jeden Jahres zu berechnen?

Muss ich in myUtils eine externe Routine erstellen oder kann ich dies im DOIF tun?

P.S. Während ich mit Google Translate aus Italien schreibe, entschuldige ich mich, wenn die deutsche Übersetzung nicht perfekt ist.

Schöne Grüße,
Xavier

Damian

Zitat von: xavier am 08 Januar 2021, 22:39:33
Hallo,

Ich weiß, dass die Saison jetzt fast vorbei ist, aber hier wollen sie die Weihnachtsbeleuchtung bis zum ersten Sonntag nach dem 6. Januar anhalten.

Ich hatte diesen einfachen DOIF geschrieben:


([{sunset("HORIZON=-1.5")}-{sunrise("HORIZON=-11")}] and ($md ge "12-01" or $md le "01-06")) (set blabla on)
DOELSE (set blabla off)



und für dieses Jahr könnte ich einfach "01-06" in "01-10" ändern, aber jedes Jahr müsste ich den Code ändern.

Gibt es eine elegante Möglichkeit, den ersten Sonntag nach dem 6. Januar eines jeden Jahres zu berechnen?

Muss ich in myUtils eine externe Routine erstellen oder kann ich dies im DOIF tun?

P.S. Während ich mit Google Translate aus Italien schreibe, entschuldige ich mich, wenn die deutsche Übersetzung nicht perfekt ist.

Schöne Grüße,
Xavier

Da müsstest du eine Perl-Funktion programmieren, die das korrekte Datum im Format MM_DD liefert. Diese Funktion kannst du dann angeben.

z. B.:

($md ge "12-01" or $md le last_day())

evtl. kannst du es auch mit holiday-Modul über den Typ 5 lösen:

Zitat5
Date relative, weekday fixed holiday. Arguments: <nth> <weekday> <month> <day> < holiday-name>
Note that while +0 or -0 as offsets are not forbidden, their behaviour is undefined in the sense that it might change without notice.
Examples:
5 -1 Wed 11 23 Buss und Bettag (first Wednesday before Nov, 23rd)
5 1 Mon 01 31 First Monday after Jan, 31st (1st Monday in February)

siehe: https://fhem.de/commandref.html#holiday
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

xavier

Vielen Dank für Ihre Vorschläge. Ich konnte die Funktion holiday() nicht verwenden, da ich keinen Weg finden konnte, einen Wert basierend auf dem Feiertagsnamen zu erhalten, sondern nur auf einem Datum (gestern, morgen).

Andererseits habe ich eine funktionierende Lösung für myUtils mit diesem Code:


sub last_day(){
   my $year = (localtime(time))[5]+1900;
   my $time = str2time("01/06/$year");
   my $wday = (localtime($time))[6];
   my $lday = 6 + (7 - $wday);
   return sprintf("01-%02d",$lday);
}


Schöne Grüße,
Xavier