FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: BrandonQuest am 24 Februar 2019, 14:38:16

Titel: DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 24 Februar 2019, 14:38:16
Hallo,

Mein Problem (über dessen Abwandlungen ich hier im Forum beim Durchstöbern gestolpert bin, allerdings ohne abschließende Klärung)
wird aus einer sehr simplen Grundfunktion heraus generiert:

Ein DOIF soll beim Eintreten diverser Ereignisse einem Lichtschalter das Kommando "off" senden
(mit einer Verzögerung von 5 Sekunden, falls sich einer der Parameter zwischenzeitlich doch noch ändert).

Das funktioniert soweit.
Zu den Ereignissen gehört auch die Abfrage ob das Licht schon/noch an ist - z.B. für den Fall, dass das Licht einfach manuell eingeschaltet wird.

Und an diesem isolierten Ereignis scheitere ich.
Ereigniskette: Schalte ich das Licht manuell ein und das DOIF war im cmd_2, so springt es nach 5 Sekunden in cmd_1 und schaltet das Licht aus.

Leider springt es jedoch danach nicht wieder in den Ausgangszustand cmd_2 zurück.

Erst, wenn ich das Licht wieder einschalte und manuell wieder ausschalte, springt das DOIF bei diesem manuellen Ausschaltvorgang in cmd_2
und ist wieder bereit in meinem Sinne zu wirken.

Es ist also ein doppelter Statuswechsel notwendig.

Ich dachte nun, dass das DOIF vielleicht nicht auf das selbst ausgelöste "off" anspringt um auf cmd_2 zu wechseln, daher habe ich es auch mal mit dem Attribut
selftrigger all probiert. Auch das half nicht.

Auch das Spielen mit einem Timerreset hat nicht geholfen.

Ich kann mich leider immer nur am Wochenende für wenige Stunden mit dem Thema beschäftigen und dieses Problem fesselt mich jetzt schon seit dem letzten Wochenende.

Es muss einerseits recht simpel sein, auf der anderen Seite ist das DOIF-Modul sehr Umfangreich, weshalb man als Anfänger schon recht schnell den Wald vor lauter Bäumen nicht sieht.

Hier die Raw-Definition des DOIF


defmod doif_BDZ_DeckenLicht_off DOIF ([BDZ_DeckenlichtSonoff:"on"]) (set BDZ_DeckenlichtSonoff off)
attr doif_BDZ_DeckenLicht_off checkReadingEvent 0
attr doif_BDZ_DeckenLicht_off checkall all
attr doif_BDZ_DeckenLicht_off selftrigger all
attr doif_BDZ_DeckenLicht_off wait 5

setstate doif_BDZ_DeckenLicht_off cmd_1
setstate doif_BDZ_DeckenLicht_off 2019-02-24 14:20:27 Device BDZ_DeckenlichtSonoff
setstate doif_BDZ_DeckenLicht_off 2019-02-24 14:19:03 cmd 1
setstate doif_BDZ_DeckenLicht_off 2019-02-24 14:19:03 cmd_event BDZ_DeckenlichtSonoff
setstate doif_BDZ_DeckenLicht_off 2019-02-24 14:19:03 cmd_nr 1
setstate doif_BDZ_DeckenLicht_off 2019-02-24 14:20:27 e_BDZ_DeckenlichtSonoff_events on
setstate doif_BDZ_DeckenLicht_off 2019-02-24 13:39:04 mode enabled
setstate doif_BDZ_DeckenLicht_off 2019-02-24 14:19:03 state cmd_1
setstate doif_BDZ_DeckenLicht_off 2019-02-24 14:19:03 wait_timer no timer


Ich wäre dankbar für einen Hinweis, der mich weiter bringt.

Hier nochmal die Internals NACHDEM das Licht automatisch vom DOIF ausgeschaltet worden ist (inzwischen habe ich es in dieser Darstellung mit einer Zustandsabfrage des Schalters probiert, was auch nichts ändert):


Internals:
   DEF        ([BDZ_DeckenlichtSonoff:state] eq "ON") (set BDZ_DeckenlichtSonoff off) DOELSE
   MODEL      FHEM
   NAME       doif_BDZ_DeckenLicht_off
   NR         91
   NTFY_ORDER 50-doif_BDZ_DeckenLicht_off
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2019-02-24 15:52:32   Device          BDZ_DeckenlichtSonoff
     2019-02-24 15:52:32   cmd             1
     2019-02-24 15:52:32   cmd_event       BDZ_DeckenlichtSonoff
     2019-02-24 15:52:32   cmd_nr          1
     2019-02-24 15:52:32   e_BDZ_DeckenlichtSonoff_state OFF
     2019-02-24 15:43:13   mode            enabled
     2019-02-24 15:52:32   state           cmd_1
     2019-02-24 15:52:32   wait_timer      no timer
   Regex:
   attr:
     cmdState:
     wait:
       0:
         5
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'BDZ_DeckenlichtSonoff','state') eq "ON"
   devices:
     0           BDZ_DeckenlichtSonoff
     all         BDZ_DeckenlichtSonoff
   do:
     0:
       0          set BDZ_DeckenlichtSonoff off
     1:
       0         
   helper:
     event      off
     globalinit 1
     last_timer 0
     sleepdevice BDZ_DeckenlichtSonoff
     sleepsubtimer -1
     sleeptimer -1
     timerdev   BDZ_DeckenlichtSonoff
     timerevent off
     triggerDev BDZ_DeckenlichtSonoff
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: BDZ_DeckenlichtSonoff
       state: cmd_1
     timerevents:
       off
     timereventsState:
       state: OFF
     triggerEvents:
       off
     triggerEventsState:
       state: OFF
   internals:
   itimer:
   readings:
     0           BDZ_DeckenlichtSonoff:state
     all         BDZ_DeckenlichtSonoff:state
   trigger:
   uiState:
   uiTable:
Attributes:
   checkReadingEvent 0
   checkall   all
   comment    Einschalten,
wenn Lux an der Tür < 40 ist
UND die sperre nicht aktiv ist
UND (der Sensor an der Tür oder der Sensor am Fenster Signal gibt oder die Tür geöffnet wird.)
   room       50_Badezimmer
   selftrigger all
   wait       5



Und hier, wenn ich dann manuell das erste Mal nach dem Ausschalten mittels DOIF das Licht einschalte und das DOIF nicht reagiert:

Internals:
   DEF        ([BDZ_DeckenlichtSonoff:state] eq "ON") (set BDZ_DeckenlichtSonoff off) DOELSE
   MODEL      FHEM
   NAME       doif_BDZ_DeckenLicht_off
   NR         91
   NTFY_ORDER 50-doif_BDZ_DeckenLicht_off
   STATE      cmd_1
   TYPE       DOIF
   READINGS:
     2019-02-24 15:53:08   Device          BDZ_DeckenlichtSonoff
     2019-02-24 15:52:32   cmd             1
     2019-02-24 15:52:32   cmd_event       BDZ_DeckenlichtSonoff
     2019-02-24 15:52:32   cmd_nr          1
     2019-02-24 15:53:08   e_BDZ_DeckenlichtSonoff_state ON
     2019-02-24 15:43:13   mode            enabled
     2019-02-24 15:52:32   state           cmd_1
     2019-02-24 15:52:32   wait_timer      no timer
   Regex:
   attr:
     cmdState:
     wait:
       0:
         5
     waitdel:
   condition:
     0          ::ReadingValDoIf($hash,'BDZ_DeckenlichtSonoff','state') eq "ON"
   devices:
     0           BDZ_DeckenlichtSonoff
     all         BDZ_DeckenlichtSonoff
   do:
     0:
       0          set BDZ_DeckenlichtSonoff off
     1:
       0         
   helper:
     event      on
     globalinit 1
     last_timer 0
     sleepdevice BDZ_DeckenlichtSonoff
     sleepsubtimer -1
     sleeptimer -1
     timerdev   BDZ_DeckenlichtSonoff
     timerevent on
     triggerDev BDZ_DeckenlichtSonoff
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: BDZ_DeckenlichtSonoff
       state: cmd_1
     timerevents:
       on
     timereventsState:
       state: ON
     triggerEvents:
       on
     triggerEventsState:
       state: ON
   internals:
   itimer:
   readings:
     0           BDZ_DeckenlichtSonoff:state
     all         BDZ_DeckenlichtSonoff:state
   trigger:
   uiState:
   uiTable:
