Homematic 6fach-Taster HM-PB-6-WM55 mit openHAB als universales Eingabegerät auch für PIN-Eingaben verwenden

Der 6fach-Taster von Homematic (HM-PB-6-WM55) ist ein recht universell einsetzbares Gerät, welches für viele Einsatzzwecke hergenommen werden kann.
Ich selbst verwende ihn, um bestimmte Funktionen im Haus direkt anzusteuern und verwende ihn auch z.B. zum Deaktivieren meiner Alarmanlage.

Angedachte Use-Cases

  • Bestimmte Tasten sollen bei langem Tastendruck bestimmte Smart-Home-Funktionen starten
  • Kurzer Tastendruck soll registriert werden und als Zahlenfolge erkannt werden, so dass die richtige Drück-Reihenfolge z.B. die Alarmanlage deaktiviert.

Um auf die langen und kurzen Tastendrücke entsprechend reagieren zu können, habe ich zuerst ausschließen wollen, dass ein etwas zu langer kurzer Tastendruck als langer erkannt wird oder umgekehrt. Daher habe ich zuerst im Homematic-Konfigurator die Zeit für einen langen Tastendruck auf das Maximum erhöht (1,8 s.).

Dann werden die Geräte in openHAB eingebunden. Um eine eingegebene Tastenkombination auswerten und speichern zu können brauchen wir nicht nur den Taster mit seinen Tasten für Lang und Kurz sondern auch noch einen String für die Zeichenkette.

items-Datei:

Switch schalter_1_6fach_OL_kurz "Schalter Oben links" { homematic="address=OEQ0******, channel=1, parameter=PRESS_SHORT" }
Switch schalter_1_6fach_OR_kurz "Schalter Oben rechts" { homematic="address=OEQ0******, channel=2, parameter=PRESS_SHORT" }
Switch schalter_1_6fach_ML_kurz "Schalter Mitte links" { homematic="address=OEQ0******, channel=3, parameter=PRESS_SHORT" }
Switch schalter_1_6fach_MR_kurz "Schalter Mitte rechts" { homematic="address=OEQ0******, channel=4, parameter=PRESS_SHORT" }
Switch schalter_1_6fach_UL_kurz "Schalter Unten links" { homematic="address=OEQ0******, channel=5, parameter=PRESS_SHORT" }
Switch schalter_1_6fach_UR_kurz "Schalter Unten rechts" { homematic="address=OEQ0******, channel=6, parameter=PRESS_SHORT" }

String schalter1_sequenz "%s"

Switch schalter_1_6fach_OL "Schalter Oben links" { homematic="address=OEQ0******, channel=1, parameter=PRESS_LONG" }
Switch schalter_1_6fach_OR "Schalter Oben rechts" { homematic="address=OEQ0******, channel=2, parameter=PRESS_LONG" }
Switch schalter_1_6fach_ML "Schalter Mitte links" { homematic="address=OEQ0******, channel=3, parameter=PRESS_LONG" }
Switch schalter_1_6fach_MR "Schalter Mitte rechts" { homematic="address=OEQ0******, channel=4, parameter=PRESS_LONG" }
Switch schalter_1_6fach_UL "Schalter Unten links" { homematic="address=OEQ0******, channel=5, parameter=PRESS_LONG" }
Switch schalter_1_6fach_UR "Schalter Unten rechts" { homematic="address=OEQ0******, channel=6, parameter=PRESS_LONG" }

Nun kann auf die jeweilige Taste per rule reagiert werden, das normale Reagieren auf kurzen und langen Tastendruck ist trivial, daher überspringe ich das hier und bringe nur beispielhaft die Rule ein, welche bei mir die Anwesenheitssimulation aktiviert.

Rules-Datei für kurze Tastendrücke und deren Verarbeitung:

rule "6-Fachschalter 1 - Mitte links"
when Item schalter_1_6fach_ML changed from OFF to ON
then praesenzSimulation.postUpdate(ON)
end

Spannender ist das Verwerten von Tasten-Sequenzen. Mein Ziel war es, eine vierstellige PIN erkennen zu können. Wie auf der Grafik ganz oben zu sehen habe ich das Inlay entsprechend gestaltet und mit Nummern versehen.

