Thermokon EnOcean Taster, Eltako & FHEM

Begonnen von twinFHEM, 26 Oktober 2021, 00:27:06

Vorheriges Thema - Nächstes Thema

twinFHEM

Hallo zusammen,

ich habe ein paar Thermokon EnOcean Taster (2x Wippe bzw. 4x Taster), die ich direkt mit Eltako Aktoren (z.B. FSR14-4x) verbunden habe.
Ich programmiere die Taster mit der Eltako-Software PCT14. Dies funktioniert soweit sehr gut, bis auf die Tatsache, dass ich den Tastern darüber generell keine Mehrfachfunktionen (z.B. 2x drücken oder 1x lange drücken) zuweisen kann.

Hier kommt FHEM ins Spiel! Eltako-Aktoren und Thermokontaster sind in FHEM eingelernt.
Hier der list eines Tasters:

Internals:
   DEF        0035EF96
   FUUID      616f2135-f33f-b102-cc85-c15e3faa69770b4a
   IODev      TCM_ESP3_0
   LASTInputDev TCM_ESP3_0
   MSGCNT     402
   NAME       SCH_WZ_F_EnO_Thermokon
   NR         171
   NTFY_ORDER 50-SCH_WZ_F_EnO_Thermokon
   STATE      A0
   TCM_ESP3_0_DestinationID FFFFFFFF
   TCM_ESP3_0_MSGCNT 402
   TCM_ESP3_0_PacketType 1
   TCM_ESP3_0_RSSI -67
   TCM_ESP3_0_ReceivingQuality excellent
   TCM_ESP3_0_RepeatingCounter 1
   TCM_ESP3_0_SubTelNum 4
   TCM_ESP3_0_TIME 2021-10-25 23:06:23
   TYPE       EnOcean
   READINGS:
     2021-10-21 02:16:55   IODev           TCM_ESP3_0
     2021-10-25 23:06:23   buttons         released
     2021-10-25 23:06:23   channelA        A0
     2021-10-25 22:58:57   channelB        B0
     2021-10-25 23:06:23   state           A0
     2021-10-19 21:49:09   teach           RPS teach-in accepted EEP F6-02-01 Manufacturer: no ID
   helper:
Attributes:
   IODev      TCM_ESP3_0
   eep        F6-02-01
   manufID    7FF
   room       EnOcean,Garten,Wohnzimmer
   subType    switch
   teachMethod RPS


und des Aktors (FSR14_4x):

Internals:
   DEF        FF959491
   FUUID      616f0900-f33f-b102-629b-ff6e3477ad30785b
   IODev      TCM_ESP3_0
   NAME       AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta
   NR         165
   NTFY_ORDER 50-AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta
   STATE      off
   TYPE       EnOcean
   READINGS:
     2021-10-21 02:16:54   IODev           TCM_ESP3_0
     2021-10-25 22:58:17   block           unlock
     2021-10-25 22:58:17   state           off
     2021-10-19 20:35:18   teach           4BS teach-in sent
   helper:
Attributes:
   IODev      TCM_ESP3_0
   eep        A5-38-08
   gwCmd      switching
   manufID    00D
   room       EnOcean,Garten
   subDef     FF959494
   subType    gateway
   webCmd     on:off


Die Taster werden in FHEM mit A0, AI und B0, BI tituliert. Also, habe ich mir zwei simple DOIFs gebaut, mit denen ich bei 2x drücken die gesamte Gartenbeleuchtung aus- bzw. einschalten möchte (Bsp. list DI_allLightsGardenON):

Internals:
   DEF        ([SCH_WZ_F_EnO_Thermokon:state] eq "B0" or [SCH_KUE_F_EnO_Thermokon:state] eq "A0")
(set AC_GAR_FSR14_2x_1_Mauer_EnO_Elta on)
(set AC_GAR_FSR14_2x_2_Treppe_EnO_Elta on)
(set AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta on)
(set AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta on)
   FUUID      61707b6f-f33f-b102-010f-c60aacf617913004
   MODEL      FHEM
   NAME       DI_allLightsGardenON
   NOTIFYDEV  global,SCH_KUE_F_EnO_Thermokon,SCH_WZ_F_EnO_Thermokon
   NR         173
   NTFY_ORDER 50-DI_allLightsGardenON
   STATE      cmd_1
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   READINGS:
     2021-10-25 23:43:17   Device          SCH_WZ_F_EnO_Thermokon
     2021-10-25 22:42:28   cmd             1.4
     2021-10-25 22:42:28   cmd_event       SCH_KUE_F_EnO_Thermokon
     2021-10-25 22:42:28   cmd_nr          1
     2021-10-25 22:42:28   cmd_seqnr       4
     2021-10-25 22:42:41   e_SCH_KUE_F_EnO_Thermokon_state AI
     2021-10-25 23:43:17   e_SCH_WZ_F_EnO_Thermokon_state AI
     2021-10-21 00:22:04   mode            enabled
     2021-10-25 22:42:28   state           cmd_1
     2021-10-25 22:58:57   waitsame        cmd_1
   Regex:
     accu:
     collect:
     cond:
       SCH_KUE_F_EnO_Thermokon:
         0:
           state      ^SCH_KUE_F_EnO_Thermokon$:^state:
       SCH_WZ_F_EnO_Thermokon:
         0:
           state      ^SCH_WZ_F_EnO_Thermokon$:^state:
   attr:
     cmdState:
     wait:
     waitdel:
     waitsame:
       2
   condition:
     0          ::ReadingValDoIf($hash,'SCH_WZ_F_EnO_Thermokon','state') eq "B0" or ::ReadingValDoIf($hash,'SCH_KUE_F_EnO_Thermokon','state') eq "A0"
   do:
     0:
       0          set AC_GAR_FSR14_2x_1_Mauer_EnO_Elta on
       1          set AC_GAR_FSR14_2x_2_Treppe_EnO_Elta on
       2          set AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta on
       3          set AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta on
     1:
   helper:
     DEVFILTER  ^global$|^SCH_KUE_F_EnO_Thermokon$|^SCH_WZ_F_EnO_Thermokon$
     NOTIFYDEV  global|SCH_KUE_F_EnO_Thermokon|SCH_WZ_F_EnO_Thermokon
     event      buttons: pressed,channelA: AI,AI
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   SCH_WZ_F_EnO_Thermokon
     timerevent buttons: pressed,channelB: B0,B0
     triggerDev SCH_WZ_F_EnO_Thermokon
     timerevents:
       buttons: pressed
       channelB: B0
       B0
     timereventsState:
       buttons: pressed
       channelB: B0
       state: B0
     triggerEvents:
       buttons: pressed
       channelA: AI
       AI
     triggerEventsState:
       buttons: pressed
       channelA: AI
       state: AI
   internals:
   perlblock:
   readings:
     all         SCH_WZ_F_EnO_Thermokon:state SCH_KUE_F_EnO_Thermokon:state
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   waitsame   2


