[Gelöst] Wiederholte Befehlssequenzen von Taster über DOIF

Begonnen von FHEm2005, 05 Juli 2016, 13:59:08

Vorheriges Thema - Nächstes Thema

FHEm2005

Ein zweifach Homatic-Taster erzeugt über einen virtuellen Aktor in einem UserReading TrigType je nach Tastendruck und je Taster vier verschiedene Zustände/Events: short_on, short_off, long_Up und long_down. Die short-Events sind single-shot und die long-Events "feuern" mehrfach bis zum Loslassen der Taste.

Es geht darum, dass die mehrfachen Events bei längerem Drücken auch mehrfache Befehle aus DOIF aussenden sollen - und genau das geht nicht. Sie agieren einmal und dann ist Feierabend. Funktion so, als würde "do always" fehlen. Deshalb hier die Angaben:


Internals:
   CFGFN
   DEF        ([virt_Akt01_Btn1:"long_Down"]) (set SB3.Buero volumeDown)
DOELSEIF ([virt_Akt01_Btn1:"long_Up"]) (set SB3.Buero volumeUp)
DOELSEIF ([virt_Akt01_Btn1:"short_ON"]) (set SB3.Buero on)
DOELSEIF ([virt_Akt01_Btn1:"short_OFF"]) (set SB3.Buero off)
   NAME       di_Test
   NR         1468
   NTFY_ORDER 50-di_Test
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-07-05 12:26:32   Device          virt_Akt01_Btn1
     2016-07-05 12:26:31   cmd             1
     2016-07-05 12:26:31   cmd_event       virt_Akt01_Btn1
     2016-07-05 12:26:31   cmd_nr          1
     2016-07-05 12:26:32   e_virt_Akt01_Btn1_events virtActTrigRpt: 7,virtActTrigType: long_Release
     2016-07-05 12:26:31   state           cmd_1
   Condition:
     0          EventDoIf('virt_Akt01_Btn1',$hash,'long_Down',1)
     1          EventDoIf('virt_Akt01_Btn1',$hash,'long_Up',1)
     2          EventDoIf('virt_Akt01_Btn1',$hash,'short_ON',1)
     3          EventDoIf('virt_Akt01_Btn1',$hash,'short_OFF',1)
   Devices:
     0           virt_Akt01_Btn1
     1           virt_Akt01_Btn1
     2           virt_Akt01_Btn1
     3           virt_Akt01_Btn1
     all         virt_Akt01_Btn1
   Do:
     0:
       0          set SB3.Buero volumeDown
     1:
       0          set SB3.Buero volumeUp
     2:
       0          set SB3.Buero on
     3:
       0          set SB3.Buero off
     4:
   Helper:
     event      virtActTrigRpt: 7,virtActTrigType: long_Release
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   virt_Akt01_Btn1
     timerevent TrigType: long_Down
     triggerDev virt_Akt01_Btn1
     timerevents:
       ON
       virtActState: ON
       virtActTrigNo: 232
       virtActTrigRpt: 1
       virtActTrigType: long
       TrigType: long_Down
     timereventsState:
       state: ON
       virtActState: ON
       virtActTrigNo: 232
       virtActTrigRpt: 1
       virtActTrigType: long
       TrigType: long_Down
     triggerEvents:
       virtActTrigRpt: 7
       virtActTrigType: long_Release
     triggerEventsState:
       virtActTrigRpt: 7
       virtActTrigType: long_Release
   Internals:
   Itimer:
   Readings:
   Regexp:
     0:
     1:
     2:
     3:
     All:
   State:
   Trigger:
     all         virt_Akt01_Btn1
Attributes:
   do         always
   event-on-change-reading .*
   room       Schalter


repeatcmd
wiederholt den Befehl bis zum Sankt-Nimmerleins-Tag: also auch nicht.

Ich habe das Forum vor und zurück durchsucht. Was auf meinen Fall passt, habe ich nicht gefunden. Was kann ich tun?

Gruß Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM, BSB-LAN

Per


FHEm2005

Hallo Per, leider keine Änderung.
Gruß Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM, BSB-LAN

automatisierer

beim DOIF ist ein event-on-change-reading nicht sinnvoll, aber auch nicht schlimm. Interessanter wäre ob das Device (virt_Akt01_Btn1) ein event-on-change-reading hat...


FHEm2005