Attributes:
   checkReadingEvent 0
   checkall   all
   comment    Einschalten,
wenn Lux an der Tür < 40 ist
UND die sperre nicht aktiv ist
UND (der Sensor an der Tür oder der Sensor am Fenster Signal gibt oder die Tür geöffnet wird.)
   room       50_Badezimmer
   selftrigger all
   wait       5




Grüße
Brandon
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: Damian am 24 Februar 2019, 16:49:54
Probiere mal:

defmod doif_BDZ_DeckenLicht_off DOIF ([BDZ_DeckenlichtSonoff:"on"]) (set BDZ_DeckenlichtSonoff off)
attr doif_BDZ_DeckenLicht_off wait 5
attr doif_BDZ_DeckenLicht_off do always

Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: Ellert am 24 Februar 2019, 17:09:16
ZitatMein Problem (über dessen Abwandlungen ich hier im Forum beim Durchstöbern gestolpert bin, allerdings ohne abschließende Klärung)
wird aus einer sehr simplen Grundfunktion heraus generiert
Es wäre ganz nett, wenn Du uns nicht verheimlichst auf welchen Thread Du Dich beziehst.
Da nicht davon auszugehen ist, dass jeder die Events von Sonoff kennt wäre es gut, alle Events die im Zusammenhang mit den von Dir genannten Aktionen (manuell, automatisch ein/aus) stehen, postest.
Ich würde für jede Aktion einen DOIF/DOELSEIF Zweig anlegen mit einer genau zutreffenden Bedingung, vereinfachen kann man wenn'funktioniert immer noch.

[BDZ_DeckenlichtSonoff:"on"] hier triggert jedes Ereignis von BDZ_DeckenlichtSonoff, das on enthält, sofern zwischendurch ein Event von BDZ_DeckenlichtSonoff, das kein "on" enthält, aber davon bist Du sicherlich aus gegengen.

Mir stellt sich die Frage, warum Du checkReadingEvent auf 0 gesetzt hast, Du hast keine Readings angegebnen. Ebenso checkall, es gibt nur einen Zweig.
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 24 Februar 2019, 18:53:59
@Damian:

vielen, lieben Dank - es hat funktioniert. Ich verstehe zwar nicht, weshalb es vorher nicht ging (denn das do always hatte ich als erstes ausprobiert).

@Ellert: Meine Frage gestaltete sich schon als recht lang und ich wollte keine zusätzlichen, potentiell unnötigen Infos liefern, die nur vom Lesen abschrecken.

Ich schließe aus der richtigen Lösung von Damian, dass alle Infos vorhanden gewesen sind.

1.: "...Es wäre ganz nett, wenn Du uns nicht verheimlichst auf welchen Thread Du Dich beziehst...."
ok:  https://forum.fhem.de/index.php/topic,97050.0.html

2.: "...Da nicht davon auszugehen ist, dass jeder die Events von Sonoff kennt wäre es gut,..."
die Events liefern, wie aus meinem Eingangsposting hervorgeht, ON/OFF bzw. on/off, beides ist gemapped.
Da ich geschrieben hatte, dass ein wiederholtes Auslösen des Ereignisses die Schleife wieder aktiviert, war der Fehler ja nicht hier zu suchen.

3.: "...Ich würde für jede Aktion einen DOIF/DOELSEIF Zweig anlegen ..."
Das Problem war ja, dass dieses eine DOIF, zuständig nur für's Auschalten, "hängen" geblieben ist.
Eine weitere, identische Schleife, hätte das Problem ja nur "kopiert" - denn rudimentärer als mein DOIF geht ausschalten unter meinen Bedinungen ja nicht.

4.: ...Mir stellt sich die Frage, warum Du checkReadingEvent auf 0 gesetzt hast,..."
Im Wiki zum DOIF steht:
"...Soll das Modul, wie bei Statusangaben der Art [<Device>], auf alle Ereignisse des Devices reagieren, so muss das Attribut auf Null gesetzt werden...."
und
"...Für DOIF-Versionen nach 16651 2018-04-23 06:28:53Z Damian ist das Attribut checkReadingEvent intern per default auf 1 gesetzt.
Wenn eine Definition aus diesem Grund ein unerwartetes Verhalten zeigt, sollte dort das Attribut checkReadingEvent auf 0 gesetzt werden..."

WAS ein unerwartetes Verhalten ist, wird nicht weiter erläutert - daher darfst Du davon ausgehen, dass ein Neuling wie ich vor dem Posten
hier jeden Strohhalm ergreift, den er finden kann - also auch dieses Attribut mal auszuprobieren.

Ursprünglich ist meine Definition so nackt gewesen, wie sie Damian hier vorgeschlagen hat -
die anderen Attribute sind aus Versuchen erwachsen etwas an der Verhalten des DOIFs zum Besseren zu ändern.
Allerdings hatte keines der Attribute auf mein Szenario eine Auswirkung.

Wahrscheinlich hatte sich an anderer Ecke von FHEM was verschluckt gehabt, während ich "do always" ausprobiert hatte, danach habe ich es von meiner Liste gestrichen.

Vielen Dank auch Dir für Dein Interesse an dem Problem.

Einen schönen Abend an alle noch!

Brandon


Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 24 Februar 2019, 19:31:52
@Damian,

ich glaube, mir schwant, weshalb ich da do always anfangs verworfen hatte:

Eine der Bedingungen ist nicht erfüllt: "...mit einer Verzögerung von 5 Sekunden, falls sich einer der Parameter zwischenzeitlich doch noch ändert)..."
Es hängt z.B. ein Bewegungsmelder mit dran.

Das "do" sorgt nun dafür, dass der Timer bei ändern der Trigger-Bedingungen (z.B. ein Erneutes Auslösen des Bewegungsmelders während des Timers) der Timer erst abläuft,
das Licht ausschaltet und dann erst wieder aktiviert.

Daher hatte ich das "do" nicht reingenommen und aber weiterhin keine Lösung für die "einfache" Aufgabenstellung des Timers gefunden.

Wenn weitere Infos gefordert werden: gerne.
Ich will nur nicht alle Sensoren und Schalter hier posten, da das eigentliche Problem mir nur das DOIF zu sein scheint und
ein simuliertes Schalten aller Zustände mit einfachen Sets auf "on" und "offs" die anderen Komponenten entlastet.

Grüße
Brandon
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: Damian am 24 Februar 2019, 19:54:23
Beim Bewegungsmelder musst du mit do resetwait arbeiten, damit der Timer verlängert werden kann, siehe: https://fhem.de/commandref_DE.html#DOIF_Weitere_Anwendungsbeispiele (on-for-timer Nachbildung)
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 24 Februar 2019, 20:20:25
Das do resetwait hatte genau das gleiche Verhalten zur Folge wie das do always:
nach Aktivierung des Timers durch ,,nomotion" des Bewegungsmelders u d zwischenzeitlichem
,,motion" geht das Licht erst aus bevor es wieder angeht.

Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: Ellert am 24 Februar 2019, 20:42:17
Zitat von: BrandonQuest am 24 Februar 2019, 18:53:59
@Ellert: Meine Frage gestaltete sich schon als recht lang und ich wollte keine zusätzlichen, potentiell unnötigen Infos liefern, die nur vom Lesen abschrecken.
Es ist in der Tat ein recht langer Text im ersten Post für die Frage: "Wie  löse ich zeitverzögert wiederholt einen Befehl durch ein Ereignis aus?".  Ich hatte mehr vermutet.

Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 24 Februar 2019, 21:01:43
Die Problemstellung ist ja schon ein wenig komplexer,
denn den Kern Deiner zusammengefassten ,,Frage" habe ich ja umgesetzt.

Es liegt halt in der Natur der Ausgangssituation eines Problems,
dass man unter Umständen nicht weiß, wie man es korrekt und vollständig umschreibt,
da mit diesem Vermögen bereits das Wissen um die Lösung einherginge :-)
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 25 Februar 2019, 16:57:59
Hallo nochmal - dann möchte ich mal das Rätsel lösen:

was jetzt schlussendlich die gewünschten und vor allem reproduzierbare Ergebnisse liefert, war das Setzen eines DOELSE am Ende.
Und ich muss es nicht mal weiter ausführen, es langt einfach nur ans Ende der Definitions-Zeile DOELSE zu schreiben und das komplette DOIF reagiert endlich so, wie es alle Attribute erwarten lassen.

Für den Einen mag es logisch erscheinen, mich brachte es an den Rand des Wahnsinns und so offensichtlich es wohl auch nicht für alle gewesen.

Vielleicht hilft es dem Einen oder Anderen Anfänger aus der Klemme.

Danke und Grüße
Brandon.
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 02 März 2019, 21:29:37
Moin,

ich bin drauf und dran den Kram in einem Karton zu packen und in die Tonne zu werfen - tage für Nichts und wieder Nichts....

Meine DOIFs funktionieren einfach nicht zuverlässig und ich habe keine Ahnung, wie ich dem auf die Spur kommen soll.

Ich habe nun jeweils ein DOIF um das Licht einzuschalten und ein DOIF, welches für das Ausschalten zuständig ist.
Als Auslöser habe ich Events, die mit Zuständen verknüpft sind.

Leider funktioniert mal das Einschalten und mal das Ausschalten nicht zuverlässig, nicht reproduzierbar.
Es kann auch mal sein, dass das Einschalten 10x hintereinander funktioniert und dann das DOIF wieder hängen bleibt und im schlimmsten Fall per Hand zurückgesetzt werden muss.

Jemand ein Idee, was hier zu Kollisionen führen könnte?

Mal als Text zum Code das Einschalten:

Wenn zumindest der Bewegungsmelder an der Tuer Bewegung meldet
ODER der Bewegungsmelder am Fenster meldet Bewegung
ODER die Tür wird geöffnet

UND weder das Deckenlicht noch der Spiegelschrank an sind
UND die Helligkeit unter 20 Lux betraegt
UND Wenn die Automatiksperre deaktiviert ist

dann schalte das Deckenlicht ein


Internals:
   DEF        (
(["BDZ_MotionTuer:motion"] or ["BDZ_MotionFenster:motion"] or ["BDZ_Tuer:open"])
and
[?BDZ_DeckenlichtSonoff] eq "off"
and [?BDZ_SpiegelschrankSonoff] eq "off"
and [?BDZ_LuxTuer:lux] <20
and AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0
)
(set BDZ_DeckenlichtSonoff on) DOELSE
   FUUID      5c74116f-f33f-d24e-a42a-9b2831ed21539d6a
   MODEL      FHEM
   NAME       doif_BDZ_DeckenLicht_on
   NR         87
   NTFY_ORDER 50-doif_BDZ_DeckenLicht_on
   STATE      cmd_2
   TYPE       DOIF
   VERSION    18706 2019-02-23 21:48:22
   READINGS:
     2019-03-02 21:00:20   Device          BDZ_MotionFenster
     2019-03-02 21:00:20   cmd             2
     2019-03-02 21:00:20   cmd_event       BDZ_MotionFenster
     2019-03-02 21:00:20   cmd_nr          2
     2019-03-02 19:47:07   e_BDZ_DeckenlichtSonoff_STATE on
     2019-03-02 19:47:07   e_BDZ_DeckenlichtSonoff_events on
     2019-03-02 19:48:01   e_BDZ_MotionFenster_STATE nomotion
     2019-03-02 19:48:01   e_BDZ_MotionFenster_events nomotion
     2019-03-02 19:47:58   e_BDZ_MotionTuer_STATE nomotion
     2019-03-02 19:47:58   e_BDZ_MotionTuer_events nomotion
     2019-03-02 19:48:07   e_BDZ_SpiegelschrankSonoff_STATE on
     2019-03-02 19:48:07   e_BDZ_SpiegelschrankSonoff_events on
     2019-03-02 19:54:48   mode            enabled
     2019-03-02 21:00:20   state           cmd_2
   Regex:
     accu:
     cond:
       :
         0:
           "BDZ_MotionFenster:motion" BDZ_MotionFenster:motion
           "BDZ_Tuer:open" BDZ_Tuer:open
   attr:
     cmdState:
     wait:
     waitdel:
   condition:
     0            (::EventDoIf('BDZ_MotionFenster',$hash,'motion',0) or ::EventDoIf('BDZ_Tuer',$hash,'open',0))  and  ::InternalDoIf($hash,'BDZ_DeckenlichtSonoff','STATE') eq "off"  and ::InternalDoIf($hash,'BDZ_SpiegelschrankSonoff','STATE') eq "off"  and ::ReadingValDoIf($hash,'BDZ_LuxTuer','lux') <20  and AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0
   devices:
   do:
     0:
       0          set BDZ_DeckenlichtSonoff on
     1:
       0         
   helper:
     event      nomotion
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   BDZ_MotionFenster
     timerevent nomotion
     triggerDev BDZ_MotionFenster
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: BDZ_MotionFenster
       state: cmd_2
     timerevents:
       nomotion
     timereventsState:
       state: nomotion
     triggerEvents:
       nomotion
     triggerEventsState:
       state: nomotion
   internals:
     0           BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
     all         BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
   itimer:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   alias      Deckenlicht AN
   devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1
   do         always
   group      A) Logik Beleuchtungssteuerung
   icon       helper_doif
   room       50_Badezimmer


Als Text zum Code das Ausschalten:

Wenn die Bewegungsmelder an der Tuer und am Fenster keine Bewegung melden
und zumindest Deckenlicht oder Spiegelschrank an sind
und die Automatiksperre deaktiviert ist

dann das Ausschaltsignal an Deckenbeleuchtung und Spiegelschrank schicken.


