Hauptmenü

DOIF mit Selbstbezug

Begonnen von olwaldi, 10 Oktober 2026, 18:22:43

Vorheriges Thema - Nächstes Thema

olwaldi

Ich versuche zu verstehen, wie/ob man selbstbezügliche DOIFs erstellen darf. Hier ein einfaches Beispiel, daß zwar funktioniert, aber in cmd_1 steckenbleibt:
define AudioMode DOIF ([AudioModeKeys] eq "on")\
  (set AudioModeKeys off)\
DOELSE\

attr AudioMode cmdState on|off
attr AudioMode do resetwait
attr AudioMode wait 10:0
#   DEF        ([AudioModeKeys] eq "on")
#  (set AudioModeKeys off)
#DOELSE
#
#   FUUID      656d878e-f33f-fc3a-38f2-09c42f025fc93f22
#   MODEL      FHEM
#   NAME       AudioMode
#   NOTIFYDEV  global,AudioModeKeys
#   NR         73
#   NTFY_ORDER 50-AudioMode
#   STATE      on
#   TYPE       DOIF
#   VERSION    30659 2025-12-25 12:37:16
#   eventCount 87
#   READINGS:
#     2026-10-10 18:12:54   Device          AudioModeKeys
#     2026-10-10 18:13:04   cmd             1
#     2026-10-10 18:13:04   cmd_event       AudioModeKeys
#     2026-10-10 18:13:04   cmd_nr          1
#     2026-10-10 18:12:54   e_AudioModeKeys_STATE on
#     2026-10-10 18:11:26   mode            enabled
#     2026-10-10 18:13:04   state           on
#     2026-10-10 18:13:04   wait_timer      no timer
#   Regex:
#     accu:
#     bar:
#     barAvg:
#     collect:
#     cond:
#       AudioModeKeys:
#         0:
#           &STATE     ^AudioModeKeys$
#   attr:
#     cmdState:
#       0:
#         on
#       1:
#         off
#     wait:
#       0:
#         10
#       1:
#         0
#     waitdel:
#   condition:
#     0          ::InternalDoIf($hash,'AudioModeKeys','STATE') eq "on"
#   do:
#     0:
#       0          set AudioModeKeys off
#     1:
#       0         
#   helper:
#     NOTIFYDEV  global,AudioModeKeys
#     event      on
#     globalinit 1
#     last_timer 0
#     sleepdevice AudioModeKeys
#     sleepsubtimer -1
#     sleeptimer -1
#     timerdev   AudioModeKeys
#     timerevent on
#     triggerDev AudioModeKeys
#     DOIF_eventa:
#       cmd_nr: 1
#       cmd: 1
#       cmd_event: AudioModeKeys
#       on
#     DOIF_eventas:
#       cmd_nr: 1
#       cmd: 1
#       cmd_event: AudioModeKeys
#       state: on
#     timerevents:
#       on
#     timereventsState:
#       state: on
#     triggerEvents:
#       on
#     triggerEventsState:
#       state: on
#   internals:
#     all         AudioModeKeys:STATE
#   readings:
#   trigger:
#   uiState:
#   uiTable:
#
setstate AudioMode on
setstate AudioMode 2026-10-10 18:12:54 Device AudioModeKeys
setstate AudioMode 2026-10-10 18:13:04 cmd 1
setstate AudioMode 2026-10-10 18:13:04 cmd_event AudioModeKeys
setstate AudioMode 2026-10-10 18:13:04 cmd_nr 1
setstate AudioMode 2026-10-10 18:12:54 e_AudioModeKeys_STATE on
setstate AudioMode 2026-10-10 18:11:26 mode enabled
setstate AudioMode 2026-10-10 18:13:04 state on
setstate AudioMode 2026-10-10 18:13:04 wait_timer no timer

Vermutlich wird der Status von DOIF auf on/cmd_1 gesetzt, wenn nach 10s der Wert auf off gesetzt wird.

Aber wie erreiche ich mein Ziel, daß der state vom DOIF synchron zu AudioModeKeys geändert wird?

Grüßle, Michael
Nachtrag: Dasselbe Problem habe ich auch mit einem anderen DOIF, wo nicht so offensichtlich dieselbe Art von "Rekursivität" genutzt wird.

Per

DOIF kennt ein Attribut (selftrigger), mit welchem du Selftriggering explizit erlauben kannst.