Hi automatisierer,
das Device virt_Akt01_Btn1 hat das attr event-on-Change-reading, weil es ja bei einer Änderung der attr TrigType (userREading) und virtActTrigRpt "feuern" soll. Dass es das macht ist auf dem EventMonitor gut zu sehen. Hier die vier events auf dem E-Monitor:
2016-07-05 15:40:05 DOIF di_Test cmd_event: virt_Akt01_Btn1
2016-07-05 15:40:05 CUL_HM virt_Akt01_Btn1 ON
2016-07-05 15:40:05 CUL_HM virt_Akt01_Btn1 virtActState: ON
2016-07-05 15:40:05 CUL_HM virt_Akt01_Btn1 virtActTrigNo: 18
2016-07-05 15:40:05 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 1
2016-07-05 15:40:05 CUL_HM virt_Akt01_Btn1 virtActTrigType: short_Release
2016-07-05 15:40:05 CUL_HM virt_Akt01_Btn1 TrigType: short_ON
2016-07-05 15:40:10 DOIF di_Test cmd_event: virt_Akt01_Btn1

2016-07-05 15:40:10 CUL_HM virt_Akt01_Btn1 OFF
2016-07-05 15:40:10 CUL_HM virt_Akt01_Btn1 virtActState: OFF
2016-07-05 15:40:10 CUL_HM virt_Akt01_Btn1 virtActTrigNo: 19
2016-07-05 15:40:10 CUL_HM virt_Akt01_Btn1 TrigType: short_OFF
2016-07-05 15:40:13 DOIF di_Test cmd_event: virt_Akt01_Btn1

2016-07-05 15:40:13 CUL_HM virt_Akt01_Btn1 ON
2016-07-05 15:40:13 CUL_HM virt_Akt01_Btn1 virtActState: ON
2016-07-05 15:40:13 CUL_HM virt_Akt01_Btn1 virtActTrigNo: 20
2016-07-05 15:40:13 CUL_HM virt_Akt01_Btn1 virtActTrigType: long
2016-07-05 15:40:13 CUL_HM virt_Akt01_Btn1 TrigType: long_Down
2016-07-05 15:40:13 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 2
2016-07-05 15:40:13 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 3
2016-07-05 15:40:14 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 4
2016-07-05 15:40:14 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 5
2016-07-05 15:40:14 CUL_HM virt_Akt01_Btn1 virtActTrigType: long_Release
2016-07-05 15:40:16 DOIF di_Test cmd_event: virt_Akt01_Btn1

2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 OFF
2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 virtActState: OFF
2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 virtActTrigNo: 21
2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 1
2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 virtActTrigType: long
2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 TrigType: long_Up
2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 2
2016-07-05 15:40:17 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 3
2016-07-05 15:40:17 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 4
2016-07-05 15:40:17 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 5
2016-07-05 15:40:17 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 6
2016-07-05 15:40:18 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 7
2016-07-05 15:40:18 CUL_HM virt_Akt01_Btn1 virtActTrigType: long_Release


Die Leerzeilen habe ich eingefügt, damit die Events der 4 Zustände besser erkennbar sind.

Gruß Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM, BSB-LAN

automatisierer

event-on-change-reading .* unterdrückt das wiederholen eines Events - das willst du doch eigentlich nicht.

des weiteren feuert das Event ja auch nicht dauern, sondern immer genau ein mal pro Tastendruck. Entweder musst du das event-on-change-reading entfernen oder auf ein anderes Event triggern zum Beispiel ["virt_Akt01_Btn1:virtActTrigRpt"]

FHEm2005

Hallo Automatisierer,
der Taster ist ein Homeatic HM-PB-2-WM55. Der hat zwei Tasterstellungen (oben und unten). Jeder Taster geneiert zwei Events:
1. Short bei kurzem Tastendruck (singleshot)
2. Long bei längerem Tastendruck; gleichzeitig wird die Wiederholung solange der Taster gedrückt ist hochgezählt Long1, long2, long3 usw.

In einem virt_Akt wird aus den Singleshots von 1. eine Toggel-Funktion ON - OFF mit den bereits erwähnten Zuständen short_ON und short_OFF. Die werden über das DOIF  benutzt, um das Device ein- bzw. auszuschalten. Das funktioniert tadellos.

Der virt_Akt liefert auch bei längerem Tastendruck eine Toggle Funktion ON - OFF verbunden mit einem Hochzählen der empfangenen Events. Durch die Auswertung wird daraus während des längeren Tastendrucks n x  long_Up (n ist abhängig von der Dauer des Tastendruckes) oder ein n x  long_Down

Du siehst diese Aussage:
Zitatdes weiteren feuert das Event ja auch nicht dauern, sondern immer genau ein mal pro Tastendruck.
ist leider falsch. Der Auszug aus dem Event-Monitor wurde durch 4 Tastendrücke erzeugt (2x Kurz und 2x Lang).

Zitatevent-on-change-reading .* unterdrückt das wiederholen eines Events - das willst du doch eigentlich nicht.
Das ist wohl richtig, aber nachdem ich das attr gelöscht habe und neu gestartet habe, besteht kein Unterschied zu vorher.
Aber auch über event-on-update-reading ist kein Erfolg zu verzeichnen.

Ich habe vier eindeutige Events, von denen also zwei während eines längeren Tastendruckes mehrfache identische Events erzeugen. Davon wird nur der erste ausgewertet, die restlichen n-1 Events bleiben unberücksichtigt. Das ist genau die Krux.