Das funktioniert leider nur sporadisch und gefühlt willkürlich. Drücke ich z.b. 1x B0 und 1x BI, um zwei verschiedene Lampen einzeln zu schalten, geht alles aus. Dies sollte eigentlich nur bei 2x BI geschehen. Selbst das einmalige Drücken von AI (ganz andere Lampe und Direktverbindung) und dann B0 lässt alles ausgehen obwohl ich zwei verschiedene Lampen einschalten wollte.

Hier ein Auszug vom Event Monitor:

2021-10-25 22:56:25 DOIF DI_allLightsGardenOFF waitsame: cmd_1
2021-10-25 22:56:25 EnOcean SCH_WZ_F_EnO_Thermokon buttons: pressed
2021-10-25 22:56:25 EnOcean SCH_WZ_F_EnO_Thermokon channelA: AI
2021-10-25 22:56:25 EnOcean SCH_WZ_F_EnO_Thermokon AI
2021-10-25 22:56:25 EnOcean SCH_WZ_F_EnO_Thermokon buttons: released
2021-10-25 22:56:26 structure str_GAR_Terra_Kue_Bel off
2021-10-25 22:56:26 EnOcean AC_GAR_FSR14_2x_1_Mauer_EnO_Elta block: unlock
2021-10-25 22:56:26 structure str_GAR_Terra_Kue_Bel off
2021-10-25 22:56:26 EnOcean AC_GAR_FSR14_2x_1_Mauer_EnO_Elta off
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_nr: 1
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_seqnr: 1
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd: 1.1
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_event: SCH_WZ_F_EnO_Thermokon
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_1_1
2021-10-25 22:56:26 structure str_GAR_Terra_Kue_Bel off
2021-10-25 22:56:26 EnOcean AC_GAR_FSR14_2x_2_Treppe_EnO_Elta block: unlock
2021-10-25 22:56:26 structure str_GAR_Terra_Kue_Bel off
2021-10-25 22:56:26 EnOcean AC_GAR_FSR14_2x_2_Treppe_EnO_Elta off
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_nr: 1
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_seqnr: 2
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd: 1.2
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_event: SCH_WZ_F_EnO_Thermokon
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_1_2
2021-10-25 22:56:26 EnOcean AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta block: unlock
2021-10-25 22:56:26 EnOcean AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta off
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_nr: 1
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_seqnr: 3
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd: 1.3
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_event: SCH_WZ_F_EnO_Thermokon
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_1_3
2021-10-25 22:56:26 EnOcean AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta block: unlock
2021-10-25 22:56:26 EnOcean AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta off
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_nr: 1
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_seqnr: 4
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd: 1.4
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_event: SCH_WZ_F_EnO_Thermokon
2021-10-25 22:56:26 DOIF DI_allLightsGardenOFF cmd_1
2021-10-25 22:56:26 DOIF DI_allLightsGardenON waitsame: cmd_1
2021-10-25 22:56:26 EnOcean SCH_WZ_F_EnO_Thermokon buttons: pressed
2021-10-25 22:56:26 EnOcean SCH_WZ_F_EnO_Thermokon channelB: B0
2021-10-25 22:56:26 EnOcean SCH_WZ_F_EnO_Thermokon B0
2021-10-25 22:56:26 EnOcean SCH_WZ_F_EnO_Thermokon buttons: released
2021-10-25 22:56:26 structure str_GAR_Terra_Kue_Bel off
2021-10-25 22:56:26 EnOcean AC_GAR_FSR14_2x_1_Mauer_EnO_Elta off
2021-10-25 22:56:26 structure str_GAR_Terra_Kue_Bel off
2021-10-25 22:56:26 EnOcean AC_GAR_FSR14_2x_2_Treppe_EnO_Elta off


Hat jemand Erfahrung mit diesen Tastern und FHEM?
Stimmt etwas nicht mit meiner aufgeführten Konfiguration?

Btw. wird bei längerem Drücken eines Tasters nicht BI, B0, etc. im Event Monitor angezeigt sonder einfach nur:

2021-10-25 22:58:17 EnOcean SCH_WZ_F_EnO_Thermokon buttons: pressed
2021-10-25 22:58:17 EnOcean SCH_WZ_F_EnO_Thermokon pressed
2021-10-25 22:58:17 EnOcean SCH_WZ_F_EnO_Thermokon buttons: released


