Hallo.
Ich würde gerne Folgendes realisieren:
- Licht an bei Betätigung Taster
- Licht aus bei Betätigung Taster
- Licht an, wenn Bewegungsmelder Bewegung meldet
- Licht nach 5 Minuten aus, wenn Bewegungsmelder keine Bewegung mehr meldet
Am Start sind:
- Ein Homematic HM-SEC-MDIR-2 und
- Ein Homematic HM-LC-SW1-FM
Ich versuche mit einem DOIF umzusetzen.
Der HM-LC-SW1-FM leistet mit einem herkömmlichen Taster bereits seine Arbeit ... Licht an/aus.
Die Probleme treten bei der Automatisierung mit dem Bewegungsmelder auf.
Mein Ansatz im Kern - DOIF auf Zustand Licht und Ereignisse des Bewegungsmelders:
## Watch Dog
([ugCorridorLight] eq "on" and [ugCorridorMotionDetector:"motion: off"])
(set ugCorridorLight off)
## On on Motion
DOELSEIF ([ugCorridorLight] eq "off" and [ugCorridorMotionDetector:"motion: on"])
(set ugCorridorLight on)
... ergänzt um "
wait" für die Verzögerung.
Probleme:
- Wenn das Licht mal an ist, dann scheinen weitere Bewegungen ("Tanzen") nicht zu einer Verlängerung der Beleuchtung zu führen. Das Licht geht nach 5 Minuten aus.
- Nachdem das Licht aus ist dauert es "gefühlt" 1-2 Minuten bis das "Tanzen" vor dem Bewegungsmelder dazu führt, dass das Licht wieder angeht.
Auf Basis der Commandref -> DOIF -> Verzögerungen dachte ich "
wait" sei die Lösung. Ich gestehe aber offen ein, dass ich "
do always" (welches ich verwende) und "
timerWithWait" oder auch "
do resetwait" (verwende ich beide nicht) noch nicht richtig verstanden habe.
Unten noch das List von meinem DOIF.
Ich hoffe meine Beschreibung war nicht zu konfus.
Ich bin für jeden Hinweis dankbar und sollte mein Frage bereits an anderer Stelle beantwortet sein bitte ich um einen kurzen Hinweis.
Danke und Grüße, Erich
Internals:
CFGFN
DEF ## Watch Dog
([ugCorridorLight] eq "on" and [ugCorridorMotionDetector:"motion: off"])
(set ugCorridorLight off)
## On on Motion
DOELSEIF ([ugCorridorLight] eq "off" and [ugCorridorMotionDetector:"motion: on"])
(set ugCorridorLight on)
FUUID 5ca9d2a7-f33f-508c-2a91-da232d34b5a66709
MODEL FHEM
NAME ugCorridorLightWatchDog
NR 3758
NTFY_ORDER 50-ugCorridorLightWatchDog
STATE cmd_1
TYPE DOIF
VERSION 18890 2019-03-13 18:56:41
READINGS:
2019-04-11 22:20:31 Device ugCorridorMotionDetector
2019-04-11 22:08:53 cmd 1
2019-04-11 22:08:53 cmd_event ugCorridorMotionDetector
2019-04-11 22:08:53 cmd_nr 1
2019-04-11 22:15:32 e_ugCorridorLight_STATE off
2019-04-11 22:20:31 e_ugCorridorMotionDetector_events battery: ok,brightness: 33,cover: closed
2019-04-07 12:36:23 mode enabled
2019-04-11 22:08:53 state cmd_1
2019-04-07 12:38:20 timer 300
2019-04-11 22:08:53 wait_timer no timer
Regex:
accu:
attr:
cmdState:
wait:
0:
[$SELF:timer]
waitdel:
condition:
0 ::InternalDoIf($hash,'ugCorridorLight','STATE') eq "on" and ::EventDoIf('ugCorridorMotionDetector',$hash,'motion: off',1)
1 ::InternalDoIf($hash,'ugCorridorLight','STATE') eq "off" and ::EventDoIf('ugCorridorMotionDetector',$hash,'motion: on',1)
devices:
0 ugCorridorLight ugCorridorMotionDetector
1 ugCorridorLight ugCorridorMotionDetector
all ugCorridorLight ugCorridorMotionDetector
do:
0:
0 set ugCorridorLight off
1:
0 set ugCorridorLight on
2:
helper:
event battery: ok,brightness: 33,cover: closed
globalinit 1
last_timer 0
sleepdevice ugCorridorMotionDetector
sleepsubtimer -1
sleeptimer -1
timerdev ugCorridorMotionDetector
timerevent motion: off
triggerDev ugCorridorMotionDetector
DOIF_eventas:
cmd_nr: 1
cmd: 1
cmd_event: ugCorridorMotionDetector
state: cmd_1
timerevents:
motion: off
motionDuration: 242
noMotion
timereventsState:
motion: off
motionDuration: 242
state: noMotion
triggerEvents:
battery: ok
brightness: 33
cover: closed
triggerEventsState:
battery: ok
brightness: 33
cover: closed
internals:
0 ugCorridorLight:STATE
1 ugCorridorLight:STATE
all ugCorridorLight:STATE
itimer:
readings:
trigger:
all ugCorridorMotionDetector
uiState:
uiTable:
Attributes:
alias UG Corridor Light Watch Dog
disable 0
do always
icon helper_doif
readingList timer
room UG Corridor
setList timer:5,60,120,180,240,300
wait [$SELF:timer]
webCmd timer
webCmdLabel Timer:
Hi,
es gibt viele Möglichkeiten, ich betreibe mein Flurlicht so und das funktioniert super:
defmod di_Flurlicht DOIF ([PIR1:"motion:.on"] and (!isday("REAL")?1:0 or [?PIRWg:brightness] < 130)) (set SW01_Sw01 on)(set SW01_Sw01 off)
attr di_Flurlicht do resetwait
attr di_Flurlicht room Flur
attr di_Flurlicht wait 0,180
Ich habe den Taster und den BM, die Funktion ist genauso wie Du beschreibst. Die Helligkeitssteuerung kannst Du auch weglassen ;D
Gruß Otto
Hallo Otto.
Danke für Deine Antwort.
Ich würde gerne verstehen was Du geschrieben hast ...
- Du nimmst das Ereignis "motion:.on" von PIR1. Hier gleich eine erste Frage: warum verwendest Du in der RegEx einen Punkt (".")? Gibt es Ereignisse, die keine Leerstelle nach "motion:" haben?
- Bei Eintreten der Bedigung führst Du zwei Befehle aus ... (set SW01_Sw01 on) und (set SW01_Sw01 off). Richtig?
- Befehl zwei "(set SW01_Sw01 off)" wird relativ zu Befehl eins um 180 Sekunden verzögert. Richtig?
- "do resetwait" bewirkt, dass der 180 Sekunden Timer zurückgesetzt wird, wenn die Bedigung erneut wahr wird ... eine erneutes Ereignis "motion:.on" also. Richtig?
Gruß, Erich
Ich bin zwar nicht Otto, kann dir aber die Fragen beantworten:
Du liegst mit deinen Vermutungen richtig.
Bei "motion:.on" benutzen viele User den Punkt, weil sie es vom notify her kennen, da geht es nicht anders.
Beim DOIF kann man genauso gut ein Leerzeichen angeben, also "motion: on".
Was man genau angibt, ist dem User überlassen, es sollte etwas sein, was eindeutig den entscheidenden Trigger definiert.
Wichtig ist noch zu wissen, dass beim DOIF die Angabe irgendwo im Event vorkommen kann, will man abfragen,
dass das Event mit motion anfängt, muss man das Regex-Zeichen für den Anfang angeben und das ist ^, also
"^motion: on". Wenn hinter "on" nichts mehr kommen sollte/darf, so kann man durch Angabe des Endzeichens $ angeben: "^motion: on$", hier wird nur auf genau diese Angabe getrigget, es darf nichts davor und nichts danach stehen, damit der Trigger ausgelöst wird. All das steht in der Commandref zu DOIF.
Moin Erich,
1. Hat Damian schon beantwortet :) aber dazu:
Zitatwarum verwendest Du in der RegEx einen Punkt (".")? Gibt es Ereignisse, die keine Leerstelle nach "motion:" haben?
Man kann im regEx (DOIF ist die Ausnahme) kein einfaches Leerzeichen im Suchstring verwenden. Deswegen nimmt man für gewöhnlich einfach den Punkt
2. Ja
3. Ja
4. Ja
8)
Du hast den Code richtig analysiert. Mein Taster schaltet einfach parallel. Aber so war eigentlich auch deine Forderung. Das bewirkt z.B. : Ich kann tagsüber bzw. wenn es hell ist das Licht auch per Taster anmachen und es geht nicht durch das DOIF aus. Nachts bzw. im Dunkeln ist es anders, da würde das DOIF den Taster übersteuern. Aber das ist bei mir so gewollt, bzw. mach ich das Licht im Dunkeln nie per Taster an, das macht immer das DOIF.
Gruß Otto
ZitatMan kann im regEx (DOIF ist die Ausnahme) kein einfaches Leerzeichen im Suchstring verwenden.
Das stimmt so nicht. Natürlich kann man im regEx im Suchstring ein Leerzeichen angaben. Man kann nicht etwas verallgemeinern nur weil ein FHEM-Modul es nicht kann.
Ja Damian, Du hast Recht. :D Ich habe halt regEx durch FHEM kennengelernt. Mittlerweile weiß ich auch da gibt es tausend Ausprägungen. Alles was ich versucht habe darüber zu lesen und zu verstehen, sagte mir immer wieder Leerzeichen ist etwas besonderes :)
Gruß Otto
Zitat von: Erich Fromm am 11 April 2019, 22:51:15
- Licht aus bei Betätigung Taster
- Licht an, wenn Bewegungsmelder Bewegung meldet
Wenn du dein
DOIF dann wie oben geplant fertig hast, kannst du die nächste Stufe zünden: wenn du das Licht ausschaltest (Taster), musst du gaaaanz langsam den Raum verlassen, weil sonst der Bewegungsmelder anschlägt und das Licht wieder anschaltet. Oder du packst ("nächste Stufe") noch einen Timer rein, der das verhindert.
Danke Euch allen.
Hallo zusammen.
Jetzt habe ich mich bereits bedankt und muss leider feststellen, dass es immer noch nicht so tut wie es soll.
Mein DOIF ist jetzt im ,,Kern"
defmod ugCorridorLightWatchDog DOIF ## On on Motion \
([ugCorridorLight] eq "off" and [ugCorridorMotionDetector:"motion: on"])\
(set ugCorridorLight on)(set ugCorridorLight off)\
## Watchdog\
DOELSEIF\
([ugCorridorLight] eq "on")\
(set ugCorridorLight off)
Mit:
attr ugCorridorLightWatchDog do resetwait
attr ugCorridorLightWatchDog icon helper_doif
attr ugCorridorLightWatchDog readingList timer
attr ugCorridorLightWatchDog room UG Corridor
attr ugCorridorLightWatchDog setList timer:5,60,120,180,240,300
attr ugCorridorLightWatchDog wait 0,[$SELF:timer]:[$SELF:timer]
attr ugCorridorLightWatchDog webCmd timer
attr ugCorridorLightWatchDog webCmdLabel Timer:
Den DOELSEIF Teil habe ich ergänzt, um den Fall des direkten Schaltens durch den HM-LC-SW1-FM (ugCorridorLight) abzudecken.
Ziel: weitere Bewegungen von ugCorridorMotionDetector sollen den Timer zurücksetzen - egal ob via ugCorridorLight oder via ugCorridorMotionDetector eingeschaltet.
Problem: das DOIF schaltet genau nach der Timer-Zeit. Weitere Bewegungen werden ignoriert.
Wo ist mein (Denk-) Fehler?
Gruß, Erich
... noch so ein Gedanke.
Ich dachte, ich könnte mir einen Überblick verschaffen über das was hier schief geht. Mein Ansatz war: einen Plot zu erzeugen, der die relevanten Ereignisse der beteiligten Komponenten über die Zeitachse aufträgt.
... wann hat das DOIF welchen Zustand?
... wo steht der DOIF Timer?
... Ereignisse des Bewegungsmelders
Da ich hierbei kläglich gescheitert bin, würde ich gerne wissen ob das überhaupt grundsätzlich denkbar ist? ... und wenn ja, wie?
Was denken die DOIF Profis... Ist dieser Ansatz zielführend bei der Fehlersuche? Welchen Weg geht Ihr, wenn es nicht so funktioniert wie angedacht?
Gruß, Erich
Hier sind Möglichkeiten aufgezeigt die Zustände der Operatoren zu beobachten, https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche und eine weitere hier, https://forum.fhem.de/index.php/topic,99365.msg927748.html#msg927748 und auch hier https://forum.fhem.de/index.php/topic,99203.msg926068.html#msg926068
Zitat von: Erich Fromm am 16 April 2019, 21:28:25Wo ist mein (Denk-) Fehler?
Du prüfst, ob das Licht aus ist. Damit wird cmd1 nicht wieder wahr und resetwait ausgehebelt.
Nimm diese Abfrage lieber aus dem DOIF raus und pack es bei Notwenigkeit als Filter in den cmd-Teil.
Hallo Per.
Danke.
Ich versuche Deinen Hinweis zu verstehen.
Zitat von: Per am 17 April 2019, 13:13:23
Du prüfst, ob das Licht aus ist. Damit wird cmd1 nicht wieder wahr und resetwait ausgehebelt.
Nimm diese Abfrage lieber aus dem DOIF raus und pack es bei Notwenigkeit als Filter in den cmd-Teil.
defmod ugCorridorLightWatchDog DOIF ## On on Motion \
([ugCorridorMotionDetector:"motion: on"])\
(set ugCorridorLight on)(set ugCorridorLight off)\
## Watchdog\
DOELSEIF\
([ugCorridorLight] eq "on")\
(set ugCorridorLight off)
So wäre vermutlich besser, oder?
Springt das DOIF durch cmd1.1
(set ugCorridorLight on) eigentlich automatisch in cmd2, da dieses ja jetzt wahr wird? Oder bleibt das DOIF in der cmd1 Ausführungskette, bis diese abgearbeitet ist?
Grüße, Erich
Danke, Ellert
Zitat von: Ellert am 17 April 2019, 08:40:31
Hier sind Möglichkeiten aufgezeigt die Zustände der Operatoren zu beobachten, https://wiki.fhem.de/wiki/DOIF/Tools_und_Fehlersuche und eine weitere hier, https://forum.fhem.de/index.php/topic,99365.msg927748.html#msg927748 und auch hier https://forum.fhem.de/index.php/topic,99203.msg926068.html#msg926068
Schaue ich mir an.
Grüße, Erich
Zitat von: Erich Fromm am 17 April 2019, 13:45:12Springt das DOIF durch cmd1.1 (set ugCorridorLight on) eigentlich automatisch in cmd2, da dieses ja jetzt wahr wird?
Was ist da der Unterschied zu deiner bisherigen Programmierung? Falls es bisher ging, geht es auch weiterhin.
Hallo Per.
Zitat von: Per am 17 April 2019, 14:27:40
Was ist da der Unterschied zu deiner bisherigen Programmierung? Falls es bisher ging, geht es auch weiterhin.
Meine Frage war nicht durch ,,wie gelingt mein Szenario" getrieben, sondern durch ,,ich würde gerne DOIF verstehen".
... vielleicht dann doch zwei Themen in einem Thread vermischt.
Gruß, Erich
Hallo.
Zitat von: Per am 17 April 2019, 13:13:23
Du prüfst, ob das Licht aus ist. Damit wird cmd1 nicht wieder wahr und resetwait ausgehebelt.
Nimm diese Abfrage lieber aus dem DOIF raus und pack es bei Notwenigkeit als Filter in den cmd-Teil.
Das hier scheint jetzt erstmal zu funktionieren.
defmod ugCorridorLightWatchDog DOIF ## On on Motion \
([ugCorridorMotionDetector:"motion: on"])\
(set ugCorridorLight on)(set ugCorridorLight off)\
## Watchdog\
DOELSEIF\
([ugCorridorLight] eq "on")\
(set ugCorridorLight off)
Eben getestet.
Das
do resetwait schiebt wie gewünscht den Timer bei erneuter Bewegung vorwärts.
2019-04-17_20:36:32 ugCorridorLightWatchDog wait_timer: 17.04.2019 20:41:32 cmd_2 ugCorridorLight
2019-04-17_20:36:41 ugCorridorLightWatchDog wait_timer: no timer
2019-04-17_20:36:41 ugCorridorLightWatchDog cmd_nr: 1
2019-04-17_20:36:41 ugCorridorLightWatchDog cmd_seqnr: 1
2019-04-17_20:36:41 ugCorridorLightWatchDog cmd: 1.1
2019-04-17_20:36:41 ugCorridorLightWatchDog cmd_event: ugCorridorMotionDetector
2019-04-17_20:36:41 ugCorridorLightWatchDog cmd_1_1
2019-04-17_20:36:41 ugCorridorLightWatchDog wait_timer: 17.04.2019 20:41:41 cmd_1_2 ugCorridorMotionDetector
2019-04-17_20:36:42 ugCorridorLightWatchDog wait_timer: no timer
2019-04-17_20:36:42 ugCorridorLightWatchDog wait_timer: 17.04.2019 20:41:42 cmd_2 ugCorridorLight
2019-04-17_20:38:29 ugCorridorLightWatchDog wait_timer: no timer
2019-04-17_20:38:29 ugCorridorLightWatchDog cmd_nr: 1
2019-04-17_20:38:29 ugCorridorLightWatchDog cmd_seqnr: 1
2019-04-17_20:38:29 ugCorridorLightWatchDog cmd: 1.1
2019-04-17_20:38:29 ugCorridorLightWatchDog cmd_event: ugCorridorMotionDetector
2019-04-17_20:38:29 ugCorridorLightWatchDog cmd_1_1
2019-04-17_20:38:29 ugCorridorLightWatchDog wait_timer: 17.04.2019 20:43:29 cmd_1_2 ugCorridorMotionDetector
2019-04-17_20:38:29 ugCorridorLightWatchDog wait_timer: no timer
2019-04-17_20:38:29 ugCorridorLightWatchDog wait_timer: 17.04.2019 20:43:29 cmd_2 ugCorridorLight
2019-04-17_20:39:29 ugCorridorLightWatchDog wait_timer: no timer
2019-04-17_20:39:29 ugCorridorLightWatchDog cmd_nr: 1
2019-04-17_20:39:29 ugCorridorLightWatchDog cmd_seqnr: 1
2019-04-17_20:39:29 ugCorridorLightWatchDog cmd: 1.1
2019-04-17_20:39:29 ugCorridorLightWatchDog cmd_event: ugCorridorMotionDetector
2019-04-17_20:39:29 ugCorridorLightWatchDog cmd_1_1
2019-04-17_20:39:29 ugCorridorLightWatchDog wait_timer: 17.04.2019 20:44:29 cmd_1_2 ugCorridorMotionDetector
2019-04-17_20:39:30 ugCorridorLightWatchDog wait_timer: no timer
2019-04-17_20:39:30 ugCorridorLightWatchDog wait_timer: 17.04.2019 20:44:30 cmd_2 ugCorridorLight
2019-04-17_20:44:30 ugCorridorLightWatchDog wait_timer: no timer
2019-04-17_20:44:30 ugCorridorLightWatchDog cmd_nr: 2
2019-04-17_20:44:30 ugCorridorLightWatchDog cmd: 2
2019-04-17_20:44:30 ugCorridorLightWatchDog cmd_event: ugCorridorLight
2019-04-17_20:44:30 ugCorridorLightWatchDog cmd_2
Danke für den Gedankenanstoß.
Gruß, Erich