Internals:
   DEF        (
(
([BDZ_MotionTuer:"nomotion"] and [?BDZ_MotionFenster] eq "nomotion")
or
([BDZ_MotionFenster:"nomotion"] and [?BDZ_MotionTuer] eq "nomotion")
or
([BDZ_SpiegelschrankSonoff:"on"] and [?BDZ_MotionTuer] eq "nomotion" and [?BDZ_MotionFenster] eq "nomotion")
or
([BDZ_DeckenlichtSonoff:"on"] and [?BDZ_MotionTuer] eq "nomotion" and [?BDZ_MotionFenster] eq "nomotion")
)
and
([?BDZ_DeckenlichtSonoff] eq "on" or [?BDZ_SpiegelschrankSonoff] eq "on")
and
AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0
)
(set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off) DOELSE
   FUUID      5c74116f-f33f-d24e-34a0-49a85c6c1759028d
   MODEL      FHEM
   NAME       doif_BDZ_DeckenLicht_off
   NR         88
   NTFY_ORDER 50-doif_BDZ_DeckenLicht_off
   STATE      cmd_2
   TYPE       DOIF
   VERSION    18706 2019-02-23 21:48:22
   READINGS:
     2019-03-02 20:40:24   Device          BDZ_MotionTuer
     2019-03-02 20:40:24   cmd             2
     2019-03-02 20:40:24   cmd_event       BDZ_MotionTuer
     2019-03-02 20:40:24   cmd_nr          2
     2019-03-02 20:35:24   e_BDZ_DeckenlichtSonoff_STATE on
     2019-03-02 20:35:24   e_BDZ_DeckenlichtSonoff_events on
     2019-03-02 20:40:23   e_BDZ_MotionFenster_STATE nomotion
     2019-03-02 20:40:23   e_BDZ_MotionFenster_events nomotion
     2019-03-02 20:40:24   e_BDZ_MotionTuer_STATE nomotion
     2019-03-02 20:40:24   e_BDZ_MotionTuer_events nomotion
     2019-03-02 19:48:07   e_BDZ_SpiegelschrankSonoff_STATE on
     2019-03-02 19:48:07   e_BDZ_SpiegelschrankSonoff_events on
     2019-03-02 19:46:09   mode            enabled
     2019-03-02 20:40:24   state           cmd_2
     2019-03-02 20:36:25   wait_timer      no timer
   Regex:
     accu:
   attr:
     cmdState:
     wait:
       0:
         60
     waitdel:
   condition:
     0            ( (::EventDoIf('BDZ_MotionTuer',$hash,'nomotion',1) and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") or (::EventDoIf('BDZ_MotionFenster',$hash,'nomotion',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion") or (::EventDoIf('BDZ_SpiegelschrankSonoff',$hash,'on',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion" and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") or (::EventDoIf('BDZ_DeckenlichtSonoff',$hash,'on',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion" and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") ) and (::InternalDoIf($hash,'BDZ_DeckenlichtSonoff','STATE') eq "on" or ::InternalDoIf($hash,'BDZ_SpiegelschrankSonoff','STATE') eq "on") and AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0 
   devices:
     0           BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
     all         BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
   do:
     0:
       0          set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off
     1:
       0         
   helper:
     event      nomotion
     globalinit 1
     last_timer 0
     sleepdevice BDZ_MotionTuer
     sleepsubtimer -1
     sleeptimer -1
     timerdev   BDZ_MotionTuer
     timerevent nomotion
     triggerDev BDZ_MotionTuer
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: BDZ_MotionTuer
       state: cmd_2
     timerevents:
       nomotion
     timereventsState:
       state: nomotion
     triggerEvents:
       nomotion
     triggerEventsState:
       state: nomotion
   internals:
     0           BDZ_MotionFenster:STATE BDZ_MotionTuer:STATE BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
     all         BDZ_MotionFenster:STATE BDZ_MotionTuer:STATE BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
   itimer:
   readings:
   trigger:
     all         BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
   uiState:
   uiTable:
Attributes:
   alias      Deckenlicht AUS
   devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1
   do         resetwait
   group      A) Logik Beleuchtungssteuerung
   icon       helper_doif
   room       50_Badezimmer
   wait       60


Die Events sind on/off, motion/nomotion und open für die Tür.
Als Bewegungsmelder habe ich Philips Hue Motion über deCONZ eingebunden.

Die Status werden auch alle entsprechend angezeigt, kann man man während der (Fehl)-funktionen auch an den Icons ablesen (s. Anhang, der Zustand "AUS" der State-Icons der DOIFs  steht für cmd_2, "AN" wäre cmd_1).

Und wie ich grad beobachten darf, passiert genau auf die Sekunde genau alle 10 Minuten das hier:
Das Licht geht einfach an.
Im Eventmonitor sieht das dann so aus:


2019-03-02 21:15:18 DOIF doif_BDZ_DeckenLicht_off cmd_nr: 2
2019-03-02 21:15:18 DOIF doif_BDZ_DeckenLicht_off cmd: 2
2019-03-02 21:15:18 DOIF doif_BDZ_DeckenLicht_off cmd_event: BDZ_MotionFenster
2019-03-02 21:15:18 DOIF doif_BDZ_DeckenLicht_off cmd_2
2019-03-02 21:15:18 DOIF doif_BDZ_DeckenLicht_off wait_timer: 02.03.2019 21:16:18 cmd_1 BDZ_DeckenlichtSonoff
2019-03-02 21:15:18 MQTT_DEVICE BDZ_DeckenlichtSonoff on
2019-03-02 21:15:18 DOIF doif_BDZ_DeckenLicht_on cmd_nr: 1
2019-03-02 21:15:18 DOIF doif_BDZ_DeckenLicht_on cmd: 1
2019-03-02 21:15:18 DOIF doif_BDZ_DeckenLicht_on cmd_event: BDZ_MotionFenster
2019-03-02 21:15:18 DOIF doif_BDZ_DeckenLicht_on cmd_1
2019-03-02 21:15:18 HUEDevice BDZ_MotionFenster nomotion
2019-03-02 21:15:19 HUEDevice BDZ_LuxFenster lightlevel: 0
2019-03-02 21:15:19 HUEDevice BDZ_LuxFenster dark: 1
2019-03-02 21:15:19 HUEDevice BDZ_LuxFenster lux: 0
2019-03-02 21:15:19 HUEDevice BDZ_LuxFenster daylight: 0
2019-03-02 21:15:20 DOIF doif_BDZ_DeckenLicht_off wait_timer: no timer
2019-03-02 21:15:20 DOIF doif_BDZ_DeckenLicht_off wait_timer: 02.03.2019 21:16:20 cmd_1 BDZ_MotionTuer
2019-03-02 21:15:20 HUEDevice BDZ_MotionTuer nomotion
2019-03-02 21:15:20 HUEDevice BDZ_LuxTuer daylight: 0
2019-03-02 21:15:20 HUEDevice BDZ_LuxTuer lux: 33
2019-03-02 21:15:20 HUEDevice BDZ_LuxTuer dark: 0
2019-03-02 21:15:20 HUEDevice BDZ_LuxTuer lightlevel: 15151
2019-03-02 21:15:50 MQTT Mosquitto connection: active
2019.03.02 21:15:50 3 : deCONZ: websocket opened to 192.168.163.99:443
2019.03.02 21:15:50 3 : deCONZ: websocket: Switching Protocols ok
2019-03-02 21:15:57 HUEDevice BDZ_TempTuer temperature: 24.18
2019-03-02 21:16:20 DOIF doif_BDZ_DeckenLicht_off wait_timer: no timer
2019-03-02 21:16:20 MQTT_DEVICE BDZ_DeckenlichtSonoff off
2019-03-02 21:16:20 DOIF doif_BDZ_DeckenLicht_off cmd_nr: 1
2019-03-02 21:16:20 DOIF doif_BDZ_DeckenLicht_off cmd: 1
2019-03-02 21:16:20 DOIF doif_BDZ_DeckenLicht_off cmd_event: BDZ_MotionTuer
2019-03-02 21:16:20 DOIF doif_BDZ_DeckenLicht_off cmd_1


  :-\

Grüße
ein sehr verzweifelter Brandon


Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: Damian am 02 März 2019, 22:11:23
Als erstes würde ich im Device global das Attribut mseclog auf 1 setzen. Damit kannst du genauer erkennen welche Events zusammen gehören und damit überhaupt erst erkennen, was die Ursache und was die Auswirkung ist, wenn alles scheinbar in einer Sekunde stattfindet.

Ich bin mir sicher, dass man das Problem dann eindeutig identifizieren kann, bisher konnte man immer eine Ursache finden - meistens liegt das Problem außerhalb des Moduls  :)
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: amenomade am 02 März 2019, 22:18:48
1. Warum testest Du ob die Lichter an sind, bevor du die ausschaltest? Das kannst Du m.A. dir sparen, und ausschalten, egal ob an oder aus oder? Das gleiche für anschalten

2. Warum ([BDZ_SpiegelschrankSonoff:"on"] and [?BDZ_MotionTuer] eq "nomotion" and [?BDZ_MotionFenster] eq "nomotion")? Wenn SpiegelschrankSonoff ein Event "on" bekommt, willst Du wirklich ausschalten?

3. Kann man nicht ([BDZ_MotionTuer:"nomotion"] and [?BDZ_MotionFenster] eq "nomotion")
or
([BDZ_MotionFenster:"nomotion"] and [?BDZ_MotionTuer] eq "nomotion")
einfach so schreiben? ([BDZ_MotionTuer] eq "nomotion"] and [BDZ_MotionFenster] eq "nomotion")?

4.
ZitatDas Licht geht einfach an.
Das sehe ich nicht in den Events
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: Damian am 02 März 2019, 22:19:05
Die Lösung kann ich dir aber schon vorab sagen:

["BDZ_MotionFenster:motion"]  beinhaltet auch das Wort nomotion. Zur genauen Eingrenzung schau mal hier nach: https://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 02 März 2019, 23:11:12
@Damian
MSECLOG werde ich aktivieren und schauen.
Zu ["BDZ_MotionFenster:motion"]:
Ich hatte vorher [BDZ_MotionFenster:"motion"], wäre das,
was Du meinst?
Hatte mal wieder gehofft, nachdem die zufälligen Fehler danach weg
waren, dass mit dieser flexiblen Definition das Problem beseitigt wäre.
Aber in der Tat, das ,,No"Motion hätte ich vollkommen übersehen.

Ich werde es morgen ausprobieren.