Da passt doch auch etwas nicht oder ist das bei diesen Tastern normal?
Ist das der Fall, fällt die Option langes Drücken von z.B. B0 komplett weg!
Aber das ist tätsächlich momentan Nebensache...

Ich freue mich auf eure Antworten und hoffentlich Hilfe.
Vielen Dank & viele Grüße.








Flachzange

Das klingt mir jetzt weniger nach einem EnOcean- oder Tasterproblem, sondern nach einer DOIF-Konfiguration, denn nur die ist in Deinem Setup für den Doppelklick verantwortlich. Hierzu bitte auch mal das zweite DOIF posten, von dem Du schreibst. Ich würde in jedem Fall jetzt mal das ":state" weggelassen im DOIF.

Langes drücken geht genauso mit DOIF, aber dann musst Du zwingend über "pressed" und "released" gehen (In Kombination mit STATE (nicht:state), um zu unterscheiden, ob oben oder unten gedrück wurde). Das DOIF ist dann minimal komplizierter, weil Du mit Timern und Prüfung auf diesen arbeiten musst.

twinFHEM

Hallo Flachzange & danke für die Antwort.
Die jetzige state-Version ist einer von mehreren Versuchen. Da sie grundsätzlich die richtige Funktion zeigte, habe ich sie so gelassen.
Den Standard SCH_SZ_F_EnO_Thermokon:B0 und Versuche wie ([SCH_WZ_F_EnO_Thermokon] eq ".*B0.*") habe ich bereits hinter mir.
Ich nehme :state nochmal heraus.

Hier das zweite DOIF:

Internals:
   DEF        ([SCH_WZ_F_EnO_Thermokon:BI] or
[SCH_KUE_F_EnO_Thermokon:AI])
(set AC_GAR_FSR14_2x_1_Mauer_EnO_Elta off)
(set AC_GAR_FSR14_2x_2_Treppe_EnO_Elta off)
(set AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta off)
(set AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta off)
   FUUID      6170829f-f33f-b102-52ad-f5877a2e887e6b53
   MODEL      FHEM
   NAME       DI_allLightsGardenOFF
   NOTIFYDEV  SCH_WZ_F_EnO_Thermokon,global,SCH_KUE_F_EnO_Thermokon
   NR         174
   NTFY_ORDER 50-DI_allLightsGardenOFF
   STATE      initialized
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   READINGS:
     2021-10-26 10:08:37   cmd             0
     2021-10-26 10:08:37   mode            enabled
     2021-10-26 10:08:37   state           initialized
   Regex:
     accu:
     collect:
     cond:
       SCH_KUE_F_EnO_Thermokon:
         0:
           AI         ^SCH_KUE_F_EnO_Thermokon$:^AI:
       SCH_WZ_F_EnO_Thermokon:
         0:
           BI         ^SCH_WZ_F_EnO_Thermokon$:^BI:
   attr:
     cmdState:
     wait:
     waitdel:
     waitsame:
       2
   condition:
     0          ::ReadingValDoIf($hash,'SCH_WZ_F_EnO_Thermokon','BI') or ::ReadingValDoIf($hash,'SCH_KUE_F_EnO_Thermokon','AI')
   do:
     0:
       0          set AC_GAR_FSR14_2x_1_Mauer_EnO_Elta off
       1          set AC_GAR_FSR14_2x_2_Treppe_EnO_Elta off
       2          set AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta off
       3          set AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta off
     1:
   helper:
     DEVFILTER  ^global$|^SCH_WZ_F_EnO_Thermokon$|^SCH_KUE_F_EnO_Thermokon$
     NOTIFYDEV  global|SCH_WZ_F_EnO_Thermokon|SCH_KUE_F_EnO_Thermokon
     globalinit 1
     last_timer 0
     sleeptimer -1
   readings:
     all         SCH_WZ_F_EnO_Thermokon:BI SCH_KUE_F_EnO_Thermokon:AI
   uiState:
   uiTable:
Attributes:
   do         always
   waitsame   2


Das STATE (nicht:state) beim langen Drücken werde ich mir nochmal genauer ansehen.

Viele Grüße

Flachzange

#3
Also...

([SCH_WZ_F_EnO_Thermokon] eq "B0" or [SCH_KUE_F_EnO_Thermokon] eq "A0")

wäre jetzt wie ich es notieren würde.


ZitatDas funktioniert leider nur sporadisch und gefühlt willkürlich. Drücke ich z.b. 1x B0 und 1x BI, um zwei verschiedene Lampen einzeln zu schalten, geht alles aus. Dies sollte eigentlich nur bei 2x BI geschehen. Selbst das einmalige Drücken von AI (ganz andere Lampe und Direktverbindung) und dann B0 lässt alles ausgehen obwohl ich zwei verschiedene Lampen einschalten wollte.

Das liegt vermutlich daran, dass in beiden DOIFs ein DOELSE() am Ende fehlt. Ohne das verharrt das DOIF beim ersten Drücken einer Taste im wait-Zustand für "cmd_1". Egal, was Du dann dazwischen drückst, drückst Du irgendwann nochmal eine der beiden Tasten triggert das DOIF in "cmd_1". Versuche mal folgendes:

([SCH_WZ_F_EnO_Thermokon] eq "B0" or [SCH_KUE_F_EnO_Thermokon] eq "A0")(...) DOELSE()

Analog im anderen DOIF. Dabei muss Dir klar sein, dass auch eine Kombination B0,A0 und A0,B0 ein Doppeltasten auslösen würde.

