Neues Modul:Taster

Begonnen von ThomasRamm, 11 Januar 2016, 11:12:04

Vorheriges Thema - Nächstes Thema

ThomasRamm

Neue Version vom 29.06.2016 verfügbar

Hallo,
ich habe mir ein Modul geschrieben das mir hilft auf einfache Weise Taster mehrfach zu belegen, so dass ich einen Tastendruck, doppelte Tastendrücke und lange Tastendrücke erkennen und darauf reagieren kann.
Meine Eingänge sind Readings eines einzigen Hardwaremoduls, weshalb ich das ganze auf Readings ausgerichtet habe. Ein Abändern auf einen Eingang ist mit wenig Aufwand im Code ebenfalls möglich.
Das Modul wertet also on/off Stati eines Readings aus und zählt/speichert die Millisekunden die zwischen den Readingaktualisierungen liegen. Dabei kann das Modul folgende Situationen erkennen:

  • kurzer Tastendruck
  • langer Tastendruck
  • doppelter Tastendruck
  • Taste wird gerade gedrückt
Getestet habe ich dieses Modul bisher mit einem I2C_MCP23017 und einer Siemens S5 Steuerungsanlage
Das Hauptaugenmerk liegt bei diesem Modul darauf die verschiedenen Tastendrücke auszuwerten, die Darstellung
der Tasten auf der Oberfläche und die Set-Methoden dienen mehr dem Debugging, nichts desto trotz wird der letzte Tastendruck bzw. ein "Wird gerade gedrückt" visuell dargestellt und es ist möglich die verschiedenen Tastendrücke per set zu simulieren. Die zur Darstellung benutzte devStateIcon-Definition sowie webCmd-Definition wird bei einem define automatisch mit erzeugt, so dass man sich da einiges an Tipp-Arbeit spart wenn man die Darstellung so übernimmt.

Wird ein Doppelklick definiert bedeutet dies natürlich das auch bei jedem einfachen Tastendruck kurz gewartet wird ob ein zweiter folgt und somit die Schaltvorgänge alle etwas verzögert ausgeführt werden. Ich habe eine Wartezeit von 0,5 Sekunden bei den meisten Tastern und empfinde es als nicht störend. Soll der doppelte Tastendruck nicht ausgewertet werden, sondern nur ein kurzer oder langer Tastendruck, dann einfach die Definitionen für den doppelten Tastendruck löschen oder die Wartezeit auf 0 setzen, dann werden die Schaltvorgänge wieder sofort ausgeführt.

Der zuletzt erkannte Tastendruck wird im state-Reading gespeichert.
Zusätzlich zur Auswertung des Tastendrucks kann man auch gleich noch einen Befehl hinterlegen der bei diesem Tastendruck ausgewertet werden soll, so dass man sich ein DOIF oder notify sparen kann. Das macht das ganze für mich etwas übersichtlicher.

In der Definition wird das Hardwaremodul und das Reading (der Port/Adresse) des "on"/"off" Tasters angegeben</p>

Beispiel
define Taster1 TASTER myMcp20 PortB1

Define
define <name> TASTER <device> <port>

  • device = Das Device in fhem dessen Reading ausgewertet werden soll
  • port = Der Auszuwertende Port/Reading des Device

Set

  • set <name> pushed
    Status des devices auf 'pushed' setzen, verknüpft aktionen auslösen
  • set <name> short-click
    Status des devices auf 'short-click' setzen und verknüpfte aktionen auslösen
  • set <name> double-click
    Status des devices auf 'double-click' setzen und verknüpfte aktionen auslösen
  • set <name> long-click
    Status des devices auf 'long-click' setzen und verknüpfte aktionen auslösen

Attribute


  • long-click-time
      Zeit in Sekunden die eine Taste gedrückt werden muss um als "Langer Tastendruck" ausgewertet zu werden
  • long-click-define
      Optionaler Befehl der bei einem langen Tastendruck ausgeführt werden soll.
      Hier ist alles erlaubt was auch in der Befehlszeile von fhem eingegeben werden kann.
  • short-click-define
      Optionaler Befehl der bei einem kurzen Tastendruck ausgeführt werden soll.
      Hier ist alles erlaubt was auch in der Befehlszeile von fhem eingegeben werden kann.
  • double-click-time
      Zeit in Sekunden die nach einem Tastendruck gewartet werden soll. Erfolgt innerhalb dieser Zeit ein weiterer Tastendruck, so wird ein "Doppelter Tastendruck" ausgewertet.
  • double-click-define
      Optionaler Befehl der bei einem kurzen Tastendruck ausgeführt werden soll.
      Hier ist alles erlaubt was auch in der Befehlszeile von fhem eingegeben werden kann.
  • pushed-click-define
      Optionaler Befehl der bei einem kurzen Tastendruck ausgeführt werden soll.
      Hier ist alles erlaubt was auch in der Befehlszeile von fhem eingegeben werden kann.

