Dimmer Rule für IKEA Schalter

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

forrest
Beiträge: 19
Registriert: 13. Jan 2021 20:32
Answers: 0

Dimmer Rule für IKEA Schalter

Beitrag von forrest »

Hallo Foren Gemeinde,

ich bekommen eine Rule einfach nicht richtig zum laufen. Aber eventuell bin ich auch am Holzweg ;) .

Folgendes Thema, ich möchte den IKEA Schalter als Dimmer verwenden. Hingegen meiner Homematic Taster welche dauerhaft #LONG_PRESS senden
und so immer wieder die Rule triggern, verhält sich der IKEA Taster anders. Hier wird bei Langdruck "1001" an ein Item gesendet und dann erst wieder beim loslassen "1003". Nun dachte ich an eine Loop die so lange läuft bis das Item auf 1003 springt. Bekomme das aber nicht gebacken. Würde mich freuen, wenn mir jemand unter die Arme greifen kann. Hier mal meine Idee welche aber nicht funktioniert. Problem ist, dass sich das system nahezu aufhängt.

Code: Alles auswählen

when
    Item IKEASchalter1_Button changed to 1001
then
    while (!(IKEASchalter1_Button == 1003)) {

        var HSBType currentState = LIFX_Spitzboden_Color.state
 
        var DecimalType hue = currentState.hue
        var DecimalType sat = currentState.saturation
        var PercentType bright

        
 
        if( currentState.brightness.intValue < 95 ) {
               bright = new PercentType(currentState.brightness + 5)              
        } else {
               bright = new PercentType(100)
        }
        LIFX_Spitzboden_Color.sendCommand(new HSBType(hue, sat, bright) as Number)
        thread::sleep(500)
    
        }

end

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

Re: Dimmer Rule für IKEA Schalter

Beitrag von udo1toni »

while ist aus verschiedenen Gründen verpönt. Wenn Du in einer Rule auf den Status eines Items zugreifen willst, musst Du Item.state schreiben, Item ist das Item selbst (Der when Teil der Rule gehört nicht zum ausgeführten Code, das ist nur der Trigger, dort geht es ums Item).
Thread::sleep() (Groß/Kleinschreibung...) ist in diesem Zusammenhang auch keine gute Idee.

Da sind noch ein paar andere Ungereimtheiten mit drin, beispielsweise ist HSBType eben nicht vom Typ Number und kann auch nicht dorthin gecastet werden.
Ich bin jetzt nicht der Spezialist, was Color Steuerung betrifft, ich habe nur ein einziges Color Item, und das ist mit einem Selbstbauprojekt verbunden. Aber ich gehe davon aus, dass eine "bessere" Rule so aussieht:

Code: Alles auswählen

var Timer tDimmer = null

rule "Dimmer Taster"
when
    Item IKEASchalter1_Button received command
then
    if(receivedCommand.toString == "1001") {
        tDimmer?.cancel
        tDimmer = createTimer(now, [|
            val HSBType currentState = LIFX_Spitzboden_Color.state as HSBType
            val hue = currentState.hue
            val sat = currentState.saturation
            val bri = currentState.brightness + 5
            if( bri > 100)
                bri = 100
            LIFX_Spitzboden_Color.sendCommand(new HSBType(hue, sat, bri))
            if(bri < 100)
                tDimmer.reschedule(now.plusMillis(500))
        ])
    } else if(receivedCommand.toString == "1003") {
        tDimmer?.cancel
        tDimmer = null
    }
end
Ich gehe hier von OH2 aus, bzw. davon, dass die Rule in einer *.rules Datei gespeichert ist. Die Rule benötigt globale Variablen, welche nur in rules Dateien zur Verfügung stehen. Diese Variable wird vor der ersten Rule in der Datei definiert (wichtig!)
Die Rule triggert auf received command, man könnte auch mit changed aerbeiten, aber eigentlich sollte ein Taster auch ein Kommando senden. Wenn received command nicht funktioniert, muss der Trigger auf changed geändert werden und in der if- Anweisung muss auf IKEASchalter1_Button.state.toString getestet werden.

Die Rule triggert genau zweimal, nämlich beim Drücken und beim Loslassen.