Aufpassen: Wenn der Taster auch zwei Zustände gleichzeitig annehmen kann, also eine Kombination aus A und B. Das äußert sich dann in einem state wie AI,BI (zum Beispiel). Das passiert in der Regel dann wenn man bei einem Serientaster beide Wippen gleichzeitig drückt. Ich vermute, dass es trotzdem funktioniert, aber Du solltest es mal testen.


Nachfolgend ein mögliches Beispiel, um langes Drücken zu realisieren:

Internals:
   DEF        (["Schalter_1_fach_Schlafzimmer_Bett_:buttons:.pressed"] and [$DEVICE] eq "B0")(msg 'Licht: Alles aus. Folgende Lampen werden ausgeschaltet: [@"^Lichtaktor_":state:"on"]', set Lichtaktor.*:FILTER=STATE=on off)
DOELSEIF(["Schalter_1_fach_Schlafzimmer_Bett_:buttons:.released"] and [?DOIF_Licht_Alles_Aus:wait_timer] =~/cmd_/)()
   DOIFDEV    ^global$|Schalter_1_fach_Schlafzimmer_Bett_
   FUUID      613f88fe-f33f-fd7e-7344-768ec60034b975b5
   MODEL      FHEM
   NAME       DOIF_Licht_Alles_Aus
   NR         411
   NTFY_ORDER 50-DOIF_Licht_Alles_Aus
   STATE      cmd_1
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   Helper:
     DBLOG:
       cmd:
         logdb:
           TIME       1635194944.9228
           VALUE      1
       cmd_event:
         logdb:
           TIME       1635194944.9228
           VALUE      Schalter_1_fach_Schlafzimmer_Bett_links
       cmd_nr:
         logdb:
           TIME       1635194944.9228
           VALUE      1
       state:
         logdb:
           TIME       1635194944.9228
           VALUE      cmd_1
       wait_timer:
         logdb:
           TIME       1635194944.60454
           VALUE      no timer
   READINGS:
     2021-10-25 22:49:07   Device          Schalter_1_fach_Schlafzimmer_Bett_links
     2021-10-25 22:49:04   cmd             1
     2021-10-25 22:49:04   cmd_event       Schalter_1_fach_Schlafzimmer_Bett_links
     2021-10-25 22:49:04   cmd_nr          1
     2021-09-29 06:11:48   mode            enabled
     2021-10-25 22:49:04   state           cmd_1
     2021-10-25 22:49:04   wait_timer      no timer
   Regex:
     accu:
     collect:
     cond:
       :
         0:
           "Schalter_1_fach_Schlafzimmer_Bett_:buttons:.pressed" Schalter_1_fach_Schlafzimmer_Bett_:buttons:.pressed
         1:
           "Schalter_1_fach_Schlafzimmer_Bett_:buttons:.released" Schalter_1_fach_Schlafzimmer_Bett_:buttons:.released
   attr:
     cmdState:
     wait:
       0:
         1
       1:
         0
     waitdel:
   condition:
     0          ::EventDoIf('Schalter_1_fach_Schlafzimmer_Bett_',$hash,'buttons:.pressed',0) and ::InternalDoIf($hash,'$DEVICE','STATE') eq "B0"
     1          ::EventDoIf('Schalter_1_fach_Schlafzimmer_Bett_',$hash,'buttons:.released',0) and ::ReadingValDoIf($hash,'DOIF_Licht_Alles_Aus','wait_timer') =~/cmd_/
   do:
     0:
       0          msg 'Licht: Alles aus. Folgende Lampen werden ausgeschaltet: [@"^Lichtaktor_":state:"on"]', set Lichtaktor.*:FILTER=STATE=on off
     1:
       0         
     2:
   helper:
     DEVFILTER  ^global$|Schalter_1_fach_Schlafzimmer_Bett_
     NOTIFYDEV  global|.*Schalter_1_fach_Schlafzimmer_Bett_.*
     event      buttons: released
     globalinit 1
     last_timer 0
     sleepdevice Schalter_1_fach_Schlafzimmer_Bett_links
     sleepsubtimer -1
     sleeptimer -1
     timerdev   Schalter_1_fach_Schlafzimmer_Bett_links
     timerevent buttons: pressed
     triggerDev Schalter_1_fach_Schlafzimmer_Bett_links
     timerevents:
       buttons: pressed
       channelB: B0
       B0
     timereventsState:
       buttons: pressed
       channelB: B0
       state: B0
     triggerEvents:
       buttons: released
     triggerEventsState:
       buttons: released
   internals:
     all         $DEVICE:STATE
   perlblock:
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   comment    Beim Drücken der Schalter am Bett (oben) werden alle Lampen ausgeschaltet, die noch eingeschaltet sind. Wird zu früh losgelassen passiert nichts
   do         resetwait
   room       Licht
   verbose    1
   wait       1:0

twinFHEM

Hi Flachzange,
erstmal vielen Dank für die ausführliche Antwort.

Die Sache mit DOELSE () klang plausibel und ich habe das Ganze angepasst.

Internals:
   DEF        ([SCH_WZ_F_EnO_Thermokon] eq "BI" or [SCH_KUE_F_EnO_Thermokon] eq "AI")