Gruß Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM, BSB-LAN

Per

Jetzt verstehe ich es noch weniger: du musst doch nach [virt_Akt01_Btn1:TrigType] auswerten, nicht nach [virt_Akt01_Btn1] selbst.
Und mit
DOELSE ([virt_Akt01_Btn1:virtActTrigType] eq "long_Release")
kannst du dein DOIF nach Longpress zurücksetzen.

([virt_Akt01_Btn1:TrigType] eq "short_ON") ("do short on")
DOELSEIF ([virt_Akt01_Btn1:TrigType] eq "short_OFF") ("do short off")
DOELSEIF ([virt_Akt01_Btn1:TrigType] eq "long_Down") ("do long on")
DOELSEIF ([virt_Akt01_Btn1:TrigType] eq "long_Up") ("do long off")
DOELSE ([virt_Akt01_Btn1:virtActTrigType] eq "long_Release") ("nix")


Dazu
repeatcmd 0:0:1:1:0

Ellert

Zitat von: FHEm2005 am 05 Juli 2016, 13:59:08
Ein zweifach Homatic-Taster erzeugt über einen virtuellen Aktor in einem UserReading TrigType je nach Tastendruck und je Taster vier verschiedene Zustände/Events: short_on, short_off, long_Up und long_down. Die short-Events sind single-shot und die long-Events "feuern" mehrfach bis zum Loslassen der Taste.

Es geht darum, dass die mehrfachen Events bei längerem Drücken auch mehrfache Befehle aus DOIF aussenden sollen - und genau das geht nicht. Sie agieren einmal und dann ist Feierabend. Funktion so, als würde "do always" fehlen. Deshalb hier die Angaben:


Internals:
   CFGFN
   DEF        ([virt_Akt01_Btn1:"long_Down"]) (set SB3.Buero volumeDown)
DOELSEIF ([virt_Akt01_Btn1:"long_Up"]) (set SB3.Buero volumeUp)
DOELSEIF ([virt_Akt01_Btn1:"short_ON"]) (set SB3.Buero on)
DOELSEIF ([virt_Akt01_Btn1:"short_OFF"]) (set SB3.Buero off)
   NAME       di_Test
   NR         1468
   NTFY_ORDER 50-di_Test
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-07-05 12:26:32   Device          virt_Akt01_Btn1
     2016-07-05 12:26:31   cmd             1
     2016-07-05 12:26:31   cmd_event       virt_Akt01_Btn1
     2016-07-05 12:26:31   cmd_nr          1
     2016-07-05 12:26:32   e_virt_Akt01_Btn1_events virtActTrigRpt: 7,virtActTrigType: long_Release
     2016-07-05 12:26:31   state           cmd_1
   Condition:
     0          EventDoIf('virt_Akt01_Btn1',$hash,'long_Down',1)
     1          EventDoIf('virt_Akt01_Btn1',$hash,'long_Up',1)
     2          EventDoIf('virt_Akt01_Btn1',$hash,'short_ON',1)
     3          EventDoIf('virt_Akt01_Btn1',$hash,'short_OFF',1)
   Devices:
     0           virt_Akt01_Btn1
     1           virt_Akt01_Btn1
     2           virt_Akt01_Btn1
     3           virt_Akt01_Btn1
     all         virt_Akt01_Btn1
   Do:
     0:
       0          set SB3.Buero volumeDown
     1:
       0          set SB3.Buero volumeUp
     2:
       0          set SB3.Buero on
     3:
       0          set SB3.Buero off
     4:
   Helper:
     event      virtActTrigRpt: 7,virtActTrigType: long_Release
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   virt_Akt01_Btn1
     timerevent TrigType: long_Down
     triggerDev virt_Akt01_Btn1
     timerevents:
       ON
       virtActState: ON
       virtActTrigNo: 232
       virtActTrigRpt: 1
       virtActTrigType: long
       TrigType: long_Down
     timereventsState:
       state: ON
       virtActState: ON
       virtActTrigNo: 232
       virtActTrigRpt: 1
       virtActTrigType: long
       TrigType: long_Down
     triggerEvents:
       virtActTrigRpt: 7
       virtActTrigType: long_Release
     triggerEventsState:
       virtActTrigRpt: 7
       virtActTrigType: long_Release
   Internals:
   Itimer:
   Readings:
   Regexp:
     0:
     1:
     2:
     3:
     All:
   State:
   Trigger:
     all         virt_Akt01_Btn1
Attributes:
   do         always
   event-on-change-reading .*
   room       Schalter


repeatcmd
wiederholt den Befehl bis zum Sankt-Nimmerleins-Tag: also auch nicht.

Ich habe das Forum vor und zurück durchsucht. Was auf meinen Fall passt, habe ich nicht gefunden. Was kann ich tun?

