Hallo,
ich möchte Sonnenauf- und untergangszeiten sowie den Zustand Tageslicht "Hell" und "Dunkel" in einem DOIF ermitteln und verwende dazu folgenden Code:
defmod di_Tageslicht DOIF {\
# Prüfen, ob Modulname bekannt ist, ansonsten fest laden\
my $name = $DOIF::doifname // "di_Tageslicht";;\
# Log3("DOIF",3,"DOIF: \$DOIF::doifname ist ". (defined($DOIF::doifname) ? $DOIF::doifname : "undef"));;\
Log3($name, 3, "DOIF Sonnenzeiten-Update gestartet");;\
use strict;;\
use warnings;;\
# Sonnenaufgang mit HORIZON=-4 (z.B. Dämmerungsbeginn minus 4 Grad)\
my $sa = substr(main::sunrise_abs("HORIZON=-4"),0,5);;\
# Sonnenuntergang mit HORIZON=-3 (z.B. Dämmerungsende minus 3 Grad)\
my $su = substr(main::sunset("HORIZON=-3"),0,5);;\
# Jal_Auf_Morgens: Sonnenaufgang aber nicht vor 07:00 Uhr, nicht nach 10:00 Uhr\
my $jal = substr(main::sunrise_abs(0, "07:00", "10:00"),0,5);;\
# Readings speichern\
fhem("setreading $name Sonnenaufgang $sa");;\
fhem("setreading $name Sonnenuntergang $su");;\
fhem("setreading $name Jal_Auf_Morgens $jal");;\
\
# Timer-Namen für At-Devices festlegen (unique)\
my $atHellName = "at_TageslichtHell";;\
my $atDunkelName = "at_TageslichtDunkel";;\
\
# Vorhandene Timer löschen, falls vorhanden\
# Sicherheitshalber mit eval falls das At-Device noch nicht existiert\
eval {\
fhem("delete $atHellName") if defined(fhem("list $atHellName"));;\
fhem("delete $atDunkelName") if defined(fhem("list $atDunkelName"));;\
};;\
\
# Neue At-Timer definieren für Sonnenaufgang & Sonnenuntergang\
fhem("define $atHellName at *$sa setreading $name Tageslicht hell");;\
fhem("define $atDunkelName at *$su setreading $name Tageslicht dunkel");;\
\
return "Sonnenzeiten gesetzt, At-Timer für Tageslicht angelegt";;\
}
attr di_Tageslicht event-on-change-reading trigger
attr di_Tageslicht initialize hell
attr di_Tageslicht loglevel 4
attr di_Tageslicht room 9.8.1_DOIF
attr di_Tageslicht verbose 5
setstate di_Tageslicht initialized
setstate di_Tageslicht 2025-07-25 12:23:14 Jal_Auf_Morgens 07:00
setstate di_Tageslicht 2025-07-25 12:23:14 Sonnenaufgang 05:23
setstate di_Tageslicht 2025-07-25 12:23:14 Sonnenuntergang 21:22
setstate di_Tageslicht 2025-07-25 12:26:27 Tageslicht hell
setstate di_Tageslicht 2025-07-25 12:23:14 block_01 executed
setstate di_Tageslicht 2025-07-25 12:15:50 mode enabled
setstate di_Tageslicht 2025-07-25 12:15:50 state initialized
setstate di_Tageslicht 2025-07-25 12:31:37 trigger 1
Zum Triggern des DOIF verwende ich 2 ats, die zu eienr festgelegten Zeit das DOIF triggern sollen:
defmod at_TageslichtTrigger at *03:30:00 setreading di_Tageslicht trigger 1
attr at_TageslichtTrigger room 9.8.1_DOIF,9.8.4_ats
setstate at_TageslichtTrigger Next: 03:30:00
setstate at_TageslichtTrigger 2025-07-25 12:16:50 state Next: 03:30:00
defmod at_TageslichtTriggerReset at *03:31:00 setreading di_Tageslicht trigger 0
attr at_TageslichtTriggerReset room 9.8.1_DOIF,9.8.4_ats
setstate at_TageslichtTriggerReset Next: 03:31:00
setstate at_TageslichtTriggerReset 2025-07-25 12:17:14 state Next: 03:31:00
Trotz gesetztem event-on-change-reading trigger wird das DOIF nicht gestartet. Ich habe keinen Eintrag im Log (zum Test) und die TimeStamp der Readings (Sonnenaufgang...) sind unverändert.
Wo liegt der Fehler?
Grüße Jürgen
Ohne die eigentliche Ursache zu kennen (dafür kann ich zuwenig Perl), aber warum schreibst du die Zeiten nicht direkt ins DOIF als Trigger?
Wo hast du denn den Trigger im DOIF-Block definiert? Ich kann keinen erkennen. Eventtrigger werden im DOIF in eckigen Klammen definiert.
@Per: Hatte keine Idee, wie das geht und auch nichts dazu gefunden. Ist wahrscheinlich zu speziell.
@Damian: Stimmt. Ich habe so lange verschiedene Versionen versucht und Dinge geändert, dass mir irgendwann die Triggerbedingung abhanden gekommen ist. So kann es ja gar nicht funktionieren.
Danke