(set AC_GAR_FSR14_2x_1_Mauer_EnO_Elta on)
(set AC_GAR_FSR14_2x_2_Treppe_EnO_Elta on)
(set AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta on)
(set AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta on) DOELSE ()
   FUUID      61707b6f-f33f-b102-010f-c60aacf617913004
   MODEL      FHEM
   NAME       DI_allLightsGardenON
   NOTIFYDEV  SCH_WZ_F_EnO_Thermokon,SCH_KUE_F_EnO_Thermokon,global
   NR         173
   NTFY_ORDER 50-DI_allLightsGardenON
   STATE      cmd_2
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   READINGS:
     2021-11-01 00:06:15   Device          SCH_WZ_F_EnO_Thermokon
     2021-11-01 00:06:15   cmd             2
     2021-11-01 00:06:15   cmd_event       SCH_WZ_F_EnO_Thermokon
     2021-11-01 00:06:15   cmd_nr          2
     2021-11-01 00:06:15   e_SCH_WZ_F_EnO_Thermokon_STATE A0
     2021-10-30 01:36:00   mode            enabled
     2021-11-01 00:06:15   state           cmd_2
   Regex:
     accu:
     collect:
     cond:
       SCH_KUE_F_EnO_Thermokon:
         0:
           &STATE     ^SCH_KUE_F_EnO_Thermokon$
       SCH_WZ_F_EnO_Thermokon:
         0:
           &STATE     ^SCH_WZ_F_EnO_Thermokon$
   attr:
     cmdState:
     wait:
     waitdel:
     waitsame:
       2
   condition:
     0          ::InternalDoIf($hash,'SCH_WZ_F_EnO_Thermokon','STATE') eq "BI" or ::InternalDoIf($hash,'SCH_KUE_F_EnO_Thermokon','STATE') eq "AI"
   do:
     0:
       0          set AC_GAR_FSR14_2x_1_Mauer_EnO_Elta on
       1          set AC_GAR_FSR14_2x_2_Treppe_EnO_Elta on
       2          set AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta on
       3          set AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta on
     1:
       0         
   helper:
     DEVFILTER  ^global$|^SCH_KUE_F_EnO_Thermokon$|^SCH_WZ_F_EnO_Thermokon$
     NOTIFYDEV  global|SCH_KUE_F_EnO_Thermokon|SCH_WZ_F_EnO_Thermokon
     event      buttons: released
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   SCH_WZ_F_EnO_Thermokon
     timerevent buttons: released
     triggerDev SCH_WZ_F_EnO_Thermokon
     DOIF_eventa:
       cmd_nr: 2
       cmd: 2
       cmd_event: SCH_WZ_F_EnO_Thermokon
       cmd_2
     DOIF_eventas:
       cmd_nr: 2
       cmd: 2
       cmd_event: SCH_WZ_F_EnO_Thermokon
       state: cmd_2
     timerevents:
       buttons: released
     timereventsState:
       buttons: released
     triggerEvents:
       buttons: released
     triggerEventsState:
       buttons: released
   internals:
     all         SCH_WZ_F_EnO_Thermokon:STATE SCH_KUE_F_EnO_Thermokon:STATE
   readings:
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   waitsame   2


Ich habe übers Wochenende ausgiebig getestet, aber eine gravierende Verbesserung konnte ich leider nicht feststellen. Nach wie vor funktioniert es, wenn ich
2x BI für AllesAn und 2x B0 für AllesAus drücke. Allerdings geht auch alles aus bzw. an, wenn ich BI -> B0 bzw. B0 -> BI drücke. Je nachdem, was ich zuletzt gedrückt habe, trifft ein. Das Ganze ist mir doch sehr suspekt!

Zitat
Dabei muss Dir klar sein, dass auch eine Kombination B0,A0 und A0,B0 ein Doppeltasten auslösen würde.
Beziehst Du das generell auf diese Schalter oder auf meine Konfig?
Ich habe zwei verschiedene Schalter aufgeführt.

Danke Dir für den Ansatz fürs lange Drücken. Da das Doppelklicken leider nicht sehr zufriedenstellend ist, werde ich dies versuchen.
Ich werde eine SEQUENCE und ein DOIF erstellen und schauen, was besser funktioniert. Wenn es funktioniert... ;-)




Flachzange

Mein Fehler, ich hatte nicht auf dem Schirm, dass die Taster bei einem Tastendruck (pressed/released) mehrere Events senden und somit das DOIF bei [SCH_WZ_F_EnO_Thermokon] gleich mehrfach auslöst und somit die waitsame-Bedingunge erfüllen. U.a. dein Weg über state führt zum Ziel, weil dann nur auf state getriggert wird.

Du bekommst wie folgt alles in einem DOIF unter:

([SCH_WZ_F_EnO_Thermokon:state] eq "B0" or [SCH_WZ_F_EnO_Thermokon:state] eq "A0")(set set AC_GAR_FSR14_2x_1_Mauer_EnO_Elta off, set AC_GAR_FSR14_2x_2_Treppe_EnO_Elta off, set AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta off, set AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta  off)
DOELSEIF ([SCH_WZ_F_EnO_Thermokon:state] eq "BI" or [SCH_WZ_F_EnO_Thermokon:state] eq "AI")(set set AC_GAR_FSR14_2x_1_Mauer_EnO_Elta on, set AC_GAR_FSR14_2x_2_Treppe_EnO_Elta on, set AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta on, set AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta on)

attr waitsame 2:2
attr do always


Falls ich jetzt nichts falsch zusammenkopiert habe.

twinFHEM

#6
Also, so langsam kommen Zweifel auf... ;D

Ich habe folgende SEQUENCE...