@amenomade: viele Fragen :-)
1.  es ist dem Komfort geschuldet:
Szenario 1: Du hast MANUELL das Licht außen nach Deinem Wunsch eingeschaltet
, weil Du bewusst eine Konstellation bevorzugst, die die Bewegungsmelder/Automatik nicht
riechen können und betrittst das Bad - jetzt erkennt der Bewgungsmelder Dein Eintreten
und wirft alles über den Haufen, weil die Automatik aktiv wird.

Daher checke ich vorher, ob denn schon Licht eingeschaltet worden ist, bevor die
Bewegungsmelder reagiert haben, dann soll halt nichts eingeschaltet werden,
der Beleuchtungszustand ist ja schon wunschgemäß.

Beim Ausschalten war meine Intention ähnlich:
es muss erfasst werden ob Licht an ist, weil manuell geschaltet.
Ich kann natürlich sagen, schalte alles aus - aber wodurch getriggert?
Durch die Bewegungsmelder - ok.

Was aber, wenn das Licht mal wieder manuell von außen
eingeschaltet worden ist ohne dann doch den Raum zu betreten
bzw. die Bewegungsmelder auszulösen
(so unwahrscheinlich wie es ist: ausgeschlossen ist es nicht, und
wenn Logik alles anfangen kann, soll sie das gerne).

Dann fehlt der trigger.
Der wird hier durch die Abfrage des Lichts geschaffen.

Das ist dann auch die Antwort zu
2. : ja, ich will das Licht wieder ausschalten (innerhalb des 60s Timers)
wenn die Bewegungsmelder im Status nomotion verbleiben, nachdem Licht
getriggert hat.

Zu 3.:
Nein, glaube ich nicht, weil jeder der beiden Sensoren als Trigger-Quelle
dienen kann/muss, während der andere schon oder noch aus ist.

Daher beide Kombinationen.
Wenn beide eq nomotion sind, wer hat dann den Trigger ausgelöst?

Zu 4: da steht um 21:15:18 dass das MQTT-Device Deckenlicht ein in-Kommando bekommt.
(Sorry, dass ich das nicht kopiert bekomme, aber ich breche mir grad auf dem Smartphone
einen ab und erspare mir das).

Feedback gibt es morgen.

Danke und Grüße
Brandon
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: Damian am 02 März 2019, 23:23:54
["BDZ_MotionFenster:^motion$"]  Du hättest dir die Beispiele zum Link genauer anschauen sollen
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 03 März 2019, 00:02:15
Hi Damian,

Das hatte ich, ich hatte es nur so verstanden, dass beim Setzen ["device:reading"]
komplett in Anführungsstriche mit regulären Ausdrücken gearbeitet werden soll,
setze ich nur das Reading oder den gewünschten State in Anführungsstriche,
n [device:"reading"]könnte ich auch ohne reguläre Ausdrücke das exakte Ergbnis angeben.

Dem ist also nicht so? Ich muss immer mit regulären Ausdrücken arbeiten?
Das gilt dann ausnahmslos für alle Angaben, die ich in meinen DOIFs gemacht habe,
ob in Anführungstrichen oder nicht ob als Zustand oder Event?

Dann bin ich in der Tat recht baff.
Und ich habe mir extra aus der Command-Ref und dem Einsteiger-Leitfaden für DOIF
alles in einem Dokument mit meinen Worten zusammengefasst!
Leichtfertigkeit möchte ich hier nicht suggerieren!

Grüße
Brandon



Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: amenomade am 03 März 2019, 00:10:38
Obwohl Damian dir schon den guten Rat gegeben hat, trotzdem zurück zu den Fragen:

Zu 1: ok, ich verstehe für "on". Aber nicht für "off". Du testest, ob ein oder beide Lichter an sind, und schaltest dann beide aus. Ohne diese Bedingung, würde es nur dazu noch ausschalten, wenn alles schon aus ist. Na und?

Zu 2: ok, verstehe

Zu 3: ist es wichtig zu wissen, welche getriggert hat? Prinzipiell "triggert" ([device] eq "etwas") auch. Aber ok, vielleicht triggert [device] zu viel, wenn dieses Device andere Events generiert und nicht nur motion oder nomotion.

Zu 4: ok, hatte ich übersehen. Wahrscheinlich durch "doif_BDZ_DeckenLicht_on cmd: 1" aus dem Grund, den Damian erklärt hat.

Fazit: kannst alles so lassen (bis auf "^motion$"), es war nur ein Versuch, um das DOIF zu vereinfachen.

Und zuletzt: sobald, Du mit Einführungszeichen arbeitest, wird es als regulare Ausdruck bewertet.
["device:reading"] ist ["<device regex>:<event regex>"]
[device:"reading"] ist [<devicename>:"<event regex>"]


Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 03 März 2019, 00:53:04
Hallo.

vielen Dank für die klaren Worte:

["device:reading"] ist ["<device regex>:<event regex>"]
[device:"reading"] ist [<devicename>:"<event regex>"]

Das ist mir die letzten Wochen wirklich nicht klar gewesen.
Ein Wunder, dass es nicht schon vorher und heftiger zu Problemen gekommen ist.

Ich werde Deine Hinweise zur Vereinfachung mal wirken lassen.
Ich verstehe den Punkt 1, es stimmt was Du schreibst.

