Long-Tastendruck triggert auch Short-Tastendruck-DOIF

Begonnen von heikoh81, 24 Februar 2016, 21:24:18

Vorheriges Thema - Nächstes Thema

heikoh81

Hallo zusammen,

ich verwende einen Homematic-6-Fach-Wandtaster für verschiedene Befehle.
Dieser unterscheidet in seinem state zwischen kurzem Tastendruck (ShortRelease) und langen Tastendruck (LongRelease).

Ich bin mir nicht sicher, aber ich glaube wenn man die Taste gedrückt hält, geht der state erst auf Short, dann auf Long, zählt hoch und endet dann je nach Länge des Tastendrucks mit LongRelease-9, wobei die Zahl die Länge des Tastendrucks angibt.

Ich habe nun 4 DOIFs gebastelt, eines für den Short-Tastendruck und eines für den langen - für die Tasten 1 und 5.
Bei 2 DOIFs kann ich von 2 solchen 6-fach-Wandtastern denselben Befehl auslösen, bei 2 DOIFs nur von einem Wandtaster.

Die beiden DOIFs, die nur von einem Wandtaster getriggert werden können, funktionieren:

([Wandtaster_Wohnzimmer_Btn01] =~/Short/ and [?di_Wandtaster_Wohnzimmer_Btn01_Betaetigt_kurz_Markise_links_einfahren] ne "cmd_1_1")
(set NAME=Markise_Pergola_Links:FILTER=STATE!=einfahren einfahren) ()
DOELSEIF ([Wandtaster_Wohnzimmer_Btn01] =~/Short/ and [?di_Wandtaster_Wohnzimmer_Btn01_Betaetigt_kurz_Markise_links_einfahren] eq "cmd_1_1")
  (set Markise_Pergola_Links stop)
DOELSE ()


  • attr do always


([Wandtaster_Wohnzimmer_Btn01] =~/Long/)
(set PollinStandventilator on)
DOELSE ()


  • attr do always
  • attr cmdpause 5

Problem bei den DOIFs, die 2 auslösende Wandtaster haben:
Halte ich die Taste gedrückt, wird immer auch das Short-DOIF getriggert, wahrscheinlich weil der Short-State zumindest kurz auftritt.
Wie kann ich das verhindern?


(([Wandtaster_Wohnzimmer_Btn05] =~/Short/ or [Wandtaster_Studio_Btn05] =~/Short/) and [?di_Wandtaster_Wohnzimmer_Studio_Btn05_Betaetigt_kurz_Markise_Studio_einfahren] ne "cmd_1_1")
(set Markise_Dachterrasse_auf_Position_Fahren einfahren) ()
DOELSEIF (([Wandtaster_Wohnzimmer_Btn05] =~/Short/ or [Wandtaster_Studio_Btn05] =~/Short/) and [?di_Wandtaster_Wohnzimmer_Studio_Btn05_Betaetigt_kurz_Markise_Studio_einfahren] eq "cmd_1_1")
  (set Markise_Dachterrasse_auf_Position_Fahren Stop)
DOELSE ()


  • attr do always


([Wandtaster_Wohnzimmer_Btn05] =~/Long/)
(set PollinStandventilator off)
DOELSE ()


  • attr do always
  • attr cmdpause 5

Viele Grüße,
Heiko

Otto123

Hallo Heiko,

DOIF triggert zwar den Event du fragst mit oder den State ab. Daher das Problem.
Nimm also das "?" ...
Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

FunkOdyssey

#2
Die neue Schreibweise dafür ist aber nun:

[device:"event"]

Das Fragezeichen ist aber noch möglich.

Otto123

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

heikoh81

Danke für eure Antworten.

Zitat von: Otto123 am 24 Februar 2016, 21:45:48
DOIF triggert zwar den Event du fragst mit oder den State ab. Daher das Problem.
Nimm also das "?" ...