Gruß Eberhard
Bei mir triggert das DOIF bei jeder Änderung des Zählers mit diesem DOIF:

ZitatInternals:
   DEF        (["^HM_3B775A_Btn_01$:^Long [0-9]{0,3}_[0-9]{0,3} \(to VCCU\)$"]) ({Log 1, "Device: $DEVICE --> Event: $EVENTS"})
   NAME       TestStatus
   NR         167
   NTFY_ORDER 50-TestStatus
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-07-05 18:14:09   Device          HM_3B775A_Btn_01
     2016-07-05 18:14:09   cmd             1
     2016-07-05 18:14:09   cmd_event       HM_3B775A_Btn_01
     2016-07-05 18:14:09   cmd_nr          1
     2016-07-05 18:14:09   matched_event_c1_1 Long 9_155 (to VCCU)
     2016-07-05 18:14:09   state           cmd_1
   Condition:
     0          EventDoIf('^HM_3B775A_Btn_01$',$hash,'^Long [0-9]{0,3}_[0-9]{0,3} \(to VCCU\)$',0)
   Devices:
   Do:
     0:
       0          {Log 1, "Device: $DEVICE --> Event: $EVENTS"}
   Helper:
     event      Long 9_155 (to VCCU)
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   HM_3B775A_Btn_01
     timerevent Long 9_155 (to VCCU)
     triggerDev HM_3B775A_Btn_01
     timerevents:
       Long 9_155 (to VCCU)
       trigger: Long_155
       trigger_cnt: 155
     timereventsState:
       state: Long 9_155 (to VCCU)
       trigger: Long_155
       trigger_cnt: 155
     triggerEvents:
       Long 9_155 (to VCCU)
       trigger: Long_155
       trigger_cnt: 155
     triggerEventsState:
       state: Long 9_155 (to VCCU)
       trigger: Long_155
       trigger_cnt: 155
   Internals:
   Itimer:
   Readings:
   Regexp:
     0:
       0          ^HM_3B775A_Btn_01$:^Long [0-9]{0,3}_[0-9]{0,3} \(to VCCU\)$
     All:
       0          ^HM_3B775A_Btn_01$:^Long [0-9]{0,3}_[0-9]{0,3} \(to VCCU\)$
   State:
   Trigger:
Attributes:
   disable    0
   do         always
   group      00_Test
   room       0_Test
Es wird der Taster ausgewertet, einen virtuellen Taster habe ich nicht eingerichtet.

Hier die Log-Einträge dazu:
Zitat2016.07.05 18:14:07.406 1: Device: HM_3B775A_Btn_01 --> Event: Long 1_155 (to VCCU),trigger: Long_155,trigger_cnt: 155
2016.07.05 18:14:07.654 1: Device: HM_3B775A_Btn_01 --> Event: Long 2_155 (to VCCU),trigger: Long_155,trigger_cnt: 155
2016.07.05 18:14:07.904 1: Device: HM_3B775A_Btn_01 --> Event: Long 3_155 (to VCCU),trigger: Long_155,trigger_cnt: 155
2016.07.05 18:14:08.154 1: Device: HM_3B775A_Btn_01 --> Event: Long 4_155 (to VCCU),trigger: Long_155,trigger_cnt: 155
2016.07.05 18:14:08.405 1: Device: HM_3B775A_Btn_01 --> Event: Long 5_155 (to VCCU),trigger: Long_155,trigger_cnt: 155
2016.07.05 18:14:08.654 1: Device: HM_3B775A_Btn_01 --> Event: Long 6_155 (to VCCU),trigger: Long_155,trigger_cnt: 155
2016.07.05 18:14:08.904 1: Device: HM_3B775A_Btn_01 --> Event: Long 7_155 (to VCCU),trigger: Long_155,trigger_cnt: 155
2016.07.05 18:14:09.155 1: Device: HM_3B775A_Btn_01 --> Event: Long 8_155 (to VCCU),trigger: Long_155,trigger_cnt: 155
2016.07.05 18:14:09.406 1: Device: HM_3B775A_Btn_01 --> Event: Long 9_155 (to VCCU),trigger: Long_155,trigger_cnt: 155

Am DOIF liegt es nicht.
Zitat
Was kann ich tun?
In meinem Test habe ich den Trigger vollständig per Regex beschrieben, das könntest Du auch machen, dann wird es klappen.

automatisierer

Zitat von: FHEm2005 am 05 Juli 2016, 16:43:54
Hallo Automatisierer,
der Taster ist ein Homeatic HM-PB-2-WM55. Der hat zwei Tasterstellungen (oben und unten). Jeder Taster geneiert zwei Events:
1. Short bei kurzem Tastendruck (singleshot)
2. Long bei längerem Tastendruck; gleichzeitig wird die Wiederholung solange der Taster gedrückt ist hochgezählt Long1, long2, long3 usw.