Zu 3: auch das war eine Interpreation der Mechanismen, die ich meinte aus
der Dokumentation ziehen zu müssen: dass ich letztendlich eine Art
Statusänderung benötige um einen Trigger zu bekommen.
Zwar können auch Zustände als Trigger dienen, jedoch muss das zugehörige Device
dennoch zumindest über die Änderung eines anderen Parameters auf sich
aufmerksam machen, dann kann ich auch einen statischen Zustand als trigger heranziehen
- meinte ich
(...aus der Command Ref:

,,...Das Modul wird getriggert, sobald das angegebene Device hier "remotecontrol" ein Event erzeugt. Das geschieht, wenn irgendein Reading oder der Status von "remotecontrol" aktualisiert wird. Ausgewertet wird hier der Zustand des Status von remotecontrol nicht das Event selbst...."

Und ich dachte eben ,,eq" eignet sich nur für einen Status und device:"reading" wäre für Events.

Ich schaue, wie weit ich mit Euren Hinweisen komme.
Bin aber guter Dinge, da ich Grundlegendes falsch verstanden hatte
und werde das Ergbnis natürlich hier posten.

Grüße und gute Nacht
Brandon
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 03 März 2019, 09:26:00
Noch eine Frage:

ich möchte, dass das DOIF nach getaner Arbeit in den cmd 2 wechselt, was es ja eigentlich selbstständig tun sollte.
Tut es aber nicht (ist wohl immer noch ein Kinken drin).

Weder

(set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off) (set $SELF cmd_2) DOELSE

noch



(set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off,set $SELF cmd_2) DOELSE

können dies bewirken.

Entweder kläre ich auf, weswegen der Wechsel nicht automatisch geschieht oder die Lösung ginge mit anderen Seiteneffekten einher und ich finde heraus, wie
ich dem DOIF klar mache, dass nach Abarbeiten des cmd 1 in den cmd 2 gewechselt werden soll.

Ich nehme an es klappt bisher nicht, da es sich beißt, wenn der wechsel zu "2" noch in der Abarbeitung von "1" gefordert wird.
Nur zur Info: zusätzlich zur bisherigen Konfiguration habe ich noch selftrigger wait aktiviert, damit die Readings der beteiligten Devices im DOIF auch nach dem Auslösen aktuell gelistet werden.

Hoffentlich schmerzt es Damian nicht zu sehr, sein Modul so vergewaltigt zu sehen...

Damit evt. fehlende Informationen nicht zu Rückfragen zwingen, folgen jetzt im Anschluss nochmal aktuelle Internals und Logs in folgender Reihenfolge:

1. EventLog vom Moment des manuellen Einschaltens des Lichts und Reagieren des Ausschalt-DOIFs (Ausschalten nach 5 Sekunden, wenn nichts passiert), über den fehlgeschlagenen Versuch
des Erzwingens von cmd_2 bis zum selbstständigen Wechsel in cmd_2 nach einiger Zeit.

2. Internals VOR dem Einschalten

3. Internals WÄHREND des aktiven aktiven DOIFs

4. Internals NACH Abarbeitung des DOIFs bzw. wenn es das Licht vom DOIF ausgeschaltet worden ist - aber VOR dem selbstständigen Wechsel in cmd_2, was dann wieder dem Log unter Punkt 2. entspricht.

1:


2019-03-03 09:01:59.591 DOIF doif_BDZ_DeckenLicht_off wait_timer: 03.03.2019 09:02:04 cmd_1 BDZ_DeckenlichtSonoff
2019-03-03 09:01:59.614 MQTT_DEVICE BDZ_DeckenlichtSonoff on
2019-03-03 09:02:04.597 DOIF doif_BDZ_DeckenLicht_off wait_timer: no timer
2019-03-03 09:02:04.649 DOIF doif_BDZ_DeckenLicht_off cmd_nr: 2
2019-03-03 09:02:04.649 DOIF doif_BDZ_DeckenLicht_off cmd: 2
2019-03-03 09:02:04.649 DOIF doif_BDZ_DeckenLicht_off cmd_event: BDZ_DeckenlichtSonoff
2019-03-03 09:02:04.649 DOIF doif_BDZ_DeckenLicht_off cmd_2
2019-03-03 09:02:04.672 MQTT_DEVICE BDZ_DeckenlichtSonoff off
2019-03-03 09:02:04.710 DOIF doif_BDZ_DeckenLicht_off cmd_nr: 2
2019-03-03 09:02:04.710 DOIF doif_BDZ_DeckenLicht_off cmd: 2
2019-03-03 09:02:04.710 DOIF doif_BDZ_DeckenLicht_off cmd_event: set_cmd_2
2019-03-03 09:02:04.710 DOIF doif_BDZ_DeckenLicht_off cmd_2
2019-03-03 09:02:04.728 DOIF doif_BDZ_DeckenLicht_off cmd_nr: 1
2019-03-03 09:02:04.728 DOIF doif_BDZ_DeckenLicht_off cmd: 1
2019-03-03 09:02:04.728 DOIF doif_BDZ_DeckenLicht_off cmd_event: BDZ_DeckenlichtSonoff
2019-03-03 09:02:04.728 DOIF doif_BDZ_DeckenLicht_off cmd_1
2019-03-03 09:02:08.198 HUEDevice BDZ_LuxTuer lightlevel: 3433
2019-03-03 09:02:08.198 HUEDevice BDZ_LuxTuer lux: 2
2019-03-03 09:02:08.198 HUEDevice BDZ_LuxTuer daylight: 0
2019-03-03 09:02:08.198 HUEDevice BDZ_LuxTuer dark: 1
2019-03-03 09:02:13.144 HUEDevice BDZ_LuxFenster lightlevel: 4573
2019-03-03 09:02:13.144 HUEDevice BDZ_LuxFenster lux: 3
2019-03-03 09:02:13.144 HUEDevice BDZ_LuxFenster dark: 1
2019-03-03 09:02:13.144 HUEDevice BDZ_LuxFenster daylight: 0
2019-03-03 09:02:38.236 MQTT Mosquitto connection: active
2019-03-03 09:03:38.237 MQTT Mosquitto connection: active
2019-03-03 09:04:17.160 HUEDevice BDZ_TempFenster temperature: 21.16
2019-03-03 09:04:38.241 MQTT Mosquitto connection: active
2019-03-03 09:05:14.078 DOIF doif_BDZ_DeckenLicht_off cmd_nr: 2
2019-03-03 09:05:14.078 DOIF doif_BDZ_DeckenLicht_off cmd: 2
2019-03-03 09:05:14.078 DOIF doif_BDZ_DeckenLicht_off cmd_event: BDZ_MotionTuer
2019-03-03 09:05:14.078 DOIF doif_BDZ_DeckenLicht_off cmd_2
2019-03-03 09:05:14.101 HUEDevice BDZ_MotionTuer nomotion
2019-03-03 09:05:14.908 DOIF doif_BDZ_DeckenLicht_off cmd_nr: 2
2019-03-03 09:05:14.908 DOIF doif_BDZ_DeckenLicht_off cmd: 2
2019-03-03 09:05:14.908 DOIF doif_BDZ_DeckenLicht_off cmd_event: BDZ_MotionFenster
2019-03-03 09:05:14.908 DOIF doif_BDZ_DeckenLicht_off cmd_2
2019-03-03 09:05:14.931 HUEDevice BDZ_MotionFenster nomotion


2:


Internals:
   DEF        (
(
([BDZ_MotionTuer:"^nomotion$"] and [?BDZ_MotionFenster] eq "nomotion")
or
([BDZ_MotionFenster:"^nomotion$"] and [?BDZ_MotionTuer] eq "nomotion")
or
([BDZ_SpiegelschrankSonoff:"^on$"] and [?BDZ_MotionTuer] eq "nomotion" and [?BDZ_MotionFenster] eq "nomotion")
or
([BDZ_DeckenlichtSonoff:"^on$"] and [?BDZ_MotionTuer] eq "nomotion" and [?BDZ_MotionFenster] eq "nomotion")
)
and
([?BDZ_DeckenlichtSonoff] eq "on" or [?BDZ_SpiegelschrankSonoff] eq "on")
and
AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0
)
(set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off,set $SELF cmd_2) DOELSE
   FUUID      5c74116f-f33f-d24e-34a0-49a85c6c1759028d
   MODEL      FHEM
   NAME       doif_BDZ_DeckenLicht_off
   NR         88
   NTFY_ORDER 50-doif_BDZ_DeckenLicht_off
   STATE      cmd_2
   TYPE       DOIF
   VERSION    18706 2019-02-23 21:48:22
   READINGS:
     2019-03-03 09:05:14   Device          BDZ_MotionFenster
     2019-03-03 09:05:14   cmd             2
     2019-03-03 09:05:14   cmd_event       BDZ_MotionFenster
     2019-03-03 09:05:14   cmd_nr          2
     2019-03-03 09:02:04   e_BDZ_DeckenlichtSonoff_STATE off
     2019-03-03 09:02:04   e_BDZ_DeckenlichtSonoff_events off
     2019-03-03 09:05:14   e_BDZ_MotionFenster_STATE nomotion
     2019-03-03 09:05:14   e_BDZ_MotionFenster_events nomotion
     2019-03-03 09:05:14   e_BDZ_MotionTuer_STATE nomotion
     2019-03-03 09:05:14   e_BDZ_MotionTuer_events nomotion
     2019-03-03 09:01:36   mode            enabled
     2019-03-03 09:05:14   state           cmd_2
     2019-03-03 09:02:04   wait_timer      no timer
   Regex:
     accu:
   attr:
     cmdState:
     wait:
       0:
         5
     waitdel:
   condition:
     0            ( (::EventDoIf('BDZ_MotionTuer',$hash,'^nomotion$',1) and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") or (::EventDoIf('BDZ_MotionFenster',$hash,'^nomotion$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion") or (::EventDoIf('BDZ_SpiegelschrankSonoff',$hash,'^on$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion" and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") or (::EventDoIf('BDZ_DeckenlichtSonoff',$hash,'^on$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion" and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") ) and (::InternalDoIf($hash,'BDZ_DeckenlichtSonoff','STATE') eq "on" or ::InternalDoIf($hash,'BDZ_SpiegelschrankSonoff','STATE') eq "on") and AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0 
   devices:
     0           BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
     all         BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
   do:
     0:
       0          set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off,set doif_BDZ_DeckenLicht_off cmd_2
     1:
       0         
   helper:
     event      nomotion
     globalinit 1
     last_timer 0
     sleepdevice BDZ_DeckenlichtSonoff
     sleepsubtimer -1
     sleeptimer -1
     timerdev   BDZ_MotionFenster
     timerevent nomotion
     triggerDev BDZ_MotionFenster
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: BDZ_MotionFenster
       state: cmd_2
     timerevents:
       nomotion
     timereventsState:
       state: nomotion
     triggerEvents:
       nomotion
     triggerEventsState:
       state: nomotion
   internals:
     0           BDZ_MotionFenster:STATE BDZ_MotionTuer:STATE BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
     all         BDZ_MotionFenster:STATE BDZ_MotionTuer:STATE BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
   itimer:
   readings:
   trigger:
     all         BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
   uiState:
   uiTable:
Attributes:
   alias      Deckenlicht AUS
   devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1
   do         resetwait
   group      A) Logik Beleuchtungssteuerung
   icon       helper_doif
   room       50_Badezimmer
   selftrigger wait
   startup    set $SELF cmd_2
   wait       5



3:


Internals:
   DEF        (
(
([BDZ_MotionTuer:"^nomotion$"] and [?BDZ_MotionFenster] eq "nomotion")
or
([BDZ_MotionFenster:"^nomotion$"] and [?BDZ_MotionTuer] eq "nomotion")
or
([BDZ_SpiegelschrankSonoff:"^on$"] and [?BDZ_MotionTuer] eq "nomotion" and [?BDZ_MotionFenster] eq "nomotion")
or
([BDZ_DeckenlichtSonoff:"^on$"] and [?BDZ_MotionTuer] eq "nomotion" and [?BDZ_MotionFenster] eq "nomotion")
)
and
([?BDZ_DeckenlichtSonoff] eq "on" or [?BDZ_SpiegelschrankSonoff] eq "on")
and
AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0
)
(set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off,set $SELF cmd_2) DOELSE
   FUUID      5c74116f-f33f-d24e-34a0-49a85c6c1759028d
   MODEL      FHEM
   NAME       doif_BDZ_DeckenLicht_off
   NR         88
   NTFY_ORDER 50-doif_BDZ_DeckenLicht_off
   STATE      cmd_2
   TYPE       DOIF
   VERSION    18706 2019-02-23 21:48:22
   READINGS:
     2019-03-03 09:08:19   Device          BDZ_DeckenlichtSonoff
     2019-03-03 09:05:14   cmd             2
     2019-03-03 09:05:14   cmd_event       BDZ_MotionFenster
     2019-03-03 09:05:14   cmd_nr          2
     2019-03-03 09:08:19   e_BDZ_DeckenlichtSonoff_STATE on
     2019-03-03 09:08:19   e_BDZ_DeckenlichtSonoff_events on
     2019-03-03 09:05:14   e_BDZ_MotionFenster_STATE nomotion
     2019-03-03 09:05:14   e_BDZ_MotionFenster_events nomotion
     2019-03-03 09:05:14   e_BDZ_MotionTuer_STATE nomotion
     2019-03-03 09:05:14   e_BDZ_MotionTuer_events nomotion
     2019-03-03 09:01:36   mode            enabled
     2019-03-03 09:05:14   state           cmd_2
     2019-03-03 09:08:19   wait_timer      03.03.2019 09:08:24 cmd_1 BDZ_DeckenlichtSonoff
   Regex:
     accu:
   attr:
     cmdState:
     wait:
       0:
         5
     waitdel:
   condition:
     0            ( (::EventDoIf('BDZ_MotionTuer',$hash,'^nomotion$',1) and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") or (::EventDoIf('BDZ_MotionFenster',$hash,'^nomotion$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion") or (::EventDoIf('BDZ_SpiegelschrankSonoff',$hash,'^on$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion" and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") or (::EventDoIf('BDZ_DeckenlichtSonoff',$hash,'^on$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion" and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") ) and (::InternalDoIf($hash,'BDZ_DeckenlichtSonoff','STATE') eq "on" or ::InternalDoIf($hash,'BDZ_SpiegelschrankSonoff','STATE') eq "on") and AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0 
   devices:
     0           BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
     all         BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
   do:
     0:
       0          set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off,set doif_BDZ_DeckenLicht_off cmd_2
     1:
       0         
   helper:
     event      on
     globalinit 1
     last_timer 0
     sleepdevice BDZ_DeckenlichtSonoff
     sleepsubtimer 0
     sleeptimer 0
     timerdev   BDZ_DeckenlichtSonoff
     timerevent on
     triggerDev BDZ_DeckenlichtSonoff
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: BDZ_MotionFenster
       state: cmd_2
     timerevents:
       on
     timereventsState:
       state: ON
     triggerEvents:
       on
     triggerEventsState:
       state: ON
   internals:
     0           BDZ_MotionFenster:STATE BDZ_MotionTuer:STATE BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
     all         BDZ_MotionFenster:STATE BDZ_MotionTuer:STATE BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
   itimer:
   readings:
   trigger:
     all         BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
   uiState:
   uiTable:
Attributes:
   alias      Deckenlicht AUS
   devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1
   do         resetwait
   group      A) Logik Beleuchtungssteuerung
   icon       helper_doif
   room       50_Badezimmer
   selftrigger wait
   startup    set $SELF cmd_2
   wait       5



4:


Internals:
   DEF        (
(
([BDZ_MotionTuer:"^nomotion$"] and [?BDZ_MotionFenster] eq "nomotion")
or
([BDZ_MotionFenster:"^nomotion$"] and [?BDZ_MotionTuer] eq "nomotion")
or
([BDZ_SpiegelschrankSonoff:"^on$"] and [?BDZ_MotionTuer] eq "nomotion" and [?BDZ_MotionFenster] eq "nomotion")
or
([BDZ_DeckenlichtSonoff:"^on$"] and [?BDZ_MotionTuer] eq "nomotion" and [?BDZ_MotionFenster] eq "nomotion")
)
and
([?BDZ_DeckenlichtSonoff] eq "on" or [?BDZ_SpiegelschrankSonoff] eq "on")
and
AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0
)
(set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off,set $SELF cmd_2) DOELSE
   FUUID      5c74116f-f33f-d24e-34a0-49a85c6c1759028d
   MODEL      FHEM
   NAME       doif_BDZ_DeckenLicht_off
   NR         88
   NTFY_ORDER 50-doif_BDZ_DeckenLicht_off
   STATE      cmd_1
   TYPE       DOIF
   VERSION    18706 2019-02-23 21:48:22
   READINGS:
     2019-03-03 09:08:24   Device          BDZ_DeckenlichtSonoff
     2019-03-03 09:08:24   cmd             1
     2019-03-03 09:08:24   cmd_event       BDZ_DeckenlichtSonoff
     2019-03-03 09:08:24   cmd_nr          1
     2019-03-03 09:08:24   e_BDZ_DeckenlichtSonoff_STATE off
     2019-03-03 09:08:24   e_BDZ_DeckenlichtSonoff_events off
     2019-03-03 09:05:14   e_BDZ_MotionFenster_STATE nomotion
     2019-03-03 09:05:14   e_BDZ_MotionFenster_events nomotion
     2019-03-03 09:05:14   e_BDZ_MotionTuer_STATE nomotion
     2019-03-03 09:05:14   e_BDZ_MotionTuer_events nomotion
     2019-03-03 09:01:36   mode            enabled
     2019-03-03 09:08:24   state           cmd_1
     2019-03-03 09:08:24   wait_timer      no timer
   Regex:
     accu:
   attr:
     cmdState:
     wait:
       0:
         5
     waitdel:
   condition:
     0            ( (::EventDoIf('BDZ_MotionTuer',$hash,'^nomotion$',1) and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") or (::EventDoIf('BDZ_MotionFenster',$hash,'^nomotion$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion") or (::EventDoIf('BDZ_SpiegelschrankSonoff',$hash,'^on$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion" and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") or (::EventDoIf('BDZ_DeckenlichtSonoff',$hash,'^on$',1) and ::InternalDoIf($hash,'BDZ_MotionTuer','STATE') eq "nomotion" and ::InternalDoIf($hash,'BDZ_MotionFenster','STATE') eq "nomotion") ) and (::InternalDoIf($hash,'BDZ_DeckenlichtSonoff','STATE') eq "on" or ::InternalDoIf($hash,'BDZ_SpiegelschrankSonoff','STATE') eq "on") and AttrVal("BDZ_DeckenlichtSonoff","sperre","") == 0 
   devices:
     0           BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
     all         BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
   do:
     0:
       0          set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off,set doif_BDZ_DeckenLicht_off cmd_2
     1:
       0         
   helper:
     event      off
     globalinit 1
     last_timer 0
     sleepdevice BDZ_DeckenlichtSonoff
     sleepsubtimer -1
     sleeptimer -1
     timerdev   BDZ_DeckenlichtSonoff
     timerevent off
     triggerDev BDZ_DeckenlichtSonoff
     DOIF_eventas:
       cmd_nr: 1
       cmd: 1
       cmd_event: BDZ_DeckenlichtSonoff
       state: cmd_1
     timerevents:
       off
     timereventsState:
       state: OFF
     triggerEvents:
       off
     triggerEventsState:
       state: OFF
   internals:
     0           BDZ_MotionFenster:STATE BDZ_MotionTuer:STATE BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
     all         BDZ_MotionFenster:STATE BDZ_MotionTuer:STATE BDZ_DeckenlichtSonoff:STATE BDZ_SpiegelschrankSonoff:STATE
   itimer:
   readings:
   trigger:
     all         BDZ_MotionTuer BDZ_MotionFenster BDZ_SpiegelschrankSonoff BDZ_DeckenlichtSonoff
   uiState:
   uiTable:
Attributes:
   alias      Deckenlicht AUS
   devStateIcon cmd_1:general_an:cmd_2 cmd_2|initialized:general_aus:cmd_1
   do         resetwait
   group      A) Logik Beleuchtungssteuerung
   icon       helper_doif
   room       50_Badezimmer
   selftrigger wait
   startup    set $SELF cmd_2
   wait       5



Ich danke für's Lesen

Grüße
Brandon
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: Damian am 03 März 2019, 11:58:17
Das Absetzen von set $SELF ... aus dem DOIF selbst ist keine gute Idee, denn die eigentliche Abarbeitung des Befehls ist zu diesem Zeitpunkt nicht abgeschlossen und der Status noch nicht gesetzt. Auch mit Selftrigger entsteht eine Rekursion, die nur durch waittimer ausgehebelt werden kann.

Wenn du komplexere Dinge mit DOIF erstellen willst, so bietet sich der Perl-Modus an, hier kannst du dich nach Belieben austoben indem du strukturiert programmierst.
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 03 März 2019, 14:32:35
Danke,

ich komme nur langsam vom 100sten ins 1000ste und bin mir nicht sicher ob fhem das geeignete Tool ist.
Mein Anspruch scheint mir doch nicht so hoch gegriffen.

Bei dem Versuch nun, das DOIF in Perl zu versetzen, habe ich Probleme damit, die Aktion zu definieren:

(set BDZ_DeckenlichtSonoff off,set BDZ_SpiegelschrankSonoff off)


Ich habe jetzt alles durchgeackert und finde kein Beispiel, wie ich zwei Befehle im "Perl-DOIF" an fhem weitergebe!
Es gibt immer nur Beispiele mit EINEM Befehl.

Und da fhem_set wohl ein eigenständiger Befehl der DOIFs ist (andere Perl-Erklärungen haben {fhem("set...."} als Grundlage)
ist die Menge meiner Suchergebnisse auch recht eingeschränkt.

Weder

{ fhem_set"BDZ_DeckenlichtSonoff off"};{ fhem_set"BDZ_SpiegelschrankSonoff off"}



{ fhem_set"BDZ_DeckenlichtSonoff off"};;{ fhem_set"BDZ_SpiegelschrankSonoff off"}



{fhem_set"BDZ_DeckenlichtSonoff off, BDZ_SpiegelschrankSonoff off"}



{fhem_set"BDZ_DeckenlichtSonoff off" ; "BDZ_SpiegelschrankSonoff off"}

Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 03 März 2019, 14:50:47
ok, ok - jetzt hat DAS zumindest schonmal geklappt:


{ fhem_set"BDZ_DeckenlichtSonoff off";
fhem_set"BDZ_SpiegelschrankSonoff off";
}
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: Damian am 03 März 2019, 16:33:28
Zitat von: BrandonQuest am 03 März 2019, 14:50:47
ok, ok - jetzt hat DAS zumindest schonmal geklappt:


{ fhem_set"BDZ_DeckenlichtSonoff off";
fhem_set"BDZ_SpiegelschrankSonoff off";
}


Und nicht zu viel auf einmal vornehmen, Rom wurde auch nicht an einem Tag erbaut ;)
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 03 März 2019, 16:39:10
Ich würde mal sagen, die Realisierung des Timers mit Abbruchbedingung ist wohl schon der Bau Roms :-/

Mein Kenntnisstand dürfte klar sein, dass ich mich damit übernehme wohl auch.
Habe versucht auf Github vielleicht eine Eingebung durch Studium Deines Moduls zu bekommen - das grenzt wohl aber etwas an Größenwahn.

Ich wollte mir etwas auf Basis

attr BDZ_MotionTuer userReadings Zeit {if (ReadingsVal("$NAME","state","0") eq "nomotion") {time_str2num (ReadingsTimestamp ("$NAME","state","0"))}}

(dass hatte ich mir vor einigen Tagen zum Erfassen eines Zeitintervalls nach Reading-Aktualisierung im Device gebastelt und ist jetzt obsolet)

nehmen, in die if-Abfrage in Perl überführen und die Timerdauer draufschlagen.

Ich bin allerdings 1. noch dabei es zum Laufen zu bekommen und weiß 2. nicht,
wie ich die Timerschleife dann zum laufen bekomme ohne Gefahr zu laufen, dass alle anderen Prozesse solange stillstehen.
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 03 März 2019, 20:57:00
Den Timer inkl. Reset habe ich nun ganz simpel so realisiert:


{fhem ("defmod Timer_BDZ_DeckenlichtSonoff at +00:01 set BDZ_DeckenlichtSonoff off ;; set BDZ_SpiegelschrankSonoff off");}
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: BrandonQuest am 04 März 2019, 09:57:21
Wie sieht ein simpler negierender RegEx aus?

Ich möchte im DOIF einfach nur sagen: "Trigger bei allem, was NICHT off ist"

Nach so einleuchtenden Beispielen wie:
...
(["^FS$:^temp$"] triggert auf Devices, die genau "FS" heißen und im Event genau "temp" vorkommt
...
Dachte ich es wäre einfach mit

([BDZ_DeckenlichtSonoff:"!off"])
oder
([BDZ_DeckenlichtSonoff:"(?!off)"])
oder
([BDZ_DeckenlichtSonoff:"\b(?!off\b).*\b"])
oder
([BDZ_DeckenlichtSonoff:"[^o][^f][^f]"])


Aber ich komme nicht weiter :-(

EDIT: ich habe erstmal als workaround statt auf einen negativen RegEx zu schauen, die komplette Bedingung negiert:
!([BDZ_DeckenlichtSonoff:"off"])

Aber es wäre dennoch nett zu wissen, wie sich das mit dem RegEx verhalten hätte...
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: Damian am 04 März 2019, 10:09:02
Zitat von: BrandonQuest am 04 März 2019, 09:57:21
Wie sieht ein simpler negierender RegEx aus?

Ich möchte im DOIF einfach nur sagen: "Trigger bei allem, was NICHT off ist"

Nach so einleuchtenden Beispielen wie:
...
(["^FS$:^temp$"] triggert auf Devices, die genau "FS" heißen und im Event genau "temp" vorkommt
...
Dachte ich es wäre einfach mit

([BDZ_DeckenlichtSonoff:"!off"])
oder
([BDZ_DeckenlichtSonoff:"(?!off)"])
oder
([BDZ_DeckenlichtSonoff:"\b(?!off\b).*\b"])
oder
([BDZ_DeckenlichtSonoff:"[^o][^f][^f]"])


Aber ich komme nicht weiter :-(

Als Zustandstrigger [FS:state] ne "on", Negation von RegEx ist schwierig.
Titel: Antw:DOIF triggert nur bei jedem zweiten Ereignis
Beitrag von: Per am 04 März 2019, 14:19:47
Zitat von: BrandonQuest am 02 März 2019, 21:29:37Ich habe nun jeweils ein DOIF um das Licht einzuschalten und ein DOIF, welches für das Ausschalten zuständig ist.
Warum? Pack das in ein DOIF. Das ist doch der Vorteil ggü. notify.