[gelöst] Licht + Bewegungsmelder + Taster

Begonnen von Erich Fromm, 11 April 2019, 22:51:15

Vorheriges Thema - Nächstes Thema

Erich Fromm

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:



Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Erich Fromm

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

Damian

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.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

#4
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Per

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.

Erich Fromm


Erich Fromm

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

Erich Fromm

...  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

Ellert

#11

Per

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.

Erich Fromm

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

Erich Fromm