Shelly Button1 sendet Bei Tastendruck öfters
Moderator: seppy
-
- Beiträge: 9
- Registriert: 2. Nov 2020 05:54
Shelly Button1 sendet Bei Tastendruck öfters
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
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
-
- Beiträge: 5
- Registriert: 23. Nov 2020 18:07
Re: Shelly Button1 sendet Bei Tastendruck öfters
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
- udo1toni
- Beiträge: 13865
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Shelly Button1 sendet Bei Tastendruck öfters
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.:
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.
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 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
-
- Beiträge: 9
- Registriert: 2. Nov 2020 05:54
Re: Shelly Button1 sendet Bei Tastendruck öfters
Hallo Zusammen,
Erst mal danke für die Antworten. Deine Rule habe ich getestet und
die funktioniert super.
Besten Dank.
Grüsse
logologo
Erst mal danke für die Antworten. Deine Rule habe ich getestet und
die funktioniert super.
Besten Dank.
Grüsse
logologo
-
- Beiträge: 9
- Registriert: 2. Nov 2020 05:54
Re: Shelly Button1 sendet Bei Tastendruck öfters
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 .
Hat jemand einen Ansatz für mich den ich testen kann?
liebe Grüsse
logologo
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 .
Hat jemand einen Ansatz für mich den ich testen kann?
liebe Grüsse
logologo
-
- 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
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
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
-
- Beiträge: 9
- Registriert: 2. Nov 2020 05:54
Re: Shelly Button1 sendet Bei Tastendruck öfters
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?
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="hue000000000000:4:color_temperature"}
Dimmer SchlafzimmerStehlampeFarbtemperaturBrightness "Brightness" (g_Schlafzimmer) {channel="hue000000000000:4:brightness"}
Switch SchlafzimmerStehlampeFarbtemperaturOn "Ein/Aus" (g_Schlafzimmer) {channel="hue000000000000:4:brightness"}
String SchlafzimmerStehlampeFarbtemperaturAlert "Alert" (g_Schlafzimmer) {channel="hue000000000000:4:alert"}
Switch SchlafzimmerStehlampeFarbtemperaturEffect "Color loop" (g_Schlafzimmer) {channel="hue000000000000: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
@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?
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="hue000000000000:4:color_temperature"}
Dimmer SchlafzimmerStehlampeFarbtemperaturBrightness "Brightness" (g_Schlafzimmer) {channel="hue000000000000:4:brightness"}
Switch SchlafzimmerStehlampeFarbtemperaturOn "Ein/Aus" (g_Schlafzimmer) {channel="hue000000000000:4:brightness"}
String SchlafzimmerStehlampeFarbtemperaturAlert "Alert" (g_Schlafzimmer) {channel="hue000000000000:4:alert"}
Switch SchlafzimmerStehlampeFarbtemperaturEffect "Color loop" (g_Schlafzimmer) {channel="hue000000000000: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
- udo1toni
- Beiträge: 13865
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Shelly Button1 sendet Bei Tastendruck öfters
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).
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
-
- Beiträge: 9
- Registriert: 2. Nov 2020 05:54
Re: Shelly Button1 sendet Bei Tastendruck öfters
Morgen Zusammen,
Danke udo1toni nochmal für die Erläuterung.
Kannst du mir sagen wo der "Haken" in meiner Dimmer Rule liegt?
lieber Grüsse
logologo
Danke udo1toni nochmal für die Erläuterung.
Kannst du mir sagen wo der "Haken" in meiner Dimmer Rule liegt?
lieber Grüsse
logologo
- udo1toni
- Beiträge: 13865
- Registriert: 11. Apr 2018 18:05
- Wohnort: Darmstadt
Re: Shelly Button1 sendet Bei Tastendruck öfters
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:
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.
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 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