Internals:
   DEF        SCH_WZ_F_EnO_Thermokon:buttons:.pressed 0.5 SCH_WZ_F_EnO_Thermokon:BI 2:5 SCH_WZ_F_EnO_Thermokon:buttons:.released
   FUUID      6181a6ab-f33f-b102-0578-136879ff9ff00220
   IDX        0
   MAX        5
   NAME       SEQ_SCH_WZ_BI
   NOTIFYDEV  SCH_WZ_F_EnO_Thermokon
   NR         176
   NTFY_ORDER 50-SEQ_SCH_WZ_BI
   RE         SCH_WZ_F_EnO_Thermokon:buttons:.pressed
   STATE      active
   TS         0
   TYPE       sequence
Attributes:


die dieses DOIF triggern soll:

Internals:
   DEF        ([SEQ_SCH_WZ_BI:"trigger"]) (set AC_GAR_FSR14_2x_1_Mauer_EnO_Elta on) (set AC_GAR_FSR14_2x_2_Treppe_EnO_Elta on) (set AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta on) (set AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta on)
   FUUID      6181a798-f33f-b102-5902-9ff38cc70a6f6407
   MODEL      FHEM
   NAME       DI_allGardenOnByWZ_BI
   NOTIFYDEV  SEQ_SCH_WZ_BI,global
   NR         177
   NTFY_ORDER 50-DI_allGardenOnByWZ_BI
   STATE      initialized
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   READINGS:
     2021-11-02 22:21:21   cmd             0
     2021-11-02 22:21:21   mode            enabled
     2021-11-02 22:21:21   state           initialized
   Regex:
     accu:
     collect:
     cond:
       SEQ_SCH_WZ_BI:
         0:
           &STATE     ^SEQ_SCH_WZ_BI$
   condition:
     0          ::EventDoIf('SEQ_SCH_WZ_BI',$hash,'trigger',1)
   do:
     0:
       0          set AC_GAR_FSR14_2x_1_Mauer_EnO_Elta on
       1          set AC_GAR_FSR14_2x_2_Treppe_EnO_Elta on
       2          set AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta on
       3          set AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta on
     1:
   helper:
     DEVFILTER  ^global$|^SEQ_SCH_WZ_BI$
     NOTIFYDEV  global|SEQ_SCH_WZ_BI
     globalinit 1
     last_timer 0
     sleeptimer -1
   perlblock:
   trigger:
     all         SEQ_SCH_WZ_BI
   uiState:
   uiTable:
Attributes:
   do         always


Kann mir jemand sagen, warum es nicht getriggert wird?
Was übersehe ich?

Auszug aus Event Monitor:

2021-11-02 23:22:37 EnOcean SCH_WZ_F_EnO_Thermokon buttons: pressed
2021-11-02 23:22:37 EnOcean SCH_WZ_F_EnO_Thermokon channelB: BI
2021-11-02 23:22:37 EnOcean SCH_WZ_F_EnO_Thermokon BI
2021-11-02 23:22:41 EnOcean SCH_WZ_F_EnO_Thermokon buttons: released


Zudem habe ich es mit dem DOIF inkl. DOELSEIF in etwas abgeänderter Form ausprobiert.
Meiner Meinung nach korrekt, auch was das waitsame 2:2 angeht. Egal, ob ich 2x BI oder 2x B0 nehme, es wird der Befehl zum Ausschalten gegeben.


Internals:
   DEF        ([SCH_WZ_F_EnO_Thermokon:state] eq "B0" or [SCH_KUE_F_EnO_Thermokon:state] eq "A0")
(set AC_GAR_FSR14_2x_1_Mauer_EnO_Elta off)
(set AC_GAR_FSR14_2x_2_Treppe_EnO_Elta off)
(set AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta off)
(set AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta  off)
DOELSEIF ([SCH_WZ_F_EnO_Thermokon:state] eq "BI" or [SCH_KUE_F_EnO_Thermokon:state] eq "AI")
(set AC_GAR_FSR14_2x_1_Mauer_EnO_Elta on)
(set AC_GAR_FSR14_2x_2_Treppe_EnO_Elta on)
(set AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta on)
(set AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta on)
   FUUID      61819f02-f33f-b102-7b1a-10ebbc9e042de1e0
   MODEL      FHEM
   NAME       DI_allLightsGarden
   NOTIFYDEV  global,SCH_KUE_F_EnO_Thermokon,SCH_WZ_F_EnO_Thermokon
   NR         175
   NTFY_ORDER 50-DI_allLightsGarden
   STATE      cmd_1
   TYPE       DOIF
   VERSION    24905 2021-09-01 18:35:54
   READINGS:
     2021-11-02 23:22:42   Device          SCH_WZ_F_EnO_Thermokon
     2021-11-02 23:22:43   cmd             1.4
     2021-11-02 23:22:43   cmd_event       SCH_WZ_F_EnO_Thermokon
     2021-11-02 23:22:43   cmd_nr          1
     2021-11-02 23:22:43   cmd_seqnr       4
     2021-11-02 23:22:42   e_SCH_WZ_F_EnO_Thermokon_state B0
     2021-11-02 23:11:55   mode            enabled
     2021-11-02 23:22:43   state           cmd_1
   Regex:
     accu:
     collect:
     cond:
       SCH_KUE_F_EnO_Thermokon:
         0:
           state      ^SCH_KUE_F_EnO_Thermokon$:^state:
         1:
           state      ^SCH_KUE_F_EnO_Thermokon$:^state:
       SCH_WZ_F_EnO_Thermokon:
         0:
           state      ^SCH_WZ_F_EnO_Thermokon$:^state:
         1:
           state      ^SCH_WZ_F_EnO_Thermokon$:^state:
   attr:
     cmdState:
     wait:
     waitdel:
     waitsame:
       2
       2
   condition:
     0          ::ReadingValDoIf($hash,'SCH_WZ_F_EnO_Thermokon','state') eq "B0" or ::ReadingValDoIf($hash,'SCH_KUE_F_EnO_Thermokon','state') eq "A0"
     1          ::ReadingValDoIf($hash,'SCH_WZ_F_EnO_Thermokon','state') eq "BI" or ::ReadingValDoIf($hash,'SCH_KUE_F_EnO_Thermokon','state') eq "AI"
   do:
     0:
       0          set AC_GAR_FSR14_2x_1_Mauer_EnO_Elta off
       1          set AC_GAR_FSR14_2x_2_Treppe_EnO_Elta off
       2          set AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta off
       3          set AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta  off
     1:
       0          set AC_GAR_FSR14_2x_1_Mauer_EnO_Elta on
       1          set AC_GAR_FSR14_2x_2_Treppe_EnO_Elta on
       2          set AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta on
       3          set AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta on
     2:
   helper:
     DEVFILTER  ^global$|^SCH_KUE_F_EnO_Thermokon$|^SCH_WZ_F_EnO_Thermokon$
     NOTIFYDEV  global|SCH_KUE_F_EnO_Thermokon|SCH_WZ_F_EnO_Thermokon
     event      buttons: pressed,channelB: B0,B0
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   SCH_WZ_F_EnO_Thermokon
     timerevent buttons: pressed,channelB: B0,B0
     triggerDev SCH_WZ_F_EnO_Thermokon
     timerevents:
       buttons: pressed
       channelB: B0
       B0
     timereventsState:
       buttons: pressed
       channelB: B0
       state: B0
     triggerEvents:
       buttons: pressed
       channelB: B0
       B0
     triggerEventsState:
       buttons: pressed
       channelB: B0
       state: B0
   internals:
   readings:
     all         SCH_WZ_F_EnO_Thermokon:state SCH_KUE_F_EnO_Thermokon:state
   trigger:
   uiState:
   uiTable:
