DOIF triggert nur bei jedem zweiten Ereignis

Begonnen von BrandonQuest, 24 Februar 2019, 14:38:16

Vorheriges Thema - Nächstes Thema

BrandonQuest

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

Damian

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

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

Ellert

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.

BrandonQuest

#3
@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



BrandonQuest

@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

Damian

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

BrandonQuest

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.


Ellert

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.


BrandonQuest

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 :-)

BrandonQuest

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.

BrandonQuest

#10
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



Damian

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

amenomade

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
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Damian

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

BrandonQuest

@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