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!

Gr!nDeR

moin, ich hab mal auch ein bisschen was für den totensonntag geschrieben...

define Weihnachtsbeleuchtung_Steuerung DOIF ([LiSens_Garage_0Uhr:state] eq "active" and $month==11 and $mday>=20 and $mday <=26 and $wday==0) (set LiSens_Garage_0Uhr inactive;;setReading Weihnachtsbeleuchtung_Steuerung Status XMAS TIME)\
DOELSEIF([LiSens_Garage_0Uhr:state] eq "inactive" and $month==1 and $mday==6) (set LiSens_Garage_0Uhr active;;set room=Weihnachtsbeleuchtung on;;setreading Weihnachtsbeleuchtung_Steuerung Status normal - alle Shelly on)\
DOELSEIF([06:00-00:00] and [LW.I1.Lichtsensor_Garage:state] eq "on" ) (set room=Weihnachtsbeleuchtung on;;setreading Weihnachtsbeleuchtung_Steuerung Status ON: LS und Zeit und Xmas)\
DOELSEIF([00:00]) (set room=Weihnachtsbeleuchtung off;;setreading Weihnachtsbeleuchtung_Steuerung Status OFF: 0 Uhr Xmas)\

attr Weihnachtsbeleuchtung_Steuerung room Lichtsteuerung,Weihnachtsbeleuchtung
attr Weihnachtsbeleuchtung_Steuerung stateFormat Status
#   DEF        ([LiSens_Garage_0Uhr:state] eq "active" and $month==11 and $mday>=20 and $mday <=26 and $wday==0) (set LiSens_Garage_0Uhr inactive;setReading Weihnachtsbeleuchtung_Steuerung Status XMAS TIME)
#DOELSEIF([LiSens_Garage_0Uhr:state] eq "inactive" and $month==1 and $mday==6) (set LiSens_Garage_0Uhr active;set room=Weihnachtsbeleuchtung on;setreading Weihnachtsbeleuchtung_Steuerung Status normal - alle Shelly on)
#DOELSEIF([06:00-00:00] and [LW.I1.Lichtsensor_Garage:state] eq "on" ) (set room=Weihnachtsbeleuchtung on;setreading Weihnachtsbeleuchtung_Steuerung Status ON: LS und Zeit und Xmas)
#DOELSEIF([00:00]) (set room=Weihnachtsbeleuchtung off;setreading Weihnachtsbeleuchtung_Steuerung Status OFF: 0 Uhr Xmas)
#
#   FUUID      6921ce7a-f33f-5bb8-2691-ab3a3b23330ceed7
#   MODEL      FHEM
#   NAME       Weihnachtsbeleuchtung_Steuerung
#   NOTIFYDEV  LW.I1.Lichtsensor_Garage,LiSens_Garage_0Uhr,global
#   NR         180
#   NTFY_ORDER 50-Weihnachtsbeleuchtung_Steuerung
#   STATE      ON: LS und Zeit und Xmas
#   TYPE       DOIF
#   VERSION    30377 2025-10-12 09:46:59
#   eventCount 281
#   READINGS:
#     2025-11-24 16:21:25   Device          LW.I1.Lichtsensor_Garage
#     2025-11-24 16:21:25   Status          ON: LS und Zeit und Xmas
#     2025-11-24 16:21:25   cmd             3
#     2025-11-24 16:21:25   cmd_event       LW.I1.Lichtsensor_Garage
#     2025-11-24 16:21:25   cmd_nr          3
#     2025-11-24 16:21:25   e_LW.I1.Lichtsensor_Garage_state on
#     2025-11-24 16:20:12   mode            enabled
#     2025-11-24 16:21:25   state           cmd_3
#     2025-11-24 16:19:38   timer_01_c03    25.11.2025 06:00:00
#     2025-11-24 16:19:38   timer_02_c03    25.11.2025 00:00:00
#     2025-11-24 16:19:38   timer_03_c04    25.11.2025 00:00:00
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#     cond:
#       LW.I1.Lichtsensor_Garage:
#         0:
#         1:
#         2:
#           state      ^LW.I1.Lichtsensor_Garage$:^state:
#       LiSens_Garage_0Uhr:
#         0:
#           state      ^LiSens_Garage_0Uhr$:^state:
#         1:
#           state      ^LiSens_Garage_0Uhr$:^state:
#   attr:
#     cmdState:
#     wait:
#     waitdel:
#   condition:
#     0          ::ReadingValDoIf($hash,'LiSens_Garage_0Uhr','state') eq "active" and $month==11 and $mday>=20 and $mday <=26 and $wday==0
#     1          ::ReadingValDoIf($hash,'LiSens_Garage_0Uhr','state') eq "inactive" and $month==1 and $mday==6
#     2          ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'LW.I1.Lichtsensor_Garage','state') eq "on"
#     3          ::DOIF_time_once($hash,2,$wday)
#   days:
#   devices:
#   do:
#     0:
#       0          set LiSens_Garage_0Uhr inactive;setReading Weihnachtsbeleuchtung_Steuerung Status XMAS TIME
#     1:
#       0          set LiSens_Garage_0Uhr active;set room=Weihnachtsbeleuchtung on;setreading Weihnachtsbeleuchtung_Steuerung Status normal - alle Shelly on
#     2:
#       0          set room=Weihnachtsbeleuchtung on;setreading Weihnachtsbeleuchtung_Steuerung Status ON: LS und Zeit und Xmas
#     3:
#       0          set room=Weihnachtsbeleuchtung off;setreading Weihnachtsbeleuchtung_Steuerung Status OFF: 0 Uhr Xmas
#     4:
#   helper:
#     NOTIFYDEV  LW.I1.Lichtsensor_Garage,LiSens_Garage_0Uhr,global
#     event      on
#     globalinit 1
#     last_timer 3
#     sleeptimer -1
#     timerdev   LW.I1.Lichtsensor_Garage
#     timerevent on
#     triggerDev LW.I1.Lichtsensor_Garage
#     timerevents:
#       on
#     timereventsState:
#       state: on
#     triggerEvents:
#       on
#     triggerEventsState:
#       state: on
#   internals:
#   interval:
#     0          -1
#     1          0
#   intervalfunc:
#   localtime:
#     0          1764046800
#     1          1764025200
#     2          1764025200
#   readings:
#     all         LiSens_Garage_0Uhr:state LW.I1.Lichtsensor_Garage:state
#   realtime:
#     0          06:00:00
#     1          00:00:00
#     2          00:00:00
#   time:
#     0          06:00:00
#     1          00:00:00
#     2          00:00:00
#   timeCond:
#     0          2
#     1          2
#     2          3
#   timer:
#     0          0
#     1          0
#     2          0
#   timers:
#     2           0  1
#     3           2
#   trigger:
#   triggertime:
#     1764025200:
#       localtime  1764025200
#       hash:
#     1764046800:
#       localtime  1764046800
#       hash:
#   uiState:
#   uiTable:
#
setstate Weihnachtsbeleuchtung_Steuerung ON: LS und Zeit und Xmas
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-24 14:28:55 .eM off
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-24 16:21:25 Device LW.I1.Lichtsensor_Garage
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-24 16:21:25 Status ON: LS und Zeit und Xmas
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-24 16:21:25 cmd 3
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-24 16:21:25 cmd_event LW.I1.Lichtsensor_Garage
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-24 16:21:25 cmd_nr 3
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-24 16:21:25 e_LW.I1.Lichtsensor_Garage_state on
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-24 16:20:12 mode enabled
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-24 16:21:25 state cmd_3
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-24 16:19:38 timer_01_c03 25.11.2025 06:00:00
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-24 16:19:38 timer_02_c03 25.11.2025 00:00:00
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-24 16:19:38 timer_03_c04 25.11.2025 00:00:00


