Dimmen mit Long pressed

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

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

Dimmen mit Long pressed

Beitrag von Rob69 »

Hallo,

Ich bin momemtan am verzweifeln!
Und zwar möchte ich über einen Shelly I3 (kann auch DECT 440 sein) mehrere Aktionen ausführen.
Einmal SHORT PRESSED = ein bzw. auschalten welches ich mit dieser Regel mache:

Code: Alles auswählen

rule "LED Treppenhaus Aus"
      when
               Channel "shelly:shelly1:e8db84d44d7d:relay#button" triggered SHORT_PRESSED
      then
                if (LED_Treppenhaus.state == ON) {
                       sendCommand (LED_Treppenhaus, OFF)
              }
  end
und was auch funktioniert!

Mit LONG PRESSED möchte ich gerne dimmen
z.Beispiel so

Code: Alles auswählen

 rule "LED_WZ_Indirekt dimmen"
	when
		Channel "shelly:shelly1:e8db84d44d7d:relay#button" triggered LONG_PRESSED
	then
		var Number percent = 0
		if(LED_WZ_Indirekt_ColorWhite.state instanceof DecimalType) percent = LED_WZ_Indirekt_ColorWhite.state as DecimalType 
			
		if(receivedCommand==INCREASE) percent = percent + 5
		if(receivedCommand==DECREASE) percent = percent - 5

		if(percent<0)   percent = 0
		if(percent>100) percent = 100
		postUpdate(LED_WZ_Indirekt_ColorWhite, percent);
end

Nun meine Fehlermeldung:

2022-02-12 14:45:29.288 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'Dimmed Light': The name 'receivedCommand' cannot be resolved to an item or type; line 52, column 6, length 15

Wie geht es besser oder wo ist mein Fehler!

Vorab 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 »

receivedCommand ist eine implizite Variable, die nur in Rules zur Verfügung steht, die auf received command getriggert haben. Deine Rule triggert jedoch auf ein Channel Event LONG_PRESSED.
Punkt 1: Woher soll die Rule wissen, in welche Richtung gedimmt werden soll?
Punkt 2: Ich gehe ganz stark davon aus, dass Du eigentlich möchtest, dass der Dimmer kontinuiertlich dimmt, solange Du die Taste festhältst. Das bedeutet, Du brauchst zwei verschiedene Events, nämlich LONG_PRESSED und RELEASED (Also Taste wurde losgelassen).
Also Punkt 3: Steht RELEASED (oder ein anderes Event, welches diese Bedeutung hat) zur Verfügung? Falls nicht, kannst Du den Versuch sofort abbrechen und Dir etwas anderes überlegen...

Sollte es aber ein Event RELEASED geben, so müsste Deine Rule immer noch dafür sorgen, dass das einmalige Ereignis LONG_PRESSED in eine kontinuierliche Aktion mündet, welche dann eben abgebrochen werden muss, sobald RELEASED empfangen wird. Das sähe z.B. so aus:

Code: Alles auswählen

// Globale Variablen müssen vor der ersten Rule definiert werden!
var Boolean bDimDir = false                                                // false = dunkler, true = heller
var Timer tDim = null                                                      // ein Schleifentimer

rule "LED_WZ_Indirekt dimmen"
when
    Channel "shelly:shelly1:e8db84d44d7d:relay#button" triggered           // egal welches Ereignis
then
    tDim?.cancel                                                           // laufenden Timer abbrechen
    if(receivedEvent != LONG_PRESSED)                                      // falls nicht LONG_PRESSED
        return;                                                            // Rule beenden

    bDimDir = !bDimDir                                                     // Dimrichtung beim Dimstart umkehren
    tDim = createTimer(now.plusNanos(10000000), [|                         // lege einen Timer 10 mSec in der Zukunft an
        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(bDimDir)                                                        // 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
            bDimDir = false                                                // und setze Dimmrichtung auf dunkler
        } else if(iLevel < 0) {                                            // ansonsten prüfe auf Unterschreiten, falls ja
            iLevel = 0                                                     // setze Minimum
            bDimDir = true                                                 // und setze Dimmrichtung auf heller
        }
        LED_WZ_Indirekt_ColorWhite.sendCommand(iLevel)                     // Sende Befehl an die Lampe
        tDim.reschedule(now.plusNanos(100000000))                          // und plane den Timer erneut in 100 mSec
    ])
end
Die Rule ist für openHAB3 bestimmt. Wegen der globalen Variablen muss sie zwingend über eine *.rules Datei angelegt werden.
a += x und a -= x sind Abkürzungen für a = a + x und a = a - x. Diese stehen nur beim Typ Integer zur Verfügung. Da der Dimmer ohnehin ein Integer erwartet, bietet es sich an, von Anfang an ein Integer zu nutzen.
Die Rule triggert auf jedes Ereignis des Schalters. In jedem Fall wird ein eventuell gerade laufender Timer abgebrochen. Falls das Ereignis nicht LONG_PRESSED heißt, ist die Rule schon wieder vorbei (man könnte hier aber durchaus auch noch auf weitere Ereignisse verzweigen, z.B. SHORT_PRESSED)
Anschließend wird die Boolean Variable bDimDir negiert, sie wechselt also von true nach false oder umgekehrt.
Danach wird ein Timer mit einem Codeblock erzeugt und die Rule ist beendet. Es ist ganz wichtig, zu verstehen, dass die Rule den Code nicht ausführt! Sie trägt den Codeblock lediglich im Scheduler ein und setzt einen Startzeitpunkt, 10 Millisekunden in der Zukunft.

