95_holiday.pm - Daylight saving time (DST) - Typ 5 - wird nicht angezeigt

Begonnen von bertl, 25 Oktober 2026, 12:50:04

Vorheriges Thema - Nächstes Thema

bertl

Hallo Leute,

mir ist heute am 25.10.2026 (Beginn Winterzeit) aufgefallen, dass mit "get Termine today" nichts angezeigt wird.

Termine.holiday - Teilausschnitt von der Typ 5 Definition:
5 -1 Sun 04 01 Beginn Sommerzeit
5  1 Sun 05 07 Muttertag
5  1 Sun 06 07 Vatertag
5  1 Sun 09 30 Erntedankfest
5 -1 Sun 11 01 Beginn Winterzeit
5 -1 Fri 11 30 Black Friday
5 -4 Sun 12 25 1. Adventsonntag
5 -3 Sun 12 25 2. Adventsonntag
5 -2 Sun 12 25 3. Adventsonntag
5 -1 Sun 12 25 4. Adventsonntag

list Termine
Internals:
   FUUID      61dd4ad2-f33f-3e1e-636e-73dbdf9bd1e98742
   FVERSION   95_holiday.pm:0.251870/2021-11-06
   HOLIDAYFILE ./FHEM/Termine.holiday
   NAME       Termine
   NR         584
   READONLY   0
   STATE      none
   TRIGGERTIME 1792965602.08219
   TYPE       holiday
   eventCount 1
   READINGS:
     2026-10-25 02:18:15   state           none
     2026-10-25 02:18:15   today           none
     2026-10-25 02:18:15   tomorrow        none
     2026-10-25 02:18:15   yesterday       none
Attributes:
   alias      sonstige Termine
   group      Termine
   icon       time_calendar
   room       Kalender
   sortby     3

Ich habe mal ein bisschen im Code von 95_holiday.pm herumgespielt und beim Aufruf von "mktime" den "isdst"-Wert von -1 auf 0 geändert.
Dann hat "get Termine today" den richtigen Wert "Beginn Winterzeit" geliefert.

diff -u 95_holiday.pm_test 95_holiday.pm
--- 95_holiday.pm_test  2026-10-25 12:24:40.844788215 +0100
+++ 95_holiday.pm       2026-10-25 11:50:45.363313206 +0100
@@ -190,11 +190,11 @@
       my $yday=$fd[7];
       # create time object of target date - mktime counts months and their
       # days from 0 instead of 1, so subtract 1 from each
-      my $tgt=mktime(0,0,1,$a[4],$a[3]-1,$fd[5],0,0,0);
+      my $tgt=mktime(0,0,1,$a[4],$a[3]-1,$fd[5],0,0,-1);
       my $tgtmin=$tgt;
       my $tgtmax=$tgt;
       my $weeksecs=7*24*60*60; # 7 days, 24 hours, 60 minutes, 60seconds each
-      my $cd=mktime(0,0,1,$fd[3],$fd[4],$fd[5],0,0,0);
+      my $cd=mktime(0,0,1,$fd[3],$fd[4],$fd[5],0,0,-1);
       if ( $a[1] =~ /^-([0-9])*$/ ) {
         $tgtmin -= $1*$weeksecs; # Minimum: target date minus $1 weeks
         $tgtmax = $tgtmin+$weeksecs; # Maximum: one week after minimum

Muss ich irgendwas spezielles bezüglich Zeitzone auf meinem Raspi einstellen, funktioniert die perl-Funktion mktime nicht richtig oder muss 95_holiday.pm angepasst werden?

Danke für die Unterstützung
Robert

betateilchen

Zitat von: bertl am 25 Oktober 2026, 12:50:04Termine.holiday - Teilausschnitt von der Typ 5 Definition:

Da die Umstellung auf Winterzeit immer am letzten Sonntag im Oktober stattfindet, solltest Du vielleicht besser eine Typ3 Definition verwenden, die genau dafür gedacht ist.

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

betateilchen

#2
Zitat von: bertl am 25 Oktober 2026, 12:50:04oder muss 95_holiday.pm angepasst werden?

Vermutlich liegt das Problem in der Tatsache, dass der Bezugstag 01.11. in diesem Jahr selbst ein Sonntag ist und deshalb die Zählung bei -1 nicht wie erwartet arbeitet.

Wenn Du in der Definition vom Typ 5 testweise mit -2 arbeitest,

5 -2 Sun 11 01 Beginn Winterzeit
wird für heute korrekt der Beginn der Winterzeit ausgegeben.

Das wird sich Rudi als Modulautor sicher bei Gelegenheit anschauen.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

bertl

Zitat von: betateilchen am 25 Oktober 2026, 13:49:42Da die Umstellung auf Winterzeit immer am letzten Sonntag im Oktober stattfindet, solltest Du vielleicht besser eine Typ3 Definition verwenden, die genau dafür gedacht ist.

Danke für den Hinweis - habe ich geändert!

bertl

Zitat von: betateilchen am 25 Oktober 2026, 15:58:59Das wird sich Rudi als Modulautor sicher bei Gelegenheit anschauen.

Obwohl für meinen speziellen Fall der Typ 3 besser geeignet ist, sollte Typ 5 auch funktionieren.

Danke, Robert

rudolfkoenig


bertl

Danke Rudi fürs schnelle checken!

Noch eine kleine kosmetische Anmerkung:

Im Code stehe als Kommentar
191        # create time object of target date - mktime counts months and their
192        # days from 0 instead of 1, so subtract 1 from each
193        my $tgt=mktime(0,0,1,$a[4],$a[3]-1,$fd[5],0,0,0);

Was so nicht stimmt, da days von 1 beginnt und somit nicht korrigiert werden muss.
Im Code ist es auch richtig ausgeführt, aber eben der Kommentar ist irreführend.

Vielleicht kannst du das bei Gelegenheit korrigieren.

Schöne Tag, Robert

rudolfkoenig

Ich habe jetzt alle Kommentare aus dem Abschnitt entfernt, da sie nur eine Uebersetzung der perl Ausdruecke nach Englisch waren.
Kommentare sind wichtig, um eine nicht offensichtliche Aktion zu erklaeren, aber in dieser Form sind sie mAn stoerend.