DOIF Fragen zu repeatsame, repeatcmd, wait und rand

Begonnen von Jogi, 29 März 2023, 14:27:48

Vorheriges Thema - Nächstes Thema

Jogi

Hallo,
ich nutze schon lange DOIF´s und finde sie genial. Aber ich nutze natürlich noch nicht alle Funktionen. Momentan versuche ich das Zusammenspiel von repeatsame, repeatcmd, wait und rand zu verstehen und habe mir dazu ein Test-DOIF gebaut.
Internals:
   CFGFN     
   DEF        ([10:00-22:30] and [Helligkeit] > 1)(set Testlampe rgb 0580FB : bri 245)(set Testlampe bri {(int(rand(220))+1)})(set Testlampe sat {(int(rand(254))+1)})## 1
DOELSE (set Testlampe off) ## 3 AUS
   FUUID      6424221e-f33f-8efe-9d34-8854dc413ef72811
   MODEL      FHEM
   NAME       Test_DOIF
   NOTIFYDEV  Helligkeit,global
   NR         443403
   NTFY_ORDER 50-Test_DOIF
   STATE      cmd_1
   TYPE       DOIF
   VERSION    27239 2023-02-16 21:12:36
   eventCount 444
   READINGS:
     2023-03-29 14:15:19   Device          Helligkeit
     2023-03-29 14:15:39   cmd             1.3
     2023-03-29 14:15:39   cmd_event       Helligkeit
     2023-03-29 14:15:39   cmd_nr          1
     2023-03-29 14:15:39   cmd_seqnr       3
     2023-03-29 14:15:19   e_Helligkeit_STATE 1713.475
     2023-03-29 14:08:14   mode            enabled
     2023-03-29 14:15:39   state           cmd_1
     2023-03-29 14:08:14   timer_01_c01    30.03.2023 10:00:00
     2023-03-29 14:08:14   timer_02_c01    29.03.2023 22:30:00
     2023-03-29 14:15:39   wait_timer      29.03.2023 14:15:58 cmd_1_1 Helligkeit
   Regex:
     accu:
     bar:
     collect:
     cond:
       Helligkeit:
         0:
           &STATE     ^Helligkeit$
   attr:
     cmdState:
     repeatcmd:
       rand(10)+10
     wait:
       0:
         0
         rand(10)+5
         rand(20)+3
       1:
         rand(300)+10
     waitdel:
   condition:
     0          ::DOIF_time($hash,0,1,$wday,$hms) and ::InternalDoIf($hash,'Helligkeit','STATE') > 1
   days:
   do:
     0:
       0          set Testlampe rgb 0580FB : bri 245
       1          set Testlampe bri {(int(rand(220))+1)}
       2          set Testlampe sat {(int(rand(254))+1)}
     1:
       0          set Testlampe off
   helper:
     NOTIFYDEV  Helligkeit,global
     event      1713.475
     globalinit 1
     last_timer 2
     sleepdevice Helligkeit
     sleepsubtimer 0
     sleeptimer 0
     timerdev   Helligkeit
     timerevent 1713.475
     triggerDev Helligkeit
     DOIF_eventa:
       cmd_nr: 1
       cmd_seqnr: 3
       cmd_event: Helligkeit
       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd_seqnr: 3
       cmd_event: Helligkeit
       state: cmd_1
     timerevents:
       1713.475
     timereventsState:
       state: 1713.475
     triggerEvents:
       1713.475
     triggerEventsState:
       state: 1713.475
   internals:
     all         Helligkeit:STATE
   interval:
     0          -1
     1          0
   intervalfunc:
   localtime:
     0          1680163200
     1          1680121800
   readings:
   realtime:
     0          10:00:00
     1          22:30:00
   time:
     0          10:00:00
     1          22:30:00
   timeCond:
     0          0
     1          0
   timer:
     0          0
     1          0
   timers:
     0           0  1
   trigger:
   triggertime:
     1680121800:
       localtime  1680121800
       hash:
     1680163200:
       localtime  1680163200
       hash:
   uiState:
   uiTable:
Attributes:
 
   group      1Einstellungen
   repeatcmd  rand(10)+10:
   room       99.Programm
   startup    set $SELF checkall
   userattr   LichtAlarm LichtAlarm_map structexclude
   wait       0,rand(10)+5,rand(20)+3:rand(300)+10

Folgende Fragen habe ich:
- was muss ich bei wait, repeatcmd, repeatsame eingeben, wenn das auf den letzten Pfad nicht zutreffen soll. Ist es richtig, dann hinter dem : nichts einzutragen (so wie ich es jetzt gemacht habe), oder muss da eine 0 oder eine 1 rein?

