Tastenerkennung

Begonnen von JMW, 25 Mai 2015, 19:05:12

Vorheriges Thema - Nächstes Thema

JMW

Hallo, wie mache ich, dass bei Long-Erkennung genau ein Aktion ausgelöst wird, ohne dass bei dauerndem Drücken bei jedem Long-Event
die Aktion ausgelöst wird. Bei LongRelease Erkennung soll der Mechanismus zurückgesetzt werden, damit bei erneutem Long-Erkennen die
Aktion wieder ausgeführt wird.
Wie macht man das am besten?

Danke.

wkarl

Hallo,

ZitatlgMultiExec      |     literal        | required | multiple execution per repeat of long trigger options:on,off

Habe es noch nicht gebraucht/getestet, aber das Register sollte in die Richtung gehen. Ist standardmäßig on, also off würde nur einen lg event berücksichtigen.

ciao walter
FHEM 5.7 & TabletUI 2.2 auf Fedora22 Server auf NUC5i5RYK
CUL 868 > FAST EnergyCam
HMLAN > HomeMatic TCs & VDs, Bewegungsmelder, Schalter, Taster, Steckdosen

frank

schau dir die events genau mit dem eventmonitor an.  mit long sollte auch ein zähler gesendet werden. dadurch kann man eigentlich ein gedrückt halten erkennen. eventuell noch das attr event-on-change benutzen.

wenn du direkt peerst, kannst du ein retriggern mehrerer longs auch unterdrücken, indem du das register lgMultiExec=off im aktor für diesen peer setzt.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

JMW

Soll ich es also so machen:
Ich schau auf den Long Counter und merke mir mit einer Variable, dass ich die Aktion ausgelöst habe. Bei Erkennen des LongRelease setze ich die Variable dann zurück, damit die Aktion erneut ausgelöst wird.

frank

zb so oder du vergleichst ob sich der counter geändert/nicht geändert hat. der zählt wohl nur bei jedem erneuten drücken hoch. eventuell überlauf beachten bei 255->0. am besten ein paar eventsequenzen beobachten. ich habe keinen echten hm-taster. mit setreading kannst du diesen wert in irgendeinem device wegspeichern.

es gibt auch ein modul sequence oder so ähnlich. vielleicht bietet das auch schon was fertiges.
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

Pfriemler

Ist eines meiner Standardprobleme hier :-)
Vorweg: das erwähnte Register ist nur sinnvoll bei direktem Peering und entsprechenden Einstellungen. Für eine Auswertung in FHEM dagegen nutzlos.

meine Lösungsmöglichkeiten:
a) Trigger auf das entsprechende Long-Event (also mit Counter), z.B. "<HM-channel>:Long.5.*"
   + wird nur einmal ausgeführt
   + Auslösezeit kann man wählen durch Wahl der Ziffer
   - Gefahr von ausgelassenen Triggern, wenn ausgerechnet diese Message verloren geht
b) Auslösen auf LongRelease
   - haptisch unlogisch (Aktion erfolgt erst beim Loslassen der Taste)
   + bei mir seltsamerweise viel sicherer als a)
c) Setzen des Attributs "event-min-interval" im HM-Channel: neue Events werden erst berücksichtigt nach dieser Zeitspanne
d) Verarbeitung im DOIF ohne "do always": zwei Zweige, die auf Long bzw. LongRelease triggern. Der Long-Zweig wird zwar erneut getriggert, aber sein Ausführungsteil nur einmal ausgeführt, bis die Taste wieder losgelassen wird (dann "kippt" das DOIF in den zweiten Zustand und ist bereit für eine neue Auslösung).
Die vorgeschlagene Variante mit dem Dummy, der bei Long bzw. LongRelease gekippt wird, macht prinzipiell genau das Gleiche wie d).

"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

JMW

Wie kann ich im DOIF auf die notifications reagieren?

Geht das so?

