Rule: Wenn Taster doppelt gedrückt wurde

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
schokole
Beiträge: 12
Registriert: 28. Aug 2018 07:31
Answers: 0

Rule: Wenn Taster doppelt gedrückt wurde

Beitrag von schokole »

Hi zusammen,

ich bin mal wieder dabei ein bisschen was zu coden.
Leider bin ich immernoch etwas unbeholfen was die Programmierung angeht.

Aktueller Stand:
An meinem KNX-Schalter (Jung Taster 5094TSM) steuere ich das Licht per Wippe (links an, rechts aus).
In diesem Raum habe ich auch einen Präsenzmelder, welchen ich per OpenHab Oberfläche schalten kann.
Wenn der Präsenzmelder aktiv ist, schaltet er das Licht.

Mein Wunsch:
Wenn ich das Licht doppelt innerhalb einer Sekunde aktiviere - quasi ein Doppelklick am Schalter, möchte ich den Präsenzmelder an bzw ausschalten

Hintergrund:
Derzeit schalte ich den Präsenzmelder per Smartphone Oberfläche und will es auch am Schalter können - wie kein Platz mehr ist.

Wie muss ich die Rules schreiben, dass wenn am Schalter "doppelt ein" gedrückt wird, der Status des Präsenzmelders auf ein gesetzt wird?
Wie muss ich die Rules schreiben, dass wenn am Schalter "doppelt aus" gedrückt wird, der Status des Präsenzmelders auf aus gesetzt wird?

Gibt es dazu bereits etwas? Hatte leider nichts gefunden.
Wenn es bessere Ansätze und Lösungen für das Problem gibt, immer her damit.


Ich habe Schalter und co als Things und Items eingebunden.


Vielen Dank im Voraus und viele Grüße :)

Schoko
Läuft: openHAB 3.0 @ Synology Diskstation (Docker-Image), KNX, Nanoleaf, Fritz!Box
In Arbeit: Amazon Echos mit Alexa, Netatmo Wetterstation

Benutzeravatar
udo1toni
Beiträge: 15265
Registriert: 11. Apr 2018 18:05
Answers: 245
Wohnort: Darmstadt

Re: Rule: Wenn Taster doppelt gedrückt wurde

Beitrag von udo1toni »

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

Antworten