Vielleicht habe ich mich falsch ausgedrückt.
Mit "or" sollen zwei triggerende Wandtaster möglich werden, ich will aber nur 1 DOIF für beide Wandtaster pflegen.
Deshalb ist bei dem 2. Wandtaster auch kein ? davor.

Bei meinen Tests habe ich aber immer nur den im Wohnzimmer gedrückt.
Ich hatte den Eindruck, dass aber nur das DOIF mit dem "or" sowohl auf "short" als auch "long" triggert.
Bei dem anderen DOIF, wo ich für das "long" nur ein triggerndes Device habe, gab es nie eine triggerung von short, wenn die Taste long gedrückt wurde.

Zitat von: FunkOdyssey am 24 Februar 2016, 21:50:13
Die neue Schreibweise dafür ist aber nun:
[device:"event"]

Verstehe ich richtig, dass ich also schreiben muss:

([Wandtaster_Wohnzimmer_Btn01:"=~/Long/"]

Oder bin ich jetzt komplett auf dem Glatteis?

Viele Grüße,
Heiko

CoolTux

Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

FunkOdyssey

#6
Ich bin zwar auch Fan der Event-Abfrage in den DOIFs. Alleine schon deswegen, weil das bei einigen Geräten (Bewegungsmeldern) gar nicht anders funktioniert. Aber zu meiner Schande muss ich gestehen, dass ich meinen Wandtaster auch über die Readings abfrage. Und bei mir wird beim Long-Press nicht vorher das "Short" ausgeführt. Wobei ich das auch gerade ziemlich merkwürdig finde. Soweit ich das in Erinnerung habe, wird beim Gedrückthalten der Buttons einmal durch alle Events gegangen: Short, Long1, Long2, Long3, etc.
Ich muss heute abend mal darauf achten.

([btn_01] =~ "Short")
(set xyz on)
DOELSEIF ([btn_02] =~ "Short")
(set xyz off)
DOELSEIF ([btn_01] =~ /Long.1_.*/)
(set abc on)
DOELSEIF ([btn_02] =~ /Long.1_.*/)
(set abc off)



Zitat von: heikoh81 am 24 Februar 2016, 23:31:13
Verstehe ich richtig, dass ich also schreiben muss:

([Wandtaster_Wohnzimmer_Btn01:"=~/Long/"]

Oder bin ich jetzt komplett auf dem Glatteis?

Nee, das müsste dann so aussehen:


([Wandtaster_Wohnzimmer_Btn01:"Long"]

Otto123

Heiko, ich vermute du drückst den einen taster, der triggert das DOIF, das DOIF fragt anschließend die Stati ab und im zweiten Taster steht das letzte reading noch drin.

Das der Taster erst short sendet wäre unlogisch - es sei dein Du zitterst beim drücken  8)
Du kannst Dir das aber im Eventmonitor genau anschauen.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

heikoh81

Danke für eure Hinweise.

Zitat von: FunkOdyssey am 25 Februar 2016, 09:42:30
Nee, das müsste dann so aussehen:

([Wandtaster_Wohnzimmer_Btn01:"Long"]


Das funktioniert, allerdings wird das DOIF noch so oft ausgeführt, wie lange ich die Taste gedrückt halte und das "Long" hochzählt.
Wie könnte ich das jetzt auf 1 Wiederholung beschränken?

Viele Grüße,
Heiko

FunkOdyssey


Otto123

Zitat von: heikoh81 am 28 Februar 2016, 23:18:16
Danke für eure Hinweise.

Das funktioniert, allerdings wird das DOIF noch so oft ausgeführt, wie lange ich die Taste gedrückt halte und das "Long" hochzählt.
Wie könnte ich das jetzt auf 1 Wiederholung beschränken?

Viele Grüße,
Heiko
In dem Du auf LongRelease triggerst ...
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

FunkOdyssey

Oh, cool. Das kannte ich ja noch gar nicht. Dann muss ich heute abend mal wieder einen Blick in den EventMonitor werfen.

heikoh81

Ich habe meine DOIFs angepasst.

Ich hatte dann zunächst noch das Problem, dass das DOIF mehrfach ausgelöst wird, also bei

([Fernbedienung05_Btn01:"Short"] or [Fernbedienung05_Btn01:"Long.1_.*"])
attr do always

wird offensichtlich das DOIF für (Short UND Short Release) bzw. (Long UND LongRelease_1 UND LongRelease_2 usw.) getriggert.

Deshalb habe ich noch

attr cmdpause 2:2:2:2

für die einzelnen DOELSEIFs eingefügt.

Jetzt wird das DOIF nur einmal getriggert.

Viele Grüße,
Heiko

FunkOdyssey

Ich kann jetzt leider nicht Text, sondern nur nen Screenshot präsentieren.
Bei mir gibt es keine Probleme mit Doppelauslösung oder das der Short-Befehl als erstes ausgeführt wird.
Lustigerweise gibt es bei mir aber auch kein LongRelease.

Somit kann ich deine Probleme leider nicht nachvollziehen. Sorry.

Wie ich hier gerade lese, ist ein LongRelease nur vorhanden, wenn die Buttons gepeert sind (auch über vccu möglich). Das erklärt auch wieso ich das nicht sehe.

heikoh81

Ich habe leider immer noch das Problem, dass mein DOIF exakt 2x ausgeführt wird, obwohl ich die Taste nur ganz kurz drücke:

attr cmdpause 10:10:10:10:10
zusätzlich probiert ohne Erfolg
attr repeatsame 1:1:1:1:1

DOIF:

([Fernbedienung02_Btn01:"Short"] or [Fernbedienung02_Btn01:"Long.1_.*"])
(set Fernbedienung02Dummy on)
({FernbedienungLogikNEU_mit_DOIF("Fernbedienung02", $we)})
DOELSEIF ([Fernbedienung02_Btn02:"Short"] or [Fernbedienung02_Btn02:"Long.1_.*"])
(set Fernbedienung02Dummy off)
({FernbedienungLogikNEU_mit_DOIF("Fernbedienung02", $we)})
DOELSEIF (([Fernbedienung02_Btn03:"Short"] or [Fernbedienung02_Btn03:"Long.1_.*"]) and [?Fernbedienung02SteuertGarageChkBox] eq "on")
(set Garage_Torschalter Motor_Aktivieren)
DOELSEIF ([Fernbedienung02_Btn04:"Short"] or [Fernbedienung02_Btn04:"Long.1_.*"])
(set PollinKamera01WohnzimmerDauerbetriebChkBox off,set PollinKamera02KuecheDauerbetriebChkBox off,set PollinKamera03StudioDauerbetriebChkBox off,set PollinKamera07EsseckeDauerbetriebChkBox off,set PollinKamera09SchlafDauerbetriebChkBox off)
(set NAME=PollinKamera09Schlaf:FILTER=STATE=on off)
(set NAME=PollinKamera01Wohnzimmer:FILTER=STATE=on off)
(set NAME=PollinKamera07Essecke:FILTER=STATE=on off)
(set NAME=PollinKamera02Kueche:FILTER=STATE=on off)
(set NAME=PollinKamera03Studio:FILTER=STATE=on off)


EventMonitor:

Events (Filter: Fernbedienung02.*)   FHEM log   

2016-03-02 22:03:25 CUL_HM Fernbedienung02 battery: ok
2016-03-02 22:03:25 CUL_HM Fernbedienung02 CMDs_done
2016-03-02 22:03:25 CUL_HM Fernbedienung02 Fernbedienung02_Btn02 Short
2016-03-02 22:03:26 dummy Fernbedienung02OffTastenverzoegerungChkBox on
2016-03-02 22:03:26 at Fernbedienung02OffTastenverzoegerungChkBoxWiederZuruecksetzenTemp Next: 22:03:31
2016-03-02 22:03:28 Global global DEFINED Fernbedienung02OffTastenverzoegerungChkBoxWiederZuruecksetzenTemp
2016-03-02 22:03:28 Global global ATTR Fernbedienung02OffTastenverzoegerungChkBoxWiederZuruecksetzenTemp room TimerTemp
2016-03-02 22:03:28 Global global ATTR Fernbedienung02OffTastenverzoegerungChkBoxWiederZuruecksetzenTemp group Fernbedienung
2016-03-02 22:03:32 at Fernbedienung02Status01GruenWiederZuruecksetzenTemp Next: 22:08:32
2016-03-02 22:03:35 Global global DEFINED Fernbedienung02Status01GruenWiederZuruecksetzenTemp
2016-03-02 22:03:35 Global global ATTR Fernbedienung02Status01GruenWiederZuruecksetzenTemp room TimerTemp
2016-03-02 22:03:35 Global global ATTR Fernbedienung02Status01GruenWiederZuruecksetzenTemp group Fernbedienung
2016-03-02 22:03:37 at Gong3Fernbedienung02Temp1 Next: 22:03:40
2016-03-02 22:03:40 Global global DEFINED Gong3Fernbedienung02Temp1
2016-03-02 22:03:40 Global global ATTR Gong3Fernbedienung02Temp1 room TimerTemp
2016-03-02 22:03:40 dummy Fernbedienung02Dummy off
2016-03-02 22:03:40 DOIF di_Fernbedienung02 cmd_nr: 2
2016-03-02 22:03:40 DOIF di_Fernbedienung02 cmd_seqnr: 1
2016-03-02 22:03:40 DOIF di_Fernbedienung02 cmd_event: Fernbedienung02_Btn02
2016-03-02 22:03:40 DOIF di_Fernbedienung02 cmd_2_1
2016-03-02 22:03:44 Global global DELETED Fernbedienung02Status01GruenWiederZuruecksetzenTemp
2016-03-02 22:03:45 at Fernbedienung02Status01GruenWiederZuruecksetzenTemp Next: 22:08:44
2016-03-02 22:03:47 Global global DEFINED Fernbedienung02Status01GruenWiederZuruecksetzenTemp
2016-03-02 22:03:47 Global global ATTR Fernbedienung02Status01GruenWiederZuruecksetzenTemp room TimerTemp
2016-03-02 22:03:47 Global global ATTR Fernbedienung02Status01GruenWiederZuruecksetzenTemp group Fernbedienung
2016-03-02 22:03:50 Global global ATTR Gong3Fernbedienung02Temp1 room TimerTemp
2016-03-02 22:03:50 DOIF di_Fernbedienung02 cmd_nr: 2
2016-03-02 22:03:50 DOIF di_Fernbedienung02 cmd_seqnr: 2
2016-03-02 22:03:50 DOIF di_Fernbedienung02 cmd_event: Fernbedienung02_Btn02
2016-03-02 22:03:50 DOIF di_Fernbedienung02 cmd_2
2016-03-02 22:03:50 DOIF di_Fernbedienung02 wait_timer: 02.03.2016 22:03:51 cmd_2_1 Fernbedienung02_Btn02
2016-03-02 22:03:50 CUL_HM Fernbedienung02_Btn02 Short (to vccu)
2016-03-02 22:03:50 CUL_HM Fernbedienung02_Btn02 trigDst_vccu: noConfig
2016-03-02 22:03:50 CUL_HM Fernbedienung02_Btn02 trigger: Short_37
2016-03-02 22:03:50 CUL_HM Fernbedienung02_Btn02 trigger_cnt: 37
2016-03-02 22:03:53 dummy Fernbedienung02OffTastenverzoegerungChkBox off
2016-03-02 22:03:55 Global global DELETED Fernbedienung02OffTastenverzoegerungChkBoxWiederZuruecksetzenTemp
2016-03-02 22:03:58 Global global DELETED Gong3Fernbedienung02Temp1
2016-03-02 22:03:58 DOIF di_Fernbedienung02 wait_timer: no timer


Woran könnte es liegen?

Viele Grüße,
Heiko