FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: ringidigiding am 23 Februar 2023, 18:01:49

Titel: [gelöst]DOIF im Perlmodus: mit set_Exec Lichtdauer verlängern funktioniert nicht
Beitrag von: ringidigiding am 23 Februar 2023, 18:01:49
mir gehen die Ideen aus.
Habe versucht mit dem Bewegungsmelder (BM_KELLER) die Beleuchtungsdauer eines Raumes mit dem Schalter (Keller_Licht) über einen DOIF im Perlmodus zu verlängern.
Was funktioniert:
- Licht geht an, wenn der Bewegungsmelder den Status motion annimmt
- Timer wird über set_Exec gesetzt, um das Licht nach einer bestimmten Zeit (für Tests auf nur 180 Sekunden gesetzt) wieder auszuschalten
- Timer wird aktualisiert, wenn der Bewegungsmelder in den Zustand motion wechselt, nachdem er zuvor den Status nomotion hatte

Was nicht funktioniert:
Das Licht geht bereits aus, nachdem der zuerst gesetzte Timer abgelaufen ist, obwohl der Timer inzwischen verlängert wurde.

Hier noch die Definition meines DOIF. In einem anderen Post habe ich gelesen, dass set_Excec zuerst vor allen anderen fhem_set Kommandos im DOIF aufgerufen werden soll. Hat aber nichts gebracht.
Habe auch mit unterschiedlichen Bewegungsmeldern (Aqara, Ikea) und (Shelly, Sonoff mini) Schaltern getestet, hat auch nichts gebracht.

define DOIF_Keller_Licht DOIF {\
  if (["BM_KELLER:^motion$"])            ## bei Bewegung\
  {\
      set_Exec("off_TimerKellerLicht",180,'fhem_set("Keller_Licht OFF")');;;;\
      ## Lampe einschalten, wenn sie nicht an ist\
      if ([?Keller_Licht] ne "ON") {\
        fhem_set("Keller_Licht ON");;;;\
      }\
\
      ## Timer namens "off_TimerKellerLicht" für das Ausschalten der Lampe \
      ## auf TIMER_KELLER_LICHT Sekunden setzen bzw. verlängern\
      ## set_Exec("off_TimerKellerLicht",[TIMER_KELLER_LICHT:state],'fhem_set("Keller_Licht OFF")');;\
  }\
}
attr DOIF_Keller_Licht checkReadingEvent 0
attr DOIF_Keller_Licht room Technik->Keller,Technik->Licht,Technik->Überwachung
#   DEF        {
#  if (["BM_KELLER:^motion$"])            ## bei Bewegung
#  {
#      set_Exec("off_TimerKellerLicht",180,'fhem_set("Keller_Licht OFF")');;
#      ## Lampe einschalten, wenn sie nicht an ist
#      if ([?Keller_Licht] ne "ON") {
#        fhem_set("Keller_Licht ON");;
#      }
#
#      ## Timer namens "off_TimerKellerLicht" für das Ausschalten der Lampe
#      ## auf TIMER_KELLER_LICHT Sekunden setzen bzw. verlängern
#      ## set_Exec("off_TimerKellerLicht",[TIMER_KELLER_LICHT:state],'fhem_set("Keller_Licht OFF")');
#  }
#}
#   FUUID      61c33f17-f33f-641a-0fd3-6b0357a13a736385
#   FVERSION   98_DOIF.pm:0.272390/2023-02-16
#   MODEL      Perl
#   NAME       DOIF_Keller_Licht
#   NOTIFYDEV  .*(BM_KELLER).*,global
#   NR         1137
#   NTFY_ORDER 50-DOIF_Keller_Licht
#   STATE      initialized
#   TYPE       DOIF
#   VERSION    27239 2023-02-16 21:12:36
#   eventCount 5
#   Helper:
#     DBLOG:
#       mode:
#         logdb:
#           TIME       1677171084.42535
#           VALUE      enabled
#   READINGS:
#     2023-02-23 17:51:23   mode            enabled
#     2023-02-23 17:51:24   state           initialized
#   Regex:
#     accu:
#     bar:
#     collect:
#     cond:
#       :
#         0:
#           "BM_KELLER:^motion$" BM_KELLER:^motion$
#   condition:
#     0         
#  if (::EventDoIf('BM_KELLER',$hash,'^motion$',0))               {
#      set_Exec("off_TimerKellerLicht",180,'fhem_set("Keller_Licht OFF")');;
#             if (::InternalDoIf($hash,'Keller_Licht','STATE') ne "ON") {
#        fhem_set("Keller_Licht ON");;
#      }
#
#                       }
#
#   helper:
#     NOTIFYDEV  .*(BM_KELLER).*,global
#     globalinit 1
#     last_timer 0
#     sleeptimer -1
#   internals:
#     all         Keller_Licht:STATE
#   perlblock:
#     0          block_01
#   uiState:
#   uiTable:
#
setstate DOIF_Keller_Licht initialized
setstate DOIF_Keller_Licht 2023-02-23 17:51:23 mode enabled
setstate DOIF_Keller_Licht 2023-02-23 17:51:24 state initialized

