Dimmen mit Long pressed

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Re: Dimmen mit Long pressed

Beitrag von udo1toni »

Ich habe mir gerade mal die Bedienungsanleitung vom I3 angeschaut, da heißt es explizit, dass die ON/OFF-Meldung nur funktioniert, wenn der Eingang auf Switch-Mode steht. Dann jedoch werden keine Short-Pressed und double/tripple pressed Botschaften gesendet.

Die pragmatische Lösung wäre, den I3-Kanal auf Switch zu stellen und in openHAB die Auswertung short/double/tripple/long zu erledigen. Ich haeb vor Jahren im englischen Forum mal dazu eine Rule programmiert, das war nicht selbsterklärend, aber verhältnismäßig leicht realisierbar.

PS: Tasmota bietet hier leider auch nicht mehr Möglichkeiten.

PPS: So ungefähr könnte es funktionieren:

Code: Alles auswählen

var Timer   tTaster       = null    // Timer für Messung Short Press
var Timer   tTasterLong   = null    // Timer für Befehlswiederholung
var Integer iTaster       = 0       // Zähler Short Press
val Long    lTasterShort  = 400     // Erkennung Short <-> Long Press
val Long    lMio          = 1000000 // Abkürzung für Million
var Boolean bTasterDir    = false   // Dimmrichtung

rule "Multi Taste"
when
    Item My Taster changed                                                         // Taster gedrückt oder losgelassen
then
    tTasterLong?.cancel                                                            // falls long press Timer läuft stoppen

    if(newState == ON) {                                                           // falls Taste gedrückt
        iTaster += 1                                                               // Zähler für Tastendruck erhöhen
        tTaster?.cancel                                                            // Timer für Unterscheidung short-long löschen
        tTaster = createTimer(now.plusNanos(lTasterShort * lMio), [|               // Messung starten
                                                                                   // hier beginnt longPress
            iTaster = 0                                                            // Zähler für short press auf 0
            tTaster = null                                                         // und Timer entfernen
            bTasterDir = !bTasterDir                                               // Dimmrichtung umkehren
            tTasterLong = createTimer(now.plusNanos(10 * lMio), [|                 // und Timer für Dimmvorgang starten
                var Integer iLevel = 0                                             // erzeuge ein lokalea Integer Objekt
                if(LED_WZ_Indirekt_ColorWhite.state instanceof Number)             // Falls der Status vom Typ Number ist
                    nLevel = (LED_WZ_Indirekt_ColorWhite.state as Number).intValue // fülle das Objekt mit dem Integerwert
                if(bTasterDir)                                                     // falls heller dimmen
                    iLevel += 2                                                    // erhöhe den Level
                else                                                               // ansonsten
                    iLevel -= 2                                                    // verringere den Level

                if(iLevel > 100) {                                                 // Prüfe auf Überschreiten, falls ja
                    iLevel = 100                                                   // setze auf Maximum
                    bTasterDir = false                                             // und setze Dimmrichtung auf dunkler
                } else if(iLevel < 0) {                                            // ansonsten prüfe auf Unterschreiten, falls ja
                    iLevel = 0                                                     // setze Minimum
                    bTasterDir = true                                              // und setze Dimmrichtung auf heller
                }
                LED_WZ_Indirekt_ColorWhite.sendCommand(iLevel)                     // Sende Befehl an die Lampe
                tTasterLong.reschedule(now.plusNanos(100 * lMio))                  // und plane den Timer erneut in 100 mSec
            ])
        ])
    } else if(tTaster !== null){                                                   // short press erkannt, da Timer noch lief
        tTaster?.cancel                                                            // timer löschen
        tTaster = createTimer(now.plusNanos(lTasterShort * lMio), [|               // kurz warten ob weiterer Tastendruck folgt
            switch(iTaster) {                                                      // abhängig von der Anzahl Tastendrücke
                case 1: {
                    Licht1.sendCommand(if(Licht1.state == OFF) ON else OFF)        // Licht 1 Toggle
                }
                case 2: {
                    Licht2.sendCommand(if(Licht2.state == OFF) ON else OFF)        // Licht 2 Toggle
                }
                case 3: {
                    Licht3.sendCommand(if(Licht3.state == OFF) ON else OFF)        // Licht 3 Toggle
                }
            }
            iTaster = 0
        ])
    }
end
Ich hoffe es ist nachvollziehbar, wie die Rule funktioniert.

Man kann die Liste der Tastendrücke beliebig verlängern, also auch vierfach, fünffach... n-fach auswerten.

Das Funktionsprinzip ist einfach: Beim Drücken der Taste wird ein Timer gestartet, beim Loslassen der Taste wird geprüft, ob der Timer läuft. Ist das der Fall, so handelt es sich um einen kurzen Tastendruck. Da wir eventuell weitere Tastendrücke erwarten, startet der Timer erneut. Läuft dieser Timer ab, so wurde die Taste nicht erneut gedrückt, also wird der passende Schaltbefehl ausgeführt (hier exemplarisch mit einem Toggle versehen, genauso könnte man aber auch ein bestimmtes Licht explizit ein- oder ausschalten oder auch wesentlich komplexere Dinge treiben).

