Shelly Button1 sendet Bei Tastendruck öfters

Geflasht oder ungeflasht ...

Moderator: seppy

logologo
Beiträge: 9
Registriert: 2. Nov 2020 05:54

Shelly Button1 sendet Bei Tastendruck öfters

Beitrag von logologo »

Hallo "Openhabler"

ich habe mich jetzt einige Zeit mit Openhab 2 beschäftigt.
Etwas euphorisch habe ich mich mit diversen Shellys, Hue-Leuchten
und Tradfri Komponenten eingedeckt.
Openhab läuft auf einem Raspi4. Gateways sind der Deconz und das
Hue-Gateway. Als Bindings habe ich Hue und Shelly installiert.
Die Geräte wurden mit VSC eingebunden (Items).

Jetzt scheitere ich leider schon an einer einfachen Rule. Ich
habe versucht eine Rule für einen Shelly Botton 1 zu testen.

Das Schalten der Lampe funktioniert nicht ständig. Nach ein paar mal an
und aus wird die Lampe kurz an dann wieder sofort ausgeschaltet. Bzw.
habe ich teilweise einen Zustand bei welchem ich öfters anschalten muss
bis die Leuchte an geht.

Im Openhablog habe ich festgestellt, dass der Shelly trotz einmaligem
"TRIPLE_PRESSED" dieses öfters sendet. Teilweise bis zu dreimal.

Die Schalter Rule:

rule "test schalter regel"

when
Channel "shelly:shellybutton1:d8f15b154f55:status#button" triggered "TRIPLE_PRESSED"
then
logInfo ('schalter.rules', 'shelly botton wurde 3x gedrückt')
RetroglobeOn.sendCommand(if(RetroglobeOn.state != ON) ON else OFF)
end

Hat jemand einen Tip für mich?

Grüsse
logologo

LanHebroMic
Beiträge: 5
Registriert: 23. Nov 2020 18:07
Answers: 1

Re: Shelly Button1 sendet Bei Tastendruck öfters

Beitrag von LanHebroMic »

Code: Alles auswählen

rule "test schalter regel"
when
    Channel "shelly:shellybutton1:d8f15b154f55:status#button" triggered TRIPLE_PRESSED
then
    logInfo ("schalter.rules", "shelly botton wurde 3x gedrückt")
    RetroglobeOn.sendCommand(if(RetroglobeOn.state == ON) ON else OFF)
end
vielleicht so besser

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

Re: Shelly Button1 sendet Bei Tastendruck öfters

Beitrag von udo1toni »

Aber das != war schon richtig...

Man könnte versuchen, die Schaltfrequenz zu begrenzen, also, dass auch mehrere Trigger z.B. innerhalb einer Sekunde nur zu einem Schaltvorgang führen. So z.B.:

Code: Alles auswählen

var Timer tDebounce = null

rule "test schalter regel"
when
    Channel "shelly:shellybutton1:d8f15b154f55:status#button" triggered TRIPLE_PRESSED
then
    if(tDebounce !== null) return;

    tDebounce = createTimer(now.plusMillis(1000),[|
        tDebounce = null
    ])
    logInfo ("schalter.rules", "shelly botton wurde 3x gedrückt")
    RetroglobeOn.sendCommand(if(RetroglobeOn.state != ON) ON else OFF)
end
Wenn tDebounce nicht null ist, wird die Rule umgehend abgebrochen. Ist tDebounce hingegen null, wird die Rule ausgeführt. Dabei wird zuerst tDebounce initialisiert.
Wenn der Timer abläuft, wird tDebounce wieder auf null gesetzt.
Das !== ist korrekt so, da es hier nicht um gleich sondern um identisch geht.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

logologo
Beiträge: 9
Registriert: 2. Nov 2020 05:54

Re: Shelly Button1 sendet Bei Tastendruck öfters

Beitrag von logologo »

Hallo Zusammen,

Erst mal danke für die Antworten. Deine Rule habe ich getestet und
die funktioniert super.

Besten Dank.

Grüsse
logologo

logologo
Beiträge: 9
Registriert: 2. Nov 2020 05:54

Re: Shelly Button1 sendet Bei Tastendruck öfters

Beitrag von logologo »

Morgen Zusammen,

weis jemand warum der shelly button 1 trotz einmaliger Auslösung öfters sendet?
Würde mich einfach interessieren......

Da das Schalten nun funktioniert würde ich gerne mit dem Taster dimmen.

