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
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.
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.
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.
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
Hier ist ja alles in Ordnung. Dann poste den Zustand cmd1 ohne Timer.
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
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
Das funktioniert... :o
Ich lege meins nochmal neu an, das kann ja nicht sein...
Ich fasse es nicht, so funktioniert es...:
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 6952ea33-f33f-1ebd-402e-abf832c7db673341
MODEL FHEM
NAME di_HofTorMoving
NOTIFYDEV Tests,global
NR 231455
NTFY_ORDER 50-di_HofTorMoving
STATE cmd_1
TYPE DOIF
VERSION 30377 2025-10-12 09:46:59
eventCount 12
Helper:
DBLOG:
cmd:
LogDB:
TIME 1767041587.6359
VALUE 0
mode:
LogDB:
TIME 1767041587.6359
VALUE enabled
state:
LogDB:
TIME 1767041587.6359
VALUE initialized
READINGS:
2025-12-29 21:53:35 Device Tests
2025-12-29 21:54:09 cmd 1
2025-12-29 21:54:09 cmd_event Tests
2025-12-29 21:54:09 cmd_nr 1
2025-12-29 21:53:35 e_Tests_state moving
2025-12-29 21:53:07 mode enabled
2025-12-29 21:54:09 state cmd_1
2025-12-29 21:54:09 wait_timer 29.12.2025 21:54:19 cmd_1 Tests
Regex:
accu:
bar:
barAvg:
collect:
cond:
Tests:
0:
state ^Tests$:^state:
1:
state ^Tests$:^state:
attr:
cmdState:
repeatcmd:
10
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 Tests,global
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 10
Siehst Du einen Unterschied zu meinem ersten DOIF?
ChatGPT sagt:
ZitatErklärung
DOIF A reagiert auf das Event on
DOIF B reagiert korrekt auf das Event moving
Das habe ich aber doch nirgendwo programmiert?
In der helper-Section steht das auch so, aber ich habe keine Ahnung wo das herkommt.
Was Chatgpt sagt, sollte hier uninteressant sein. Es sind, was DOIF angeht, meistens Halluzinationen :) Was bei dir nicht stimmte, kann ich dir allerdings nicht sagen.
Alles klar, trotzdem danke für die Zeit und die Bestätigung!