Läuft der erste Timer ab, so wurde ein langer Tastendruck erkannt. Der Dimmvorgang startet wie gehabt.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Rob69
Beiträge: 73
Registriert: 26. Feb 2021 07:38
Answers: 0

Re: Dimmen mit Long pressed

Beitrag von Rob69 »

Die Taste ist im Shelly1 vom Relais entkoppelt!
Eigentlich wollte ich einen Shelly RGBW2 über einen anderen Taster (Shelly1 oder ShellyPlusi4; Dectt440) einschalten und dimmen, da das momentan nur über die Sitemap
funktioniert!
Für meine Gartenbeleuchtung welche auch einen Shelly Dimmer beinhaltet hatte ich auch obige Lösung angedacht , aber leider funktioniert es nicht.
Trotz aller Hilfe der Mitglieder dieses Forums!!!

Danke Rob69

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

Re: Dimmen mit Long pressed

Beitrag von udo1toni »

Wie gesagt, mit meiner zuletzt geposteten Rule sollte es unabhängig vom verwendeten Device immer funktionieren. Das Device muss nur immer unmittelbar ON und OFF melden, wenn der Taster gedrückt und dann wieder losgelassen wird.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Rob69
Beiträge: 73
Registriert: 26. Feb 2021 07:38
Answers: 0

Re: Dimmen mit Long pressed

Beitrag von Rob69 »

Erstmal danke werde wenn ich wieder Zeit habe die Rule testen!

Bin aber gespannt wie dies funktioniert, da ich über den gleichen Taster auch ein Relais schalten wollte.

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

Re: Dimmen mit Long pressed

Beitrag von udo1toni »

Solange es nicht das Relais im gleichen Device ist, ist das kein Thema. Ansonsten musst Du halt Relais und Taste voneinander entkoppeln, beides als getrennte Channel in openHAB verfügbar machen und die Verknüpfung Tastendruck <-> Relais in openHAB anlegen. Nachteil: openHAB muss laufen, damit das Relais geschaltet wird, obwohl ja beides in einer Elektronik zusammengefasst ist...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

mad-mike
Beiträge: 491
Registriert: 6. Jan 2021 18:05
Answers: 3

Re: Dimmen mit Long pressed

Beitrag von mad-mike »

Habe leider zuvor keine Zeit gefunden...

Es ist aber tatsächlich so, das man den I3 nicht für diese Konfig benutzen kann...

Erste möglichkeit:

Code: Alles auswählen


2022-02-17 15:29:38.932 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Shellyix3SHIX31_Eingang' changed from OFF to ON

2022-02-17 15:29:39.954 [INFO ] [openhab.event.ChannelTriggeredEvent ] - shelly:shellyix3:00c7272612:status1#button triggered SHORT_PRESSED
Dass was, kommt kein off - wird im I3 auch quasi als stromstoss schalter angezeigt...
erst bei nochmaligen betätigen, kommt """ON to OFF"""

Wenn ich nun im I3 von Taster auf Schalter stelle wird mir kein Trigger mehr angezeigt:

Code: Alles auswählen

022-02-17 15:32:26.869 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Shellyix3SHIX31_Eingang' changed from OFF to ON

2022-02-17 15:32:27.073 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Shellyix3SHIX31_Eingang' changed from ON to OFF
Gruss mad-mike

openHABian 4.3.5 auf Raspberry Pi 4 Mod. b (8GB) ;)

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

Re: Dimmen mit Long pressed

Beitrag von udo1toni »

Das ist der Punkt. Du brauchst dann gar keinen Channel Trigger mehr, sondern nutzt direkt das Item. Deshalb ist ja in der gezeigten Rule der Trigger auch das Item, nicht der Channel.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

mad-mike
Beiträge: 491
Registriert: 6. Jan 2021 18:05
Answers: 3

Re: Dimmen mit Long pressed

Beitrag von mad-mike »

Achso.

Ja jetzt verstanden .. :D

Also muss man den i3 auf toggle programmieren aber ein Taster anschließen... Dann klappt die rule...
Gruss mad-mike

openHABian 4.3.5 auf Raspberry Pi 4 Mod. b (8GB) ;)

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

Re: Dimmen mit Long pressed

Beitrag von udo1toni »

Man muss den Shelly auf Schalter stellen.

Das bedeutet, wenn sich der Zustand am Eingang verändert (OPEN->CLOSED->OPEN) ändert sich der Ausgang entsprechend OFF->ON->OFF.
Toggle wechselt bei jedem Wechsel von OPEN zu CLOSED am Eingang den Ausgangszustand, beim ersten Mail von OFF nach ON, beim zweiten Mal von ON zu OFF. Das wäre also zu wählen, wenn man einen Taster konventionell betreiben möchte (ohne Zeitmessung).
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten