Hi,
ich habe bei mir in den Fluren je einen Bewegungsmelder verbaut. Wenn einer von beiden BEwegung meldet, soll die Pumpe angehen. Wenn beide ein "noMotion" melden, und dieser Status innerhalb der nächsten 30min nicht wieder zurück auf "motion" wechselt, soll die Pumpe ausgehen.
Soweit so gut, nun wird aber der 30min wait-timer bei jedem Status noMotion erneut mit den 30min gestartet. Aber das "do resetwait" muss ich imho ja setzen, damit bei einem wechsel von motion auf noMotion bzw wieder zurück, der Timer wieder gelöscht wird.
Wo ist mein denkfehler?
Internals:
CFGFN
DEF ([SW_HZ_WWZirkulation] eq "off" and ([BM_EG_Flur] eq "motion" or [BM_OG_Flur] eq "motion")) (set SW_HZ_WWZirkulation on)
DOELSEIF
([SW_HZ_WWZirkulation] eq "on" and ([BM_EG_Flur] eq "noMotion" and [BM_OG_Flur] eq "noMotion")) (set SW_HZ_WWZirkulation off)
DOELSE
NAME DOIF_SW_HZ_WWZirkulation
NR 69182
NTFY_ORDER 50-DOIF_SW_HZ_WWZirkulation
STATE initialized
TYPE DOIF
Helper:
Dblog:
Cmd:
Dblog:
TIME 1493105866.80177
VALUE 0
State:
Dblog:
TIME 1493105866.80177
VALUE initialized
Readings:
2017-04-26 18:53:06 Device SW_HZ_WWZirkulation
2017-04-26 18:46:07 cmd 0
2017-04-26 18:51:42 e_BM_EG_Flur_STATE noMotion
2017-04-26 18:49:55 e_BM_OG_Flur_STATE noMotion
2017-04-26 18:53:06 e_SW_HZ_WWZirkulation_STATE on
2017-04-26 18:46:07 state initialized
2017-04-26 18:53:06 wait_timer 26.04.2017 19:23:06 cmd_2 SW_HZ_WWZirkulation
Condition:
0 InternalDoIf($hash,'SW_HZ_WWZirkulation','STATE') eq "off" and (InternalDoIf($hash,'BM_EG_Flur','STATE') eq "motion" or InternalDoIf($hash,'BM_OG_Flur','STATE') eq "motion")
1 InternalDoIf($hash,'SW_HZ_WWZirkulation','STATE') eq "on" and (InternalDoIf($hash,'BM_EG_Flur','STATE') eq "noMotion" and InternalDoIf($hash,'BM_OG_Flur','STATE') eq "noMotion")
Devices:
0 SW_HZ_WWZirkulation BM_EG_Flur BM_OG_Flur
1 SW_HZ_WWZirkulation BM_EG_Flur BM_OG_Flur
all SW_HZ_WWZirkulation BM_EG_Flur BM_OG_Flur
Do:
0:
0 set SW_HZ_WWZirkulation on
1:
0 set SW_HZ_WWZirkulation off
2:
0
Attributes:
DbLogExclude .*
cmdState Zirkulation An|Zirkulation Aus
do resetwait
room CUL_HM
wait 0:1800
ich würde es so definieren:
([BM_EG_Flur:"motion"] or [BM_OG_Flur:"motion"]) (set SW_HZ_WWZirkulation on) (set SW_HZ_WWZirkulation off)
do resetwait
wait 0,1800
Danke, mal ausprobiert... aber so startet er garnicht mehr einen timer wenn beide noMotion haben...
Beide Bewegungsmelder stehen definitiv auf noMotion
Internals:
CFGFN
DEF ([BM_EG_Flur:"motion"] or [BM_OG_Flur:"motion"]) (set SW_HZ_WWZirkulation on) (set SW_HZ_WWZirkulation off)
NAME DOIF_SW_HZ_WWZirkulation
NR 69182
NTFY_ORDER 50-DOIF_SW_HZ_WWZirkulation
STATE cmd_1
TYPE DOIF
Helper:
Dblog:
Cmd:
Dblog:
TIME 1493105866.80177
VALUE 0
State:
Dblog:
TIME 1493105866.80177
VALUE initialized
Readings:
2017-04-26 19:44:56 Device BM_OG_Flur
2017-04-26 19:44:35 cmd 1.2
2017-04-26 19:44:35 cmd_event BM_OG_Flur
2017-04-26 19:44:35 cmd_nr 1
2017-04-26 19:44:35 cmd_seqnr 2
2017-04-26 19:43:51 e_BM_EG_Flur_events motion: off,motionDuration: 242,noMotion
2017-04-26 19:44:56 e_BM_OG_Flur_events battery: ok,brightness: 85,cover: closed
2017-04-26 19:44:35 state cmd_1
Condition:
0 EventDoIf('BM_EG_Flur',$hash,'motion',1) or EventDoIf('BM_OG_Flur',$hash,'motion',1)
Devices:
0 BM_EG_Flur BM_OG_Flur
all BM_EG_Flur BM_OG_Flur
Do:
0:
0 set SW_HZ_WWZirkulation on
1 set SW_HZ_WWZirkulation off
1:
Helper:
event battery: ok,brightness: 85,cover: closed
globalinit 1
last_timer 0
sleeptimer -1
timerdev BM_OG_Flur
timerevent motion: off
triggerDev BM_OG_Flur
timerevents:
motion: off
motionDuration: 242
noMotion
timereventsState:
motion: off
motionDuration: 242
state: noMotion
triggerEvents:
battery: ok
brightness: 85
cover: closed
triggerEventsState:
battery: ok
brightness: 85
cover: closed
Internals:
Itimer:
Readings:
Regexp:
0:
All:
State:
Trigger:
all BM_EG_Flur BM_OG_Flur
Attributes:
DbLogExclude .*
cmdState Zirkulation An|Zirkulation Aus
do resetwait
room CUL_HM
wait 0:1800
hmm, hab nochmal geändert, und bei den Bewegungsmeldern das Attr. event-on-change auf "motion" gesetzt, hilft trotzdem nix.
Dadurch das der Timer immer weiter gesetzt wird, kommt praktisch nie das "Aus" Command
([SW_HZ_WWZirkulation] eq "off" and ([BM_EG_Flur:motion] =~ m/on/ or [BM_OG_Flur:motion] =~ m/on/)) (set SW_HZ_WWZirkulation on)
DOELSEIF
([SW_HZ_WWZirkulation] eq "on" and ([BM_EG_Flur:motion] eq "off" and [BM_OG_Flur:motion] eq "off")) (set SW_HZ_WWZirkulation off)
DOELSE
Zitat von: Tobias am 26 April 2017, 19:47:45
Danke, mal ausprobiert... aber so startet er garnicht mehr einen timer wenn beide noMotion haben...
Beide Bewegungsmelder stehen definitiv auf noMotion
wait 0
,1800
cool, damit funktioniert es. Und der Timer wird auch nicht immer nachkorrigiert ;) Die Pumpe geht pünktlich nach 30min aus.
Warum aber funktioniert das hier? Diese sysntax habe ich nicht verstanden.. Und warum hat mein Beispiel nicht funktioniert? Warum wurde bei mir immer bei jedem Event der Timer nach vor geschoben und bei dir nicht??
Zitat von: Tobias am 27 April 2017, 08:50:50
cool, damit funktioniert es. Und der Timer wird auch nicht immer nachkorrigiert ;) Die Pumpe geht pünktlich nach 30min aus.
Warum aber funktioniert das hier? Diese sysntax habe ich nicht verstanden.. Und warum hat mein Beispiel nicht funktioniert? Warum wurde bei mir immer bei jedem Event der Timer nach vor geschoben und bei dir nicht??
Mein Beispiel entspricht dem Beispiel für die Nachbildung eines on-for-timers aus der DOIF-Commandref.
Im Gegensatz zu deiner Lösung gibt es hier nur einen DOIF-Zweig, allerdings als eine Befehlssequenz. In der Befehlssequenz wird der erste Befehl sofort ausgeführt, der zweite verzögert (deswegen ein Komma bei wait und kein Doppelpunkt). Mit do resetwait wird ein laufender Timer neu gesetzt, hier also für den zweiten set-Befehl zum Ausschalten, der erste Befehl der Sequenz wird in diesem Fall nicht wiederholt, weil die Befehlssequenz aufgrund des laufenden Timers dann noch nicht beendet war.