Hallo,
irgendwie stehe ich auf dem Schlauch. Ich hab mehrere DOIF mit wait, die funktionieren super.
Nur bei diesem wird trotz wait 1200:0:0 das Kinderzimmerlicht auf schlafen gesetzt, wenn genau 20:30 Uhr der Bewegungsmelder bereits closed ist.
Steht der Bewegungsmelder 20:30 Uhr noch auf open und meldet danach closed, dann läuft der Timer.
Ziel ist es, dass sobald nach 20:30 Uhr keine Bewegung mehr stattfindet 20 Minuten später der Dummy Kinderzimmerlicht auf Schlafen geschaltet wird.
(([20:30 - 06:00]) and ([Bewegungsmelder_Kinderzimmer] eq "closed"))
(set Kinderzimmerlicht Schlafen)
DOELSEIF ([06:00])
(set Kinderzimmerlicht auto)
DOELSE
Im folgenden List des DOIF läuft der Timer, allerdings war bereits nach 20:30 Uhr der Bewegungsmelder nochmal aktiv.
Internals:
DEF (([20:30 - 06:00]) and ([Bewegungsmelder_Kinderzimmer] eq "closed"))
(set Kinderzimmerlicht Schlafen)
DOELSEIF ([06:00])
(set Kinderzimmerlicht auto)
DOELSE
FUUID 5dc46046-f33f-3401-192b-20cb53bbc1e84568
MODEL FHEM
NAME Kinderzimmer_Schlafmodus
NOTIFYDEV Bewegungsmelder_Kinderzimmer,global
NR 495
NTFY_ORDER 50-Kinderzimmer_Schlafmodus
STATE cmd_3
TYPE DOIF
VERSION 20423 2019-10-29 18:50:08
READINGS:
2019-11-11 21:12:06 Device Bewegungsmelder_Kinderzimmer
2019-11-11 21:11:05 cmd 3
2019-11-11 21:11:05 cmd_event Bewegungsmelder_Kinderzimmer
2019-11-11 21:11:05 cmd_nr 3
2019-11-11 21:12:06 e_Bewegungsmelder_Kinderzimmer_STATE closed
2019-11-07 20:54:21 mode enabled
2019-11-11 21:11:05 state cmd_3
2019-11-11 06:00:00 timer_01_c01 11.11.2019 20:30:00
2019-11-11 06:00:00 timer_02_c01 12.11.2019 06:00:00
2019-11-11 06:00:00 timer_03_c02 12.11.2019 06:00:00
2019-11-11 21:12:06 wait_timer 11.11.2019 21:32:06 cmd_1 Bewegungsmelder_Kinderzimmer
Regex:
accu:
cond:
Bewegungsmelder_Kinderzimmer:
0:
&STATE ^Bewegungsmelder_Kinderzimmer$
1:
attr:
cmdState:
wait:
0:
1200
1:
0
2:
0
waitdel:
condition:
0 (::DOIF_time($hash,0,1,$wday,$hms)) and (::InternalDoIf($hash,'Bewegungsmelder_Kinderzimmer','STATE') eq "closed")
1 ::DOIF_time_once($hash,2,$wday)
days:
do:
0:
0 set Kinderzimmerlicht Schlafen
1:
0 set Kinderzimmerlicht auto
2:
0
helper:
DEVFILTER ^global$|^Bewegungsmelder_Kinderzimmer$
NOTIFYDEV global|Bewegungsmelder_Kinderzimmer
event closed,reportedState: closed
globalinit 1
last_timer 3
sleepdevice Bewegungsmelder_Kinderzimmer
sleepsubtimer 0
sleeptimer 0
timerdev Bewegungsmelder_Kinderzimmer
timerevent closed,reportedState: closed
triggerDev Bewegungsmelder_Kinderzimmer
timerevents:
closed
reportedState: closed
timereventsState:
state: closed
reportedState: closed
triggerEvents:
closed
reportedState: closed
triggerEventsState:
state: closed
reportedState: closed
internals:
all Bewegungsmelder_Kinderzimmer:STATE
interval:
0 -1
1 0
intervalfunc:
intervaltimer:
localtime:
0 1573500600
1 1573534800
2 1573534800
perlblock:
readings:
realtime:
0 20:30:00
1 06:00:00
2 06:00:00
time:
0 20:30:00
1 06:00:00
2 06:00:00
timeCond:
0 0
1 0
2 1
timer:
0 0
1 0
2 0
timers:
0 0 1
1 2
trigger:
triggertime:
1573534800:
localtime 1573534800
hash:
uiState:
uiTable:
Attributes:
wait 1200:0:0
Es gibt zig verschiedene Bewegungsmelder-Varianten. Du musst uns schon erst mal sagen: Was ist open und was ist closed? Wie lange verweilt der Bewegungsmelder in dem jeweiligen Zustand bis er ihn wechselt.
Es ist ein Fibaro Motion Eye.
open bedeutet Bewegung erkannt, dort bleibt der Bewegungsmelder auch so lange, bis er eine Minute lang keine Bewegung mehr erkannt hat. Dann schaltet er den state auf closed.
Ich habe insgesamt 7 dieser Bewegungsmelder und viele DOIFs die darauf triggern. ([Bewegungsmelder_XY] eq "open") oder ([Bewegungsmelder_XY] eq "closed") passt also zum jeweiligen Zustand.
U.a. auch ein DOIF, das genau diesen Bewegungsmelder auswertet und entsprechend das Licht schaltet.
Das DOIF was mir hier Probleme macht funktioniert an sich ja auch, nur WAIT wird ignoriert. Es wird 20:30 Uhr und der Bewegungsmelder-State ist closed - aber es wartet nicht die 1200 Sekunden ab, bis es CMD_1 setzt.
Du brauchst wohl https://fhem.de/commandref_DE.html#DOIF_timerWithWait
Ahhh vielen Dank! Das probiere ich aus.
Ich dachte Wait wartet immer bis das jeweilige CMD ausgeführt wird, auch wenn ein Zeitbereich angegeben ist.
Vielen Dank für die schnelle Hilfe!
EDIT:
schnell mit einem einfachen DOIF ausprobiert und funktioniert:
([22:50 - 22:51])
(set test test)
DOELSE
mit wait 20:0
ohne timerWithWait wurde es sofort 20:50 ausgeführt, mit dem Attribut hat es die 20 Sekunden gewartet.
DANKE :-)