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?

Damian

Funktioniert deine Definition denn?

Der einzige Trigger im ersten und zweiten Zweig ist [LiSens_Garage_0Uhr:state]. Wenn es am besagten Tag keinen Trigger gibt, wird der Befehl jeweils nicht ausgeführt.

Ich würde die tägliche Lichtsteuerung von den Sonderbehandlungen logisch trennen und als Anfänger in zwei DOIFs im FHEM-Modus aufteilen. Als Perlkenner kann man alles in einem DOIF-Perl-Device unterbringen. Dort lassen sich die unterschiedlichen Funktionen durch einen modularen Aufbau logisch voneinander trennen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Gr!nDeR

tatsächlich funzt das, allerdings schaltet er nicht wie gewünscht aus, wenn lichtsensor = hell und zeit = 6-0 uhr

also nochmals angepasst und auch mit einem event mehr

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([LiSens_Garage_0Uhr:state] eq "inactive" and [06:00-23:59] and [LW.I1.Lichtsensor_Garage:state] eq "on" ) (set room=Weihnachtsbeleuchtung on;;setreading Weihnachtsbeleuchtung_Steuerung Status ON: LS und Zeit und Xmas)\
DOELSEIF([LiSens_Garage_0Uhr:state] eq "inactive" and [00:00] or [LW.I1.Lichtsensor_Garage:state] eq "off") (set room=Weihnachtsbeleuchtung off;;setreading Weihnachtsbeleuchtung_Steuerung Status OFF: Hell und oder 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([LiSens_Garage_0Uhr:state] eq "inactive" and [06:00-23:59] and [LW.I1.Lichtsensor_Garage:state] eq "on" ) (set room=Weihnachtsbeleuchtung on;setreading Weihnachtsbeleuchtung_Steuerung Status ON: LS und Zeit und Xmas)
#DOELSEIF([LiSens_Garage_0Uhr:state] eq "inactive" and [00:00] or [LW.I1.Lichtsensor_Garage:state] eq "off") (set room=Weihnachtsbeleuchtung off;setreading Weihnachtsbeleuchtung_Steuerung Status OFF: Hell und oder 0 Uhr Xmas)
#
#   FUUID      6921ce7a-f33f-5bb8-2691-ab3a3b23330ceed7
#   MODEL      FHEM
#   NAME       Weihnachtsbeleuchtung_Steuerung
#   NOTIFYDEV  global,LiSens_Garage_0Uhr,LW.I1.Lichtsensor_Garage
#   NR         180
#   NTFY_ORDER 50-Weihnachtsbeleuchtung_Steuerung
#   STATE      OFF: Hell und oder 0 Uhr Xmas
#   TYPE       DOIF
#   VERSION    30377 2025-10-12 09:46:59
#   eventCount 308
#   READINGS:
#     2025-11-26 14:12:12   Device          LW.I1.Lichtsensor_Garage
#     2025-11-26 12:47:11   Status          OFF: Hell und oder 0 Uhr Xmas
#     2025-11-26 12:47:11   cmd             4
#     2025-11-26 12:47:11   cmd_event       Weihnachtsbeleuchtung_Steuerung
#     2025-11-26 12:47:11   cmd_nr          4
#     2025-11-26 14:12:12   e_LW.I1.Lichtsensor_Garage_state off
#     2025-11-26 12:47:06   mode            enabled
#     2025-11-26 12:47:11   state           cmd_4
#     2025-11-26 12:47:06   timer_01_c03    27.11.2025 06:00:00
#     2025-11-26 12:47:06   timer_02_c03    26.11.2025 23:59:00
#     2025-11-26 12:47:06   timer_03_c04    27.11.2025 00:00:00
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#     cond:
#       LW.I1.Lichtsensor_Garage:
#         0:
#         1:
#         2:
#           state      ^LW.I1.Lichtsensor_Garage$:^state:
#         3:
#           state      ^LW.I1.Lichtsensor_Garage$:^state:
#       LiSens_Garage_0Uhr:
#         0:
#           state      ^LiSens_Garage_0Uhr$:^state:
#         1:
#           state      ^LiSens_Garage_0Uhr$:^state:
#         2:
#           state      ^LiSens_Garage_0Uhr$:^state:
#         3:
#           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          ::ReadingValDoIf($hash,'LiSens_Garage_0Uhr','state') eq "inactive" and ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'LW.I1.Lichtsensor_Garage','state') eq "on"
#     3          ::ReadingValDoIf($hash,'LiSens_Garage_0Uhr','state') eq "inactive" and ::DOIF_time_once($hash,2,$wday) or ::ReadingValDoIf($hash,'LW.I1.Lichtsensor_Garage','state') eq "off"
#   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: Hell und oder 0 Uhr Xmas
#     4:
#   helper:
#     NOTIFYDEV  global,LiSens_Garage_0Uhr,LW.I1.Lichtsensor_Garage
#     event      off
#     globalinit 1
#     last_timer 3
#     sleeptimer -1
#     timerdev   LW.I1.Lichtsensor_Garage
#     timerevent off
#     triggerDev LW.I1.Lichtsensor_Garage
#     timerevents:
#       off
#     timereventsState:
#       state: off
#     triggerEvents:
#       off
#     triggerEventsState:
#       state: off
#   internals:
#   interval:
#     0          -1
#     1          0
#   intervalfunc:
#   localtime:
#     0          1764219600
#     1          1764197940
#     2          1764198000
#   readings:
#     all         LiSens_Garage_0Uhr:state LW.I1.Lichtsensor_Garage:state
#   realtime:
#     0          06:00:00
#     1          23:59:00
#     2          00:00:00
#   time:
#     0          06:00:00
#     1          23:59: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:
#     1764197940:
#       localtime  1764197940
#       hash:
#     1764198000:
#       localtime  1764198000
#       hash:
#     1764219600:
#       localtime  1764219600
#       hash:
#   uiState:
#   uiTable:
#
setstate Weihnachtsbeleuchtung_Steuerung OFF: Hell und oder 0 Uhr Xmas
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-24 14:28:55 .eM off
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-26 14:12:12 Device LW.I1.Lichtsensor_Garage
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-26 12:47:11 Status OFF: Hell und oder 0 Uhr Xmas
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-26 12:47:11 cmd 4
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-26 12:47:11 cmd_event Weihnachtsbeleuchtung_Steuerung
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-26 12:47:11 cmd_nr 4
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-26 14:12:12 e_LW.I1.Lichtsensor_Garage_state off
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-26 12:47:06 mode enabled
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-26 12:47:11 state cmd_4
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-26 12:47:06 timer_01_c03 27.11.2025 06:00:00
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-26 12:47:06 timer_02_c03 26.11.2025 23:59:00
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-26 12:47:06 timer_03_c04 27.11.2025 00:00:00


JudgeDredd

ich bin bei weitem kein DOIF Kenner,
aber mal abgesehen davon, das das DOIF-List nicht zu der Beschreibung passt die Du da lieferst (z.B. hell/dunkel=0/1 aber was ist active/inactive; 6-0 Uhr ist etwas anderes wie 6-23:59 Uhr),
stimmt doch ebenfalls die Syntax nicht. Lt. Commandref werden mehrere SET nicht mit Semikolon getrennt

Aber vielleicht liege ich auch falsch und was Du schreibst funktioniert.
Router: Eigenbau (pfSense)
FHEM: Proxmox (DELL R720) | Debian 12 (VM)

Gr!nDeR

#11
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([LiSens_Garage_0Uhr:state] eq "inactive" and [06:00-23:59] and [LW.I1.Lichtsensor_Garage:state] eq "on" ) (set room=Weihnachtsbeleuchtung on;;setreading Weihnachtsbeleuchtung_Steuerung Status ON: LS und Zeit und Xmas)\
DOELSEIF([LiSens_Garage_0Uhr:state] eq "inactive" and [06:00-23:59] and [LW.I1.Lichtsensor_Garage:state] eq "off" ) (set room=Weihnachtsbeleuchtung off;;setreading Weihnachtsbeleuchtung_Steuerung Status OFF: Hell Xmas)\
DOELSEIF([LiSens_Garage_0Uhr:state] eq "inactive" and [00:00] or [LW.I1.Lichtsensor_Garage:state] eq "off") (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([LiSens_Garage_0Uhr:state] eq "inactive" and [06:00-23:59] and [LW.I1.Lichtsensor_Garage:state] eq "on" ) (set room=Weihnachtsbeleuchtung on;setreading Weihnachtsbeleuchtung_Steuerung Status ON: LS und Zeit und Xmas)
#DOELSEIF([LiSens_Garage_0Uhr:state] eq "inactive" and [06:00-23:59] and [LW.I1.Lichtsensor_Garage:state] eq "off" ) (set room=Weihnachtsbeleuchtung off;setreading Weihnachtsbeleuchtung_Steuerung Status OFF: Hell Xmas)
#DOELSEIF([LiSens_Garage_0Uhr:state] eq "inactive" and [00:00] or [LW.I1.Lichtsensor_Garage:state] eq "off") (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,global,LiSens_Garage_0Uhr
#   NR         180
#   NTFY_ORDER 50-Weihnachtsbeleuchtung_Steuerung
#   STATE      OFF: Hell Xmas
#   TYPE       DOIF
#   VERSION    30377 2025-10-12 09:46:59
#   eventCount 331
#   READINGS:
#     2025-11-27 10:12:19   Device          LW.I1.Lichtsensor_Garage
#     2025-11-27 10:12:19   Status          OFF: Hell Xmas
#     2025-11-27 10:12:19   cmd             4
#     2025-11-27 10:12:19   cmd_event       LW.I1.Lichtsensor_Garage
#     2025-11-27 10:12:19   cmd_nr          4
#     2025-11-27 10:12:19   e_LW.I1.Lichtsensor_Garage_state off
#     2025-11-27 09:54:28   mode            enabled
#     2025-11-27 10:12:19   state           cmd_4
#     2025-11-27 09:54:28   timer_01_c03    28.11.2025 06:00:00
#     2025-11-27 09:54:28   timer_02_c03    27.11.2025 23:59:00
#     2025-11-27 09:54:28   timer_03_c04    28.11.2025 06:00:00
#     2025-11-27 09:54:28   timer_04_c04    27.11.2025 23:59:00
#     2025-11-27 09:54:28   timer_05_c05    28.11.2025 00:00:00
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#     cond:
#       LW.I1.Lichtsensor_Garage:
#         0:
#         1:
#         2:
#           state      ^LW.I1.Lichtsensor_Garage$:^state:
#         3:
#           state      ^LW.I1.Lichtsensor_Garage$:^state:
#         4:
#           state      ^LW.I1.Lichtsensor_Garage$:^state:
#       LiSens_Garage_0Uhr:
#         0:
#           state      ^LiSens_Garage_0Uhr$:^state:
#         1:
#           state      ^LiSens_Garage_0Uhr$:^state:
#         2:
#           state      ^LiSens_Garage_0Uhr$:^state:
#         3:
#           state      ^LiSens_Garage_0Uhr$:^state:
#         4:
#           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          ::ReadingValDoIf($hash,'LiSens_Garage_0Uhr','state') eq "inactive" and ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'LW.I1.Lichtsensor_Garage','state') eq "on"
#     3          ::ReadingValDoIf($hash,'LiSens_Garage_0Uhr','state') eq "inactive" and ::DOIF_time($hash,2,3,$wday,$hms) and ::ReadingValDoIf($hash,'LW.I1.Lichtsensor_Garage','state') eq "off"
#     4          ::ReadingValDoIf($hash,'LiSens_Garage_0Uhr','state') eq "inactive" and ::DOIF_time_once($hash,4,$wday) or ::ReadingValDoIf($hash,'LW.I1.Lichtsensor_Garage','state') eq "off"
#   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: Hell Xmas
#     4:
#       0          set room=Weihnachtsbeleuchtung off;setreading Weihnachtsbeleuchtung_Steuerung Status OFF: 0 Uhr Xmas
#     5:
#   helper:
#     NOTIFYDEV  LW.I1.Lichtsensor_Garage,global,LiSens_Garage_0Uhr
#     event      off
#     globalinit 1
#     last_timer 5
#     sleeptimer -1
#     timerdev   LW.I1.Lichtsensor_Garage
#     timerevent off
#     triggerDev LW.I1.Lichtsensor_Garage
#     DOIF_eventa:
#       cmd_nr: 4
#       cmd: 4
#       cmd_event: LW.I1.Lichtsensor_Garage
#       cmd_4
#     DOIF_eventas:
#       cmd_nr: 4
#       cmd: 4
#       cmd_event: LW.I1.Lichtsensor_Garage
#       state: cmd_4
#     timerevents:
#       off
#     timereventsState:
#       state: off
#     triggerEvents:
#       off
#     triggerEventsState:
#       state: off
#   internals:
#   interval:
#     0          -1
#     1          0
#     2          -1
#     3          2
#   intervalfunc:
#   localtime:
#     0          1764306000
#     1          1764284340
#     2          1764306000
#     3          1764284340
#     4          1764284400
#   readings:
#     all         LiSens_Garage_0Uhr:state LW.I1.Lichtsensor_Garage:state
#   realtime:
#     0          06:00:00
#     1          23:59:00
#     2          06:00:00
#     3          23:59:00
#     4          00:00:00
#   time:
#     0          06:00:00
#     1          23:59:00
#     2          06:00:00
#     3          23:59:00
#     4          00:00:00
#   timeCond:
#     0          2
#     1          2
#     2          3
#     3          3
#     4          4
#   timer:
#     0          0
#     1          0
#     2          0
#     3          0
#     4          0
#   timers:
#     2           0  1
#     3           2  3
#     4           4
#   trigger:
#   triggertime:
#     1764284340:
#       localtime  1764284340
#       hash:
#     1764284400:
#       localtime  1764284400
#       hash:
#     1764306000:
#       localtime  1764306000
#       hash:
#   uiState:
#   uiTable:
#
setstate Weihnachtsbeleuchtung_Steuerung OFF: Hell Xmas
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-24 14:28:55 .eM off
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-27 10:12:19 Device LW.I1.Lichtsensor_Garage
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-27 10:12:19 Status OFF: Hell Xmas
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-27 10:12:19 cmd 4
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-27 10:12:19 cmd_event LW.I1.Lichtsensor_Garage
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-27 10:12:19 cmd_nr 4
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-27 10:12:19 e_LW.I1.Lichtsensor_Garage_state off
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-27 09:54:28 mode enabled
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-27 10:12:19 state cmd_4
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-27 09:54:28 timer_01_c03 28.11.2025 06:00:00
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-27 09:54:28 timer_02_c03 27.11.2025 23:59:00
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-27 09:54:28 timer_03_c04 28.11.2025 06:00:00
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-27 09:54:28 timer_04_c04 27.11.2025 23:59:00
setstate Weihnachtsbeleuchtung_Steuerung 2025-11-27 09:54:28 timer_05_c05 28.11.2025 00:00:00


heute nochmals angepasst, die dinger werden nicht ausgeschaltet tagsüber....

@judgedredd: doch, es funktioniert tatsächlich.
die frage war aber auch, was liesse sich daran verbessern?
übrigens hab ich zum thema active/inactive auch die erklärung dazu geschrieben, hier nochmal:
Zitateine 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)
dieser modus muss natürlich im weihnachtsmodus ausgeschaltet werden, daher das active/inactive. ich nutze diesen zustand gleichzeitig als zustand für "es ist weihnachten oder eben nicht"
und wo siehst du mehrere set-anweisungen? ich sehe nur jeweils eine.....

meine intention war, hier eventuell anderen zu helfen durch dinge, die bei mir klappen - und gleichzeitig auch noch wertvolle infos abschöpfen... aber leider scheint es auch in diesem forum blockwarte zu geben... sowas erzeugt nur passive member, die nur lesen aber nichts beitragen
und übrigens: ich hab mit perl nix am hut, deswegen auch meine beteiligung hier.....

JudgeDredd

Zitat von: Gr!nDeR am 24 November 2025, 16:34:05ist die syntax soweit korrekt?
Das habe ich als Frage gelesen.
Zitat von: Gr!nDeR am 27 November 2025, 10:22:20wo siehst du mehrere set-anweisungen? ich sehe nur jeweils eine
Hier z.B.
set room=Weihnachtsbeleuchtung off;;setreading Weihnachtsbeleuchtung_Steuerung Status OFF: Hell XmasWenn die CommandRef stimmt, dürfte das setreading gar nicht ausgeführt werden.
Zitat von: Gr!nDeR am 26 November 2025, 14:18:40allerdings schaltet er nicht wie gewünscht aus
Zitat von: Gr!nDeR am 27 November 2025, 10:22:20die dinger werden nicht ausgeschaltet tagsüber
Diese beiden Aussagen habe ich nicht als "doch, es funktioniert tatsächlich" interpretiert.
Zitat von: Gr!nDeR am 27 November 2025, 10:22:20meine intention war, hier eventuell anderen zu helfen durch dinge, die bei mir klappen
Aber gut, wenn das ein Vorschlag für eine Lösung sein soll und Jemand möchte es genauso bei sich auch haben, dann ist ja alles gut.

Router: Eigenbau (pfSense)
FHEM: Proxmox (DELL R720) | Debian 12 (VM)

Gr!nDeR

set und setreading sind aber zwei völlig unterschiedliche befehle nach meinem verständnis.... mal davon ab - es funktioniert tatsächlich.

mir geht es halt in erster linie darum, ob man den recht aufgeblasenen code verschmälern kann, in dem man gar nicht das ereignis on/off oder active/inactive auswertet, sondern eher das $event.... da bin ich halt ratlos.
und ich wollte eben über define gehen und nicht über my_99Utils oder ähnliches.... lieber klickibunti als nerd-programming ;)