Beim Drücken wird der erste Teil des Codes ausgeführt. Zunächst wird ein eventuell laufender Timer abgebrochen, dann wird ein Timer angelegt und unmittelbar ausgeführt. Im Timer läuft der Code wie von Dir entworfen, es werden die drei Werte separiert und wieder zurückgeschrieben, allerdings nehme ich die Grenzwertbetrachtung etwas anders vor (wie ich glaube, etwas eleganter...)
Nachdem der Wert ins Item geschrieben wurde, wird der Timer neu geplant, das heißt, der Code bleibt so wie er ist erhalten. Das geschieht allerdings nur, solange noch nicht die Maximalhelligkeit erreicht ist. (bri < 100).
Wird die taste losgelassen, so wird der Timer unmittelbar abgebrochen und aus dem Scheduler entfernt.

Bei den Eigenschaften currentState.hue, .saturation und .brightness bin ich mir nicht sicher (wie gesagt, nutze ich praktisch nicht...), es könnte auch sein, dass new HSBType() als Zuweisung nicht funktioniert, dann wäre es einen Versuch wert, das so zu formulieren: (new HSBType(...)).toString also den HSBType als String zu übergeben.

Wie oben erwähnt ist das mit while in openHAB nicht gern gesehen. der Grund hierfür ist, dass openHAB für Rules exakt 5 + 2 Threads zur Verfügung stellt, es können also maximal 5 +2 Rules gleichzeitig ausgeführt werden. Läuft nun eine Rule "dauerhaft", so blockiert sie auch dauerhaft einen der Slots. Thread::sleep() tut genau das, was der Name sagt, sie legt den Thread für die angegebene Zeit schlafen, die Rule ist also aktiv und belegt den Slot. Im Gegensatz dazu läuft das mit der gezeigten Rule anders. Diese läuft nur wenige Millisekunden, eben gerade so lang, wie sie braucht, den Timer anzulegen.
Der Timer selbst läuft nur, wenn der Code gerade ausgeführt wird. der Scheduler in openHAB merkt sich die gewünschte Stratzeit und führt den Code zu diesem Zeitpunkt aus. der Reschedule ist dann die Schleife, aber eben indirekt, der Timer ruft sich selbst erneut auf und die Codeausführung ist danach beendet, also auch der Timer Code läuft nur wenige Millisekunden und wird dann (in openHAB-Größenordnungen) erst sehr viel später erneut aufgerufen. Dazwischen steht der benötigte Slot für andere Aufgaben zur Verfügung.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

forrest
Beiträge: 19
Registriert: 13. Jan 2021 20:32
Answers: 0

Re: Dimmer Rule für IKEA Schalter

Beitrag von forrest »

Also erstmal lieben Dank für die Zeit und die Ausführliche Antwort. Ist alles andere als selbstverständlich !!

Ich habe auf alle Fälle schon mal dazugelernt :)

Mal das Thema mit dem HSBType aus vor gelassen ( könnte ja auch einfach mit (INCREASE) arbeiten ) habe ich das Problem, dass der Timer wohl nicht funktioniert. Hier meckert er an das "dTimer = null" an? Ich sollte wohl erwähnen, dass ich in OH3 Arbeite.In deiner Rule habe ich deshalb schon das now.plusMillis zu now.plusSeconds geändert.

Error LOG :

Code: Alles auswählen

08:11:20.451 [ERROR] [.internal.handler.ScriptActionHandler] - Script execution of rule with UID 'Untergeschoss-1' failed: cannot invoke method public abstract boolean org.openhab.core.model.script.actions.Timer.cancel() on null in Untergeschoss
Hier noch die aktuell "Test" Rule:

Code: Alles auswählen

var Timer tDimmer = null

rule "Dimmer Taster"
when
    Item IKEASchalter1_Button changed to 1001
then
    logInfo("Info", "Rule Dimmer gestartet")
    if(IKEASchalter1_Button.state.toString == "1001") {
        tDimmer?.cancel
        tDimmer = createTimer(now, [|
            val HSBType currentState = LIFX_Spitzboden_Color.state as HSBType
            val hue = currentState.hue
            val sat = currentState.saturation
            val bri = currentState.brightness + 5
            if( bri > 100)
                bri = 100
            LIFX_Spitzboden_Color.sendCommand(new HSBType(hue, sat, bri))
            if(bri < 100)
                tDimmer.reschedule(now.plusSeconds(1))
        ])
    } else if(IKEASchalter1_Button.state.toString == "1003") {
        tDimmer?.cancel
        tDimmer = null
    }
end
Nur noch Interessehalber, wozu ist das "?" nötig in tDimmer?.cancel ?

Und nochmals super lieben Dank für die ausgezeichnete Unterstützung.

VG

Stefan

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

Re: Dimmer Rule für IKEA Schalter

Beitrag von udo1toni »

Mit wäre jetzt nicht bewusst, dass sich da etwas in openHAB3 geändert hat, aber sei's drum...