In einem virt_Akt wird aus den Singleshots von 1. eine Toggel-Funktion ON - OFF mit den bereits erwähnten Zuständen short_ON und short_OFF. Die werden über das DOIF  benutzt, um das Device ein- bzw. auszuschalten. Das funktioniert tadellos.

Der virt_Akt liefert auch bei längerem Tastendruck eine Toggle Funktion ON - OFF verbunden mit einem Hochzählen der empfangenen Events. Durch die Auswertung wird daraus während des längeren Tastendrucks n x  long_Up (n ist abhängig von der Dauer des Tastendruckes) oder ein n x  long_Down

Du siehst diese Aussage:ist leider falsch. Der Auszug aus dem Event-Monitor wurde durch 4 Tastendrücke erzeugt (2x Kurz und 2x Lang).
Das ist wohl richtig, aber nachdem ich das attr gelöscht habe und neu gestartet habe, besteht kein Unterschied zu vorher.
Aber auch über event-on-update-reading ist kein Erfolg zu verzeichnen.
ist mir klar, aber dieses hier:
2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 OFF
2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 virtActState: OFF
2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 virtActTrigNo: 21
2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 1
2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 virtActTrigType: long
2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 TrigType: long_Up
2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 2
2016-07-05 15:40:17 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 3
2016-07-05 15:40:17 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 4
2016-07-05 15:40:17 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 5
2016-07-05 15:40:17 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 6
2016-07-05 15:40:18 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 7
2016-07-05 15:40:18 CUL_HM virt_Akt01_Btn1 virtActTrigType: long_Release


ist ja nur von einem langen Tastendruck und da kommt das event auf das du triggern möchtest nur einmal vor - oder nicht?!?!?
was sich jedoch wiederholt, ist das hier:


2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 1
2016-07-05 15:40:16 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 2
2016-07-05 15:40:17 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 3
2016-07-05 15:40:17 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 4
2016-07-05 15:40:17 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 5
2016-07-05 15:40:17 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 6
2016-07-05 15:40:18 CUL_HM virt_Akt01_Btn1 virtActTrigRpt: 7


wenn du das, wie in meinem Vorschlag, als trigger für dein DOIF nimmst, wird es wiederholt ausgelöst werden.

Zitat
Ich habe vier eindeutige Events, von denen also zwei während eines längeren Tastendruckes mehrfache identische Events erzeugen. Davon wird nur der erste ausgewertet, die restlichen n-1 Events bleiben unberücksichtigt. Das ist genau die Krux.

Gruß Eberhard
falls das event auf du zu triggern versuchst tatsächlich bei einem langen Tastendruck mehrfach wiederholt wird, kann es natürlich sein, dass ein 'event-on-change-reading .*' das unterdrückt

Ellert

#10
Man muss allerdings auch beachten, dass das DOIF für alle Events, die in dem Bezeichner $EVENTS aufgelistet sind, nur einmal auslöst.

In $EVENTS sind alle Events enthalten, die zeitgleich gesendet werden:

Zitat
2016-07-05 20:57:25.143 CUL_HM HM_3B775A_Btn_01 Long 1_170 (to VCCU)
2016-07-05 20:57:25.143 CUL_HM HM_3B775A_Btn_01 trigger: Long_170
2016-07-05 20:57:25.143 CUL_HM HM_3B775A_Btn_01 trigger_cnt: 170

2016-07-05 20:57:25.324 CUL_HM HM_3B775A battery: ok
2016-07-05 20:57:25.324 CUL_HM HM_3B775A HM_3B775A_Btn_01 Long
2016-07-05 20:57:25.372 DOIF TestStatus cmd_nr: 1
2016-07-05 20:57:25.372 DOIF TestStatus cmd: 1
2016-07-05 20:57:25.372 DOIF TestStatus cmd_event: HM_3B775A_Btn_01
2016-07-05 20:57:25.372 DOIF TestStatus cmd_1
2016-07-05 20:57:25.391 CUL_HM HM_3B775A_Btn_01 Long 2_170 (to VCCU)
2016-07-05 20:57:25.391 CUL_HM HM_3B775A_Btn_01 trigger: Long_170
2016-07-05 20:57:25.391 CUL_HM HM_3B775A_Btn_01 trigger_cnt: 170
2016-07-05 20:57:25.575 CUL_HM HM_3B775A battery: ok
2016-07-05 20:57:25.575 CUL_HM HM_3B775A HM_3B775A_Btn_01 Long

Eine Bedingung ["^HM_3B775A_Btn_01$:Long"] wird daher nur einmal auslösen und hat nur einen Trigger.

Das steht etwas knapper auch in der deutschsprachigen Befehlsreferenz zum DOIF:
Zitat..., $EVENTS kommagetrennt durch alle Eventzeilen des Triggers ersetzt.


