FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Erich Fromm am 11 April 2019, 22:51:15

Titel: [gelöst] Licht + Bewegungsmelder + Taster
Beitrag von: Erich Fromm am 11 April 2019, 22:51:15
Hallo.

Ich würde gerne Folgendes realisieren:
Am Start sind:
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:
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:


Titel: Antw:Licht + Bewegungsmelder + Taster
Beitrag von: Otto123 am 11 April 2019, 23:05:16
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
Titel: Antw:Licht + Bewegungsmelder + Taster
Beitrag von: Erich Fromm am 11 April 2019, 23:56:43
Hallo Otto.

Danke für Deine Antwort.

Ich würde gerne verstehen was Du geschrieben hast ...

Gruß, Erich
Titel: Antw:Licht + Bewegungsmelder + Taster
Beitrag von: Damian am 12 April 2019, 09:03:24
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.

Titel: Antw:Licht + Bewegungsmelder + Taster
Beitrag von: Otto123 am 12 April 2019, 09:13:19
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
Titel: Antw:Licht + Bewegungsmelder + Taster
Beitrag von: Damian am 12 April 2019, 09:53:54
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.
Titel: Antw:Licht + Bewegungsmelder + Taster
Beitrag von: Otto123 am 12 April 2019, 10:12:11
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
Titel: Antw:Licht + Bewegungsmelder + Taster
Beitrag von: Per am 12 April 2019, 13:23:40
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.
Titel: Antw:Licht + Bewegungsmelder + Taster
Beitrag von: Erich Fromm am 12 April 2019, 14:54:01
Danke Euch allen.
Titel: Antw: Licht + Bewegungsmelder + Taster
Beitrag von: Erich Fromm am 16 April 2019, 21:28:25
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
Titel: Antw:Licht + Bewegungsmelder + Taster
Beitrag von: Erich Fromm am 16 April 2019, 21:39:23
...  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
Titel: Antw:Licht + Bewegungsmelder + Taster
Beitrag 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
Titel: Antw: Licht + Bewegungsmelder + Taster
Beitrag von: Per am 17 April 2019, 13:13:23
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.
Titel: Antw: Licht + Bewegungsmelder + Taster
Beitrag von: Erich Fromm am 17 April 2019, 13:45:12
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
Titel: Antw:Licht + Bewegungsmelder + Taster
Beitrag von: Erich Fromm am 17 April 2019, 13:45:56
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
Titel: Antw: Licht + Bewegungsmelder + Taster
Beitrag von: Per am 17 April 2019, 14:27:40
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.
Titel: Antw: Licht + Bewegungsmelder + Taster
Beitrag von: Erich Fromm am 17 April 2019, 21:11:33
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
Titel: Antw: Licht + Bewegungsmelder + Taster
Beitrag von: Erich Fromm am 17 April 2019, 21:19:01
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