Weihnachtsbeleuchtung schalten bzw. ende der Beleuchtung

Begonnen von rvideobaer, 02 Februar 2025, 19:37:24

Vorheriges Thema - Nächstes Thema

rvideobaer

Hallo,

ich habe das kleine Programm
use POSIX;

sub xmas(){
    #Der Totensonntag fällt immer auf einen Tag zwischen dem 20. Und 26. November.
    my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(gettimeofday());
    $month=10;
    $mday=20;
    ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(timelocal($sec,$min,$hour,$mday,$month,$year));
    if ($wday>0){
        $mday+=7-$wday;
    }
    #Montag nach Totensontag
    $mday+=1;
    my $totensonntag=timelocal(0,0,0,$mday,$month,$year);
    #Weihnachtsbeleuchtungsende ist am 1.Februar
    my $weihnachtsende=timelocal(59,59,23,1,2,$year);
    #War wenn vor dem 12.01 oder nach Totensonntag
    return gettimeofday()<$weihnachtsende ? 1 : gettimeofday() > $totensonntag ? 1 : 0;
}
benutzt um meine Weihnachtsbeleuchtung einzuschalten.
es wird dann mit dem folgenden doif getriggert.
(xmas == 1 and ([14:00-23:08|56] and [HM_Sensor:luminosity] < 12) or (xmas == 1 and ([14:00-22:08|01234] and [HM_Sensor:luminosity] < 12))) ((set L_Gruppe scene Weihnachten)) DOELSE ((set L_Gruppe scene Weihnachten_Aus))
jetzt sollte aber am 2. Februar schuss sein, leider wird die Beleuchtung aber immer noch eingeschaltet. Hat jemand eine Idee was ich hier falsch mache?

Gruß Rolf
Raspberry Pi 2, HM-Uart,1x HM-LC-Sw1PBU-FM, 1x HM-RC-2-PBU-FM,1x HM-LC-SW4-DR,1x HM-LC-Sw1-Pl-DN-R1,1x HM-TC-IT-WM-W-EU, 5x HM-CC-RT-DN und noch mehr

rabehd

Auch funktionierende Lösungen kann man hinterfragen.

rvideobaer

Hallo,

doch eigentlich immer wenn sich der wert "HM_Sensor:luminosity" ändert. Oder?

Gruß Rolf
Raspberry Pi 2, HM-Uart,1x HM-LC-Sw1PBU-FM, 1x HM-RC-2-PBU-FM,1x HM-LC-SW4-DR,1x HM-LC-Sw1-Pl-DN-R1,1x HM-TC-IT-WM-W-EU, 5x HM-CC-RT-DN und noch mehr

betateilchen

Es ist völlig egal, wann das aufgerufen wird.

Deine Berechnung für $weihnachtsende ist schlicht falsch, wenn Du den 1. Februar haben möchtest.

Mit Monat=2 in timelocal() berechnest Du den timestamp für den 1. März, weil die Zählung der Monate mit 0 beginnt.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

rabehd

Zitat von: rvideobaer am 02 Februar 2025, 20:09:26Hallo,

doch eigentlich immer wenn sich der wert "HM_Sensor:luminosity" ändert. Oder?

Gruß Rolf
Da bist Du Dir wohl nicht sicher?
Ich sehe da keine Neuberechnung getriggert durch dem Sensor.
Falls es durch das DOIF passiert, dann finde ich es nicht schön geschrieben.

Zitat von: betateilchen am 02 Februar 2025, 20:22:25Es ist völlig egal, wann das aufgerufen wird.

Hier egal, aber grundsätzlich sollte man auch wissen wann/wie
Auch funktionierende Lösungen kann man hinterfragen.

rvideobaer

@betateilchen

Danke für den Hinweis habe es geändert. Ich hoffe das es jetzt funktioniert. Werde es dann am Jahresende merken ob er tut wie er soll.
Also nochmal Danke für den Hilfreichen Post.

Gruß Rolf
Raspberry Pi 2, HM-Uart,1x HM-LC-Sw1PBU-FM, 1x HM-RC-2-PBU-FM,1x HM-LC-SW4-DR,1x HM-LC-Sw1-Pl-DN-R1,1x HM-TC-IT-WM-W-EU, 5x HM-CC-RT-DN und noch mehr

betateilchen

Zitat von: rvideobaer am 02 Februar 2025, 21:24:18Danke für den Hinweis habe es geändert. Ich hoffe das es jetzt funktioniert. Werde es dann am Jahresende merken ob er tut wie er soll.

Welcher Wert von xmas() zurückgeliefert wird, kannst Du doch jederzeit in Deinem FHEM testen, indem Du {xmas()} in die FHEM Befehlszeile oben eingibst. Da muss je nach Zeitpunkt eine 0 oder eine 1 zurückkommen.

Solchen Problemen auf die Schliche zu kommen, ist auch relativ einfach. Man baut sich einfach zum Testen ein paar passende Debug Ausgaben in den Code.

sub xmas(){
    #Der Totensonntag fällt immer auf einen Tag zwischen dem 20. Und 26. November.
    my ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(gettimeofday());
    $month=10;
    $mday=20;
    ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(timelocal($sec,$min,$hour,$mday,$month,$year));
    if ($wday>0){
        $mday+=7-$wday;
    }
    #Montag nach Totensontag
    $mday+=1;
    my $totensonntag=timelocal(0,0,0,$mday,$month,$year);
Debug $totensonntag;
    #Weihnachtsbeleuchtungsende ist am 1.Februar
    my $weihnachtsende=timelocal(59,59,23,1,2,$year);
Debug $weihnachtsende;
Debug gettimeofday();
    #War wenn vor dem 12.01 oder nach Totensonntag
    return gettimeofday()<$weihnachtsende ? 1 : gettimeofday() > $totensonntag ? 1 : 0;
}

Damit bekommst Du beim Aufruf von xmas() drei Zahlen ins Log:

2025.02.02 20:16:02 1: DEBUG>1763938800       (das ist $totensonntag)
2025.02.02 20:16:02 1: DEBUG>1740869999       (das ist $weihnachtsende)
2025.02.02 20:16:02 1: DEBUG>1738523762.28387 (das ist gettimeofday())

Daran siehst Du auf einen Blick, dass $weihnachtsende noch nicht erreicht ist.

Dann gibst Du mal {localtime 1740869999} in die FHEM Befehlszeile ein, bekommst als Ergebnis

Sat Mar 1 23:59:59 2025
und schon weißt Du Bescheid, wo das Problem liegt...

Und danach bitte nicht vergessen, die Debug Meldungen wieder auszubauen 8)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!