Erkennung von Kurz-/Langdruck bei Tastern

Begonnen von TOtto, 23 Mai 2013, 21:42:57

Vorheriges Thema - Nächstes Thema

TOtto

Hallo,

ich Versuche gerade normale Enocean-Taster mit Kurz- und Langdruck zu belegen.
Die Taster senden ja nach dem BI/B0/AI/A0 beim loslassen der Taste ein released.

Über sequence geht das ganze nicht, da bei Kurzdruck beide sequence erkannt werden.

#Dachrollo per Kurzdruck vollständig öffnen
define seq1 sequence Mini_Taster:A0 1 Mini_Taster:released
define seq1_test notify seq1:trigger set Dachrollo_SZ auf

#Dachrollo per Langdruck 10 Sekunden öffnen
define seq3 sequence Mini_Taster:A0 5 Mini_Taster:released
define seq3_test notify seq3:trigger set Dachrollo_SZ auf;;sleep 10;;set Dachrollo_SZ stop

Gibt es eine eingebaute Funktion um das zu realisieren? Bin nicht fündig geworden.

Danke.
Grüße
Thomas


klaus.schauer

Zitat von: TOtto schrieb am Do, 23 Mai 2013 21:42Hallo,

ich Versuche gerade normale Enocean-Taster mit Kurz- und Langdruck zu belegen.
Die Taster senden ja nach dem BI/B0/AI/A0 beim loslassen der Taste ein released.

Über sequence geht das ganze nicht, da bei Kurzdruck beide sequence erkannt werden.

#Dachrollo per Kurzdruck vollständig öffnen
define seq1 sequence Mini_Taster:A0 1 Mini_Taster:released
define seq1_test notify seq1:trigger set Dachrollo_SZ auf

#Dachrollo per Langdruck 10 Sekunden öffnen
define seq3 sequence Mini_Taster:A0 5 Mini_Taster:released
define seq3_test notify seq3:trigger set Dachrollo_SZ auf;;sleep 10;;set Dachrollo_SZ stop

Gibt es eine eingebaute Funktion um das zu realisieren? Bin nicht fündig geworden.

Danke.
Grüße
Thomas

Normalerweise sendet Fhem nur das, was man angibt: A0, CI, released. Da manche Funktionen von den Aktoren nur ausgeführt werden, wenn nach einem Befehl auch ein released kommt, habe ich das Attribut switchMode eingeführt. Falls es auf pushbutton steht, wird nach einem Befehl sofort released gesendet. Man könnte sich natürlich auch vorstellen, diese Funktion aufzubohren und die Zeit bis zum Senden von released variabel zu machen. Mir ist aber noch keine gute Lösung für Parameterisierung bei der Eingabe eingefallen. Schließlich soll der Wert ja nicht nur fest als Attribut vorgegeben werden können.

TOtto

Hallo Klaus,

da hast du mich falsch verstanden:
1.
ich lese einen externen Schalter "Mini_Taster" ein und will abhängig davon, ob er kurz oder lang betätigt wurde, verschieden Aktionen auslösen. Leider weiss ich nicht wie ich das vernünftig umsetzen soll, da das mit sequence nicht funktioniert.

2. zu dem von dir beschriebenen Thema:
da bin ich auch gerade dran. Ich habe an ein Eltako FSR14-4x (4fach Schalter) eine Velux Kux100-Fernbedienung angebaut um die Tasterbetätigung der Fernbedienung zu simulieren. Das Relais des FSR14 wird bei der Einstellung "ER" solange angezogen bis released gesendet wird. Das geschieht bei pushbutton so schnell dass die Fernbedienung nicht immer einen Tasterdruck erkennt. Beim versenden von zwei Enocean-Telegrammen ist immer eine Pause von 0.2 Sekunden, bei pushbutton gibt es keine. Hier die Stelle:

      IOWrite ($hash, $header, $data);
      if ($switchMode eq "pushbutton") {
        $data = "F600";
        $status = "20";
       select(undef, undef, undef, 0.2);   #Entprellzeit für pushbutton
        $data = sprintf "%s%s%s", $data, $subDef, $status;
   Log $ll2, "EnOcean: set $name released";
        IOWrite ($hash, $header, $data);
      }
    }
    select(undef, undef, undef, 0.2);   # Tested by joerg. He prefers 0.3 :)