Nach 10 Millisekunden startet der Scheduler den Codeblock. Zunächst wird eine lokale Integer Variable erzeugt, in der anschließend der aktuelle Level gespeichert wird. Nun wird abhängig von bDimDir entweder addiert oder subtrahiert. Anschließend prüft der Code auf Über- oder Unterschreiten der Grenzwerte, korrigiert den Wert gegebenenfalls und setzt auch gleich die logische Dimmrichtung - Wenn der obere Grenzwert erreicht wurde, will man wieder abdimmen und umgekehrt (ansonsten lässt man natürlich die Taste einfach los).
Anschließend wird der Befehl an die Lampe geschickt. Ein postUpdate ändert lediglich den Wert des Items, hat aber auf die Lampe keinen Einfluss!
Zum Schluss plant der Timer sich selbst erneut ein, und zwar 100 Millisekunden in der Zukunft. Das heißt, pro Sekunde wird der Timer etwa 10 mal durchlaufen (etwa, weil die Abarbeitung der Befehle ja auch Zeit kostet), bei einer Schrittweite von 2 ergeben sich 5 Sekunden für einen vollständgigen Dimmvorgang in einer Richtung.

Das Ganze funktioniert, wie oben erwähnt, nur, falls beim Loslassen auch ein Event ausgelöst wird. Das .plusNanos() ist leider die einzige Möglichkeit, einen Timer unterhalb einer Sekunde zu planen. Unter openHAB2.5 kannst Du stattdessen auch .plusMillis(100) schreiben.
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 »

Hallo, udo1toni

Erstmal danke für die Hilfe!

Wielange bist du schon mit Openhab beschäftigt, denn dein Wissenist schon der Hammer!!!!!!!

Gruß Rob69

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

Re: Dimmen mit Long pressed

Beitrag von Rob69 »

Nochmals dank!

Ich habe die Regel jetzt integriert, aber habe immer den Fehler:

2022-02-13 10:05:46.877 [ERROR] [ntime.internal.engine.RuleEngineImpl] - Rule 'LED_WZ_Indirekt dimmen': The name 'LONG_PRESSED' cannot be resolved to an item or type; line 10, column 25, length 12

welches auch bei einem Short Pressed kommt!

die Zeit des Shelly für LONG Pressed ist` 800 ms`

sollte ich die LONG Pressed zeit höher setzten !

Mein system ist openhab das letzte 2.5

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

Re: Dimmen mit Long pressed

Beitrag von udo1toni »

Ah. in openHAB2.5 gibt es receivedEvent noch nicht. Da musst Du dann wohl oder übel getrennte Rules erstellen (und natürlich vorher schauen, wie das Event heißt, welches beim Loslassen der Taste ausgelöst wird).

Die Zeit für LONG_PRESSED im Taster selbst dient ja nur der Unterscheidung, wann der Taster erkennt, dass die Taste gedrückt gehalten wird. da kommt es nur darauf an, wie schnell Du die Taste gewöhnlich loslässt, wenn Du die Taste normal zum Schalten nutzt.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

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

Re: Dimmen mit Long pressed

Beitrag von udo1toni »

Rob69 hat geschrieben: 13. Feb 2022 09:44Wie lange bist du schon mit Openhab beschäftigt, denn dein Wissen ist schon der Hammer!
Dieses Jahr wird es eine volle Dekade :) im ältesten Backup, welches ist habe, steht der 11. September 2012 drin, genau dieser Tag wird es eher nicht gewesen sein, vermutlich ein, zwei Monate vorher... Backup kommt ja immer zum Schluss :lol:
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 »

Heist das ich muss `wohl oder übel doch auf Openhab 3 updaten!

Oder kann ich das umgehen! Hab etwas Schiess vor dem Update!


<Gruß Rob69

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

Re: Dimmen mit Long pressed

Beitrag von mad-mike »

Moin.

Ich habe gerade mal einen Shelly 1 im log bei mir raus gesucht.

So stehts bei mir:

Code: Alles auswählen

2022-02-13 18:15:09.145 [INFO ] [openhab.event.ChannelTriggeredEvent ] - shelly:shellydevice:abcb84a0173a:relay#button triggered LONG_PRESSED
2022-02-13 18:15:09.148 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Shelly110_LetztesEreignis' changed from  to L
2022-02-13 18:15:12.542 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'shelly110_Eingang' changed from ON to OFF
2022-02-13 18:15:15.715 [INFO ] [openhab.event.ItemStateChangedEvent ] - Item 'Shelly110_LetztesEreignis' changed from L to 
Vielleicht hilft es ja, und ich hoffe, das ich so auch raus bekomme, wie ich die Schalter mehrfach belegen kann...

Derzeit, habe ich die Funktion mit ""short Pressed"" und ""long pressed"" direkt im Shelly mit einer passenden url Verknüpfung eingegeben, weil ich es nicht besser hin bekommen habe :oops: ... hoffe aber in diesem Thema was zu lernen...
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 »

Gibt es denn keine weitere Zeile, passend wie diese hier:

Code: Alles auswählen

2022-02-13 18:15:09.145 [INFO ] [openhab.event.ChannelTriggeredEvent ] - shelly:shellydevice:abcb84a0173a:relay#button triggered LONG_PRESSED
bei der dann weder LONG PRESSED noch SHORT_PRESSED steht, sondern ein dritter Wert?
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 »

Nein.

(Von LCN kenne ich ""kurz/lang/los"") aber bei de Shelly kenne ich nur kurz / lang.

Wobei es z.B. beim I3 noch andere Möglichkeiten gibt: 1x kurz, 2x kurz, 3 x kurz, kurz-lang, lang-kurz, ...
Gruss mad-mike

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

Antworten