Komplette Beispielkonfiguration inkl. Readings:
Ich benutzt das Modul um bei einem einfachen Klick das Licht, bei einem Doppelklick meinen Rolladen zu bedienen. Fährt der Rolladen gerade, so reicht wiederrum ein einfacher Klick um ihn zu stoppen.

define TasterWL TASTER modulE22 PortB0
attr TasterWL devStateIcon short-click:control_on_off@green long-click:control_on_off@blue pushed:control_on_off@red double-click:control_on_off@orange
attr TasterWL double-click-define set RolladenTerassentuer,RolladenWohnzimmer offen
attr TasterWL double-click-time 0.5
attr TasterWL long-click-define set dummy1 toggle
attr TasterWL long-click-time 1
attr TasterWL short-click-define {if (Value("RolladenTerassentuer") =~ /drive/) {fhem("set RolladenTerassentuer,RolladenWohnzimmer stop")} else {fhem("set WohnzimmerLicht1 toggle")}}
attr TasterWL webCmd short-click:long-click:double-click


Zeile 1: die Definition meines Linken Wohnzimmer-Tasters, der Taster ist in fhem als modulE22, dort das Reading PortB0 definiert.
Zeile 2: das Icon auf der Oberfläche. Diese Definition wird automatisch eingefügt.
Zeile 3: Der Befehl der bei einem Doppelten Klick ausgeführt wird (Rollos auf)
Zeile 4: Wenn zwischen zwei Tastendrücken <= 0,5 Sekunden liegen, dann als Doppel-Klick auswerten
Zeile 5: Einen Langen Tastendruck werte ich hier nicht aus, zur besseren Doku hier habe ich einen dummy eingetragen
Zeile 6: Wird die Taste beim drücken >= 1 sekunde gehalten, wird der Druck als langer Tastendruck ausgewertet
Zeile 7: Bei einem kurzen Tastendruck wird ein kleiner Perl-Code ausgeführt, der prüft ob das Rollo gerade fährt, wenn ja dann Rollo stoppen, sonst mein Wohnzimmerlicht schalten
Zeile 8: die Set-Befehle auf der Oberfläche, dieses Attribut wird ebenfalls automatisch eingefügt.


Gruß
Thomas

obb20a

Yo, Thomas,

das klingt gut. Allerdings ist mir jetzt vor lauter Aufregung irgendwie entgangen, wo das Modul denn nun einzusehen oder herunterzuladen ist ... ? Oder bin ich zu doof?

LG Stefan

Marie

Stimmt, das wäre schon cool....
Banana Pi & FHEM2FHEM Raspberry,RS485 Modbus Stromzähler UMG96, diverse Schaltsteckdosen 433 MHz, 868 MHz, MYSENSORS Temperatursensoren , Smartvisu, Homekit & Siri, Geofency, Zwave Rauchmelder & Steckdosen & Garagensteuerung, TabletUi mit BananaPi M2Ultra im Wohnmobil, Homebridge usw.usw.

CQuadrat

Zitat von: ThomasRamm am 11 Januar 2016, 11:12:04
ich habe mir ein Modul geschrieben das mir hilft auf einfache Weise Taster mehrfach zu belegen, so dass ich einen Tastendruck, doppelte Tastendrücke und lange Tastendrücke erkennen und darauf reagieren kann.