- Wenn ich es richtig verstanden habe ist bei repeatcmd nicht möglich einzelne Kommandos pro Zweig zu beeinflussen, sondern die Zeit gilt immer für den kompletten Zweig. Korrekt?

- Ist es mittels repeatsame möglich zu beeinflussen, wie oft die einzelnen Befehle abgesetzt werden? z.B. durch
repeatsame: 1,1,10:1Das ist mir nicht gelungen, aber wahrscheinlich mache ich etwas falsch.

- Sind die rand -Befehle soweit korrekt vom Syntax? Scheint zu funktionieren, aber ich bin nicht sicher, da ich bisher nicht mit rand gearbeitet habe.

Ich bin für Infos, Hinweise und Tipps dankbar.
Gruß,
Jogi

Damian

repeadcmd und repeadsame beziehen sich auf den ganz Ausführungspfad. Man kann nicht einzelnen Sequenzen des Pfandes wiederholen.

Also kannst du nur, wie in der Commandref beschrieben ist, Zeiten mit Doppelpunkt getrennt angeben und nicht mit Komma. Wenn du den letzten Pfad nicht wiederholen willst, dann brauchst du auch keinen Doppelpunkt am Ende angeben.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

doc.

Ich nehme mal den Faden hier auf, weil ich auch nicht weiterkomme...Ziel ist das folgende - eine Lampe soll alle 10 Sekunden einen "breathe"-Effekt ausführen, während das Hoftor den Status "moving" hat. Wenn das Tor offen ist "open", dann soll das Licht rot leuchten. Ist das Tor geschlossen geht die Lampe aus. Da ich die Lampe auch für andere Zwecke nutze, darf der Ausschaltbefehl nur einmal gesendet werden.

Mein Ansatz:
([Tests:state] eq "moving")
(
  set zigbee_0x881a14fffe1fb54e warnung
)
DOELSEIF ([Tests:state] eq "open")
(
  set zigbee_0x881a14fffe1fb54e red
)
DOELSE
(
  set zigbee_0x881a14fffe1fb54e off
)

mit dem Attribut:

repeatcmd 10
Es funktioniert aber nicht. Der 1. Pfad wird nach 10 Sekunden nicht erneut durchlaufen. Was ist mein Denkfehler? do always kann ich nicht nutzen, da ansonsten die Lampe ausgeht, sobald das Hoftor seinen Status "closed" irgendwann wieder sendet.

Damian

Es sollte so funktionieren. Poste die Ausgabe vom list deines DOIFs, wo der Zustand cmd1 ist. Wie man bei mir sieht, gibt es während der Wiederholung ein wait_Timer-Reading, welches die nächste Ausführung anzeigt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

doc.