Titel: Antw:DOIF im Perlmodus: mit set_Exec Lichtdauer verlängern funktioniert nicht
Beitrag von: Damian am 23 Februar 2023, 18:32:51
Deine Definition entspricht weitgehend dem Beispiel zu set_Exec im Wiki. Ich sehe dort keine Fehler. Vermutlich hängt es mit den gesendeten bzw. nicht gesendeten motion Events zusammen. Aber ohne konkrete Informationen, kann man dazu nicht viel sagen.

Du kannst dir bei "motion" eine Meldung im Log ausgeben, dann siehst du, wann ein Event ankam und wann eben nicht. Bewegungsmelder verhalten sich unterschiedlich und können auch unterschiedlich konfiguriert sein. Manche legen eine Zwangspause ein. Evtl. hast du beim Bewegungsmelder event-on-change-Attribut drin oder sonst was.
Titel: Antw:DOIF im Perlmodus: mit set_Exec Lichtdauer verlängern funktioniert nicht
Beitrag von: ringidigiding am 23 Februar 2023, 18:48:03
wie beschrieben, habe ich unterschiedliche Bewegungsmelder ausprobiert, und das Problem ist nicht das Event, da dieses den DOIF korrekt zu durchlaufen scheint. Der Timer ist beim ersten mal im Reading zu sehen (mit dem Namen Timer_off_TimerKellerLicht), beim nächsten Durchlauf (das Licht ist noch an) wird der Timer auch aktualisiert und um 180 Sekunden hoch gesetzt. Trotzdem geht das Licht zu dem Zeitpunkt der mit dem ersten Durchlauf gesetzten Uhrzeit aus.  Sprich, der Timer wird hochgesetzt, das fhem Kommando im set_Exec, um das Licht auszuschalten, wird aber zum Zeitpunkt der ersten Timerinitialisierung gerufen, obwohl der Timer inzwischen einen anderen Wert hat. Kann es sein, dass alte Timer nicht wirklich überschrieben werden? Ich hatte auch schon versucht mit del_Exec jedes Mal den aktuellen Timer zu löschen, und dann erneut einen zu starten, hat aber auch nichts geholfen.
Titel: Antw:DOIF im Perlmodus: mit set_Exec Lichtdauer verlängern funktioniert nicht
Beitrag von: Damian am 23 Februar 2023, 18:56:22
Zitat von: ringidigiding am 23 Februar 2023, 18:48:03
wie beschrieben, habe ich unterschiedliche Bewegungsmelder ausprobiert, und das Problem ist nicht das Event, da dieses den DOIF korrekt zu durchlaufen scheint. Der Timer ist beim ersten mal im Reading zu sehen (mit dem Namen Timer_off_TimerKellerLicht), beim nächsten Durchlauf (das Licht ist noch an) wird der Timer auch aktualisiert und um 180 Sekunden hoch gesetzt. Trotzdem geht das Licht zu dem Zeitpunkt der mit dem ersten Durchlauf gesetzten Uhrzeit aus.  Sprich, der Timer wird hochgesetzt, das fhem Kommando im set_Exec, um das Licht auszuschalten, wird aber zum Zeitpunkt der ersten Timerinitialisierung gerufen, obwohl der Timer inzwischen einen anderen Wert hat. Kann es sein, dass alte Timer nicht wirklich überschrieben werden? Ich hatte auch schon versucht mit del_Exec jedes Mal den aktuellen Timer zu löschen, und dann erneut einen zu starten, hat aber auch nichts geholfen.

Dann brauche ich Beweise :)

Du kannst vor set_Exec, mit get_Exec die Restlaufzeit loggen, dann weißt du mehr.
Titel: [gelöst]DOIF im Perlmodus: mit set_Exec Lichtdauer verlängern funktioniert nicht
Beitrag von: ringidigiding am 24 Februar 2023, 15:16:13
Beweise sind immer gut  ;D

Da war es aber wieder, mein Problem mit verbose, verbose level und DOIFTools.

Nachdem DOIFTools die Wait-Timer trotz gesetztem Reading specialLog nicht zu dokumentieren scheint, habe ich meinen DOIF um Log() Einträge erweitert, um das Verhalten zu dokumentieren, und dann nochmal fleissig getestet.

Was soll ich sagen, ich habe den Fehler gefunden, bzw. um präziser zu sein, meine fehlerhafter Annahme, dass der mit einem Namen versehene Wait-Timer über alle DOIFs hinweg gültig ist. Musste aber feststellen, dass Wait-Timer, mit demselben Namen in mehreren DOIFs, nur den Namen gemeinsam haben, sonst aber nichts. Dachte die sind global.

Wie meistens sitzt das Problem vor dem eigenen Monitor.  :-[

Aber vielen Dank für Deine schnellen Rückmeldungen.