Hallo,
ich habe folgendes DOIF:
([$SELF] eq "on" and [?hue.Stehlampe] eq "off" and [?dummy_LightSensor:lux:d] < 10) (set hue.Stehlampe on)
DOELSE()
Das DOIF soll über eine Alexa-Routine getriggert werden. Um mir einen zusätzlichen Dummy zu ersparen habe ich das DOIF als Schalter definiert, mit setList und cmdState.
Wenn das DOIF getriggert wird, und zu diesem Zeitpunkt die Stehlampe "off" ist und der Wert eines Lichtsensors < 10, dann soll die Lampe angeschalten werden.
Aus irgendeinem Grund wird jedoch der Lightsensor-Wert ignoriert, und ich finde einfach das Problem nicht.
Im obigen Test-DOIF ist der Lightsensor ein Dummy:
Internals:
CFGFN
FUUID 5ea20686-f33f-9ecb-b1c5-e81419ca75d32139
NAME dummy_LightSensor
NR 21012
STATE lux 20
TYPE dummy
READINGS:
2020-04-23 23:20:38 lux 20
2020-04-23 23:20:22 state lux 20
Attributes:
readingList lux
setList lux
Wie man sieht ist der Lux-Wert auf 20 gesetzt.
Wenn ich jetzt die Lampe ausschalte, und dann das DOIF triggere (set di.Schlafenszeit on), dann geht die Lampe an, obwohl die Lux-Bedingung false sein sollte.
Was mache ich falsch?
List des DOIF:
Internals:
CFGFN
DEF ([$SELF] eq "on" and [?hue.Stehlampe] eq "off" and [?dummy_LightSensor:lux:d] < 10) (set hue.Stehlampe on)
DOELSE()
FUUID 5ea0afbd-f33f-9ecb-8c55-0c2088ee53ab265a
MODEL FHEM
NAME di.Schlafenszeit
NOTIFYDEV global,di.Schlafenszeit
NR 16549
NTFY_ORDER 50-di.Schlafenszeit
STATE off
TYPE DOIF
VERSION 21224 2020-02-18 18:45:49
READINGS:
2020-04-23 23:27:45 cmd 2
2020-04-23 23:27:45 cmd_event di.Schlafenszeit
2020-04-23 23:27:45 cmd_nr 2
2020-04-23 23:27:45 e_di.Schlafenszeit_STATE on
2020-04-23 23:27:17 mode enabled
2020-04-23 23:27:45 state off
Regex:
accu:
cond:
di.Schlafenszeit:
0:
&STATE ^di.Schlafenszeit$
attr:
cmdState:
0:
on
1:
off
wait:
waitdel:
condition:
0 ::InternalDoIf($hash,'di.Schlafenszeit','STATE') eq "on" and ::InternalDoIf($hash,'hue.Stehlampe','STATE') eq "off" and ::ReadingValDoIf($hash,'dummy_LightSensor','lux','','d') < 10
devices:
do:
0:
0 set hue.Stehlampe on
1:
0
helper:
DEVFILTER ^global$|^di.Schlafenszeit$
NOTIFYDEV global|di.Schlafenszeit
event cmd_nr: 1,cmd: 1,cmd_event: set_on_cmd_1,on
globalinit 1
last_timer 0
sleeptimer -1
timerdev di.Schlafenszeit
timerevent cmd_nr: 1,cmd: 1,cmd_event: set_on_cmd_1,on
triggerDev di.Schlafenszeit
DOIF_eventa:
cmd_nr: 2
cmd: 2
cmd_event: di.Schlafenszeit
off
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: di.Schlafenszeit
state: off
timerevents:
cmd_nr: 1
cmd: 1
cmd_event: set_on_cmd_1
on
e_di.Schlafenszeit_STATE: on
cmd_nr: 2
cmd: 2
cmd_event: di.Schlafenszeit
off
timereventsState:
cmd_nr: 1
cmd: 1
cmd_event: set_on_cmd_1
state: on
triggerEvents:
cmd_nr: 1
cmd: 1
cmd_event: set_on_cmd_1
on
e_di.Schlafenszeit_STATE: on
cmd_nr: 2
cmd: 2
cmd_event: di.Schlafenszeit
off
triggerEventsState:
cmd_nr: 1
cmd: 1
cmd_event: set_on_cmd_1
state: on
internals:
all di.Schlafenszeit:STATE hue.Stehlampe:STATE
readings:
trigger:
uiState:
uiTable:
Attributes:
cmdState on|off
do always
room System->DOIF
setList on off
webCmd :
Ich denke ich weiss die Antwort:
Mit set di.Schlafenszeit on führe ich effektiv den ersten Branch direkt aus (set di.Schlafenszeit cmd_1), und ignoriert sämtliche Bedingungen.
Ich schätze ich komme hier um einen Dummy nicht drum herum.
Ich vermute, das lässt sich wie mit dem "mybutton" im Beispiel hier lösen:
http://fhem.de/commandref_DE.html#DOIF_setList__readingList