Das ? sorgt dafür, dass die Funktion nur dann ausgeführt wird, wenn die Variable nicht (!) null ist. Komischerweise scheint das aber gerade nicht zu funktionieren (wie man an der Fehlermeldung sehen kann).
Schreibe bitte mal ersatzweise statt

Code: Alles auswählen

tDimmer?.cancel

Code: Alles auswählen

if(tDimmer !== null) tDimmer.cancel
Die Zeile kommt zweimal im Code vor. Falls sicher nur die beiden Kommandos 1001 und 1003 vorkommen, kann man die Rule auch noch etwas kürzer auslegen:

Code: Alles auswählen

var Timer tDimmer = null

rule "Dimmer Taster"
when
    Item IKEASchalter1_Button changed
then
    logInfo("dimmer", "Rule Dimmer gestartet")
    if(tDimmer !== null) tDimmer.cancel
    if(IKEASchalter1_Button.state.toString == "1001") {
        tDimmer = createTimer(ZonedDateTime.now, [|
            val HSBType currentState = LIFX_Spitzboden_Color.state as HSBType
            val hue = currentState.hue
            val sat = currentState.saturation
            val bri = currentState.brightness + 5
            if( bri > 100)
                bri = 100
            LIFX_Spitzboden_Color.sendCommand(new HSBType(hue, sat, bri))
            if(bri < 100)
                tDimmer.reschedule(ZonedDateTime.now.plusSeconds(1))
        ])
end
Aber der Trigger muss unbedingt ohne das "to 1001" angegeben werden, die Rule kümmert sich um zwei unterschiedliche Ereignisse!
Da die Rule in openHAB3 läuft, muss auch der Ausdruck für die Zeit angepasst werden.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

forrest
Beiträge: 19
Registriert: 13. Jan 2021 20:32
Answers: 0

Re: Dimmer Rule für IKEA Schalter

Beitrag von forrest »

Die Rule triggered aber der Timer läuft wohl nicht. Die Log Datei schaut nun aber gänzlich anders aus.

Code: Alles auswählen

13:55:01.118 [INFO ] [org.openhab.core.model.script.dimmer ] - Rule Dimmer gestartet                                                                                                                           
13:55:01.126 [INFO ] [openhab.event.ItemStateChangedEvent  ] - Item 'IKEASchalter1_Button' changed from 2002 to 1001                                                                                           
13:55:01.122 [WARN ] [core.internal.scheduler.SchedulerImpl] - Scheduled job failed and stopped                                                                                                                
java.lang.IllegalStateException: Could not invoke constructor: org.openhab.core.library.types.HSBType.HSBType(org.openhab.core.library.types.DecimalType,org.openhab.core.library.types.PercentType,org.openhab
.core.library.types.PercentType)                                                                                                                                                                               
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:847) ~[?:?]                                                                                             
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:250) ~[?:?]                                                                                              
        at org.openhab.core.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]                                                                                           
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:216) ~[?:?]                                                                                        
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluateArgumentExpressions(XbaseInterpreter.java:1206) ~[?:?]                                                                            
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1136) ~[?:?]                                                                                         
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:1082) ~[?:?]                                                                                          
        at org.openhab.core.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]                                                                                        
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:862) ~[?:?]                                                                                             
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:232) ~[?:?]                                                                                              
        at org.openhab.core.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]                                                                                           
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:216) ~[?:?]                                                                                        
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:459) ~[?:?]                                                                                             
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:240) ~[?:?]                                                                                              
        at org.openhab.core.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]                                                                                           
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:216) ~[?:?]                                                                                        
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:202) ~[?:?]                                                                                                
        at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:47) ~[?:?]                                                                                 
        at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:30) ~[?:?]                                                                   
        at com.sun.proxy.$Proxy38577.apply(Unknown Source) ~[?:?]                                                                                                                                              
        at org.openhab.core.model.script.actions.ScriptExecution.lambda$0(ScriptExecution.java:82) ~[?:?]                                                                                                      
        at org.openhab.core.internal.scheduler.SchedulerImpl.lambda$12(SchedulerImpl.java:166) ~[bundleFile:?]                                                                                                 
        at org.openhab.core.internal.scheduler.SchedulerImpl.lambda$1(SchedulerImpl.java:76) [bundleFile:?]                                                                                                    
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?]                                                                                                                       
        at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]                                                                                                                                      
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) [?:?]                                                                                
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]                                                                                                               
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]                                                                                                               
        at java.lang.Thread.run(Thread.java:834) [?:?]                                                                                                                                                         