Die Millisekunden können mit dem globalen Attribut mseclog eingeschaltet werden.

automatisierer

Zitat von: Ellert am 05 Juli 2016, 21:14:59
Man muss allerdings auch beachten, dass das DOIF für alle Events, die in dem Bezeichner $EVENTS aufgelistet sind, nur einmal auslöst.

In $EVENTS sind alle Events enthalten, die zeitgleich gesendet werden:

Eine Bedingung ["^HM_3B775A_Btn_01$:Long"] wird daher nur einmal auslösen und hat nur einen Trigger.

Das steht etwas knapper auch in der deutschsprachigen Befehlsreferenz zum DOIF:

Die Millisekunden können mit dem globalen Attribut mseclog eingeschaltet werden.

verstehe ich nicht!

ein Taster Device erzeugt bei gesetztem 'event-on-change-reading .*' folgende Events:
2016-07-05 21:51:24 CUL_HM HM_28D095 HM_28D095_Btn_01 Long
2016-07-05 21:51:24 CUL_HM HM_28D095_Btn_01 Long 1_25 (to vccu)
2016-07-05 21:51:24 CUL_HM HM_28D095_Btn_01 trigger: Long_25
2016-07-05 21:51:24 CUL_HM HM_28D095_Btn_01 trigger_cnt: 25
2016-07-05 21:51:24 CUL_HM HM_28D095_Btn_01 Long 2_25 (to vccu)
2016-07-05 21:51:24 CUL_HM HM_28D095_Btn_01 Long 3_25 (to vccu)
2016-07-05 21:51:24 CUL_HM HM_28D095_Btn_01 Long 4_25 (to vccu)
2016-07-05 21:51:25 CUL_HM HM_28D095_Btn_01 Long 5_25 (to vccu)
2016-07-05 21:51:25 CUL_HM HM_28D095_Btn_01 Long 6_25 (to vccu)
2016-07-05 21:51:25 CUL_HM HM_28D095_Btn_01 Long 7_25 (to vccu)
2016-07-05 21:51:26 CUL_HM HM_28D095_Btn_01 Long 8_25 (to vccu)
2016-07-05 21:51:26 CUL_HM HM_28D095_Btn_01 Long 9_25 (to vccu)
2016-07-05 21:51:26 CUL_HM HM_28D095_Btn_01 Long 10_25 (to vccu)
2016-07-05 21:51:26 CUL_HM HM_28D095_Btn_01 Long 11_25 (to vccu)
2016-07-05 21:51:27 CUL_HM HM_28D095_Btn_01 Long 12_25 (to vccu)
2016-07-05 21:51:27 CUL_HM HM_28D095_Btn_01 Long 13_25 (to vccu)
2016-07-05 21:51:27 CUL_HM HM_28D095_Btn_01 Long 14_25 (to vccu)
2016-07-05 21:51:27 CUL_HM HM_28D095_Btn_01 Long 15_25 (to vccu)
2016-07-05 21:51:28 CUL_HM HM_28D095_Btn_01 Long 16_25 (to vccu)
2016-07-05 21:51:28 CUL_HM HM_28D095_Btn_01 Long 17_25 (to vccu)
2016-07-05 21:51:28 CUL_HM HM_28D095 CMDs_done
2016-07-05 21:51:28 CUL_HM HM_28D095 HM_28D095_Btn_01 LongRelease
2016-07-05 21:51:28 CUL_HM HM_28D095_Btn_01 LongRelease 18_25 (to vccu)


wenn ich da jetzt mit folgendem DOIF drauf reagiere:

define testDOIF DOIF (["HM_28D095_Btn_01:Long"]) (set testdummy $EVENT)


dann wird das DOIF mit jedem Long getriggert. Im testdummy läuft der Zähler Schritt für Schritt hoch.

Wenn ich nun noch das Abschlussevent 'LongRelease' raus Filtern will, dann kommt im DOIF hinter dem Long noch ein Leerzeichen.

(["HM_28D095_Btn_01:Long "]) (set testdummy $EVENT)


Ich sehe das Problem nicht! Wenn ich auf ein Event triggere, dass nur einmal kommt, dann triggert DOIF auch nur einmal.

Das Event auf das der Threadersteller triggern möchte würde auch wiederholt werden, wenn er den Device nicht ein 'event-on-change-reading .*' spendiert hätte. Dann sieht der EventMonitor nämlich so aus:
2016-07-05 21:58:55 CUL_HM HM_28D095 HM_28D095_Btn_01 Long
2016-07-05 21:58:55 CUL_HM HM_28D095_Btn_01 Long 1_26 (to vccu)
2016-07-05 21:58:55 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:55 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:55 CUL_HM HM_28D095_Btn_01 Long 2_26 (to vccu)
2016-07-05 21:58:55 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:55 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 Long 3_26 (to vccu)
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 Long 4_26 (to vccu)
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 Long 5_26 (to vccu)
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 Long 6_26 (to vccu)
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 Long 7_26 (to vccu)
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 Long 8_26 (to vccu)
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 Long 9_26 (to vccu)
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 Long 10_26 (to vccu)
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 Long 11_26 (to vccu)
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 Long 12_26 (to vccu)
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:58 CUL_HM HM_28D095 CMDs_done
2016-07-05 21:58:58 CUL_HM HM_28D095 HM_28D095_Btn_01 LongRelease
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 LongRelease 13_26 (to vccu)
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigDst_vccu: noConfig
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26