Attributes:
   do         always
   waitsame   2:2


Der entsprechende Auszug aus dem Event Monitor:

2021-11-02 23:22:37 DOIF DI_allLightsGarden waitsame: cmd_1
2021-11-02 23:22:37 EnOcean SCH_WZ_F_EnO_Thermokon buttons: pressed
2021-11-02 23:22:37 EnOcean SCH_WZ_F_EnO_Thermokon channelB: BI
2021-11-02 23:22:37 EnOcean SCH_WZ_F_EnO_Thermokon BI
2021-11-02 23:22:37 EnOcean SCH_WZ_F_EnO_Thermokon buttons: released
2021-11-02 23:22:38 structure str_GAR_Terra_Kue_Bel off
2021-11-02 23:22:38 EnOcean AC_GAR_FSR14_2x_1_Mauer_EnO_Elta block: unlock
2021-11-02 23:22:38 structure str_GAR_Terra_Kue_Bel off
2021-11-02 23:22:38 EnOcean AC_GAR_FSR14_2x_1_Mauer_EnO_Elta off
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_nr: 1
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_seqnr: 1
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd: 1.1
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_event: SCH_WZ_F_EnO_Thermokon
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_1_1
2021-11-02 23:22:38 structure str_GAR_Terra_Kue_Bel off
2021-11-02 23:22:38 EnOcean AC_GAR_FSR14_2x_2_Treppe_EnO_Elta block: unlock
2021-11-02 23:22:38 structure str_GAR_Terra_Kue_Bel off
2021-11-02 23:22:38 EnOcean AC_GAR_FSR14_2x_2_Treppe_EnO_Elta off
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_nr: 1
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_seqnr: 2
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd: 1.2
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_event: SCH_WZ_F_EnO_Thermokon
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_1_2
2021-11-02 23:22:38 EnOcean AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta block: unlock
2021-11-02 23:22:38 EnOcean AC_GAR_FSR14_4x_1_BaumMauer_EnO_Elta off
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_nr: 1
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_seqnr: 3
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd: 1.3
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_event: SCH_WZ_F_EnO_Thermokon
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_1_3
2021-11-02 23:22:38 EnOcean AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta block: unlock
2021-11-02 23:22:38 EnOcean AC_GAR_FSR14_4x_2_MauerBaum_EnO_Elta off
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_nr: 1
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_seqnr: 4
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd: 1.4
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_event: SCH_WZ_F_EnO_Thermokon
2021-11-02 23:22:38 DOIF DI_allLightsGarden cmd_1
2021-11-02 23:22:38 EnOcean SCH_WZ_F_EnO_Thermokon buttons: pressed
2021-11-02 23:22:38 EnOcean SCH_WZ_F_EnO_Thermokon channelB: BI
2021-11-02 23:22:38 EnOcean SCH_WZ_F_EnO_Thermokon BI
2021-11-02 23:22:38 EnOcean SCH_WZ_F_EnO_Thermokon buttons: released
2021-11-02 23:22:38 structure str_GAR_Terra_Kue_Bel off
2021-11-02 23:22:38 EnOcean AC_GAR_FSR14_2x_1_Mauer_EnO_Elta off
2021-11-02 23:22:38 structure str_GAR_Terra_Kue_Bel off
2021-11-02 23:22:38 EnOcean AC_GAR_FSR14_2x_2_Treppe_EnO_Elta off
2021-11-02 23:22:42 DOIF DI_allLightsGarden waitsame: cmd_1
2021-11-02 23:22:42 EnOcean SCH_WZ_F_EnO_Thermokon buttons: pressed
2021-11-02 23:22:42 EnOcean SCH_WZ_F_EnO_Thermokon channelB: B0
2021-11-02 23:22:42 EnOcean SCH_WZ_F_EnO_Thermokon B0
2021-11-02 23:22:42 EnOcean SCH_WZ_F_EnO_Thermokon buttons: released
2021-11-02 23:22:43 structure str_GAR_Terra_Kue_Bel off
2021-11-02 23:22:43 EnOcean AC_GAR_FSR14_2x_1_Mauer_EnO_Elta block: unlock
2021-11-02 23:22:43 structure str_GAR_Terra_Kue_Bel off
2021-11-02 23:22:43 EnOcean AC_GAR_FSR14_2x_1_Mauer_EnO_Elta off
2021-11-02 23:22:43 DOIF DI_allLightsGarden cmd_nr: 1
...


