Hallo Leute,
Ich versuche mir einen Verzögerungstimer zu bauen mittel "wait", ich habe es erst versucht direkt hinter meiner Zeitangabe zu schreiben wie ich es auch bei meine Jalousien mittel Twiliight gemacht habe, dieses habe ich aber nicht hinbekommen, habe immer eine Fehlermeldung erhalten.
nun bin ich auf Wait umgestiegen. Vielleicht kann mir einer sagen ob dieses so richtig geschrieben ist und funktionieren würde.
Internals:
DEF ([?6:40-20:15] and [Lichtsensor:lux:d]<=20 and ([ZWave_SENSOR_NOTIFICATION_23:motion_state:] eq "motion" or [LOGOLichtsensor] eq "off"))
(set HUEDevice5 on)
DOELSEIF
([?20:16-00:00] and [Lichtsensor:lux:d]< 19 and [Pioneer_Anlage:input] =~ "PS_4|TV" and [Residents:state] eq "home")
(set HUEDevice5 off)
DOELSEIF
(([22:15|So|Mo|Di|Mi|Do] or [23:00|Fr|Sa]) and [Residents:state] =~ "absent|gone")
(set HUEDevice5 off)
DOELSEIF
(([?22:15] and [Pioneer_Anlage:power] eq "off") or [Lichtsensor:lux:d]> 21)
(set HUEDevice5 off)
FUUID 6085b12d-f33f-87a8-7f82-342a2fbae8249367
MODEL FHEM
NAME EsszimmerLicht
NOTIFYDEV Residents,global,Pioneer_Anlage,ZWave_SENSOR_NOTIFICATION_23,LOGOLichtsensor,Lichtsensor
NR 97
NTFY_ORDER 50-EsszimmerLicht
STATE cmd_4
TYPE DOIF
VERSION 26020 2022-05-03 16:28:02
eventCount 67
READINGS:
2022-06-12 12:08:24 Device Pioneer_Anlage
2022-06-12 09:47:26 cmd 4
2022-06-12 09:47:26 cmd_event Pioneer_Anlage
2022-06-12 09:47:26 cmd_nr 4
2022-06-12 12:08:10 e_Lichtsensor_lux 158
2022-06-12 12:08:24 e_Pioneer_Anlage_input NET
2022-06-12 12:08:24 e_Pioneer_Anlage_power on
2022-06-12 12:08:10 e_Residents_state home
2022-06-12 09:47:17 mode enabled
2022-06-12 09:47:26 state cmd_4
2022-06-12 09:47:17 timer_01_c01 13.06.2022 06:40:00
2022-06-12 09:47:17 timer_02_c01 12.06.2022 20:15:00
2022-06-12 09:47:17 timer_03_c02 12.06.2022 20:16:00
2022-06-12 09:47:17 timer_04_c02 13.06.2022 00:00:00
2022-06-12 09:47:17 timer_05_c03 12.06.2022 22:15:00|So
2022-06-12 09:47:17 timer_06_c03 12.06.2022 23:00:00|Fr
2022-06-12 09:47:17 timer_07_c04 12.06.2022 22:15:00
Regex:
accu:
collect:
cond:
LOGOLichtsensor:
0:
&STATE ^LOGOLichtsensor$
Lichtsensor:
0:
lux ^Lichtsensor$:^lux:
1:
lux ^Lichtsensor$:^lux:
3:
lux ^Lichtsensor$:^lux:
Pioneer_Anlage:
1:
input ^Pioneer_Anlage$:^input:
3:
power ^Pioneer_Anlage$:^power:
Residents:
1:
state ^Residents$:^state:
2:
state ^Residents$:^state:
ZWave_SENSOR_NOTIFICATION_23:
0:
motion_state ^ZWave_SENSOR_NOTIFICATION_23$:^motion_state:
attr:
cmdState:
wait:
0:
0
1:
0
2:
-900+int(rand(600))
-900+int(rand(600))
3:
0
waitdel:
condition:
0 ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'Lichtsensor','lux','','d')<=20 and (::ReadingValDoIf($hash,'ZWave_SENSOR_NOTIFICATION_23','motion_state') eq "motion" or ::InternalDoIf($hash,'LOGOLichtsensor','STATE') eq "off")
1 ::DOIF_time($hash,2,3,$wday,$hms) and ::ReadingValDoIf($hash,'Lichtsensor','lux','','d')< 19 and ::ReadingValDoIf($hash,'Pioneer_Anlage','input') =~ "PS_4|TV" and ::ReadingValDoIf($hash,'Residents','state') eq "home"
2 (::DOIF_time_once($hash,4,$wday,"So") or ::DOIF_time_once($hash,5,$wday,"Fr")) and ::ReadingValDoIf($hash,'Residents','state') =~ "absent|gone"
3 (::DOIF_time_once($hash,6,$wday) and ::ReadingValDoIf($hash,'Pioneer_Anlage','power') eq "off") or ::ReadingValDoIf($hash,'Lichtsensor','lux','','d')> 21
days:
4 So
5 Fr
do:
0:
0 set HUEDevice5 on
1:
0 set HUEDevice5 off
2:
0 set HUEDevice5 off
3:
0 set HUEDevice5 off
4:
helper:
NOTIFYDEV Residents,global,Pioneer_Anlage,ZWave_SENSOR_NOTIFICATION_23,LOGOLichtsensor,Lichtsensor
event currentTrackPosition: 03:34:50
globalinit 1
last_timer 7
sleeptimer -1
timerdev Pioneer_Anlage
timerevent currentTrackPosition: 03:34:50
triggerDev Pioneer_Anlage
timerevents:
currentTrackPosition: 03:34:50
timereventsState:
currentTrackPosition: 03:34:50
triggerEvents:
currentTrackPosition: 03:34:50
triggerEventsState:
currentTrackPosition: 03:34:50
internals:
all LOGOLichtsensor:STATE
interval:
0 -1
1 0
2 -1
3 2
intervalfunc:
localtime:
0 1655095200
1 1655057700
2 1655057760
3 1655071200
4 1655064900
5 1655067600
6 1655064900
readings:
all Lichtsensor:lux ZWave_SENSOR_NOTIFICATION_23:motion_state Pioneer_Anlage:input Residents:state Pioneer_Anlage:power
realtime:
0 06:40:00
1 20:15:00
2 20:16:00
3 00:00:00
4 22:15:00
5 23:00:00
6 22:15:00
time:
0 6:40
1 20:15:00
2 20:16:00
3 00:00:00
4 22:15:00
5 23:00:00
6 22:15:00
timeCond:
0 0
1 0
2 1
3 1
4 2
5 2
6 3
timer:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
timers:
2 4 5
trigger:
triggertime:
1655057700:
localtime 1655057700
hash:
1655057760:
localtime 1655057760
hash:
1655064900:
localtime 1655064900
hash:
1655067600:
localtime 1655067600
hash:
1655071200:
localtime 1655071200
hash:
1655095200:
localtime 1655095200
hash:
uiState:
uiTable:
Attributes:
checkReadingEvent 0
room Steckdosen
wait 0:0:-900+int(rand(600)),-900+int(rand(600)):0
Haupt ist ja dieses wait:
wait 0:0:-900+int(rand(600)),-900+int(rand(600)):0
Danke schon mal für eure Hilfe.
Sieht zwar syntaktisch richtig aus, aber ergibt das nicht einen negativen Wert? Sprich es müsste schon vor dem Ereignis auslösen..
Ja wollte es noch ein bisschen mehr Verschiebung im Licht haben.
Dann schau ich mir mal an ob es klappt sonst melde ich mich nochmal
Danke schon im Voraus
ZitatVielleicht kann mir einer sagen ob dieses so richtig geschrieben ist und funktionieren würde
man darf das gerne auch ausprobieren. Wenn man nicht sicher ist, einfach ein/das DOIF mit "Spieldaten" definieren und mittel list und event-Monitor zusehen, was passiert.
Zitat-900+int(rand(600))
rand(600) gibt ja ein float zwischen 0 und 600, welches Du per int() zur Ganzzahl umwandelst. "Falls" die Rechnung an der Stelle funktioniert kommt ja irgendwas zwischen -300 und 300 heraus. Details, wie man im wait rechnet und welche Werte aktzeptabel sind siehe commandref.
Auch hier: wenn Du nicht sicher bist und die commandref evtl. den Fall nicht beschreibt und im Forum nix zu finden ist: mach ein DOIF mit einem wait und trage dort einen negativen wert ein. Dann muss der Zweig einmal getriggert werden und schon siehst Du in der Detailbeschreibung/list ob da ein timer erzeugt wurde oder nicht. Es reicht ein DOIF mit einem Zeittrigger, nichts in der Ausführung und eben das attr wait.
Versuch macht kluch!
Sany
Zitat von: Sany am 13 Juni 2022, 14:36:59
kommt ja irgendwas zwischen -300 und 300 heraus.
Nicht zwischen -900 und -300?
Also, ein negativer Wait-Wert wird ignoriert und führt zur sofortigen Ausführung. Es ist also nicht sinnvoll ein negatives Wait zu definieren.
Und woher weiß ich das? Nicht weil ich es noch wusste - die Programmierung liegt schon Jahre zurück, sondern weil ich es schnell ausprobiert habe und weil alles andere keinen Sinn ergäbe - man kann die Zeit nun mal nicht zurückdrehen.
ZitatNicht zwischen -900 und -300?
stimmt. habe irgendwie die 600 2 mal dazugezählt. Am Ursprungsproblem ändert sich dadurch ja nix.
Zitat von: Damian am 13 Juni 2022, 19:49:38
Und woher weiß ich das? Nicht weil ich es noch wusste - die Programmierung liegt schon Jahre zurück, sondern weil ich es schnell ausprobiert habe und weil alles andere keinen Sinn ergäbe - man kann die Zeit nun mal nicht zurückdrehen.
D.h. ein DOIF mit negativem Wait eignet sich nicht, um eine Warnung zu generieren,
bevor dem DeLorean das Plutonium ausgeht? :D
Zitat von: xenos1984 am 14 Juni 2022, 06:41:11
D.h. ein DOIF mit negativem Wait eignet sich nicht, um eine Warnung zu generieren, bevor dem DeLorean das Plutonium ausgeht? :D
Das könnte man durchaus, wenn Wait in Kombination mit einer Zeitangabe bei der Bestimmung des nächsten Trigger-Zeitpunktes verrechnet worden wäre.
Das passiert aber nicht, die Berechnung der Wait-Verzögerung findet erst dann statt, wenn der eigentliche Event/Zeit-Trigger zuschlägt und deswegen kann man keine negative Verzögerung sinnvoll nutzen.
Danke. Habe es ohne - gebaut und es schaltet. Mit Zufall.
Mit dem anderen muss ich nochmal probieren.
Danke