und das ganze ist ja unabhängig davon welche Devices ich benutze, also ein HM-Taster oder einen Virt-Aktor - wichtig ist das Events erzeugt werden auf die ich triggern kann.

automatisierer

Mir ist grad aufgefallen, dass die von mir genannte Bedingung '["virt_Akt01_Btn1:virtActTrigRpt"]' nicht funktioniert, weil sie bei allen vier Tasterzuständen gleich ist. Daher wird nichts anderes übrig bleiben, als das 'event-on-change-reading .*' zu ändern oder zu löschen.

das DOIF im ersten Post sollte mMn bessser so aussehen:


define testdoif DOIF (["virt_Akt01_Btn1:long_Down"]) (set SB3.Buero volumeDown)
DOELSEIF (["virt_Akt01_Btn1:long_Up"]) (set SB3.Buero volumeUp)
DOELSEIF (["virt_Akt01_Btn1:short_ON"]) (set SB3.Buero on)
DOELSEIF (["virt_Akt01_Btn1:short_OFF"]) (set SB3.Buero off)

und das 'attr testdoif do always' darf natürlich auch nicht fehlen.


Du hast geschrieben, dass du das 'event-on-change-rading' gelöscht und danach neu gestartet hast. Das neu starten ist nicht nötig und für den Fall, dass du vor dem Neustart vergessen hast zu speichern sogar eher kontraproduktiv.
Also bitte das 'event-on-change-reading' und auch das 'event-on-update-reading' löschen und dann nochmal testen.

FHEm2005

Vielen Dank für die zahlreichen "Wortmeldungen". Die muss ich ersteinmal "verdauen".

@automatisierer: mit Deinem letzten Vorschlag bin ich nach der Umsetzung genau so weit wie vorher. Das Event mit long_Up bzw. long_Down kommt nur einmal. Das ist der Knackpunkt. Schade.

@Per: Deine Lösung mit dem repeatcmd ist für mich verständlich und nachvollziehbar. Funktioniert so, wie ich es wünsche, aber ich bekomme ihn durch Loslassen nicht gestoppt. Nur ein neuer Tastendruck ist in der Lage ihn zu stoppen.
DOELSE ([virt_Akt01_Btn1:virtActTrigType] eq "long_Release") kann ihn nicht stoppen. Er erkennt den Befehl auch nicht.
Auch die Abfrage
DOELSEIF ([virt_Akt01_Btn1:virtActTrigType] eq "long_Release") (set SB3.Buero stop)
erkennt er nicht.
Der Trigger kommt zwar in der Form:
2016-07-05 23:31:22 CUL_HM virt_Akt01_Btn1 virtActTrigType: long_Release
Das wars dann auch.

@Ellert:
ZitatIn meinem Test habe ich den Trigger vollständig per Regex beschrieben, das könntest Du auch machen, dann wird es klappen.
Dafür reichen meine Perl-Kenntnisse nicht aus. Dein Beitrag ist schön für mich ihn durchzuarbeiten, um besser zu werden; als kurzfristige Lösung für mich leider over the top.

Viele Grüße
Eberhard
Raspi3: FHEM, CULV3 (V1.61), EnOcean Pi 868, nanoCUL433, HUE-Bridge; Raspi4: Node-red, MQTT, Gaszähler auslesen mit ESP32-CAM, BSB-LAN

Ellert

Zitat von: automatisierer am 05 Juli 2016, 22:02:34
verstehe ich nicht!

