DOIF bleibt im Status cmd_1 hängen

Begonnen von AlexBV, 19 Juli 2023, 08:26:16

Vorheriges Thema - Nächstes Thema

AlexBV

Hallo,

ich habe ein ein einfaches DOIF, um einen Dummy einzuschalten, der wiederum andere Aktionen auslöst.
Leider bleibt der Status immer auf "cmd_1" so dass die Ausführung nur einmal stattfindet.
Auf die möglichen Workarounds, wie z.B. "do always" oder ein leeres DOELSE möchte ich nicht zurückgreifen, sondern lieber die saubere Lösung, die der Command-Ref entspricht. Dort steht nämlich ausdrücklich, dass bei nur einer Bedingung ein virtuelles DOELSE verwendet wird. Das scheint aber nicht zu funktionieren.

Hat dazu jemand eine Idee, warum es nicht funktioniert?


defmod doifSunset DOIF ([{sunset("HORIZON=-6.0")}]) (set myDummy on)


Internals:
  DEF        ([{sunset("HORIZON=-6.0")}]) (set myDummy on)
  FUUID      xxxx
  FVERSION  98_DOIF.pm:0.276160/2023-05-25
  MODEL      FHEM
  NAME      doifSunset
  NOTIFYDEV  global
  NR        66
  NTFY_ORDER 50-doifSunset
  STATE      cmd_1
  TYPE      DOIF
  VERSION    27616 2023-05-25 17:55:36
  eventCount 2
  READINGS:
    2023-07-17 22:10:50  cmd            1
    2023-07-17 22:10:50  cmd_event      timer_1
    2023-07-17 22:10:50  cmd_nr          1
    2023-07-17 14:29:06  mode            enabled
    2023-07-17 22:10:50  state          cmd_1
    2023-07-18 22:09:37  timer_01_c01    19.07.2023 22:08:22
  Regex:
    accu:
    bar:
    barAvg:
    collect:
  attr:
    cmdState:
    wait:
    waitdel:
  condition:
    0          ::DOIF_time_once($hash,0,$wday)
  days:
  do:
    0:
      0          set myDummy on
    1:
  helper:
    NOTIFYDEV  global
    event      timer_1
    globalinit 1
    last_timer 1
    sleeptimer -1
    timerdev 
    timerevent timer_1
    triggerDev
    timerevents:
      timer_1
    timereventsState:
      timer_1
    triggerEvents:
      timer_1
    triggerEventsState:
      timer_1
  interval:
  intervalfunc:
  localtime:
    0          1689797302
  perlblock:
  realtime:
    0          22:08:22
  time:
    0          {sunset("HORIZON=-6.0")}
  timeCond:
    0          0
  timer:
    0          0
  timers:
    0          0
  triggertime:
    1689797302:
      localtime  1689797302
      hash:
  uiState:
  uiTable:
Attributes:

RalfRog

Hallo
Unter Automatisierung gibt es ein eigenes Board für DOIF. Verschieb den Beitrag doch dahin, da ist bestimmt jemand unterwegs der das Verhalten erklären kann.

Setze doch das Ergebnis vom list wegen der besseren Lesbarkeit in Code-Tags.

Das do always zu probieren halte ich jetzt nicht für einen Workaround oder gar unsauber.
Ist ja ein zulässiges Attribut.

Gruß Ralf
FHEM auf Proxmox VM Bookworm (Futro S740) - nanoCUL, HM-MOD-RPI-PCB und MAX!Cube über LAN
HM- Fensterkontakte, UP-Schalter, Bewegungsmelder und ein Rauchmelder sowie Shelly 3EM, 1PM, PlugS und IT Schaltsteckdosen

Damian

Du hast in deiner Bedingung nur einen Zeittrigger definiert. Dieser triggert zum gegebenen Zeitpunkt und ist in diesem Augenblick wahr. Es gibt aber keinen Trigger in deiner Bedingung, der diese Bedingung zum Triggerzeitpunkt unwahr machen würde. Daher kann diese Definition niemals den cmd_1 Fall verlassen. Und nur durch einen Zustandswechsel wird cmd_1 wiederholt. Wenn diese einfache Definition so bleiben soll,  muss sie daher do always Attribut bekommen. Normalerweise hat man mehrere Zweige im DOIF, die zu einer Zustandsänderung führen, dann kann man auf do always verzichten.
 

Diese einfache Definition kannst du auch im Perlmodus definieren. Dieser arbeitet nicht mit Zuständen. Daher werden dort das Attribut do und viele andere nicht benötigt.

So würde die Definition im Perlmodus aussehen:

DOIF {[{sunset("HORIZON=-6.0")}];fhem_set "myDummy on"}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

AlexBV

Danke für die Info!

Ich denke, es klappt jetzt.