FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: bmwfan am 25 Juli 2025, 12:46:14

Titel: DOIF in Perl-Modus wird von at nicht getriggert
Beitrag von: bmwfan am 25 Juli 2025, 12:46:14
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
Titel: Aw: DOIF in Perl-Modus wird von at nicht getriggert
Beitrag von: Per am 25 Juli 2025, 19:56:14
Ohne die eigentliche Ursache zu kennen (dafür kann ich zuwenig Perl), aber warum schreibst du die Zeiten nicht direkt ins DOIF als Trigger?
Titel: Aw: DOIF in Perl-Modus wird von at nicht getriggert
Beitrag von: Damian am 25 Juli 2025, 22:19:40
Wo hast du denn den Trigger im DOIF-Block definiert? Ich kann keinen erkennen. Eventtrigger werden im DOIF in eckigen Klammen definiert.
Titel: Aw: DOIF in Perl-Modus wird von at nicht getriggert
Beitrag von: bmwfan am 26 Juli 2025, 12:16:05
@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