Hier legen wie eine Sequenzlänge (im Beispiel 4, beliebig änderbar) in der Rule an und verarbeiten dann die kurzen Tastendrücke entsprechend. Wichtig war hierbei, dass sofort nach Erkennen eines kurzen Tastendrucks per postUpdate der Schalter wieder auf aus gesetzt wird. Ansonsten dauert es ein bisschen, bis openHAB den Switch von selbst wieder auf OFF setzt. Macht man das nicht ist das erkennen von schneller eingegebenen Tastenfolgen nur sehr schwer möglich und man will ja nicht zwischen jedem Tastendruck 1-2 Sekunden Pause einlegen.

In meinem Beispiel werden die Tasten wie folgt vergeben:

1    2
3    4
5    6

Rules-Datei für Tastensequenz:

val Integer sequenzlaenge = 4

/**
 * Gedrückte Tasten als Text - Zeichenfolge speichern
 */
rule "6-Fachschalter 1 - Tastendrücke-Sequenzerkennung OL"
when Item schalter_1_6fach_OL_kurz changed to ON
then 
 schalter1_sequenz.postUpdate(schalter1_sequenz.state.toString().reverse().substring(0,sequenzlaenge -1).reverse() + '1')
 schalter_1_6fach_OL_kurz.postUpdate(OFF)
end
rule "6-Fachschalter 1 - Tastendrücke-Sequenzerkennung OR"
when Item schalter_1_6fach_OR_kurz changed to ON
then 
 schalter1_sequenz.postUpdate(schalter1_sequenz.state.toString().reverse().substring(0,sequenzlaenge -1).reverse() + '2')
 schalter_1_6fach_OR_kurz.postUpdate(OFF)
end
rule "6-Fachschalter 1 - Tastendrücke-Sequenzerkennung ML"
when Item schalter_1_6fach_ML_kurz changed to ON
then 
 schalter1_sequenz.postUpdate(schalter1_sequenz.state.toString().reverse().substring(0,sequenzlaenge -1).reverse() + '3')
 schalter_1_6fach_ML_kurz.postUpdate(OFF)
end
rule "6-Fachschalter 1 - Tastendrücke-Sequenzerkennung MR"
when Item schalter_1_6fach_MR_kurz changed to ON
then 
 schalter1_sequenz.postUpdate(schalter1_sequenz.state.toString().reverse().substring(0,sequenzlaenge -1).reverse() + '4')
 schalter_1_6fach_MR_kurz.postUpdate(OFF)
end
rule "6-Fachschalter 1 - Tastendrücke-Sequenzerkennung UL"
when Item schalter_1_6fach_UL_kurz changed to ON
then 
 schalter1_sequenz.postUpdate(schalter1_sequenz.state.toString().reverse().substring(0,sequenzlaenge -1).reverse() + '5')
 schalter_1_6fach_UL_kurz.postUpdate(OFF)
end
rule "6-Fachschalter 1 - Tastendrücke-Sequenzerkennung UR"
when Item schalter_1_6fach_UR_kurz changed to ON
then 
 schalter1_sequenz.postUpdate(schalter1_sequenz.state.toString().reverse().substring(0,sequenzlaenge -1).reverse() + '6')
 schalter_1_6fach_UR_kurz.postUpdate(OFF)
end

Nun bekommen wir immer die letzten 4 eingegebenen Tasten als Zeichenkette im Sequenz-Item geupdated. Dies können wir nun beliebig verwenden. Ändert sich die geupdatete Sequenz so prüfen wir, ob sie PIN stimmt und wenn ja machen wir etwas, z.B. die Alarmanlage deaktivieren.

Rules-Datei zum Auswerten der Tastersequenz:

val String geheimePin = '1234'
rule "Sequenz Tastenkombi prüfen"
when Item schalter1_sequenz changed
then
 if ((schalter1_sequenz.state.toString() == geheimePin) && (alarmanlage.state != 0)) {
 logInfo('rules', 'Alarmanlage: Richtige GeheimPIN eingegeben. Modus: ' + alarmanlage.state.toString())
 // Code löschen aus String-Speicher 
 schalter1_sequenz.postUpdate('XXXX')
 // Alarmanlage auf aus setzen
 alarmanlage.sendCommand(0)
(...)
 }
end

Ich denke das ist ein netter Anwendungsfall, wenn man für sein Zuhause eine Art Eingabesystem für Codes braucht. und dafür kein komplettes Bildschirm-System zusammenbasteln will. In meinem Fall wird das dann bei den Eingängen ins Haus jeweils als 1 6fach-Taster realisiert.

Vielleicht kann die obigen Schnippsel ja noch jemand brauchen. Der 6fach-Schalter ist in meinen Augen ein ganz nettes, universell einsetzbares Funk-Schalter-Gerät…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.