Er setzt den Timer auch (ich hab's zum Testen auf 60s erhöht) - aber dann bei der Ausführung passiert nichts mehr und hinterher ist der Status immer noch cmd1, aber ohne Timer:

Internals:
   CFGFN     
   DEF        ([Tests:state] eq "moving")
(
  set zigbee_0x881a14fffe1fb54e warnung
)
DOELSEIF ([Tests:state] eq "open")
(
  set zigbee_0x881a14fffe1fb54e red
)
DOELSE
(
  set zigbee_0x881a14fffe1fb54e off
)
   FUUID      694fcac2-f33f-1ebd-d154-76ff8eb97c491766
   MODEL      FHEM
   NAME       HofTorMoving
   NOTIFYDEV  global,Tests
   NR         219561
   NTFY_ORDER 50-HofTorMoving
   STATE      cmd_1
   TYPE       DOIF
   VERSION    30377 2025-10-12 09:46:59
   eventCount 1367
   Helper:
     DBLOG:
       cmd:
         LogDB:
           TIME       1766836930.57824
           VALUE      0
       mode:
         LogDB:
           TIME       1766836930.57824
           VALUE      enabled
       state:
         LogDB:
           TIME       1766836930.57824
           VALUE      initialized
   READINGS:
     2025-12-29 13:09:44   Device          Tests
     2025-12-29 13:09:44   cmd             1
     2025-12-29 13:09:44   cmd_event       Tests
     2025-12-29 13:09:44   cmd_nr          1
     2025-12-29 13:09:44   e_Tests_state   moving
     2025-12-29 11:35:49   mode            enabled
     2025-12-29 13:09:44   state           cmd_1
     2025-12-29 13:09:44   wait_timer      29.12.2025 13:10:44 cmd_1 Tests
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       Tests:
         0:
           state      ^Tests$:^state:
         1:
           state      ^Tests$:^state:
   attr:
     cmdState:
     repeatcmd:
       60
     repeatsame:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Tests','state') eq "moving"
     1          ::ReadingValDoIf($hash,'Tests','state') eq "open"
   do:
     0:
       0             set zigbee_0x881a14fffe1fb54e warnung
     1:
       0             set zigbee_0x881a14fffe1fb54e red
     2:
       0               set zigbee_0x881a14fffe1fb54e off 
   helper:
     NOTIFYDEV  global,Tests
     event      moving
     globalinit 1
     last_timer 0
     sleepdevice Tests
     sleepsubtimer 0
     sleeptimer 0
     timerdev   Tests
     timerevent moving
     triggerDev Tests
     DOIF_eventa:
       cmd_nr: 1
       cmd: 1
       cmd_event: Tests
       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: Tests
       state: cmd_1
     timerevents:
       moving
     timereventsState:
       state: moving
     triggerEvents:
       moving
     triggerEventsState:
       state: moving
   internals:
   readings:
     all         Tests:state
   trigger:
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   repeatcmd  60

Damian

Hier ist ja alles in Ordnung. Dann poste den Zustand cmd1 ohne Timer.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

doc.

Das hier ist der Zustand nachdem die 60s vorüber sind:

Internals:
   CFGFN     
   DEF        ([Tests:state] eq "moving")
(
  set zigbee_0x881a14fffe1fb54e warnung
)
DOELSEIF ([Tests:state] eq "open")
(
  set zigbee_0x881a14fffe1fb54e red
)
DOELSE
(
  set zigbee_0x881a14fffe1fb54e off
)
   FUUID      694fcac2-f33f-1ebd-d154-76ff8eb97c491766
   MODEL      FHEM
   NAME       HofTorMoving
   NOTIFYDEV  global,Tests
   NR         219561
   NTFY_ORDER 50-HofTorMoving
   STATE      cmd_1
   TYPE       DOIF
   VERSION    30377 2025-10-12 09:46:59
   eventCount 1377
   Helper:
     DBLOG:
       cmd:
         LogDB:
           TIME       1766836930.57824
           VALUE      0
       mode:
         LogDB:
           TIME       1766836930.57824
           VALUE      enabled
       state:
         LogDB:
           TIME       1766836930.57824
           VALUE      initialized
   READINGS:
     2025-12-29 16:23:09   Device          Tests
     2025-12-29 16:23:09   cmd             1
     2025-12-29 16:23:09   cmd_event       Tests
     2025-12-29 16:23:09   cmd_nr          1
     2025-12-29 16:23:09   e_Tests_state   moving
     2025-12-29 11:35:49   mode            enabled
     2025-12-29 16:23:09   state           cmd_1
     2025-12-29 16:24:09   wait_timer      no timer
   Regex:
     accu:
     bar:
     barAvg:
     collect:
     cond:
       Tests:
         0:
           state      ^Tests$:^state:
         1:
           state      ^Tests$:^state:
   attr:
     cmdState:
     repeatcmd:
       60
     repeatsame:
     wait:
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'Tests','state') eq "moving"
     1          ::ReadingValDoIf($hash,'Tests','state') eq "open"
   do:
     0:
       0             set zigbee_0x881a14fffe1fb54e warnung
     1:
       0             set zigbee_0x881a14fffe1fb54e red
     2:
       0               set zigbee_0x881a14fffe1fb54e off 
   helper:
     NOTIFYDEV  global,Tests
     event      moving
     globalinit 1
     last_timer 0
     sleepdevice Tests
     sleepsubtimer -1
     sleeptimer -1
     timerdev   Tests
     timerevent moving
     triggerDev Tests
     DOIF_eventa:
       cmd_nr: 1
       cmd: 1
       cmd_event: Tests
       cmd_1
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: Tests
       state: cmd_1
     timerevents:
       moving
     timereventsState:
       state: moving
     triggerEvents:
       moving
     triggerEventsState:
       state: moving
   internals:
   readings:
     all         Tests:state
   trigger:
   uiState:
   uiTable:
Attributes:
   DbLogExclude .*
   repeatcmd  60

Damian

Ich kann das Verhalten bei mir nicht nachvollziehen.

Probiere mal, ob meine Testkonfiguration bei dir funktioniert:

defmod bla dummy
defmod di_repeatcmd DOIF ([bla:test] eq "moving")\
  (set bla wiederholung)\
DOELSEIF ([bla:test] eq "open")\
  (set bla open)\
DOELSE \
  (set bla stop)
attr di_repeatcmd repeatcmd 10

Auslösen kannst du es mit: setreading bla test moving



Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF