Guten Abend!
Ich habe zwei EnOcean-Schalter, die ich zu einer Structure verbunden habe (client_behavior = last). Und ein DOIF, welches auf Statusänderung der Structure reagiert. Gesteuert sollen damit Lichtszenen werden. Das DOIF habe ich auf "do always" gestellt, damit auch geschalten wird, wenn einer der Schalter schon den Zustand hat, den er durch's Betätigen annehmen soll.
Betätige ich jetzt so einen Schalter, triggert mir das DOIF doppelt. Ich schätze mal 1x pro Schalter. Könnte mir vorstellen, dass das so sein soll. Möchte ich aber nicht.
Deswegen frage ich mal in die Runde, wie ich das verhindern könnte.
Die Structure:
Internals:
ATTR Schalter
CFGFN
DEF Schalter EnO_FEFCF935 EnO_FEFEE1A6
NAME strLichtszenenWZ
NR 3262
NTFY_ORDER 50-strLichtszenenWZ
STATE AI
TYPE structure
Content:
EnO_FEFCF935 AI
EnO_FEFEE1A6 AI
Readings:
2017-02-02 18:04:39 LastDevice EnO_FEFCF935
2017-02-02 18:04:39 LastDevice_Abs EnO_FEFCF935
2017-02-02 18:04:39 state AI
Attributes:
clientstate_behavior last
Und das DOIF:
Internals:
CFGFN
DEF ([strLichtszenenWZ] eq "BI")(
set lsWohnzimmer scene sStandard
) DOELSEIF ([strLichtszenenWZ] eq "B0")(
set lsWohnzimmer scene sEssen
) DOELSEIF ([strLichtszenenWZ] eq "AI")(
set lsWohnzimmer scene sFernsehen,
set Shield1 ttsMsg Pingis bereit zum Fernsehen,
set JabberClient msgmuc fhem@conference.jabber.jft.at Pingis bereit zum Fernsehen
) DOELSEIF ([strLichtszenenWZ] eq "A0")(
set lsWohnzimmer scene sAllesAus
)
NAME diLightScenesWZ
NR 1170
NTFY_ORDER 50-diLightScenesWZ
STATE cmd_3
TYPE DOIF
[...]
Attributes:
do always
Danke euch!
Stefan
mit https://fhem.de/commandref_DE.html#DOIF_cmdpause
Danke Damian! Macht leider keinen Unterschied. Hab cmdpause auf 5s gestellt, bekomm aber die Nachrichten immer noch doppelt.
Zitat von: drhirn am 02 Februar 2017, 18:33:36
Danke Damian! Macht leider keinen Unterschied. Hab cmdpause auf 5s gestellt, bekomm aber die Nachrichten immer noch doppelt.
Dann poste mal den kompletten List von dem DOIF-Modul
Bitteschön:
Internals:
CFGFN
DEF ([strLichtszenenWZ] eq "BI")(
set lsWohnzimmer scene sStandard
) DOELSEIF ([strLichtszenenWZ] eq "B0")(
set lsWohnzimmer scene sEssen
) DOELSEIF ([strLichtszenenWZ] eq "AI")(
set lsWohnzimmer scene sFernsehen,
set Shield1 ttsMsg Pingis bereit zum Fernsehen,
set JabberClient msgmuc fhem@conference.jabber.jft.at Pingis bereit zum Fernsehen
) DOELSEIF ([strLichtszenenWZ] eq "A0")(
set lsWohnzimmer scene sAllesAus
)
NAME diLightScenesWZ
NR 1170
NTFY_ORDER 50-diLightScenesWZ
STATE cmd_3
TYPE DOIF
Readings:
2017-02-02 18:38:08 Device strLichtszenenWZ
2017-02-02 18:37:52 cmd 3
2017-02-02 18:37:52 cmd_event strLichtszenenWZ
2017-02-02 18:37:52 cmd_nr 3
2017-02-02 18:38:08 e_strLichtszenenWZ_STATE AI
2017-02-02 18:37:52 state cmd_3
Condition:
0 InternalDoIf($hash,'strLichtszenenWZ','STATE') eq "BI"
1 InternalDoIf($hash,'strLichtszenenWZ','STATE') eq "B0"
2 InternalDoIf($hash,'strLichtszenenWZ','STATE') eq "AI"
3 InternalDoIf($hash,'strLichtszenenWZ','STATE') eq "A0"
Devices:
0 strLichtszenenWZ
1 strLichtszenenWZ
2 strLichtszenenWZ
3 strLichtszenenWZ
all strLichtszenenWZ
Do:
0:
0 set lsWohnzimmer scene sStandard
1:
0 set lsWohnzimmer scene sEssen
2:
0 set lsWohnzimmer scene sFernsehen, set Shield1 ttsMsg Pingis bereit zum Fernsehen, set JabberClient msgmuc fhem@conference.jabber.jft.at Pingis bereit zum Fernsehen
3:
0 set lsWohnzimmer scene sAllesAus
Helper:
event AI
globalinit 1
last_timer 0
sleeptimer -1
timerdev strLichtszenenWZ
timerevent AI
triggerDev strLichtszenenWZ
timerevents:
AI
timereventsState:
state: AI
triggerEvents:
AI
triggerEventsState:
state: AI
Internals:
0 strLichtszenenWZ:STATE
1 strLichtszenenWZ:STATE
2 strLichtszenenWZ:STATE
3 strLichtszenenWZ:STATE
all strLichtszenenWZ:STATE
Itimer:
Readings:
Regexp:
0:
1:
2:
3:
All:
State:
Trigger:
Attributes:
do always
repeatsame klingt irgendwie vielversprechend. Aber da wird der Befehl dann hat wirklich nur 1x ausgeführt ;)
Irgendetwas passt hier nicht:
2017-02-02 18:38:08 e_strLichtszenenWZ_STATE AI
2017-02-02 18:37:52 state cmd_3
mit do always hätte cmd_3 um 18:38:08 gesetzt werden müssen.
Oh, entschuldige. War nicht ganz aktuell.
Hier nochmal (ohne cmdpause)
Internals:
CFGFN
DEF ([strLichtszenenWZ] eq "BI")(
set lsWohnzimmer scene sStandard
) DOELSEIF ([strLichtszenenWZ] eq "B0")(
set lsWohnzimmer scene sEssen
) DOELSEIF ([strLichtszenenWZ] eq "AI")(
set lsWohnzimmer scene sFernsehen,
set Shield1 ttsMsg Pingis bereit zum Fernsehen,
set JabberClient msgmuc fhem@conference.jabber.jft.at Pingis bereit zum Fernsehen
) DOELSEIF ([strLichtszenenWZ] eq "A0")(
set lsWohnzimmer scene sAllesAus
)
NAME diLightScenesWZ
NR 1170
NTFY_ORDER 50-diLightScenesWZ
STATE cmd_3
TYPE DOIF
Readings:
2017-02-02 18:50:02 Device strLichtszenenWZ
2017-02-02 18:50:02 cmd 3
2017-02-02 18:50:02 cmd_event strLichtszenenWZ
2017-02-02 18:50:02 cmd_nr 3
2017-02-02 18:50:02 e_strLichtszenenWZ_STATE AI
2017-02-02 18:50:02 state cmd_3
Condition:
0 InternalDoIf($hash,'strLichtszenenWZ','STATE') eq "BI"
1 InternalDoIf($hash,'strLichtszenenWZ','STATE') eq "B0"
2 InternalDoIf($hash,'strLichtszenenWZ','STATE') eq "AI"
3 InternalDoIf($hash,'strLichtszenenWZ','STATE') eq "A0"
Devices:
0 strLichtszenenWZ
1 strLichtszenenWZ
2 strLichtszenenWZ
3 strLichtszenenWZ
all strLichtszenenWZ
Do:
0:
0 set lsWohnzimmer scene sStandard
1:
0 set lsWohnzimmer scene sEssen
2:
0 set lsWohnzimmer scene sFernsehen, set Shield1 ttsMsg Pingis bereit zum Fernsehen, set JabberClient msgmuc fhem@conference.jabber.jft.at Pingis bereit zum Fernsehen
3:
0 set lsWohnzimmer scene sAllesAus
Helper:
event AI
globalinit 1
last_timer 0
sleeptimer -1
timerdev strLichtszenenWZ
timerevent AI
triggerDev strLichtszenenWZ
timerevents:
AI
timereventsState:
state: AI
triggerEvents:
AI
triggerEventsState:
state: AI
Internals:
0 strLichtszenenWZ:STATE
1 strLichtszenenWZ:STATE
2 strLichtszenenWZ:STATE
3 strLichtszenenWZ:STATE
all strLichtszenenWZ:STATE
Itimer:
Readings:
Regexp:
0:
1:
2:
3:
All:
State:
Trigger:
Attributes:
do always
Jetzt musst du mir die Definition von cmdpause zeigen.
Sehr gerne
Internals:
CFGFN
DEF ([strLichtszenenWZ] eq "BI")(
set lsWohnzimmer scene sStandard
) DOELSEIF ([strLichtszenenWZ] eq "B0")(
set lsWohnzimmer scene sEssen
) DOELSEIF ([strLichtszenenWZ] eq "AI")(
set lsWohnzimmer scene sFernsehen,
set Shield1 ttsMsg Pingis bereit zum Fernsehen,
set JabberClient msgmuc fhem@conference.jabber.jft.at Pingis bereit zum Fernsehen
) DOELSEIF ([strLichtszenenWZ] eq "A0")(
set lsWohnzimmer scene sAllesAus
)
NAME diLightScenesWZ
NR 1170
NTFY_ORDER 50-diLightScenesWZ
STATE cmd_3
TYPE DOIF
Readings:
2017-02-02 18:54:47 Device strLichtszenenWZ
2017-02-02 18:54:47 cmd 3
2017-02-02 18:54:47 cmd_event strLichtszenenWZ
2017-02-02 18:54:47 cmd_nr 3
2017-02-02 18:54:47 e_strLichtszenenWZ_STATE AI
2017-02-02 18:54:47 state cmd_3
Condition:
0 InternalDoIf($hash,'strLichtszenenWZ','STATE') eq "BI"
1 InternalDoIf($hash,'strLichtszenenWZ','STATE') eq "B0"
2 InternalDoIf($hash,'strLichtszenenWZ','STATE') eq "AI"
3 InternalDoIf($hash,'strLichtszenenWZ','STATE') eq "A0"
Devices:
0 strLichtszenenWZ
1 strLichtszenenWZ
2 strLichtszenenWZ
3 strLichtszenenWZ
all strLichtszenenWZ
Do:
0:
0 set lsWohnzimmer scene sStandard
1:
0 set lsWohnzimmer scene sEssen
2:
0 set lsWohnzimmer scene sFernsehen, set Shield1 ttsMsg Pingis bereit zum Fernsehen, set JabberClient msgmuc fhem@conference.jabber.jft.at Pingis bereit zum Fernsehen
3:
0 set lsWohnzimmer scene sAllesAus
Helper:
event AI
globalinit 1
last_timer 0
sleeptimer -1
timerdev strLichtszenenWZ
timerevent AI
triggerDev strLichtszenenWZ
timerevents:
AI
timereventsState:
state: AI
triggerEvents:
AI
triggerEventsState:
state: AI
Internals:
0 strLichtszenenWZ:STATE
1 strLichtszenenWZ:STATE
2 strLichtszenenWZ:STATE
3 strLichtszenenWZ:STATE
all strLichtszenenWZ:STATE
Itimer:
Readings:
Regexp:
0:
1:
2:
3:
All:
State:
Trigger:
Attributes:
cmdpause 5
do always
cmdpause 5
Das habe ich befürchtet ;)
Jetzt ist deine Aufgabe die Dokumentation zu cmdpause noch mal richtig zu lesen. :)
Ja, kruzi, ich bin ein Blödmann!
Kurz nach dem Absenden des vorigen Beitrags kam ich drauf, dass ich cmdpause vielleicht einfach richtig definieren sollte.
attr diLightScenesWZ cmdpause 0:0:1:0
Tut mir leid, dich unnötig belästigt zu haben!
Danke für die Hilfe!
Damian, ich hab noch eine Frage zum Verständnis: Lag ich richtig, dass das Kommando für jeden Schalter ausgeführt wurde? Oder hatte das andere Gründe? Wenn ja, welche?
Danke!
Stefan
Zitat von: drhirn am 03 Februar 2017, 12:55:54
Damian, ich hab noch eine Frage zum Verständnis: Lag ich richtig, dass das Kommando für jeden Schalter ausgeführt wurde? Oder hatte das andere Gründe? Wenn ja, welche?
Danke!
Stefan
Könnte sein. Allerdings sollten die Events dann zusammengehörig sein (am gleichen Zeitstempel zu erkennen), dann wird das DOIF nur einmal getriggert. Um genaue Aussagen machen zu können, musst du die Events analysieren.
Ok, alles klar. Ich schau mir das mal genauer an.
Danke dir!