Hallo zusammen,
ich habe hier mehrere Bewegungsmelder, welche nur ein Reading namens "reading" besitzen, in denen dann entweder "on" oder "off" steht.
Diese haben alle die gleiche Namensgebung (BMK im Namen), so dass ich für alle ein DOIF schreiben wollte, womit ich mir state setzen lassen wie z.B.: bei den Homematic Bewegungsmeldern.
reading = on
setze state auf motion
readiing = off
setze state auf noMotion (aber erst nach 60 Sekunden)
So sieht mein DOIF aus:
define doif.10.XX.yy.BMK.state DOIF (["BMK"] and [$DEVICE:reading] eq "on") \
(setreading $DEVICE state motion) \
DOELSEIF \
(["BMK"] and [$DEVICE:reading] eq "off") \
(setreading $DEVICE state noMotion)
attr doif.10.XX.yy.BMK.state do always
attr doif.10.XX.yy.BMK.state room Versorgungsraum
attr doif.10.XX.yy.BMK.state wait :60
Und dazu das List des Devices:
Internals:
CFGFN
DEF (["BMK"] and [$DEVICE:reading] eq "on")
(setreading $DEVICE state motion)
DOELSEIF
(["BMK"] and [$DEVICE:reading] eq "off")
(setreading $DEVICE state noMotion)
NAME doif.10.XX.yy.BMK.state
NR 269664
NTFY_ORDER 50-doif.10.XX.yy.BMK.state
STATE cmd_1
TYPE DOIF
Helper:
Dblog:
Cmd:
Sys.dblog:
TIME 1485261325.10009
VALUE 1
Cmd_event:
Sys.dblog:
TIME 1485261325.10009
VALUE EG.fl.BMK.Flur_Motion
Cmd_nr:
Sys.dblog:
TIME 1485261325.10009
VALUE 1
Last_cmd:
Sys.dblog:
TIME 1485259600.9926
VALUE initialized
Mode:
Sys.dblog:
TIME 1485259603.70012
VALUE enable
State:
Sys.dblog:
TIME 1485261325.10009
VALUE cmd_1
Wait_timer:
Sys.dblog:
TIME 1485261340.96835
VALUE 24.01.2017 13:36:40 cmd_2 EG.fl.BMK.Flur_Motion
Readings:
2017-01-24 13:35:40 Device EG.fl.BMK.Flur_Motion
2017-01-24 13:35:25 cmd 1
2017-01-24 13:35:25 cmd_event EG.fl.BMK.Flur_Motion
2017-01-24 13:35:25 cmd_nr 1
2017-01-24 13:35:40 matched_event_c1_1 reading: off,motion: off
2017-01-24 13:35:40 matched_event_c2_1 reading: off,motion: off
2017-01-24 13:35:25 state cmd_1
2017-01-24 13:35:40 wait_timer 24.01.2017 13:36:40 cmd_2 EG.fl.BMK.Flur_Motion
Condition:
0 EventDoIf('BMK',$hash,'',0) and ReadingValDoIf($hash,'$DEVICE','reading') eq "on"
1 EventDoIf('BMK',$hash,'',0) and ReadingValDoIf($hash,'$DEVICE','reading') eq "off"
Devices:
Do:
0:
0 setreading $DEVICE state motion
1:
0 setreading $DEVICE state noMotion
2:
Helper:
event reading: off,motion: off
globalinit 1
last_timer 0
sleepdevice EG.fl.BMK.Flur_Motion
sleepsubtimer 0
sleeptimer 1
timerdev EG.fl.BMK.Flur_Motion
timerevent reading: off,motion: off
triggerDev EG.fl.BMK.Flur_Motion
timerevents:
reading: off
motion: off
timereventsState:
reading: off
motion: off
triggerEvents:
reading: off
motion: off
triggerEventsState:
reading: off
motion: off
Internals:
Itimer:
Readings:
0 $DEVICE:reading
1 $DEVICE:reading
all $DEVICE:reading $DEVICE:reading
Regexp:
0:
0 BMK
1:
0 BMK
All:
0 BMK
State:
Trigger:
Attributes:
do always
room Versorgungsraum
wait :60
Für einzelne Bewegungen funktioniert das auch, sobald aber zwei Bewegungsmelder hintereinander im reading auf off gehen, dann wird der erste Timer vom zweiten überschrieben.
Der erste Bewegungsmelder bleibt auf motion, der zweite schaltet korrekt nach 60 Sekunden auf noMotion.
Hier das List so eines Bewegungsmelders:
Internals:
CFGFN
DEF 4
IODev SYS.gw.AE.Versorgungsraum
NAME EG.ku.BMK.Kueche_Motion
NR 676
PIN 4
STATE off
TYPE FRM_IN
Helper:
Dblog:
Logstate:
Sys.dblog:
TIME 1485260016.14683
VALUE motion
Motion:
Sys.dblog:
TIME 1485261311.99207
VALUE off
Reading:
Sys.dblog:
TIME 1485261311.99207
VALUE off
State:
Sys.dblog:
TIME 1485168816.5425
VALUE Initialized
Readings:
2017-01-24 13:35:11 logstate motion
2017-01-24 13:35:11 motion off
2017-01-24 13:35:11 reading off
2017-01-24 13:35:06 state motion
Attributes:
HomeModeAlarmActive armaway
HomeSensorLocation inside
IODev SYS.gw.AE.Versorgungsraum
alias Bewegung
event-on-change-reading .*
genericDeviceType MotionSensor
group Schalter
homebridge active
homebridgeMapping MotionDetected=state,values=/motion/:1;;/noMotion/:0
icon people_sensor
room Kueche,Versorgungsraum
showtime 1
stateFormat reading
subType motionDetector
userReadings motion { ReadingsVal($name,"reading","off") },logstate { ReadingsVal($name,"state","unknown") }
userattr HomeModeAlarmActive HomeOpenTamperReadings HomeOpenTamperVal HomeSensorLocation:inside,outside showtime:1,0 subType:motionDetector
Hat jemand eine Idee, wie ich das mit einem DOIF korrekt abbilden kann?
Danke und Grüße
Christian
In einem DOIF-Modul gibt es nur einen Wait Timer. Wenn du etwas verallgemeinern (generalisieren) willst und gleichzeitig mit Verzögerungen arbeiten willst, dann brauchst du pro Device einen eigenen Verzögerungstimer.
Das kannst du z. B. so lösen:
Auszug aus der Commandref zu DOIF:
ZitatVerzögerte "Fenster offen"-Meldung
define di_window_open DOIF ["^window_:open|tilted"])
(defmod at_$DEVICE at +00:05 set send window $DEVICE open)
DOELSEIF (["^window_:closed"])
(delete at_$DEVICE)
attr di_window_open do always
Alternative mit sleep
define di_window_open DOIF ["^window_:open|tilted"])
(sleep 300 $DEVICE quiet;set send window $DEVICE open)
DOELSEIF (["^window_:closed"])
(cancel $DEVICE quiet)
attr di_window_open do always
In den obigen beiden Beispielen ist eine Verzögerung über das Attribut wait nicht sinnvoll, da pro Fenster ein eigener Timer (hier mit Hilfe von at/sleep) gesetzt werden muss.
Alles klar, vielen Dank. Hat geklappt :D
Habe die variante mit sleep verwendet, gibt es da ggf. Probleme, wenn es zu viele davon gibt?
Ebenso die Frage, was ist, wenn während des sleep für eines der Devices erneut Bewegung erkannt wird:
Im Detail:
14:10:10 readings = on DOIF schaltet state auf motion
14:10:20 readings = off DOIF startet sleep für 60 sekunden um dann state auf noMotion zu schalten
14:10:50 readings = on DOIF schaltet state auf motion
kommt dann um
14:11:20 das sleep aus dem DOIF und schaltet auf noMotion?
Ich merk schon, da muss ich noch überlegen, wie das am besten geht.
Grüße
Christian
Zitat von: Christian Uhlmann am 24 Januar 2017, 14:15:43
Alles klar, vielen Dank. Hat geklappt :D
Habe die variante mit sleep verwendet, gibt es da ggf. Probleme, wenn es zu viele davon gibt?
Ebenso die Frage, was ist, wenn während des sleep für eines der Devices erneut Bewegung erkannt wird:
Im Detail:
14:10:10 readings = on DOIF schaltet state auf motion
14:10:20 readings = off DOIF startet sleep für 60 sekunden um dann state auf noMotion zu schalten
14:10:50 readings = on DOIF schaltet state auf motion
kommt dann um
14:11:20 das sleep aus dem DOIF und schaltet auf noMotion?
Ich merk schon, da muss ich noch überlegen, wie das am besten geht.
Grüße
Christian
Du kannst beliebig viele sleeps verwenden. Wenn motion mehrfach hintereinander kommt, dann musst du vorher dein sleep löschen mit
cancel <sleepname> quiet
bevor du einen neuen setzt.
Hi Damian,
vielen Dank, damit hab ich es nun korrekt lösen können.
Grüße
Christian