ich hab einen Lichtsensor (LW.I1.Lichtsensor_Garage) an einer Logo8, der nur sagt: "ist dunkel"=1 oder "ist hell" =0
dann hab ich die passenden lampen an shellys in einem raum "Weihnachtsbeleuchtung"
eine der lampen soll im normalmodus ausserhalb der weihnachtszeit eine art treppenlicht darstellen, wird realisiert über "LiSens_Garage_0Uhr" (macht das licht an, wenns dunkel ist und um 9 Uhr aus)
erste doif: ist es totensonntag, also monat 11 und tag>20 und tag<26 und auch noch tag=montag - also der tag nach totensonntag? dann deaktiviere LiSens_Garage_0Uhr (weil die lampe ja auch zur weihnachtsbeleuchtung gehört)
zweite doelseif: wenn LiSens_Garage_0Uhr = inactive und es ist der 06.01., dann mach LiSens_Garage_0Uhr wieder active und schalte alle shellys auf dauer_an
dritte doelseif: zwischen 6-0Uhr und wenn es dunkel ist, schalte den raum "Weihnachtsbeleuchtung" an (alle shellys)
vierte doelseif: wenn 0uhr, schalte raum "weihnachtsbeleuchtung" aus


kann man das noch irgendwie verbessern? ist die syntax soweit korrekt?