Die Funktion sollte sein:
Taste gedrückt halten -> dimmt runter. Nochmaliges Taste halten -> dimmt hoch.

Ich habe mir ein paar Dimmer Rules angesehen. Leider fehlt mir da noch der Durchblick 8-) .

Hat jemand einen Ansatz für mich den ich testen kann? :D

liebe Grüsse
logologo

ibot1989
Beiträge: 99
Registriert: 30. Jul 2016 19:51
Wohnort: östlich von Hamburg, südlich von Lübeck, nördlich von Geesthacht

Re: Shelly Button1 sendet Bei Tastendruck öfters

Beitrag von ibot1989 »

Der Shelly Taster löst doch bestimmt beim gedrückt halten ein entsprechendes Trigger Event aus oder?

Das könntest du Auswerten und dadurch z.b. ein Dummy Item setzen um die zu Merken ob du beim letzten dauerdrücken rauf oder runter gedimmt hast.

Ich kann das aber nicht testen, da ich kein Shelly Taster besitze.

Gruß iBot

Gesendet von meinem ONEPLUS A6013 mit Tapatalk



logologo
Beiträge: 9
Registriert: 2. Nov 2020 05:54

Re: Shelly Button1 sendet Bei Tastendruck öfters

Beitrag von logologo »

Morgen Zusammen,

@Ibot hört sich erst mal logisch und einfach an. Ist es alledings (noch nicht) für mich.
Ich versuche mich da ein zu arbeiten.

Ich habe es mit nachfolgender Rule getestet. Allerdings ist das Ergebnis sehr mager.
Ich sehe zwar das die Tradfri Lampe reagiert. Allerdings ist es nur ein kurzes flackern.
Der Trigger "Long-Pressed" kommt ja nur einmal je Tastendruck. Eigentlich sollte doch die Dauer
des Tastendrucks den Dimmwert ändern. Oder sehe ich das falsch? :idea:

Rule
rule "test_DIMMDOWN"
when
Channel "shelly:shellybutton1:d8f15b154f55:status#button" triggered LONG_PRESSED
then
var bright=SchlafzimmerStehlampeFarbtemperaturBrightness.state as Number
bright = bright - 5
SchlafzimmerStehlampeFarbtemperaturBrightness.sendCommand(bright.intValue)
end

rule "Test_DIMMUP"
when
Channel "shelly:shellybutton1:d8f15b154f55:status#button" triggered LONG_PRESSED
then
var bright=SchlafzimmerStehlampeFarbtemperaturBrightness.state as Number
bright = bright + 5
SchlafzimmerStehlampeFarbtemperaturBrightness.sendCommand(bright.intValue)
end

Item der Tradfri Lampe
Dimmer SchlafzimmerStehlampeFarbtemperaturColorTemperature "Color temperature" (g_Schlafzimmer){channel="hue:0220:000000000000:4:color_temperature"}
Dimmer SchlafzimmerStehlampeFarbtemperaturBrightness "Brightness" (g_Schlafzimmer) {channel="hue:0220:000000000000:4:brightness"}
Switch SchlafzimmerStehlampeFarbtemperaturOn "Ein/Aus" (g_Schlafzimmer) {channel="hue:0220:000000000000:4:brightness"}
String SchlafzimmerStehlampeFarbtemperaturAlert "Alert" (g_Schlafzimmer) {channel="hue:0220:000000000000:4:alert"}
Switch SchlafzimmerStehlampeFarbtemperaturEffect "Color loop" (g_Schlafzimmer) {channel="hue:0220:000000000000:4:effect"}

Mein Ansatz ist wohl falsch. Ich möchte eigentlich keine fertig Rule sondern nur den Hinweis wo ich ansetzen sollte.

@udo1toni, der return bei deiner Rule ist mir nicht klar. Warum benötige ich das?
Codeauszug: if(tDebounce !== null) return;


liebe Grüsse
logologo

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

Re: Shelly Button1 sendet Bei Tastendruck öfters

Beitrag von udo1toni »

Die Idee der Rule ist, es wird beim ersten Ausführen der Rule ein Timer gesetzt. Für den Timer gibt es einen Zeiger, der in tDebounce gespeichert wird. Läuft der Timer ab, so wird der Zeiger wieder gelöscht (also auf null gesetzt).
Wenn also tDebounce nicht identisch mit null ist (!== null), existiert der Zeiger und folglich läuft gerade der Timer. Also darf die Rule nichts tun (was am schnellsten erledigt ist, wenn die Rule direkt verlassen wird).
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

