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 ()
([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 ()
([Wandtaster_Wohnzimmer_Btn05] =~/Long/)
(set PollinStandventilator off)
DOELSE ()
- attr do always
- attr cmdpause 5
Viele Grüße,
Heiko
Hallo Heiko,
DOIF triggert zwar den Event du fragst mit oder den State ab. Daher das Problem.
Nimm also das "?" ...
Gruß Otto
Die neue Schreibweise dafür ist aber nun:
[device:"event"]
Das Fragezeichen ist aber noch möglich.
Wieder was an mir vorbei gegangen :-X
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
Hier steht alles drin was Du brauchst für Dein Vorhaben (http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung_ueber_Auswertung_von_Events)
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"]
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
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
Das habe ich doch auch geschrieben.
/Long.1_.*
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 ...
Oh, cool. Das kannte ich ja noch gar nicht. Dann muss ich heute abend mal wieder einen Blick in den EventMonitor werfen.
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
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 (http://forum.fhem.de/index.php/topic,10782.msg61775.html#msg61775) 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.
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
In deinem Event-Log kann ich aber nicht erkennen, dass es doppelt ausgeführt wird n
Moin Heiko,
Du drückst die FB und es dauert 4 sec bis das DOIF anspringt?!
Ist die FB mit einem Aktor gepeert und der ist nicht erreichbar? Dann sendet die FB die Befehle bis zu dreimal.
Gruß Otto
Zitat2016-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
Das DOIF triggert 2x, weil es 2 Events gibt die Short beinhalten.
Du könntest es lösen, wenn Du das Ereignis vollständig beschreibst: [Fernbedienung02_Btn01:"^Short \(to vccu\)$"] oder einfach nur den Beginn des Ereignisses kennzeichnest.
Stimmt. Das wird es sein.
Bei mir tritt das nicht auf, da ich hier NICHT über die Events gehe. Dies hatte ich hier (http://forum.fhem.de/index.php/topic,49844.msg415969.html#msg4159699) ja auch schon beschrieben.
([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)
Beim Wandtaster muss man nicht zwangsläufig über die Events gehen. Die Readings werden geschrieben, wenn die Buttons gedrückt werden. Die Readings werden hier NICHT zyklisch aktualisiert, wie bei den Bewegungsmeldern (Stichwort: actCycle).