Habe auch Varianten mit einem zusätzlichen DOELSE, waitsame nur mit 2, aber auch mal 2:2:0 (bei DOELSE) ausprobiert; ohne Erfolg.
Die SEQUENCE auch mit *, allerdings auch ohne Erfolg.







Flachzange

Mein DOIF oben habe ich mit einem physischen Taster und echtem Licht getestet. Ich bin mir sicher, das es funktioniert. Jedenfalls mit einem PTM210DB oder PTM215DB:-)

Ich würde an Deiner Stelle mal allles auf ein Minimal-Konstrukt zusammenstauchen. Mit Sequence bringst Du jetzt noch etwas ins Spiel, dass bei der Fehlersuche bestimmt nicht hilft.

Gemäß Deinem Event-Monitor triggert der Taster zweimal in zwei Sekunden, was dazu führt, dass waitsame erfüllt ist. Warum das passiert müsstest Du rausfinden.

2021-11-02 23:22:37 DOIF DI_allLightsGarden waitsame: cmd_1
2021-11-02 23:22:37 EnOcean SCH_WZ_F_EnO_Thermokon buttons: pressed
2021-11-02 23:22:37 EnOcean SCH_WZ_F_EnO_Thermokon channelB: BI
2021-11-02 23:22:37 EnOcean SCH_WZ_F_EnO_Thermokon BI
2021-11-02 23:22:37 EnOcean SCH_WZ_F_EnO_Thermokon buttons: released
....
2021-11-02 23:22:38 EnOcean SCH_WZ_F_EnO_Thermokon buttons: pressed
2021-11-02 23:22:38 EnOcean SCH_WZ_F_EnO_Thermokon channelB: BI
2021-11-02 23:22:38 EnOcean SCH_WZ_F_EnO_Thermokon BI
2021-11-02 23:22:38 EnOcean SCH_WZ_F_EnO_Thermokon buttons: released
...


Also einfach mal ganz unabhängig vom DOIF prüfen, was Deine Taster bei Tastendruck machen. Inwiefern die Structures im Log damit reinspielen müsstest Du auch mal schauen.

Weitere Ideen:
- Die Attribute event-min-interval oder event-on-change-reading helfen Dir vermutlich nicht
- Waitsame auf einen höheren Wert stellen, um einfach mal zu schauen, ob irgendetwas dazwischen triggert, was Du gar nicht ausgelöst hast
- Keine Befehlssequenzen im Ausführungsteil. Wenn ich es richtig im Kopf habe ist das langsamer und brauchst Du nur, wenn du mit wait zwischen den Sequenzen abeiten musst.

twinFHEM

Zitat
Mein DOIF oben habe ich mit einem physischen Taster und echtem Licht getestet. Ich bin mir sicher, das es funktioniert. Jedenfalls mit einem PTM210DB oder PTM215DB:-)
Das nehme ich Dir ab! :)
Das DOIF ist wirklich nicht komplex und ich sehe es auch so, dass es 100%ig passen sollte.

Da mir nur noch ein Defekt des Schalters plausibel war, habe ich einen anderen genommen und siehe da, es lief!
Dann habe ich wieder den vermeintlich defekten Schalter hinzugezogen und dieser tut so als sei nichts gewesen und funktioniert bis auf Weiteres auch.

Nun muss ich davon ausgehen, dass das ganze Problem bei FHEM liegt. Es läuft trotz Neustarts zum größten Teil sehr träge, z.T. sind Seiten nicht erreichbar.
Der Event Monitor z.B. hängt immer hinterher obwohl nicht allzu viel gelistet wird. Beim Testschalten der DOIFs ging es mal sofort, aber meistens dauerte es ein paar mehr Sekunden bis das Licht aus- bzw. anging. Den Raspberry Charly als Hardware schließe ich aus.

Also, das DOIF betrachte ich als gelöst & bedanke mich bei Dir.
Nun mache ich mich noch an die SEQUENCE, damit ich diese Themen ein für alle Mal abhaken kann. ;)
Wäre klasse, wenn mir diesbezüglich jemand sagen könnte, ob es so korrekt und fehlerfrei ist. Somit kann ich den Fehler bei Schalter oder FHEM suchen.

thx & gruß

twinFHEM

Bin nochmal in mich gegangen und habe den langen Tasterdruck so umgesetzt:

([SCH_SZ_F_EnO_Thermokon:buttons] eq "released" and [?SCH_SZ_F_EnO_Thermokon:state:sec]>3 and [?SCH_SZ_F_EnO_Thermokon:state:sec]<6 and [DY_LupusBWTestLampe] eq "on") (set DY_LupusBWTestLampe off) ...


Einfach & funktioniert! :)

Flachzange

Ja, das ist wirklich schön einfach. Bei der anderen Variante finde ich charmant, dass man nicht genau das zeitliche Interval treffen muss, sondern einfach nur den Taster gedrückt hält und man dann anhand der Aktion (z.B. Licht an), dass es funktioniert hat.