logologo
Beiträge: 9
Registriert: 2. Nov 2020 05:54

Re: Shelly Button1 sendet Bei Tastendruck öfters

Beitrag von logologo »

Morgen Zusammen,

Danke udo1toni nochmal für die Erläuterung.
Kannst du mir sagen wo der "Haken" in meiner Dimmer Rule liegt? 8-)

lieber Grüsse
logologo

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

Re: Shelly Button1 sendet Bei Tastendruck öfters

Beitrag von udo1toni »

Na ja, Du hast es ja schon erkannt, der Trigger kommt nur einmal pro Druck.

Ich habe keine solchen Taster. Welche Trigger kommen denn da? Gibt es evtl SHORT_PRESSED, LONG_PRESSED und RELEASED?
Dann müsstest Du zwei Rules für das Dimmen schreiben, die eine startet den Dimmvorgang, die andere beendet ihn wieder.
Die Rule, welche den Dimmvorgang startet, muss dann einen Timer erzeugen, der sich um das schrittweise Dimmen kümmert. Der Timer ruft sich selbst auf, bis er den Grenzwert erreicht oder die Stop-Rule ausgeführt wird.
Da Du für beide Dimmrichtungen den selben Trigger verwendet hast, werden immer beide Rules ausgeführt. Kann es sein, dass Du nur eine Taste hast? Dann sollte die Dimmrichtung jeweils umgekehrt werden, wenn der Dimmvorgang startet.

So sähen meine Rules dazu aus:

Code: Alles auswählen

// globale Variablen werden zu Beginn der Datei definiert!
var Timer tDimm = null
var Integer iDimm = 0
var Boolean bDimm = false

rule "Dimm START"
when
    Channel "shelly:shellybutton1:d8f15b154f55:status#button" triggered LONG_PRESSED
then
    bDimm = !bDimm // Dimmrichtung umkehren
    iDimm = SchlafzimmerStehlampeFarbtemperaturBrightness.state as Number // aktuellen Wert laden
    tDimm?.cancel // laufenden Timer abbrechen
    tDimm = createTimer(now,[|
        iDimm = iDimm + (if(bDimm) 1 else -1)
        if(iDimm > 100 || iDimm < 0)
            tDimm = null
        else {
            SchlafzimmerStehlampeFarbtemperaturBrightness.sendCommand(iDimm)
            tDimm.reschedule(now.plusMillis(100))
        }
    ])
end

rule "Dimm STOP"
when
    Channel "shelly:shellybutton1:d8f15b154f55:status#button" triggered RELEASED
then
    tDimm?.cancel // laufenden Timer abbrechen
    tDimm = null
end
Die drei globalen Variablen sind notwendig, damit die Werte auch außerhalb der Rule erhalten bleiben.

Die Start-Rule dreht zunächst die Dimmrichtung um. Da es hier nur heller oder dunkler gibt, ist das am einfachsten über eine Boolean Variable zu erledigen.
Anschließend wird der aktuelle Helligkeitswert ausgelesen und in die globale Variable iDimm gesichert. Die ist als Integer definiert, womit wir schon die Voraussetzungen für das Schreiben des Wertes schaffen.
Nun wird ein eventuell laufender Timer abgebrochen. Dies ist nur eine Vorsichtsmaßnahme, es könnte ja sein, dass die Rule mehrfach getriggert wird oder ein alter Timer noch "rumhängt"...
Zum Abschluss wird ein Timer angelegt und sofort ausgeführt. Zu diesem Zeitpunkt ist die Rule beendet(!)

Die zweite Rule beendet einen laufenden Timer umgehend und löscht auch noch den Zeiger auf den Timer.

Der eigentliche Dimmvorgang läuft nun im angelegten Timer ab:
Abhängig von der Dimmrichtung wird iDimm entweder um 1 erhöht oder verringert.
danach wird ein Über- bzw. Unterschreiten des gültigen Wertebereichs überprüft.
Ist dies der Fall, löscht der Timer den Zeiger auf sich selbst.
Ist der Wertebereich noch nicht verlassen, so wird der aktuelle Wert als Kommando an das Item gesendet und anschließend der Timer erneut geplant.

Natürlich kann die Schrittweite (im Beispiel +/-1) und die Schrittfrequenz (Im Beispiel 100 Millisekunden) variiert werden, das musst Du letztlich ausprobieren.
openHAB4.1.2 stable in einem Debian-Container (bookworm) (Proxmox 8.1.5, LXC), mit openHABian eingerichtet

Antworten