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
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
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.
@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
@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
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)
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.
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.
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 :-)
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.
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
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 :)
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
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
@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
["BDZ_MotionFenster:^motion$"]
Du hättest dir die Beispiele zum Link genauer anschauen sollen
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
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>"]
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
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
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.
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"}
ok, ok - jetzt hat DAS zumindest schonmal geklappt:
{ fhem_set"BDZ_DeckenlichtSonoff off";
fhem_set"BDZ_SpiegelschrankSonoff off";
}
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 ;)
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.
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");}
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...
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.
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.