define di_Tastenerkennung DOIF (["<HM-channel>:Long.*] ) ( .... Taste gedrückt ..... ) DOELSE ( .... )

Pfriemler

Fast. Notifys reagieren auf Events, DOIF auf Wunsch auch:
Zitat commandref:
ZitatEreignissteuerung über Auswertung von Events
Eine Alternative zur Auswertung von Stati oder Readings ist das Auswerten von Ereignissen (Events) mit Hilfe von regulären Ausdrücken, wie beim notify. Eingeleitet wird die Angabe eines regulären Ausdrucks durch ein Fragezeichen. Die Syntax lautet: [<devicename>:?<regexp>]
Anwendungsbeispiel: wie oben, jedoch wird hier nur das Ereignis (welches im Eventmonitor erscheint) ausgewertet und nicht der Status von "remotecontrol" wie im vorherigen Beispiel
define di_garage DOIF ([remotecontrol:?on]) (set garage on) DOELSEIF ([remotecontrol] eq "off") (set garage off)
In diesem Beispiel wird nach dem Vorkommen von "on" innerhalb des Events gesucht.

Richtig wäre also
define di_Tastenerkennung DOIF ([<HM-channel>:?Long]) ( .... Aktion für Taste gedrückt ..... ) DOELSE ( .... )
oder, falls innerhalb des DOIF bswp. noch "Short" ausgewertet werden soll
define di_Tastenerkennung DOIF ([<HM-channel>:?Long]) ( .... Aktion für Taste gedrückt ..... )
DOELSEIF ([<HM-channel>:?LongRelease]) ( ... Aktion für Taste losgelassen .... )
DOELSEIF ([<HM-channel>:?Short]) ( ... Aktion für kurzen Tastendruck .... )
DOELSE (...)

"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

JMW


JMW

Leider funktioniert der Vergleich nicht:

define di_Tastenerkennung DOIF ([<HM-channel>:?Long]) ( .... Aktion für Taste gedrückt ..... )
DOELSEIF ([<HM-channel>:?LongRelease]) ( ... Aktion für Taste losgelassen .... )
DOELSEIF ([<HM-channel>:?Short]) ( ... Aktion für kurzen Tastendruck .... )
DOELSE (...)


In den Zweig für Taste losgelassen kommt man nie rein, weil "?Long" auch für "?LongRelease" zutrifft
und daher nur einmal ausgeführt wird.
Kann man bei DOIF das "do always" für bestimmte Zweige auswählen?

Pfriemler

Do always geht immer nur für alles.

Stimmt, Logikfehler. Bitte mal testweise LongRelease-Erkennung als ersten Zweig setzen, damit er ggf. als erstes Zutreffendes das DOIF entsprechend kippt.
Wenn der Eventfilter ein echtes Regex ist, müsste als Long-Filter evtl. auch Long\s funktionieren  (bzw \s für ein Space), weil die Long-Messages immer auch ein Leerzeichen und eine Ziffer haben...

geht nich Gips nich ...

"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

JMW

Super Tipp, danke!
Wenn LongRelease als erstes geprüft wird, dann funktioniert es:

define di_Tastenerkennung DOIF ([<HM-channel>:?LongRelease]) ( .... Aktion für Taste losgelassen ..... )
DOELSEIF ([<HM-channel>:?Long]) ( ... Aktion für Taste gedrückt.... )
DOELSEIF ([<HM-channel>:?Short]) ( ... Aktion für kurzen Tastendruck .... )
DOELSE (...)


Das funktioniert aber nicht:
DOIF ([<HM-channel>:?Long/s)

Pfriemler

ZitatWenn LongRelease als erstes geprüft wird, dann funktioniert es:
Siehe dt. commandref zu DOIF. Der erste zutreffende Zweig wird ausgeführt, die anderen ignoriert. Nur bei Zeitsteuerungen ist das Verhalten intern bedingt etwas anders.

ZitatDas funktioniert aber nicht: [<HM-channel>:?Long/s)
Sollte wenn auch [<HM-channel>:?Long\s)] heißen müssen. \s ist ein Whitespace, also eines der möglichen Arten von Leerzeichen.

"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."