[gelöst] DOIF mit Structure triggert doppelt

Begonnen von drhirn, 02 Februar 2017, 18:14:20

Vorheriges Thema - Nächstes Thema

drhirn

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

Damian

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

drhirn

Danke Damian! Macht leider keinen Unterschied. Hab cmdpause auf 5s gestellt, bekomm aber die Nachrichten immer noch doppelt.

Damian

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

drhirn

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

Damian

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

drhirn

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

Damian

Jetzt musst du mir die Definition von cmdpause zeigen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

drhirn

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

Damian

   cmdpause   5

Das habe ich befürchtet  ;)

Jetzt ist deine Aufgabe die Dokumentation zu cmdpause noch mal richtig zu lesen.  :)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

drhirn

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!

drhirn

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

Damian

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.

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

drhirn

Ok, alles klar. Ich schau mir das mal genauer an.

Danke dir!