Hallo, ich bräuchte mal grundlegende Hilfe beim Verständnis einer Lichtschaltung.
Ich habe einen Homematic Bewegungsmelder HM-Sen-MDIR-O-2 und will damit eine Lampe (Flurlicht über Phillips Hue) steuern.
Das Licht sollte bei Erkennung einer Bewegung ab einer bestimmten Helligkeit automatisch einschalten und nach einer vordefinierten Zeit wieder ausschalten.
Sollte die Bewegung in dieser Zeit jedoch bestehen bleiben, sollte die Lampe eingeschaltet bleiben - und genau das ist es was ich nicht hinbekomme.
Ich habe schon verschiedene Ansätze probiert:
1) Die Lampe mit on-for-Timer für eine bestimmte Zeit zu schalten
2) Die Lampe bei Bewegungserkennung ein und bei entgegengesetzter Rückmeldung des Bewegungsmelders auszuschalten (Dabei habe ich verschiedene Registereinstellungen probiert)
Wie würdet ihr die Aufgabe angehen?
Anbei die Lists vom Steuerungs-DOIF und vom Bewegungsmelder sowie der Lampe
Internals:
CFGFN
DEF (([fl_motion_detector:state] eq "motion") and ([?fl_motion_detector:brightness] < 40) and ([?Schlafend] eq "off"))
(set fl_light_Decke on)
DOELSEIF (([fl_motion_detector:state] eq "motion") and ([?fl_licht_flur] eq "on") and ([?Schlafend] eq "off"))
(set fl_light_Decke on)
DOELSEIF (([fl_motion_detector:state] eq "motion") and ([?fl_motion_detector:brightness] < 40) and ([?Schlafend] eq "on"))
(set fl_light_Decke on)
DOELSEIF (([fl_motion_detector:state] eq "motion") and ([?fl_licht_flur] eq "on") and ([?Schlafend] eq "on"))
(set fl_light_Decke)
DOELSE (set fl_light_Decke off)
FUUID 6081aaea-f33f-793a-c688-b75564f6c8c16992
MODEL FHEM
NAME flurlicht_schalten
NOTIFYDEV fl_motion_detector,global
NR 236517
NTFY_ORDER 50-flurlicht
STATE cmd_5
TYPE DOIF
VERSION 24223 2021-04-11 19:12:18
.attraggr:
.attrminint:
READINGS:
2021-04-24 23:38:50 Device fl_motion_detector
2021-04-24 23:38:50 cmd 5
2021-04-24 23:38:50 cmd_event fl_motion_detector
2021-04-24 23:38:50 cmd_nr 5
2021-04-24 23:38:50 e_fl_motion_detector_state noMotion
2021-04-24 23:37:01 mode enabled
2021-04-24 23:38:50 state cmd_5
Regex:
accu:
collect:
cond:
fl_motion_detector:
0:
state ^fl_motion_detector$:^state:
1:
state ^fl_motion_detector$:^state:
2:
state ^fl_motion_detector$:^state:
3:
state ^fl_motion_detector$:^state:
attr:
cmdState:
wait:
waitdel:
condition:
0 (::ReadingValDoIf($hash,'fl_motion_detector','state') eq "motion") and (::ReadingValDoIf($hash,'fl_motion_detector','brightness') < 40) and (::InternalDoIf($hash,'Schlafend','STATE') eq "off")
1 (::ReadingValDoIf($hash,'fl_motion_detector','state') eq "motion") and (::InternalDoIf($hash,'fl_licht_flur','STATE') eq "on") and (::InternalDoIf($hash,'Schlafend','STATE') eq "off")
2 (::ReadingValDoIf($hash,'fl_motion_detector','state') eq "motion") and (::ReadingValDoIf($hash,'fl_motion_detector','brightness') < 40) and (::InternalDoIf($hash,'Schlafend','STATE') eq "on")
3 (::ReadingValDoIf($hash,'fl_motion_detector','state') eq "motion") and (::InternalDoIf($hash,'fl_licht_flur','STATE') eq "on") and (::InternalDoIf($hash,'Schlafend','STATE') eq "on")
do:
0:
0 set fl_light_Decke on
1:
0 set fl_light_Decke on
2:
0 set fl_light_Decke on
3:
0 set fl_light_Decke
4:
0 set fl_light_Decke off
helper:
DEVFILTER ^global$|^fl_motion_detector$
NOTIFYDEV global|fl_motion_detector
event motion: off,motionDuration: 49,noMotion
globalinit 1
last_timer 0
sleeptimer -1
timerdev fl_motion_detector
timerevent motion: off,motionDuration: 49,noMotion
triggerDev fl_motion_detector
timerevents:
motion: off
motionDuration: 49
noMotion
timereventsState:
motion: off
motionDuration: 49
state: noMotion
triggerEvents:
motion: off
motionDuration: 49
noMotion
triggerEventsState:
motion: off
motionDuration: 49
state: noMotion
internals:
all Schlafend:STATE fl_licht_flur:STATE
readings:
all fl_motion_detector:state
trigger:
uiState:
uiTable:
Attributes:
alias Steuerung Flurlicht
do always
room Steuerung->Licht->Flur
Internals:
.triggerUsed 1
CFGFN
DEF 3A8C89
FUUID 60808701-f33f-793a-3e53-2bb22405a3f9e530
Homematic_Gateway_MSGCNT 1345
Homematic_Gateway_RAWMSG 0501003A2884103A8C8911111106012100
Homematic_Gateway_RSSI -58
Homematic_Gateway_TIME 2021-04-24 23:45:08
IODev Homematic_Gateway
LASTInputDev Homematic_Gateway
MSGCNT 1345
NAME fl_motion_detector
NOTIFYDEV global
NR 216789
STATE noMotion (33)
TYPE CUL_HM
chanNo 01
lastMsg No:28 - t:10 s:3A8C89 d:111111 06012100
protLastRcv 2021-04-24 23:45:08
protRcv 1343 last_at:2021-04-24 23:45:08
protResnd 9 last_at:2021-04-24 23:14:53
protSnd 549 last_at:2021-04-24 23:38:33
protState CMDs_done
rssi_at_Homematic_Gateway cnt:1346 min:-72 max:-30 avg:-47.9 lst:-58
.attraggr:
.attrminint:
READINGS:
2021-04-24 23:16:48 .D-devInfo 810100
2021-04-24 23:16:48 .D-stc 81
2021-04-24 23:16:28 .R-brightFilter 0
2021-04-24 23:16:28 .R-captInInterval off
2021-04-21 22:15:55 .R-evtFltrNum 1
2021-04-21 22:15:55 .R-evtFltrPeriod 1 s
2021-04-21 22:15:55 .R-ledOnTime 0 s
2021-04-24 23:16:28 .R-minInterval 15
2021-04-21 22:16:31 .R-pairCentral 0x111111
2021-04-21 22:15:55 .R-sabotageMsg on
2021-04-21 22:15:55 .R-sign off
2021-04-24 23:16:53 .associatedWith fl_motion_detector,fl_motion_detector
2021-04-24 23:16:49 .peerListRDate 2021-04-24 23:16:49
2021-04-24 23:45:08 .protLastRcv 20210424234508
2021-04-24 23:16:27 CommandAccepted yes
2021-04-24 23:16:48 D-firmware 1.6
2021-04-24 23:16:48 D-serialNr MEQ0539155
2021-04-24 23:16:48 PairedTo 0x111111
2021-04-24 23:16:48 RegL_00. 00:00 02:01 0A:11 0B:11 0C:11 10:01
2021-04-24 23:16:48 RegL_01. 00:00 01:12 02:00 08:00 22:00
2021-04-24 23:45:08 battery ok
2021-04-24 23:45:08 brightness 33
2021-04-24 23:16:49 cfgState TrigUndef
2021-04-24 23:38:33 commState CMDs_done
2021-04-24 23:38:50 motion off
2021-04-24 23:38:33 motionCount 87_next:15s
2021-04-24 23:38:50 motionDuration 49
2021-04-21 22:32:06 powerOn 2021-04-21 22:32:06
2021-04-24 23:45:08 recentStateType info
2021-04-24 23:45:08 sabotageError off
2021-04-24 23:38:50 state noMotion
2021-04-24 23:38:33 trigDst_111111 noConfig
2021-04-24 23:38:33 trigger_cnt 87
helper:
HM_CMDNR 40
PONtest 0
cSnd 011111113A8C8901040000000001,011111113A8C890103
mId 004A
peerFriend peerAct,peerVirt
peerIDsRaw ,00000000
peerIDsState complete
peerOpt 4:motionDetector
regLst 0,1,4p
rxType 28
supp_Pair_Rep 0
cfgChk:
idPz05 111111
cmds:
TmplKey :no:1619299013.158
TmplTs 1619299013.158
cmdKey 1:1:0::fl_motion_detector:004A:01:
cmdLst:
assignHmKey noArg
clear [(readings|trigger|register|oldRegs|rssi|msgEvents|{msgErrors}|attack|all)]
deviceRename -newName-
fwUpdate -filename- [-bootTime-]
getConfig noArg
getDevInfo noArg
getRegRaw (List0|List1|List2|List3|List4|List5|List6|List7) [-peerChn-]
peerBulk -peer1,peer2,...- [({set}|unset)]
peerChan -btnNumber- -actChn- [({single})] [({set}|unset)] [actor|remote|both]
peerSmart -peerOpt-
raw -data- [...]
regBulk -list-.-peerChn- -addr1:data1- -addr2:data2-...
regSet [(prep|{exec})] -regName- -value- [-peerChn-]
reset noArg
sign [(on|{off})]
tplDel -tplDel-
tplSet_0 -tplChan-
trgEventL -peer- -condition-
trgEventS -peer- -condition-
trgPressL [(-peer-|{all})]
trgPressS [(-peer-|{all})]
unpair noArg
lst:
condition slider,0,1,255
peer
peerOpt rauchmelder_team,sz_heizung_WindowRec,sz_heizung_remote,sz_rolladen_Schlafzimmerfenster
tplChan
tplDel
tplPeer
rtrvLst:
cmdList [({short}|long)]
deviceInfo [({short}|long)]
list [({normal}|full)]
param -param-
reg -addr- -list- [-peerChn-]
regList noArg
regTable noArg
regVal -addr- -list- [-peerChn-]
saveConfig [-filename-]
tplInfo noArg
expert:
def 0
det 0
raw 1
tpl 0
io:
flgs 0
newChn +3A8C89,00,00,00
nextSend 1619300708.87099
prefIO
rxt 2
vccu
p:
3A8C89
00
00
00
mRssi:
mNo 28
io:
Homematic_Gateway:
-52
-52
peerIDsH:
00000000 broadcast
prt:
bErr 0
sProc 0
sleeping 1
try 1
rspWait:
q:
qReqConf
qReqStat
regCollect:
role:
chn 1
dev 1
rssi:
at_Homematic_Gateway:
avg -47.9004457652303
cnt 1346
lst -58
max -30
min -72
shadowReg:
tmpl:
Attributes:
.mId 00C0
IODev Homematic_Gateway
alias Bewegungsmelder Flur
autoReadReg 4_reqStatus
expert rawReg
firmware 1.6
group Bewegungsmelder
icon motion_detector
model HM-SEC-MDIR-2
peerIDs 00000000
room CUL_HM,Wohnung->Flur
serialNr MEQ0539155
stateFormat state (brightness)
subType motionDetector
Internals:
.FhemMetaInternals 1
DEF group 5 IODev=Hue_Bridge
FUUID 5fc271f4-f33f-793a-5bd9-7281454279f40218
FVERSION 31_HUEDevice.pm:0.239120/2021-03-08
ID G5
INTERVAL
IODev Hue_Bridge
NAME fl_licht_flur
NR 55
STATE off
TYPE HUEDevice
class Living room
desired 0
lights 21
name Flur
type Room
.attraggr:
.attreocr:
.*
.attrminint:
.attrtocr:
.*
READINGS:
2021-04-22 18:58:01 alert select
2021-04-24 23:37:05 all_on 0
2021-04-24 23:37:05 any_on 0
2021-04-24 20:16:11 bri 89
2021-04-24 09:17:26 colormode ct
2021-04-24 20:16:11 ct 500
2021-04-22 18:58:01 effect none
2021-04-22 23:42:27 hue 42988
2021-04-24 23:38:35 onoff 0
2021-04-24 23:38:35 pct 0
2021-04-22 18:58:01 reachable 1
2021-04-24 20:16:11 rgb ffaf6e
2021-04-22 19:33:42 sat 254
2021-04-24 23:38:35 state off
helper:
alert select
bri 89
colormode ct
ct 500
devtype G
effect none
hue 42988
onoff 0
pct 0
reachable 1
rgb ffaf6e
sat 254
state off
update_timeout 1
json:
class Living room
name Flur
type Room
action:
alert select
bri 89
colormode ct
ct 500
effect none
hue 42993
sat 254
xy:
0.1181
0.0561
lights:
21
sensors:
state:
lights:
21 1
Attributes:
IODev Hue_Bridge
alias Deckenlampe
cmdIcon on:remotecontrol/black_btn_GREEN off:remotecontrol/black_btn_RECORD
color-icons 2
delayedUpdate 1
devStateIcon on:light_light_dim_100 off:light_light_dim_00
event-on-change-reading .*
group Lampengruppe
icon light_light
room Wohnung->Flur,HUEDevice
timestamp-on-change-reading .*
userattr createActionReadings:1,0 createGroupReadings:1,0
verbose 4
Mir gehen die Ideen aus wie ich es schaffe, dass die Lampe bei andauernder Bewegung nicht ausgeht sondern erst wenn die Bewegung nicht mehr existiert.
Hallo Superposchi,
ich habe ein DOIF bei mir laufen, welches auch von einem Homematic Bewegungsmelder getriggert wird und eine Lampe steuert. Ich nutze allerdings nicht nur den motion-Event, sondern auch den noMotion-event des Bewegungsmelders. Das Prinzip: motion wird gemeldet, Lampe geht an. noMotion kommt nach x sec, im DOIF wird der Lampe-aus-Befehl mit einem timer y verzögert gesendet. Kommt erneut das Event motion, wird der Timer abgebrochen. Bei weiteren motion-events passiert nix, das DOIF bleibt in Zweig 1. Kommt irgendwann noMotion, startet der Timer und wenn dann nicht wieder eine Bewegung kommt wird die Lampe ausgeschaltet.
Das kannst Du, wenn gewünscht, ganz einfach erweitern, dass die Lampe in 2 Stufen ausgeht (sofern die dimmbar ist ;)). Man steht dann nicht sofort im Dunkeln, wenn man sich eine Zeit nicht bewegt hat, und das Licht geht dann wieder an, wenn man sich bewegt.
(["fl_motion_detector:^motion$"] and ([?fl_motion_detector:brightness] < 40 and [Schlafend] eq "off"))
(set fl_light_Decke on)
DOELSEIF
([?fl_light_Decke] eq "on" and ["fl_motion_detector:^nomotion$"])
(set fl_light_Decke off)
Attribute:
do resetwait
timerWithWait 1
wait 0:20
die 20 sec musst Du nach Deinen Vorstellungen anpassen. Bei meinem Sensor wird noMotion ca 40 sec nach motion gemeldet, also wäre die Lampe 1 minute an, wenn einmal Bewegung getriggert wird.
Ich habe mal nur Helligkeit und Schlafen eq off aus Deinem Beispiel übernommen. Zum Testen würde ich die ganzen Bedingungen erst mal weglassen, einfach ) ## vor das and in der ersten Zeile, dann wird nur der motion-event verwendet.
Viel Erfolg!
Danke für den Ansatz.
Hatte ich im Prinzip auch schon ausprobiert, allerdings ohne die Verzögerung beim Abschalten und die Attribute.
Bin noch am Anfang mit dem Verständnis für die ganzen DOIF Möglichkeiten.
Werde die Umsetzung testen und dann Rückmeldung geben.
Kurze Frage zu deinem Code:
ZitatWas bedeutet ^motion$ genau?
a) kenne die Schreibweise nicht und b) befürchte ich, dass ich es nicht so verwenden kann, da ich mit stateformat den STATE des Bewegungsmelders angepasst habe.
Zitat([?fl_motion_detector:brightness] < 40 and [Schlafend] eq "off")
Fehlt hier nicht eine schließende Klammer vor dem And und eine öffnende danach? Kann man das so kombinieren?
Zitata) Was bedeutet ^motion$ genau?
^ fängt an mit dem folgenden
$ hört auf mit dem vorhergehenden
bedeutet: der Event hinter dem Device heißt genau motion. Da beim state das "state" nicht mitgeschickt wird passt das so.
Ist Perl Regex.
aus der cRef:
Zitat["FS"] triggert auf alle Devices, die "FS" im Namen beinhalten
["^FS"] triggert auf alle Devices, die mit "FS" im Namen anfangen
["FS:temp"] triggert auf alle Devices, die "FS" im Namen und "temp" im Event beinhalten
([":^temp"]) triggert auf beliebige Devices, die im Event mit "temp" beginnen
(["^FS$:^temp$"] triggert auf Devices, die genau "FS" heißen und im Event genau "temp" vorkommt
als Erklärung wie das im DOIF eingebaut wird.
Zitatb) befürchte ich, dass ich es nicht so verwenden kann, da ich mit stateformat den STATE des Bewegungsmelders angepasst habe.
doch kannst Du. Du hast mit stateFormat den STATE angepasst, state liefert wohl immer noch den richtigen Event:
ZitatSTATE noMotion (33)
2021-04-24 23:38:50 state noMotion
ZitatZitat
([?fl_motion_detector:brightness] < 40 and [Schlafend] eq "off")
Fehlt hier nicht eine schließende Klammer vor dem And und eine öffnende danach? Kann man das so kombinieren?
hast Du es mal ausprobiert?
Man kann das so schreiben, bzw. da noch Klammern drum zu machen ist unnötig. Auch das ist Perl. Das nach "if" (oder DOIF) muss gesamt in Klammern, innerhalb kannst Du die Vergleiche ohne schreiben und mit and oder or verknüpfen. ABER: für die Verknüpfungen gelten wiederum "Klammerregeln", je nach and/or und was zusammen gehört und was nicht. Es KANN also schon Klammern innerhalb geben.
Beliebeige Beispiel aus der cRef:
Zitat([Switch1] eq "on" and [Switch2] eq "on")
Viel Erfolg!
Zitat^motion$
Wo du es schreibst dämmert da was, aber wird wenn kein Reading angegeben nicht immer auf STATE verwiesen und nicht auf state? Falls nicht habe ich da was falsch verstanden.
ZitatMan kann das so schreiben, bzw. da noch Klammern drum zu machen ist unnötig. Auch das ist Perl. Das nach "if" (oder DOIF) muss gesamt in Klammern, innerhalb kannst Du die Vergleiche ohne schreiben und mit and oder or verknüpfen. ABER: für die Verknüpfungen gelten wiederum "Klammerregeln", je nach and/or und was zusammen gehört und was nicht. Es KANN also schon Klammern innerhalb geben.
Ich habe es mir angewöhnt jede Bedingung einzeln in Klammern zu setzen, alleine schon wegen der Übersichtlichkeit. Das mit den Klammerregeln ist mir bekannt, wenn ich sie auch noch nicht komplett durchblicke, da sie meines Erachtens ziemlich oft von einander abweichen.
Hab dein Beispiel ausprobiert und an meine Schreibweise angepasst.
Funktioniert erstmal soweit. Muss es jetzt mal einem Stress-/Dauertest unterziehen.
Danke erstmal dafür.
ZitatWo du es schreibst dämmert da was, aber wird wenn kein Reading angegeben nicht immer auf STATE verwiesen und nicht auf state? Falls nicht habe ich da was falsch verstanden.
Richtig erkannt, falsch verstanden ;)
ZitatstateFormat
Modifies the STATE of the device, shown by the list command or in the room overview in FHEMWEB. If not set, its value is taken from the state reading. If set, then every word in the argument is replaced by the value of the reading if such a reading for the current device exists. If the value of this attribute is enclosed in {}, then it is evaluated. This attribute is evaluated each time a reading is updated.
ZitataddStateEvent
attr <device> addStateEvent [0|1]
As you probably know the event associated with the state Reading is special, as the "state: " string is stripped, i.e event is not "state: on" but just "on".
das erklärt es ziemlich gut.
Also erstmal die Lösung von Sany scheint anstandslos zu funktionieren. Wenn eine Bewegung innerhalb der Abschaltzeit erkannt wird bleibt die Lampe an.
Das einzige Problem ist, dass der Bewegungsmelder oft ins Leere geht, wenn man zu kleine oder geringe Bewegungen macht, speziell in der Küche in der ich das Flurkonzept übernommen habe.
Gibt es eine Möglichkeit den Bewegungsmelder per Register empfindlicher einzustellen, als im Standard?
Alle Erläuterungen und Beschreibungen die ich zu Homematic-Registern gefunden habe bezogen sich leider in erster Linie auf Aktoren und die damit verbundenen Register die das "Senden" beeinflussen.
also ich hoffe mal
ZitatMuss es jetzt mal einem Stress-/Dauertest unterziehen
das war erfolgreich und
Zitatscheint anstandslos zu funktionieren
es nicht nur scheint, sondern es auch tut ... ;)
ZitatGibt es eine Möglichkeit den Bewegungsmelder per Register empfindlicher einzustellen, als im Standard?
schau mal hier:
https://wiki.fhem.de/wiki/HM-Sen-MDIR-O_Funk-IR-Bewegungsmelder_außen#Konfiguration_.C3.BCber_Register (https://wiki.fhem.de/wiki/HM-Sen-MDIR-O_Funk-IR-Bewegungsmelder_au%C3%9Fen#Konfiguration_.C3.BCber_Register)
also erst mal auslesen, was bei Deinem Sensor drinsteht und dann evtl. ändern. Vermutlich musst Du nur minInterval runtersetzen (Zeitkontingent beachten!), oder mit den anderen Möglichkeiten rumspielen, bis es passt.
Viel Erfolg!
Edit: Du hast wohl einen anderen Bewegungsmelder, dann hier:
https://wiki.fhem.de/wiki/HM-Sec-MDIR_Funk-Bewegungsmelder_innen#Auslesen_der_Register_aus_dem_device (https://wiki.fhem.de/wiki/HM-Sec-MDIR_Funk-Bewegungsmelder_innen#Auslesen_der_Register_aus_dem_device)
Ja, die beiden Seiten kenne ich.
Hab das MinInterval auf 15 bzw. 30 runtergestellt, aber dadurch wird ja nur die Blockzeit beeinflusst, nicht die Empfindlichkeit.
Die wird nach meinem Verständnis durch einen dieser Einträge gesteuert, aber ich finde keine weitergehenden Erklärungen zu:
captInInterval - capture within interval options:on,off
evtFltrNum - sensitivity - read sach n-th puls
evtFltrPeriod - event filter period
Also bis jetzt funktioniert die Steuerung auch im Langzeitbetrieb perfekt. Danke noch mal.
Ich hätte allerdings noch eine Frage:
Hat jemand eine Idee wie man die automatische Schaltung beim manuellen Einschalten per Sprache oder App vorübergehend deaktivieren kann?