Caused by: java.lang.IllegalArgumentException: argument type mismatch                                                                                                                                          
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[?:?]                                                                                                               
        at jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[?:?]                                                                                        
        at jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[?:?]                                                                                
        at java.lang.reflect.Constructor.newInstance(Constructor.java:490) ~[?:?]                                                                                                                              
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:842) ~[?:?]                                                                                             
        ... 28 more                                                                                                                                                                                            
13:55:03.109 [INFO ] [openhab.event.ChannelTriggeredEvent  ] - deconz:switch:Deconz_GW_ZIGBEE:847127fffe436481011000:buttonevent triggered 1003                                                                
13:55:03.113 [INFO ] [openhab.event.ItemStateChangedEvent  ] - Item 'IKEASchalter1_Button' changed from 1001 to 1003

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

Re: Dimmer Rule für IKEA Schalter

Beitrag von udo1toni »

Also mag er den HSBType nicht... Leider ist nicht so ganz klar, an welcher Stelle er sich daran stört. Wie erwähnt bin ich da kein Experte, da müsste man erst mal eine Testrule schreiben, die ohne Timer aufgesetzt ist und lediglich die Helligkeitssteuerung enthält (also immer nur einen Schritt macht, wenn sie getriggert wird)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

forrest
Beiträge: 19
Registriert: 13. Jan 2021 20:32
Answers: 0

Re: Dimmer Rule für IKEA Schalter

Beitrag von forrest »

Also ich habe mal ganz einfach angefangen und die Rule folgendermaßen umgebaut.

Code: Alles auswählen

var Timer tdimmer = null

rule "UG Esszimmer Dimmer mehr"
when
    Item IKEASchalter1_Button changed
then
    if (tdimmer !== null) tdimmer.cancel()
    if (IKEASchalter1_Button.state == 1001) {
            tdimmer = createTimer(now, [ |
                LIFX_Spitzboden_Color.sendCommand(INCREASE)
                tdimmer.reschedule(now.plusSeconds(1))
            ])
            
    } else {
        
        tdimmer = null
        
    }
end
Jetzt stört schon mal das HSB Type nicht mehr. Ich kann sogar beim Timer erfolg vermelden, allerdings funktioniert er nicht zu 100%.
Will heissen, der Dimmer geht wie er sollte aber halt nicht immer. Hin und wieder kommt eben folgende Fehlermeldung in den Log´s.

Code: Alles auswählen

2021-03-16 16:02:58.091 [WARN ] [ore.internal.scheduler.SchedulerImpl] - Scheduled job failed and stopped
java.lang.NullPointerException: cannot invoke method public abstract boolean org.openhab.core.model.script.actions.Timer.reschedule(java.time.ZonedDateTime) on null
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1161) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1151) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1137) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:1082) ~[?:?]
	at org.openhab.core.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:862) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:232) ~[?:?]
	at org.openhab.core.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:216) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:459) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:240) ~[?:?]
	at org.openhab.core.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:216) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:202) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:47) ~[?:?]
	at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:30) ~[?:?]
	at com.sun.proxy.$Proxy337.apply(Unknown Source) ~[?:?]
	at org.openhab.core.model.script.actions.ScriptExecution.lambda$0(ScriptExecution.java:82) ~[?:?]
	at org.openhab.core.internal.scheduler.SchedulerImpl.lambda$12(SchedulerImpl.java:166) ~[bundleFile:?]
	at org.openhab.core.internal.scheduler.SchedulerImpl.lambda$1(SchedulerImpl.java:76) [bundleFile:?]
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515) [?:?]
	at java.util.concurrent.FutureTask.run(FutureTask.java:264) [?:?]
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) [?:?]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) [?:?]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) [?:?]
	at java.lang.Thread.run(Thread.java:834) [?:?]
Komme hier irgendwie nicht weiter.

VG

Stefan

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

Re: Dimmer Rule für IKEA Schalter

Beitrag von udo1toni »

tdimmer = null reicht ja auch nicht im else-Teil. Du musst zwingend den Dimmer mit tdimmer.cancel abbrechen. wenn tdimmer?.cancel weiterhin einen Fehler verursacht, musst Du eben den Umweg über die Bedingung gehen.
Wie sind die Items definiert?
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Quautiputzli
Beiträge: 364
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: Dimmer Rule für IKEA Schalter

Beitrag von Quautiputzli »

Hallo, ich möchte mich gerne hier anhängen, da mich das Thema auch interessiert.
Ich habe einen Taster der bei langen Tastendruck z.b. "button_1_hold" bringt, und dann beim loslassen "button_1_released".
Ich habe es schon geschafft, ein Dimmer Item mit folgender Rule zu steuern:

Code: Alles auswählen

var Timer tdimmer = null

rule "Buero Dimmer 3 heller"
when
    Channel "mqtt:topic:broker:gf_office_switch:office_switch_trigger" triggered 
then
    logInfo("dimmer", "Rule Dimmer gestartet")
    if (tdimmer !== null) tdimmer.cancel() 
    if (receivedEvent == "button_3_hold") {
        logInfo( "HSBtype", Office_Light_temp.state.toString)
        tdimmer = createTimer(now, [ |
            Office_Light_temp.sendCommand((Office_Light_temp.state as Number) + 2)
            tdimmer.reschedule(now.plusSeconds(0.1))
        ])
    } else {
        if(tdimmer !== null) tdimmer.cancel
    }
end
Obwohl der released trigger in der Rule gar nicht vorkommt funktionniert es wunderbar.

Ich würde aber gerne auch color-Items steuern können. Ich habe da schon viel probiert, bekomme es aber nicht hin. Zum Test habe ich nun folgende Rule:

Code: Alles auswählen

when
    Channel "mqtt:topic:broker:gf_office_switch:office_switch_trigger" triggered
then
    logInfo("HSB", "Rule HSB Dimmer gestartet")
    if (tdimmer !== null) tdimmer.cancel() 
    if(receivedEvent == "button_3_hold") {
        var HSBType currentState
        currentState = GF_Office_Light.state as HSBType
        var hue = currentState.hue
        var sat = currentState.saturation
        var bri = currentState.brightness +5
        logInfo( "hueValue" , hue.toString)
        logInfo( "saturationValue" , sat.toString)
	logInfo( "brightnessValue" , bri.toString)
        GF_Office_Light.sendCommand(new HSBType(hue, sat, bri))
	logInfo( "HSBValue" , hue, sat, bri)
    } else if(receivedEvent.toString == "button_3_released") {
        if (tdimmer !== null) tdimmer.cancel() 
    }
end
Das logfile sieht so aus:

Code: Alles auswählen

2021-04-03 16:37:08.996 [INFO ] [org.openhab.core.model.script.HSB   ] - Rule HSB Dimmer gestartet

2021-04-03 16:37:09.000 [INFO ] [g.openhab.core.model.script.hueValue] - 180

2021-04-03 16:37:09.001 [INFO ] [ab.core.model.script.saturationValue] - 25

2021-04-03 16:37:09.002 [INFO ] [ab.core.model.script.brightnessValue] - 87

2021-04-03 16:37:09.004 [ERROR] [internal.handler.ScriptActionHandler] - Script execution of rule with UID 'HSB_1-1' failed: An error occurred during the script execution: Could not invoke constructor: org.openhab.core.library.types.HSBType.HSBType(org.openhab.core.library.types.DecimalType,org.openhab.core.library.types.PercentType,org.openhab.core.library.types.PercentType) in HSB_1

Man kann erkennen, dass die HSB-Werte erfasst werden, auch das zerlegen und das Addieren funktioniert. Aber ich bekomme die einzelnen Werte nicht wieder "zusammengebaut" um es richtig an das Item zu senden. Ich bekomme es nicht mal hin, dass es ins logfile ausgegeben wird.

Ich habe auch schon mit DecimalType und PercentType rumprobiert, bekomme es aber einfach nicht hin.

Was mache ich falsch?
Servus

Quautiputzli
Beiträge: 364
Registriert: 29. Okt 2020 19:53
Answers: 2

Re: Dimmer Rule für IKEA Schalter

Beitrag von Quautiputzli »

Ich bin der Sache nun schon näher gekommen. So klappt es schonmal einmalig:

Code: Alles auswählen

rule "HSB auslesen"

when 
    Channel "mqtt:topic:broker:gf_office_switch:office_switch_trigger" triggered 
then
    if (receivedEvent == "button_3_hold") {
        logInfo( "HSBtype", GF_Office_Light.state.toString)
        var HSBType currentState
        currentState = GF_Office_Light.state as HSBType
        var DecimalType new_H = currentState.hue
        var PercentType new_S = currentState.saturation
        var PercentType new_B = new PercentType(currentState.brightness + 5)
        logInfo( "hueValue" , new_H.toString)
        logInfo( "saturationValue" , new_S.toString)
	logInfo( "brightnessValue" , new_B.toString)
        var HSBType newState = new HSBType(new_H,new_S,new_B)
        sendCommand(GF_Office_Light,newState.toString)
    }   
end
Servus

Antworten