Das kann etwas knifflig werden. zunächst einmal solltest Du wissen, dass die Anbindung von openHAB zu knx gewöhnlich
nicht auf Taster bezogen ist, sondern auf Aktoren. Soll heißen, Du drückst in knx eine Taste, diese steuert den Aktor ein oder aus, der Aktor meldet seinen Zustand, diese Zustandsmeldung kommt in openHAB an und wird dort auch angezeigt.
Da die GA, um den Aktor zu steuern gewöhnlich ebenfalls in openHAB hinterlegt ist - im selben Channel - empfängt openHAB auch schon den Befehl vom Taster, wertet diesen aber auch als Statusmeldung aus.
Da gewöhnlich Befehl und Status zueinander passen (Auf Bitebene: Befehl 1 -> Status 1, Befehl 0 -> Status 0), ist es für openHAB unerheblich, dass es die gleiche Botschaft über zwei unterschiedliche GA erhält.
Du kannst nun Rules schreiben, welche Timer starten, die dann auswerten, ob innerhalb des per Timer definierten Zeitfensters mehr als zwei ON-Rückmeldungen empfangen wurden. Es kann aber (vermutlich, ich kenne den Jung Taster nicht) sehr viel einfacher erledigt werden, vorausgesetzt, Du hast Zugriff auf das ETS Projekt und eine ETS.
dazu konfigurierst Du den Zwei-Flächen-Taster auf Dimmer um. Nun kannst Du für Kurz- und Langdruck unterschiedliche GA hinterlegen. dabei ist der kurze Tastendruck gewöhnlich ein Bit lang, für ON bzw. OFF. Der lange Tastendruck hingegen sendet einen Dimm-Befehl (DPT3.007).
Du kannst also nun in openHAB einen separaten dimmer-control Channel anlegen, in dem Du für increaseDecrease die GA einträgst, die Du im Taster für langen Tastendruck eingerichtet hast.
Den Channel koppelst Du mit einem Dimmer Item.
Jetzt fehlt noch eine Rule, welche auf Item myDimmerItem received command INCREASE triggert und die Betriebsart des Bewegungsmelders toggelt.
Sollte es sich ohnehin um einen Dimmer handeln, oder Du hast keinen Zugriff auf ETS, geht dieser schmutzige Trick natürlich nicht. Dann wäre so etwas denkbar:
Code: Alles auswählen
var Timer tDoubleClick = null
rule "doppelter Tastendruck"
when
Item myLight received update ON
then
if(tDoubleClick === null) { // Timer nicht gestartet
tDoubleClick = createTimer(now.plusSeconds(1), [| // Timer starten
tDoubleClick = null // Timer löschen
])
} else { // Timer läuft noch
// hier Bewegungsmelder toggeln
}
end
Das ist die einfachste Form, welche mir gerade einfällt.
Wird der Tastendruck ON erkannt, prüft die Rule, ob der Timer tDoubleClick existiert. Ist das der Fall, so wurde die Rule vor maximal einer Sekunde gestartet und der Tastendruck ist der zweite innerhalb einer Sekunde. Existiert der Timer nicht, so ist es der erste Tastendruck un der Timer wird angelegt. Läuft der Timer ab, so wird lediglich der Timer gelöscht. Die Rule berücksichtigt nicht, dass jemand Lichtorgel spielen könnte (AN-AUS-AN innerhalb weniger als einer Sekunde, es wird also nicht wirklich ein doppelter Tastendruck erkannt, sondern nur, ob die ON-Taste innerhalb einer Sekunde mehrfach gedrückt wurde.
Man kann den Timer auch auf eine kleinere Zeitspanne einstellen, Du hast allerdings nicht dazu geschrieben, ob Du noch openHAB2.5 oder schon openHAB3.x verwendest. Im ersten Fall könntest Du mit .plusMillis(Anzahl Millisekunden) statt mit .plusSeconds(1) arbeiten, in letzterem Fall müsstest Du auf .plusNanos(Anzahl Millisekunden * 1.000.000) ausweichen.
Problematisch kann in diesem Zusammenhang aber sein, dass eventuell (siehe oben) mehrere Tastendrücke in openHAB registriert werden. Es müsste also zunächst geklärt werden, ob das der Fall ist (ich habe da schon unterschiedliche Verhaltensweisen auf dem knx Bus gesehen...)
openHAB4.3.5 stable in einem Debian-Container (bookworm) (Proxmox 8.4.1, LXC), mit openHABian eingerichtet