Kennst Du das sequence-Modul (http://fhem.de/commandref.html#sequence)?
Damit kann man schon viele Tastenkombinationen realisieren.
FHEM auf Mini-ITX-Server mit Intel Quad-Core J1900:
+ HM: HM-LAN, HM-USB, HM-MOD-UART mit div. HM-Komponenten
+ RFXtrx: Funkwetterstation Bresser mit ext. Thermometer, Regenmesser und Windmesser
+ TUL (KNX-Anbindung), KM271 (per ser2net), SONOS (div. Gimmicks), OneWire, Hue

ThomasRamm

Sorry,
habe ich doch tatsächlich verschlafen den Code anzuhängen.
Habe das im ersten Thread nachgeholt

Das Sequence-Modul kannte ich selber nicht, danke für den Hinweis.
Werde ich mir nochmal genauer anschauen.

Gruß
Thomas

xMichiix

Hallo,

hab das modul mal benutzt aber leider will es nicht so wirklich :o

zuahuse will ich es als küchenlichtschalter verwenden und gleichzeitig als radio an aus
aber leider kommt dann immer wen ich es testen will die fehlermeldung:
2016.06.24 15:05:34 1 : PERL WARNING: Use of uninitialized value $port in regexp compilation at ./FHEM/44_TASTER.pm line 250, <GEN16> line 792058.
2016.06.24 15:05:34 1 : PERL WARNING: Use of uninitialized value $port in string ne at ./FHEM/44_TASTER.pm line 253,

kann mir einer da helfen ?:o

ThomasRamm

Hallo,
habe den Fehler gefunden und behoben. In meinem ersten Beitrag findest du die Version 1001

Gruß
Thomas

klausw

Habe das Modul erst jetzt entdeckt.
Diese Funktionen separat bereitzustellen ist eine gute Idee.
Wenn es einigermaßen getestet kannst du es auch in SVN einchecken, dann ist es direkt nach einem update verfügbar
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

xMichiix

Hallo,

hab noch eine frage.
define <name> TASTER <device> <port>
muss ich umbedingt das device und den port angeben ?
ich habe keinen Taster etc. von irgendeinen hersteller :o
hab mir selbst was gebaut und jetz gibts da auch keinen port dafür.
laut FHEM wird alles erkannt wen ich den Taster / schalter drücke aber in der PERL funktion kannt dann das Problem das kein port angegeben ist. :O

gibt es da eine andere möglichkeit ?

ich weiß es geht auch anders aber denke das modul hier ist recht schon und man kann es auch bei vielen einsetzen und für das verständnis ist es auch relativ einfach :D

ThomasRamm

Hallo,
genau das Problem habe ich ja in der neuen Version gelöst,
die Angabe des Port ist nun optional. Wenn in der Definition keiner Angegeben ist, arbeitet das Modul auch nur mit einem Device.
Wichtig ist nur das dein Device den Status on/off hat.

devil77

Hallo,

wollte das ganze gern mal testen.
Bekomme aber beim Laden des Modules folgenden Hinweis in der log
syntax error at ./FHEM/44_TASTER.pm line 49, near "."
Global symbol "$value" requires explicit package name at ./FHEM/44_TASTER.pm line 255.
Global symbol "$value" requires explicit package name at ./FHEM/44_TASTER.pm line 257.
Global symbol "$value" requires explicit package name at ./FHEM/44_TASTER.pm line 261.


Habe die Version 1001 versucht.

ThomasRamm

Da ist irgendwie beim Kopieren von meinem System ein ; verrutscht. Korrigiere ich sowie ich zu Hause bin
Gruß Thomas

ThomasRamm

Fehler ist behoben, ihr könnt euch die neueste Version aus dem ersten Kommentar nun kopieren, die "alten" Versionen habe ich entfernt.

Gruß
Thomas

xMichiix

#13
Guten abend,

jetzt habe ich leider dieses problem:.
2016.07.04 19:10:40 1 : PERL WARNING: Subroutine TASTER_Initialize redefined at ./FHEM/44_TASTER.pm line 29, <GEN9> line 1268.
2016.07.04 19:10:40 1 : PERL WARNING: Subroutine TASTER_Define redefined at ./FHEM/44_TASTER.pm line 57, <GEN9> line 1268.
2016.07.04 19:10:40 1 : PERL WARNING: Subroutine TASTER_Undef redefined at ./FHEM/44_TASTER.pm line 98, <GEN9> line 1268.
2016.07.04 19:10:40 1 : PERL WARNING: Subroutine TASTER_Set redefined at ./FHEM/44_TASTER.pm line 113, <GEN9> line 1268.
2016.07.04 19:10:40 1 : PERL WARNING: Subroutine TASTER_Execute redefined at ./FHEM/44_TASTER.pm line 148, <GEN9> line 1268.
2016.07.04 19:10:40 1 : PERL WARNING: Subroutine TASTER_Get redefined at ./FHEM/44_TASTER.pm line 176, <GEN9> line 1268.
2016.07.04 19:10:40 1 : PERL WARNING: Subroutine TASTER_Attr redefined at ./FHEM/44_TASTER.pm line 214, <GEN9> line 1268.
2016.07.04 19:10:40 1 : PERL WARNING: Variable "$value" is not imported at ./FHEM/44_TASTER.pm line 255, <GEN9> line 1268.
2016.07.04 19:10:40 1 : PERL WARNING: Variable "$value" is not imported at ./FHEM/44_TASTER.pm line 257, <GEN9> line 1268.
2016.07.04 19:10:40 1 : PERL WARNING: Variable "$value" is not imported at ./FHEM/44_TASTER.pm line 261, <GEN9> line 1268.
2016.07.04 19:10:40 1 : reload: Error:Modul 44_TASTER deactivated:  Global symbol "$value" requires explicit package name at ./FHEM/44_TASTER.pm line 255, <GEN9> line 1268.
                                         Global symbol "$value" requires explicit package name at ./FHEM/44_TASTER.pm line 257, <GEN9> line 1268.
                                         Global symbol "$value" requires explicit package name at ./FHEM/44_TASTER.pm line 261, <GEN9> line 1268.
2016.07.04 19:10:40 0 : Global symbol "$value" requires explicit package name at ./FHEM/44_TASTER.pm line 255, <GEN9> line 1268.
                                         Global symbol "$value" requires explicit package name at ./FHEM/44_TASTER.pm line 257, <GEN9> line 1268.
                                         Global symbol "$value" requires explicit package name at ./FHEM/44_TASTER.pm line 261, <GEN9> line 1268.

ThomasRamm

Fehler behoben und neue Version hochgeladen