Hallo
Ich habe ein kleines Problemchen mit einem DOIF...
Es geht explizit um die Sequenz 3...
Um 22.25 wurde die Sequenz 1 ordnungsgemäß durchgeführt nachdem TVTime state off gegangen ist. (set WZEZ_WZFLed on)
Um 22.30 wurde die Sequenz 4 auch ordnungsgemäß durchgeführt. (set WZEZ_WZFLed off) (set WZBodenLed off)
Aber warum wurde um 22.32 die Sequenz 3 durchgeführt obwohl alles so zutraf wie es sein sollte? (set WZEZ_WZFLed on-for-timer 900)???
Er sollte doch nur auf [PartyTime:state] eq "off" and [TVTime:state] eq "off" triggern dabei waren diese Werte schon längst off... Verstehe ich nicht.
Hat jemand eine Idee?
Vielen Dank!
Internals:
DEF ([?15:00-22:30] and [TVTime:state] eq "off" and [LichtSensor:brightness] < 20.0 and [?WZEZ_WZFLed] eq "off")
(set WZEZ_WZFLed on)
DOELSEIF
([PartyTime:state] eq "on" and [?LichtSensor:brightness] < 20.0 and [?WZEZ_WZBodenLed] eq "off")
(set WZBodenLed on)
DOELSEIF
([?22:30-05:00] and [PartyTime:state] eq "off" and [TVTime:state] eq "off")
(set WZEZ_WZFLed on-for-timer 900) (set WZBodenLed off)
DOELSEIF
([22:30-05:00] and [?TVTime:state] eq "off" and [?PartyTime:state] eq "off" and ([?WZEZ_WZFLed] eq "on" or [?WZEZ_WZBodenLed] eq "on"))
(set WZEZ_WZFLed off) (set WZBodenLed off)
DOELSEIF
([TVTime:state] eq "on" or [LichtSensor:brightness] > 20.0)
(set WZBodenLed off) (set WZEZ_WZFLed off)
FUUID 5c4afdc5-f33f-84b4-c97a-b1cab802f56248da
MODEL FHEM
NAME DOIFWzEzBeleuchtung
NOTIFYDEV TVTime,PartyTime,global,LichtSensor
NR 46
NTFY_ORDER 50-DOIFWzEzBeleuchtung
STATE cmd_3
TYPE DOIF
VERSION 23640 2021-01-30 10:49:48
READINGS:
2021-02-06 22:37:32 Device TVTime
2021-02-06 22:32:32 cmd 3.2
2021-02-06 22:32:32 cmd_event TVTime
2021-02-06 22:32:32 cmd_nr 3
2021-02-06 22:32:32 cmd_seqnr 2
2021-02-06 22:31:12 e_LichtSensor_brightness 0.04
2020-12-13 18:52:16 e_PartyTime_state off
2021-02-06 22:37:32 e_TVTime_state off
2020-12-08 11:41:38 mode enabled
2021-02-06 22:32:32 state cmd_3
2021-02-06 22:30:00 timer_01_c01 07.02.2021 15:00:00
2021-02-06 22:30:00 timer_02_c01 07.02.2021 22:30:00
2021-02-06 16:08:53 timer_03_c03 06.02.2021 22:30:00
2021-02-06 16:08:53 timer_04_c03 07.02.2021 05:00:00
2021-02-06 16:08:53 timer_05_c04 06.02.2021 22:30:00
2021-02-06 16:08:53 timer_06_c04 07.02.2021 05:00:00
Regex:
accu:
cond:
LichtSensor:
0:
brightness ^LichtSensor$:^brightness:
1:
2:
3:
4:
brightness ^LichtSensor$:^brightness:
PartyTime:
1:
state ^PartyTime$:^state:
2:
state ^PartyTime$:^state:
TVTime:
0:
state ^TVTime$:^state:
1:
2:
state ^TVTime$:^state:
3:
4:
state ^TVTime$:^state:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'TVTime','state') eq "off" and ::ReadingValDoIf($hash,'LichtSensor','brightness') < 20.0 and ::InternalDoIf($hash,'WZEZ_WZFLed','STATE') eq "off"
1 ::ReadingValDoIf($hash,'PartyTime','state') eq "on" and ::ReadingValDoIf($hash,'LichtSensor','brightness') < 20.0 and ::InternalDoIf($hash,'WZEZ_WZBodenLed','STATE') eq "off"
2 ::DOIF_time($hash,2,3,$wday,$hms) and ::ReadingValDoIf($hash,'PartyTime','state') eq "off" and ::ReadingValDoIf($hash,'TVTime','state') eq "off"
3 ::DOIF_time($hash,4,5,$wday,$hms) and ::ReadingValDoIf($hash,'TVTime','state') eq "off" and ::ReadingValDoIf($hash,'PartyTime','state') eq "off" and (::InternalDoIf($hash,'WZEZ_WZFLed','STATE') eq "on" or ::InternalDoIf($hash,'WZEZ_WZBodenLed','STATE') eq "on")
4 ::ReadingValDoIf($hash,'TVTime','state') eq "on" or ::ReadingValDoIf($hash,'LichtSensor','brightness') > 20.0
days:
do:
0:
0 set WZEZ_WZFLed on
1:
0 set WZBodenLed on
2:
0 set WZEZ_WZFLed on-for-timer 900
1 set WZBodenLed off
3:
0 set WZEZ_WZFLed off
1 set WZBodenLed off
4:
0 set WZBodenLed off
1 set WZEZ_WZFLed off
5:
helper:
DEVFILTER ^global$|^PartyTime$|^TVTime$|^LichtSensor$
NOTIFYDEV global|PartyTime|TVTime|LichtSensor
event off
globalinit 1
last_timer 6
sleeptimer -1
timerdev TVTime
timerevent off
triggerDev TVTime
timerevents:
off
timereventsState:
state: off
triggerEvents:
off
triggerEventsState:
state: off
internals:
all WZEZ_WZFLed:STATE WZEZ_WZBodenLed:STATE
interval:
0 -1
1 0
2 -1
3 2
4 -1
5 4
intervalfunc:
intervaltimer:
localtime:
0 1612706400
1 1612733400
2 1612647000
3 1612670400
4 1612647000
5 1612670400
perlblock:
readings:
all TVTime:state LichtSensor:brightness PartyTime:state
realtime:
0 15:00:00
1 22:30:00
2 22:30:00
3 05:00:00
4 22:30:00
5 05:00:00
time:
0 15:00:00
1 22:30:00
2 22:30:00
3 05:00:00
4 22:30:00
5 05:00:00
timeCond:
0 0
1 0
2 2
3 2
4 3
5 3
timer:
0 0
1 0
2 0
3 0
4 0
5 0
timers:
3 4 5
trigger:
triggertime:
1612670400:
localtime 1612670400
hash:
1612706400:
localtime 1612706400
hash:
1612733400:
localtime 1612733400
hash:
uiState:
uiTable:
Attributes:
room DOIF
Niemand eine Idee? Das DOIF schint richtig zu sein, oder? Oder habe ich was übersehen...?
Zitat von: misux am 06 Februar 2021, 22:48:43
Aber warum wurde um 22.32 die Sequenz 3 durchgeführt obwohl alles so zutraf wie es sein sollte? (set WZEZ_WZFLed on-for-timer 900)???
Er sollte doch nur auf [PartyTime:state] eq "off" and [TVTime:state] eq "off" triggern dabei waren diese Werte schon längst off... Verstehe ich nicht.
Das stimmt nicht.
Du lässt auf den Status prüfen, nicht auf Events.
Gibt es ein Event von irgendeinem abhängigen Device, dann schaut das DOIF alles mal durch. PartyTime war auf dem status "off", TVTime auch, also wird der Zweig ausgeführt.
Willst Du auf Events prüfen, dann commandref => DOIF => Eventsteuerutn:
https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events
Ouha... OKay... das ist mir so noch komischerweise nie aufgefallen...
Vielen Dank! Werde es dann mal anpassen.
Ich raff es nicht...
Kann mir jemand helfen und sagen warum nun um 22.57 die 3. Sequenz NICHT ausgeführt wird wenn TVTime "off" geht?
Im ersten Post hat es funktioniert, aber nicht richtig, nun habe ich das DOIF angepasst und in dem TVTime Dummy event-on-change-reading .*
event-on-update-reading .* gesetzt... aber irgendwie will es nicht...
Hat jemand eine Idee warum das nicht funktioniert? Das DOIF erkennt jedenfalls das TVTime "Off" geht, aber es interessiert ihn nicht, er schaltet mir das Licht nicht an wie er es in der Sequenz 3 tun sollte...
Im Screenshot sieht man das Reading vom DOIF das es den Zustand um 22.57 von TVTime erkannt hat. PartyTime war schon "Off".
List DOIF
Internals:
DEF ([?15:00-22:30] and [TVTime:state] eq "off" and [LichtSensor] < 20.0 and [?WZEZ_WZFLed] eq "off")
(set WZEZ_WZFLed on)
DOELSEIF
([PartyTime:state] eq "on" and [?LichtSensor] < 20.0 and [?WZEZ_WZBodenLed] eq "off")
(set WZBodenLed on)
DOELSEIF
([?22:30-05:00] and [PartyTime:"off"] and [TVTime:"off"])
(set WZEZ_WZFLed on-for-timer 900) (set WZBodenLed off)
DOELSEIF
([22:30-05:00] and [?TVTime:state] eq "off" and [?PartyTime:state] eq "off" and ([?WZEZ_WZFLed] eq "on" or [?WZEZ_WZBodenLed] eq "on"))
(set WZEZ_WZFLed off) (set WZBodenLed off)
DOELSEIF
([TVTime:"on"] or [LichtSensor] > 20.0)
(set WZBodenLed off) (set WZEZ_WZFLed off)
FUUID 603a67dc-f33f-e7ed-0a6a-f5c4652c84a60b43
MODEL FHEM
NAME DOIFWzEzBeleuchtung
NOTIFYDEV PartyTime,global,TVTime,LichtSensor
NR 128
NTFY_ORDER 50-DOIFWzEzBeleuchtung
STATE cmd_5
TYPE DOIF
VERSION 23640 2021-01-30 10:49:48
READINGS:
2021-04-17 22:59:48 Device LichtSensor
2021-04-17 20:48:28 cmd 5.2
2021-04-17 20:48:28 cmd_event TVTime
2021-04-17 20:48:28 cmd_nr 5
2021-04-17 20:48:28 cmd_seqnr 2
2021-04-17 22:59:48 e_LichtSensor_STATE 0.1
2021-04-17 22:57:33 e_TVTime_events off
2021-04-17 22:57:33 e_TVTime_state off
2021-04-10 22:57:38 mode enabled
2021-04-17 20:48:28 state cmd_5
2021-04-17 22:30:00 timer_01_c01 18.04.2021 15:00:00
2021-04-17 22:30:00 timer_02_c01 18.04.2021 22:30:00
2021-04-17 05:00:00 timer_03_c03 17.04.2021 22:30:00
2021-04-17 05:00:00 timer_04_c03 18.04.2021 05:00:00
2021-04-17 05:00:00 timer_05_c04 17.04.2021 22:30:00
2021-04-17 05:00:00 timer_06_c04 18.04.2021 05:00:00
Regex:
accu:
cond:
LichtSensor:
0:
&STATE ^LichtSensor$
1:
2:
3:
4:
&STATE ^LichtSensor$
PartyTime:
1:
state ^PartyTime$:^state:
2:
&STATE ^PartyTime$
TVTime:
0:
state ^TVTime$:^state:
1:
2:
&STATE ^TVTime$
3:
4:
&STATE ^TVTime$
attr:
cmdState:
wait:
waitdel:
condition:
0 ::DOIF_time($hash,0,1,$wday,$hms) and ::ReadingValDoIf($hash,'TVTime','state') eq "off" and ::InternalDoIf($hash,'LichtSensor','STATE') < 20.0 and ::InternalDoIf($hash,'WZEZ_WZFLed','STATE') eq "off"
1 ::ReadingValDoIf($hash,'PartyTime','state') eq "on" and ::InternalDoIf($hash,'LichtSensor','STATE') < 20.0 and ::InternalDoIf($hash,'WZEZ_WZBodenLed','STATE') eq "off"
2 ::DOIF_time($hash,2,3,$wday,$hms) and ::EventDoIf('PartyTime',$hash,'off',1) and ::EventDoIf('TVTime',$hash,'off',1)
3 ::DOIF_time($hash,4,5,$wday,$hms) and ::ReadingValDoIf($hash,'TVTime','state') eq "off" and ::ReadingValDoIf($hash,'PartyTime','state') eq "off" and (::InternalDoIf($hash,'WZEZ_WZFLed','STATE') eq "on" or ::InternalDoIf($hash,'WZEZ_WZBodenLed','STATE') eq "on")
4 ::EventDoIf('TVTime',$hash,'on',1) or ::InternalDoIf($hash,'LichtSensor','STATE') > 20.0
days:
do:
0:
0 set WZEZ_WZFLed on
1:
0 set WZBodenLed on
2:
0 set WZEZ_WZFLed on-for-timer 900
1 set WZBodenLed off
3:
0 set WZEZ_WZFLed off
1 set WZBodenLed off
4:
0 set WZBodenLed off
1 set WZEZ_WZFLed off
5:
helper:
DEVFILTER ^global$|^PartyTime$|^TVTime$|^LichtSensor$
NOTIFYDEV global|PartyTime|TVTime|LichtSensor
event CURRENT_ILLUMINATION: 0.1,AVERAGE_ILLUMINATION_STATUS: NORMAL,CURRENT_ILLUMINATION_STATUS: NORMAL,LOWEST_ILLUMINATION: 0.1,AVERAGE_ILLUMINATION: 0.1,HIGHEST_ILLUMINATION: 0.1,HIGHEST_ILLUMINATION_STATUS: NORMAL,LOWEST_ILLUMINATION_STATUS: NORMAL,activity: alive,devstate: ok,rssipeer: 0,rssidevice: -54,battery: ok
globalinit 1
last_timer 6
sleeptimer -1
timerdev TVTime
timerevent on
triggerDev LichtSensor
timerevents:
on
timereventsState:
state: on
triggerEvents:
CURRENT_ILLUMINATION: 0.1
AVERAGE_ILLUMINATION_STATUS: NORMAL
CURRENT_ILLUMINATION_STATUS: NORMAL
LOWEST_ILLUMINATION: 0.1
AVERAGE_ILLUMINATION: 0.1
HIGHEST_ILLUMINATION: 0.1
HIGHEST_ILLUMINATION_STATUS: NORMAL
LOWEST_ILLUMINATION_STATUS: NORMAL
activity: alive
devstate: ok
rssipeer: 0
rssidevice: -54
battery: ok
triggerEventsState:
CURRENT_ILLUMINATION: 0.1
AVERAGE_ILLUMINATION_STATUS: NORMAL
CURRENT_ILLUMINATION_STATUS: NORMAL
LOWEST_ILLUMINATION: 0.1
AVERAGE_ILLUMINATION: 0.1
HIGHEST_ILLUMINATION: 0.1
HIGHEST_ILLUMINATION_STATUS: NORMAL
LOWEST_ILLUMINATION_STATUS: NORMAL
activity: alive
devstate: ok
rssipeer: 0
rssidevice: -54
battery: ok
internals:
all LichtSensor:STATE WZEZ_WZFLed:STATE WZEZ_WZBodenLed:STATE
interval:
0 -1
1 0
2 -1
3 2
4 -1
5 4
intervalfunc:
intervaltimer:
localtime:
0 1618750800
1 1618777800
2 1618691400
3 1618714800
4 1618691400
5 1618714800
perlblock:
readings:
all TVTime:state PartyTime:state
realtime:
0 15:00:00
1 22:30:00
2 22:30:00
3 05:00:00
4 22:30:00
5 05:00:00
time:
0 15:00:00
1 22:30:00
2 22:30:00
3 05:00:00
4 22:30:00
5 05:00:00
timeCond:
0 0
1 0
2 2
3 2
4 3
5 3
timer:
0 0
1 0
2 0
3 0
4 0
5 0
timers:
3 4 5
trigger:
all PartyTime TVTime
triggertime:
1618714800:
localtime 1618714800
hash:
1618750800:
localtime 1618750800
hash:
1618777800:
localtime 1618777800
hash:
uiState:
uiTable:
Attributes:
room DOIF
List TVTime
Internals:
FUUID 60159b77-f33f-e7ed-6e34-dcc6f0c86daa832a
NAME TVTime
NR 47
STATE off
TYPE dummy
READINGS:
2021-04-17 23:02:33 state off
Attributes:
alexaName Tv Time
devStateIcon on:general_an@green off:general_aus@grey
event-on-change-reading .*
event-on-update-reading .*
gassistantName TVTime
genericDeviceType switch
room Dummy,GoogleAssistant
setList on off
webCmd on:off
Schnell per Handy :
Du verbindest zwei events mit and.
Das kann nie wahr werden.
ZitatKann mir jemand helfen und sagen warum nun um 22.57 die 3. Sequenz NICHT ausgeführt wird wenn TVTime "off" geht?
steht in der cref:
ZitatEreignissteuerung über Auswertung von Events
..... Die logische Verknüpfung "and" mehrerer Ereignisse ist nicht sinnvoll, da zu einem Zeitpunkt immer nur ein Ereignis zutreffen kann.
deine 3. Sequenz:
Zitat([?22:30-05:00] and [PartyTime:"off"] and [TVTime:"off"])
Ein Event-Trigger im DOIF läßt einen Ausdruck wie [TVTime:"off"] nur für den Moment, in dem das Ereignis auftritt, wahr werden. Mehr ist das nicht.
1) Das eignet sich hervorragend um DOIF-Zweige auszulösen. Sollen noch andere Bedingungen mit geprüft werden muss man mit == oder eq arbeiten, oder Zeiträume. Wenn diese nicht triggernd wirken sollen dann am besten mit [?....] als nicht-triggernd einbauen. Ist aber ein Event-trigger mit dabei spielt es keine Rolle (denn der ist ja immer "false", ausser er tritt ein).
Ein Ausdruck wie [TVTime:state] eq "off" funktioniert dagegen so: das Device "TVTime" meldet irgendeinen Event. Das DOIF erkennt das und schaut dann nach, ob es damit was anfangen kann: ist im Device TVTime der state "off", obwohl zum Beispiel das Reading blalba von TVTime irgendwas gemeldet hat, so wird die Abfrage dennoch wahr und, wenn die restlichen Bedingungen zutreffen, wird der Zweig ausgelöst. Du musst Dir also genau im Klaren sein, welches Device wie einen auslösenden Trigger liefern soll (den dann als Event-trigger einbauen) und welche Bedingungen zusätzlich abgefragt werden sollen. Je mehr, desto komplexer.
event-on-change-reading sowie event-on-update-reading dienen dazu, einem Device die Events abzugewöhnen, sollte es viele davon senden. Sie dienen nicht dazu, irgendwelche Events zu erzeugen. Bei einem Dummy werden eher keine überzähligen Events erzeugt, so dass Du das hier auch weglassen könntest. Beide mit ".*" dahinter anzugeben ist gleichbedeutend mit die Attribute wegzulassen.
Jetzt nochmal genau überlegen, wer, wann was triggern soll und dann die Bedingungen entsprechend schreiben. Eine große Hilfe ist hier der Eventmonitor. Am triggernden Device Events auslösen, im Eventmonitor analysieren, wie die aussehen, die entsprechende Zeile vollständig markieren und oben rechts auf "create/modify.." klicken. Dort DOIF auswähen und den Trigger kopieren.
Viel Erfolg!
1) Es gibt auch Event-trigger, die Werte liefern und verglichen werden können. Nur der Vollständigkeit halber.
Auch interessant: https://forum.fhem.de/index.php/topic,115785.msg1100628.html#msg1100628 (https://forum.fhem.de/index.php/topic,115785.msg1100628.html#msg1100628)