ein Taster Device erzeugt bei gesetztem 'event-on-change-reading .*' folgende Events:
2016-07-05 21:51:24 CUL_HM HM_28D095 HM_28D095_Btn_01 Long
2016-07-05 21:51:24 CUL_HM HM_28D095_Btn_01 Long 1_25 (to vccu)
2016-07-05 21:51:24 CUL_HM HM_28D095_Btn_01 trigger: Long_25
2016-07-05 21:51:24 CUL_HM HM_28D095_Btn_01 trigger_cnt: 25
2016-07-05 21:51:24 CUL_HM HM_28D095_Btn_01 Long 2_25 (to vccu)
2016-07-05 21:51:24 CUL_HM HM_28D095_Btn_01 Long 3_25 (to vccu)
2016-07-05 21:51:24 CUL_HM HM_28D095_Btn_01 Long 4_25 (to vccu)
2016-07-05 21:51:25 CUL_HM HM_28D095_Btn_01 Long 5_25 (to vccu)
2016-07-05 21:51:25 CUL_HM HM_28D095_Btn_01 Long 6_25 (to vccu)
2016-07-05 21:51:25 CUL_HM HM_28D095_Btn_01 Long 7_25 (to vccu)
2016-07-05 21:51:26 CUL_HM HM_28D095_Btn_01 Long 8_25 (to vccu)
2016-07-05 21:51:26 CUL_HM HM_28D095_Btn_01 Long 9_25 (to vccu)
2016-07-05 21:51:26 CUL_HM HM_28D095_Btn_01 Long 10_25 (to vccu)
2016-07-05 21:51:26 CUL_HM HM_28D095_Btn_01 Long 11_25 (to vccu)
2016-07-05 21:51:27 CUL_HM HM_28D095_Btn_01 Long 12_25 (to vccu)
2016-07-05 21:51:27 CUL_HM HM_28D095_Btn_01 Long 13_25 (to vccu)
2016-07-05 21:51:27 CUL_HM HM_28D095_Btn_01 Long 14_25 (to vccu)
2016-07-05 21:51:27 CUL_HM HM_28D095_Btn_01 Long 15_25 (to vccu)
2016-07-05 21:51:28 CUL_HM HM_28D095_Btn_01 Long 16_25 (to vccu)
2016-07-05 21:51:28 CUL_HM HM_28D095_Btn_01 Long 17_25 (to vccu)
2016-07-05 21:51:28 CUL_HM HM_28D095 CMDs_done
2016-07-05 21:51:28 CUL_HM HM_28D095 HM_28D095_Btn_01 LongRelease
2016-07-05 21:51:28 CUL_HM HM_28D095_Btn_01 LongRelease 18_25 (to vccu)


wenn ich da jetzt mit folgendem DOIF drauf reagiere:

define testDOIF DOIF (["HM_28D095_Btn_01:Long"]) (set testdummy $EVENT)


dann wird das DOIF mit jedem Long getriggert. Im testdummy läuft der Zähler Schritt für Schritt hoch.

Wenn ich nun noch das Abschlussevent 'LongRelease' raus Filtern will, dann kommt im DOIF hinter dem Long noch ein Leerzeichen.

(["HM_28D095_Btn_01:Long "]) (set testdummy $EVENT)


Ich sehe das Problem nicht! Wenn ich auf ein Event triggere, dass nur einmal kommt, dann triggert DOIF auch nur einmal.

Das Event auf das der Threadersteller triggern möchte würde auch wiederholt werden, wenn er den Device nicht ein 'event-on-change-reading .*' spendiert hätte. Dann sieht der EventMonitor nämlich so aus:
2016-07-05 21:58:55 CUL_HM HM_28D095 HM_28D095_Btn_01 Long
2016-07-05 21:58:55 CUL_HM HM_28D095_Btn_01 Long 1_26 (to vccu)
2016-07-05 21:58:55 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:55 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:55 CUL_HM HM_28D095_Btn_01 Long 2_26 (to vccu)
2016-07-05 21:58:55 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:55 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 Long 3_26 (to vccu)
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 Long 4_26 (to vccu)
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 Long 5_26 (to vccu)
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 Long 6_26 (to vccu)
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:56 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 Long 7_26 (to vccu)
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 Long 8_26 (to vccu)
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 Long 9_26 (to vccu)
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:57 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 Long 10_26 (to vccu)
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 Long 11_26 (to vccu)
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 Long 12_26 (to vccu)
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26
2016-07-05 21:58:58 CUL_HM HM_28D095 CMDs_done
2016-07-05 21:58:58 CUL_HM HM_28D095 HM_28D095_Btn_01 LongRelease
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 LongRelease 13_26 (to vccu)
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigDst_vccu: noConfig
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger: Long_26
2016-07-05 21:58:58 CUL_HM HM_28D095_Btn_01 trigger_cnt: 26


und das ganze ist ja unabhängig davon welche Devices ich benutze, also ein HM-Taster oder einen Virt-Aktor - wichtig ist das Events erzeugt werden auf die ich triggern kann.
An dieser Stelle:
Zitat2016-07-05 21:51:24 CUL_HM HM_28D095_Btn_01 Long 1_25 (to vccu)
2016-07-05 21:51:24 CUL_HM HM_28D095_Btn_01 trigger: Long_25
2016-07-05 21:51:24 CUL_HM HM_28D095_Btn_01 trigger_cnt: 25
triggert das DOIF einmal, obwohl "Long" zweimal vorkommt.

Es triggert nur einmal, weil die 3 Events zur gleichen Zeit gesendet werden und sie nur einen Trigger darstellen. Die Gleichzeitigkeit sieht man nur, wenn "mseclog" gesetzt ist.