Meines erachtens wäre ein Attribut ausreichend, da das ganze schalterspezifisch ist und sich nicht dauernd ändern sollte.

Grüße
Thomas


klaus.schauer

Zitat von: TOtto schrieb am Fr, 24 Mai 2013 14:31Hallo Klaus,

da hast du mich falsch verstanden:
1.
ich lese einen externen Schalter "Mini_Taster" ein und will abhängig davon, ob er kurz oder lang betätigt wurde, verschieden Aktionen auslösen. Leider weiss ich nicht wie ich das vernünftig umsetzen soll, da das mit sequence nicht funktioniert.

2. zu dem von dir beschriebenen Thema:
da bin ich auch gerade dran. Ich habe an ein Eltako FSR14-4x (4fach Schalter) eine Velux Kux100-Fernbedienung angebaut um die Tasterbetätigung der Fernbedienung zu simulieren. Das Relais des FSR14 wird bei der Einstellung "ER" solange angezogen bis released gesendet wird. Das geschieht bei pushbutton so schnell dass die Fernbedienung nicht immer einen Tasterdruck erkennt. Beim versenden von zwei Enocean-Telegrammen ist immer eine Pause von 0.2 Sekunden, bei pushbutton gibt es keine. Hier die Stelle:

      IOWrite ($hash, $header, $data);
      if ($switchMode eq "pushbutton") {
        $data = "F600";
        $status = "20";
       select(undef, undef, undef, 0.2);   #Entprellzeit für pushbutton
        $data = sprintf "%s%s%s", $data, $subDef, $status;
   Log $ll2, "EnOcean: set $name released";
        IOWrite ($hash, $header, $data);
      }
    }
    select(undef, undef, undef, 0.2);   # Tested by joerg. He prefers 0.3 :)

Meines erachtens wäre ein Attribut ausreichend, da das ganze schalterspezifisch ist und sich nicht dauernd ändern sollte.

Grüße
Thomas

Eine feste Verzögerungszeit von 0,2 s werde ich erst einmal einbauen. Längere und individuelle Verzögerungszeiten könnten die Anwender sicherlich mit sleep <time> realisieren. Falls das unpraktisch ist, könnte man bei Bedarf individuelle Zeiten über die Funktion InternalTimer() bereitstellen. Dann wird der Programmablauf von EnOcean_Set($@) nicht blockiert.

rudolfkoenig

> Über sequence geht das ganze nicht, da bei Kurzdruck beide sequence erkannt wird.

sequenz muesste so geaendert werden, dass die Zeit-Spezifikation nicht nur Ober-, sondern auch Untergrenzen erkennt, z.Bsp. mit der Syntax
define lampseq sequence Btn1:on 0.5:1.5 Btn2:off

Falls jemand das implementiert und testet, dann checke ich es ein :)

zfranz

Zwei funktionierende Lösungsansätze zum Unterscheiden von Kurz- und Langdruck sind hier beschrieben:
http://forum.fhem.de/index.php?topic=22289.0

justme1968

#6
die 'zu fuss' methode den einfach klick richtig zu erkennen wäre vielleicht ein WATCHDOG für den einfach klick. der würde feuern wenn nach dem einfachen klick kein zweiter mehr kommt. der doppel klick dann über sequence.

der nachteil dabei (und jeder anderen lösung mit einfach und doppelklick bei der doppelklick nicht einfach nur eine 'erweiterung' des einfach klick ist sondern etwas komplett anderes macht) ist das die reaktion auf den einfach klick verzögert ist.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968