[SOLVED] Erratic dimmer button

First post here, and Openhab beginner … So please be patient! :slight_smile:


I’m trying to set up a rule to control a Ikea Bulb

https://www.zigbee2mqtt.io/devices/LED1836G9.html

with the Ikea dimmer button

https://www.zigbee2mqtt.io/devices/E1743.html

both working with zigbee protocol via zigbee2mqtt.

The bulb is defined here:

Thing topic tradfri01 "Tradfri Bulb" {
  Channels:
        Type switch : switch "Switch Tradfri Bulb" [stateTopic="zigbee2mqtt/tradfri01", transformationPattern="JSONPATH:$.state", commandTopic="zigbee2mqtt/tradfri01/set", transformationPatternOut="JS:settradfristate.js"]
        Type dimmer : dimmer "Dimmer Tradfri Bulb" [stateTopic="zigbee2mqtt/tradfri01", transformationPattern="JSONPATH:$.brightness", commandTopic="zigbee2mqtt/tradfri01/set", min=1, max=254, step=1, formatBeforePublish="{ \"brightness\" : %s }"]
        Type number : brightness "tradfri01 brightness" [stateTopic="zigbee2mqtt/tradfri01", transformationPattern="JSONPATH:$.brightness"]
        }

and the button here:

Thing topic tradfri_button "tradfri button" {
  Channels:
          Type string : click  "click" [ stateTopic="zigbee2mqtt/tradfri_button", transformationPattern="JSONPATH:$.click"]
        }
	

The button sends the following states:

	
	on / off / brightness_up / brightness_down / brightness_stop
	

I’ve read in the forum that the appropriate way to manage the button is to write
a dedicated rule.

So thanks to contribution of many forum members ( have to mention @Udo_Hartmann, @rlkoshak, vzorglub)

I have written the following rule:


var Timer dimmingTimer = null 


rule "tradfri button change"
when
    Item tradfri_button changed
then
	if	(tradfri_button.state == "on") {
		logInfo("tradfri_button.rules", "tradfri_button sends on")
		sendCommand(tradfri01_dimmer,80)
		}
	
	if (tradfri_button.state == "off") {
		logInfo("tradfri_button.rules", "tradfri_button sends off")
		//sendCommand(tradfri01_dimmer,0)
		sendCommand(tradfri01_switch,OFF)
		}
	
	if (tradfri_button.state == "brightness_up") {
		logInfo("tradfri_button.rules", "tradfri_button sends brightness_up")
		
				if (dimmingTimer === null) {
					logInfo("tradfri_button.rules", "dimmingTimer is NULL")
					//
					dimmingTimer = createTimer(now.plusSeconds(0), [ |
					var brightness = tradfri01_dimmer.state as Number + 5
					if(brightness > 99) brightness = 100

								
					tradfri01_dimmer.sendCommand(brightness)
						logInfo("tradfri_button.rules", "brightness set to " + brightness)
					if(brightness == 100) {
						dimmingTimer = null
						logInfo("tradfri_button.rules", "dimmingTimer set to NULL")
						}
					
					else {
						dimmingTimer.reschedule(now.plusMillis(400))
						logInfo("tradfri_button.rules", "dimmingTimer " + dimmingTimer)
						}
					])
			}

			else 
					if(dimmingTimer!==null) {
					dimmingTimer.cancel
					dimmingTimer = null
					}
		
		
		
		}
	
	if (tradfri_button.state == "brightness_down") {
		logInfo("tradfri_button.rules", "tradfri_button sends brightness_down")

			if (dimmingTimer === null) {
					logInfo("tradfri_button.rules", "dimmingTimer is NULL")
					//
					dimmingTimer = createTimer(now.plusSeconds(0), [ |
					var brightness = tradfri01_dimmer.state as Number - 5
					if(brightness < 1) brightness = 0

						
					tradfri01_dimmer.sendCommand(brightness)
						logInfo("tradfri_button.rules", "brightness set to " + brightness)
					if(brightness == 0) {
						dimmingTimer = null
						logInfo("tradfri_button.rules", "dimmingTimer set to NULL")
						}
					
					else {
						dimmingTimer.reschedule(now.plusMillis(400))
						logInfo("tradfri_button.rules", "dimmingTimer " + dimmingTimer)
						}
					])
			}

			else 
					if(dimmingTimer!==null) {
					dimmingTimer.cancel
					dimmingTimer = null
					}
		}	
		
	if (tradfri_button.state == "brightness_stop") {
		logInfo("tradfri_button.rules", "tradfri_button sends brightness_stop")
		
				if(dimmingTimer!==null) {
					dimmingTimer.cancel
					dimmingTimer = null
					logInfo("tradfri_button.rules", "dimmingTimer set to NULL")
				}
			
	
		}
	
									
end

	
	

Everything is ALMOST fine :slight_smile:

The dimming action is a little erratic as you can see in the logfile:

As you want to dimmer the brightness down

the command is intercepted:

2020-03-09 17:12:49.873 [INFO ] [me.model.script.tradfri_button.rules] - tradfri_button sends brightness_down
2020-03-09 17:12:49.883 [INFO ] [me.model.script.tradfri_button.rules] - dimmingTimer is NULL
2020-03-09 17:12:49.910 [INFO ] [me.model.script.tradfri_button.rules] - brightness set to 75.0

and the brightness is set 5 points down
as you continue to keep the button pressed

2020-03-09 17:12:50.327 [INFO ] [me.model.script.tradfri_button.rules] - brightness set to 70.0

the brightness goes down

2020-03-09 17:12:50.751 [INFO ] [me.model.script.tradfri_button.rules] - brightness set to 65.0

the brightness goes down

But:

2020-03-09 17:12:50.793 [ome.event.ItemCommandEvent] - Item 'tradfri01_dimmer' received command 65.0
2020-03-09 17:12:50.797 [nt.ItemStatePredictedEvent] - tradfri01_dimmer predicted to become 65.0
2020-03-09 17:12:50.827 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 70.0 to 65.0
2020-03-09 17:12:50.843 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 65.0 to 75.00
2020-03-09 17:12:50.853 [vent.ItemStateChangedEvent] - tradfri01_brightness changed from 203.4 to 190.75
2020-03-09 17:12:51.170 [INFO ] [me.model.script.tradfri_button.rules] - brightness set to 70.00

here something goes wrong.
The dimmer goes down, and goes up for a moment and down again.

Any hint?

Best regards,
francis3

Show both the complete openhab.log and events log from just before pressing the button to just after you stop pressing it.

Is the Rule triggering more than once?

Sending a command to a Zigbee device every 400 msec is likely way too fast. What if you make that loop time closer to 1000?

Thank for your quick answer rlkoshak!
Gonna post complete logs ASAP, and try the suggested fix.

Best regards,
francis3

What’s the exact behaviour of the wall button?
I guess, there are two buttons, which are:
button1 short press -> ON
button1 short release -> nothing
button2 short press -> OFF
button2 short press -> nothing
button1 long press -> brightness_up (one time)
button1 long release -> brightness_stop (one time)
button2 long press -> brightness_down (one time)
button2 long release -> brightness_stop (one time)

Is this correct?

Then this rule would be a more sophisticated solution :wink:

var Timer tDim = null 
var Boolean bDir = false                                                                        // false = down, true = up

rule "tradfri button change"
when
    Item tradfri_button changed
then
    logInfo("tradfri_button", "tradfri_button changed to {}",tradfri_button.state)
    tDim?.cancel                                                                                // cancel existing timers
    switch(tradfri_button.state.toString) {
        case "on" : {
            tradfri01_dimmer.sendCommand(80)
        }
        case "off" : {
            // tradfri01_dimmer.sendCommand(0)                                                  // either this or
            tradfri01_switch.sendCommand(OFF)                                                   // that
        }
        default : {                                                                             // neither on or off
            if(tradfri_button.state.toString.contains("up"))                                    // brightness_up
                bDir = true
            if(tradfri_button.state.toString.contains("down"))                                  // brightness_down
                bDir = false
            if(!(tradfri_button.state.toString.contains("stop")))                               // either up or down so
                tDim = createTimer(now.plusMillis(10), [ |                                      // start timer
                    var Integer iBright = 0                                                     // initialize Integer var
                    if(tradfri01_dimmer.state instanceof Number)                                // if dimmer value is valid
                        iBright = (tradfri01_dimmer.state as Number).intValue                   // set var to value
                    if(bDir)                                                                    // if bDir is "up"
                        iBright += 5
                    else                                                                        // if bDir is "down"
                        iBright -= 5
                    if(iBright > 100)                                                           // check upper border
                        iBright = 100
                    if(iBright < 0)                                                             // check lower border
                        iBright = 0
                    tradfri01_dimmer.sendCommand(iBright)                                       // set dimmer
                    logInfo("tradfri_button", "tradfri01_dimmer set to {}",iBright)
                    if(iBright > 0 && iBright < 100)                                            // if not reached borders
                        tDim.reschedule(now.plusMillis(750))                                    // reschedule timer
                ])
        }
    }
end

Some additional thoughts:

  • iBright must be Integer or +=/-= will fail. But you could use iBright = iBright +/- 5 instead.
  • I’m not sure if .contains() will need more time than a == it’s just for shorter code…
  • Maybe the initial timer delay (10mSec) is not required, just to ensure the timer is setup correct before it gets fired
  • you should always prefer the method over the action (i.e. item.sendCommand(value) instead of sendCommand(item,value))
  • the log string may contain placeholders which are replaced by the following statements. openHAB itself will care of the type.
    When building a string you have to care yourself "value is " + integer will fail.
  • The first string of logInfo() is the logger name. As all your log commands come from rules, the part .rules is redundant. All logs from rules belong to org.openhab.model.script..

Again, thanks for your answer @rlkoshak.

  • Here the logs.

events.log

2020-03-10 10:16:13.806 [vent.ItemStateChangedEvent] - tradfri_button changed from off to on
2020-03-10 10:16:13.857 [ome.event.ItemCommandEvent] - Item 'tradfri01_dimmer' received command 80
2020-03-10 10:16:13.863 [nt.ItemStatePredictedEvent] - tradfri01_dimmer predicted to become 80
2020-03-10 10:16:13.885 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 60.0 to 80
2020-03-10 10:16:14.809 [vent.ItemStateChangedEvent] - tradfri01_switch changed from OFF to ON
2020-03-10 10:16:14.818 [vent.ItemStateChangedEvent] - tradfri01_brightness changed from 152.8 to 203.4
2020-03-10 10:16:34.822 [vent.ItemStateChangedEvent] - tradfri_button changed from on to brightness_down
2020-03-10 10:16:34.916 [ome.event.ItemCommandEvent] - Item 'tradfri01_dimmer' received command 75.0
2020-03-10 10:16:34.924 [nt.ItemStatePredictedEvent] - tradfri01_dimmer predicted to become 75.0
2020-03-10 10:16:34.954 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 80.0 to 75.0
2020-03-10 10:16:35.337 [ome.event.ItemCommandEvent] - Item 'tradfri01_dimmer' received command 70.0
2020-03-10 10:16:35.340 [nt.ItemStatePredictedEvent] - tradfri01_dimmer predicted to become 70.0
2020-03-10 10:16:35.360 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 75.0 to 70.0
2020-03-10 10:16:35.773 [ome.event.ItemCommandEvent] - Item 'tradfri01_dimmer' received command 65.0
2020-03-10 10:16:35.778 [nt.ItemStatePredictedEvent] - tradfri01_dimmer predicted to become 65.0
2020-03-10 10:16:35.800 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 70.0 to 65.0
2020-03-10 10:16:35.828 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 65.0 to 75.00
2020-03-10 10:16:35.831 [vent.ItemStateChangedEvent] - tradfri01_brightness changed from 203.4 to 190.75
2020-03-10 10:16:36.173 [ome.event.ItemCommandEvent] - Item 'tradfri01_dimmer' received command 70.00
2020-03-10 10:16:36.183 [nt.ItemStatePredictedEvent] - tradfri01_dimmer predicted to become 70.00
2020-03-10 10:16:36.197 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 75.00 to 70.00
2020-03-10 10:16:36.616 [ome.event.ItemCommandEvent] - Item 'tradfri01_dimmer' received command 65.00
2020-03-10 10:16:36.620 [nt.ItemStatePredictedEvent] - tradfri01_dimmer predicted to become 65.00
2020-03-10 10:16:36.639 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 70.00 to 65.00
2020-03-10 10:16:36.832 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 65.00 to 70.0
2020-03-10 10:16:36.841 [vent.ItemStateChangedEvent] - tradfri01_brightness changed from 190.75 to 178.1
2020-03-10 10:16:36.848 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 70.0 to 65.00
2020-03-10 10:16:36.852 [vent.ItemStateChangedEvent] - tradfri01_brightness changed from 178.1 to 165.45
2020-03-10 10:16:36.855 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 65.00 to 70.0
2020-03-10 10:16:36.858 [vent.ItemStateChangedEvent] - tradfri01_brightness changed from 165.45 to 178.1
2020-03-10 10:16:37.037 [ome.event.ItemCommandEvent] - Item 'tradfri01_dimmer' received command 65.0
2020-03-10 10:16:37.039 [nt.ItemStatePredictedEvent] - tradfri01_dimmer predicted to become 65.0
2020-03-10 10:16:37.055 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 70.0 to 65.0
2020-03-10 10:16:37.468 [ome.event.ItemCommandEvent] - Item 'tradfri01_dimmer' received command 60.0
2020-03-10 10:16:37.476 [nt.ItemStatePredictedEvent] - tradfri01_dimmer predicted to become 60.0
2020-03-10 10:16:37.499 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 65.0 to 60.0
2020-03-10 10:16:37.836 [vent.ItemStateChangedEvent] - tradfri_button changed from brightness_down to brightness_stop
2020-03-10 10:16:37.848 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 60.0 to 65.00
2020-03-10 10:16:37.854 [vent.ItemStateChangedEvent] - tradfri01_brightness changed from 178.1 to 165.45
2020-03-10 10:16:37.885 [ome.event.ItemCommandEvent] - Item 'tradfri01_dimmer' received command 60.00
2020-03-10 10:16:37.901 [nt.ItemStatePredictedEvent] - tradfri01_dimmer predicted to become 60.00
2020-03-10 10:16:37.918 [vent.ItemStateChangedEvent] - tradfri01_dimmer changed from 65.00 to 60.00
2020-03-10 10:16:38.840 [vent.ItemStateChangedEvent] - tradfri01_brightness changed from 165.45 to 152.8

openhab.log

2020-03-10 10:16:13.820 [INFO ] [me.model.script.tradfri_button.rules] - tradfri_button sends on
2020-03-10 10:16:34.855 [INFO ] [me.model.script.tradfri_button.rules] - tradfri_button sends brightness_down
2020-03-10 10:16:34.867 [INFO ] [me.model.script.tradfri_button.rules] - dimmingTimer is NULL
2020-03-10 10:16:34.900 [INFO ] [me.model.script.tradfri_button.rules] - brightness set to 75.0
2020-03-10 10:16:34.913 [INFO ] [me.model.script.tradfri_button.rules] - dimmingTimer org.eclipse.smarthome.model.script.internal.actions.TimerImpl@d24bc1
2020-03-10 10:16:35.317 [INFO ] [me.model.script.tradfri_button.rules] - brightness set to 70.0
2020-03-10 10:16:35.334 [INFO ] [me.model.script.tradfri_button.rules] - dimmingTimer org.eclipse.smarthome.model.script.internal.actions.TimerImpl@d24bc1
2020-03-10 10:16:35.742 [INFO ] [me.model.script.tradfri_button.rules] - brightness set to 65.0
2020-03-10 10:16:35.761 [INFO ] [me.model.script.tradfri_button.rules] - dimmingTimer org.eclipse.smarthome.model.script.internal.actions.TimerImpl@d24bc1
2020-03-10 10:16:36.161 [INFO ] [me.model.script.tradfri_button.rules] - brightness set to 70.00
2020-03-10 10:16:36.176 [INFO ] [me.model.script.tradfri_button.rules] - dimmingTimer org.eclipse.smarthome.model.script.internal.actions.TimerImpl@d24bc1
2020-03-10 10:16:36.593 [INFO ] [me.model.script.tradfri_button.rules] - brightness set to 65.00
2020-03-10 10:16:36.617 [INFO ] [me.model.script.tradfri_button.rules] - dimmingTimer org.eclipse.smarthome.model.script.internal.actions.TimerImpl@d24bc1
2020-03-10 10:16:37.018 [INFO ] [me.model.script.tradfri_button.rules] - brightness set to 65.0
2020-03-10 10:16:37.032 [INFO ] [me.model.script.tradfri_button.rules] - dimmingTimer org.eclipse.smarthome.model.script.internal.actions.TimerImpl@d24bc1
2020-03-10 10:16:37.441 [INFO ] [me.model.script.tradfri_button.rules] - brightness set to 60.0
2020-03-10 10:16:37.463 [INFO ] [me.model.script.tradfri_button.rules] - dimmingTimer org.eclipse.smarthome.model.script.internal.actions.TimerImpl@d24bc1
2020-03-10 10:16:37.849 [INFO ] [me.model.script.tradfri_button.rules] - tradfri_button sends brightness_stop
2020-03-10 10:16:37.861 [INFO ] [me.model.script.tradfri_button.rules] - dimmingTimer set to NULL
2020-03-10 10:16:37.872 [INFO ] [me.model.script.tradfri_button.rules] - brightness set to 60.00
2020-03-10 10:16:37.881 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.Timer 8 2020-03-10T10:16:34.870+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {
  var brightness
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@b5943e (conditionalExpression: false)
  <XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)
  logInfo(<XStringLiteralImpl>,<XBinaryOperationImplCustom>)
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@75a09e (conditionalExpression: false)
} ] threw an unhandled Exception:
java.lang.NullPointerException: cannot invoke method public abstract boolean org.eclipse.smarthome.model.script.actions.Timer.reschedule(org.joda.time.base.AbstractInstant) on null
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1160) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1150) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1136) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:1081) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:861) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:231) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:475) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:255) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]
        at com.sun.proxy.$Proxy162.apply(Unknown Source) ~[?:?]
        at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]
        at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [bundleFile:?]
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]
2020-03-10 10:16:37.906 [ERROR] [org.quartz.core.ErrorLogger         ] - Job (DEFAULT.Timer 8 2020-03-10T10:16:34.870+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {
  var brightness
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@b5943e (conditionalExpression: false)
  <XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)
  logInfo(<XStringLiteralImpl>,<XBinaryOperationImplCustom>)
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@75a09e (conditionalExpression: false)
} ] threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception.
        at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [bundleFile:?]
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]
Caused by: java.lang.NullPointerException: cannot invoke method public abstract boolean org.eclipse.smarthome.model.script.actions.Timer.reschedule(org.joda.time.base.AbstractInstant) on null
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1160) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1150) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1136) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:1081) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:861) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:231) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:475) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:255) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]
        at com.sun.proxy.$Proxy162.apply(Unknown Source) ~[?:?]
        at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]
        at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]
        ... 1 more

I can’t say if the rule is triggered more than once.
But in this case there is also a java exception in the logs.
It does not show every time.

  • I’ve tried the suggested fix increasing the timer.
    The first value the dimmer is behaving as espected is 1600. (!!)
    Obliviously quite slow.
dimmingTimer.reschedule(now.plusMillis(1600))

Regards,
francis3

Thanks for your answer @Udo_Hartmann

Yes correct!

I think there’s a typo in your rule, corrected:

//tDim?.chancel                                                                               // cancel existing timers
tDim?.cancel                                                                               // cancel existing timers

The suggested code gives me the following
errors in the logs:

openhab.log

2020-03-10 12:59:52.129 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'tradfri_button.rules'
2020-03-10 12:59:52.134 [WARN ] [el.core.internal.ModelRepositoryImpl] - Configuration model 'tradfri_button.rules' is either empty or cannot be parsed correctly!
2020-03-10 12:59:57.304 [INFO ] [el.core.internal.ModelRepositoryImpl] - Loading model 'tradfri_button.rules'
2020-03-10 12:59:59.505 [INFO ] [el.core.internal.ModelRepositoryImpl] - Refreshing model 'tradfri_button.rules'
2020-03-10 13:00:03.025 [INFO ] [marthome.model.script.tradfri_button] - tradfri_button changed to on
2020-03-10 13:00:06.300 [INFO ] [marthome.model.script.tradfri_button] - tradfri_button changed to off
2020-03-10 13:00:08.309 [INFO ] [marthome.model.script.tradfri_button] - tradfri_button changed to on
2020-03-10 13:00:10.308 [INFO ] [marthome.model.script.tradfri_button] - tradfri_button changed to brightness_down
2020-03-10 13:00:10.352 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.Timer 38 2020-03-10T13:00:10.340+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {
  var iBright
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@561d46 (conditionalExpression: false)
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@bdae58 (conditionalExpression: false)
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@af2fb0 (conditionalExpression: false)
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@2dd27a (conditionalExpression: false)
  <XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)
  logInfo(<XStringLiteralImpl>,<XStringLiteralImpl>,<XFeatureCallImplCustom>)
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@1d65a70 (conditionalExpression: false)
} ] threw an unhandled Exception:
java.lang.IllegalStateException: Could not invoke method: org.eclipse.xtext.xbase.lib.IntegerExtensions.operator_minus(int,int) on instance: null
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1192) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1150) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1136) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:1081) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:991) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:237) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:475) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:255) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]
        at com.sun.proxy.$Proxy162.apply(Unknown Source) ~[?:?]
        at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]
        at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [bundleFile:?]
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]
Caused by: java.lang.IllegalArgumentException: argument type mismatch
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_222]
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_222]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_222]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_222]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1175) ~[?:?]
        ... 23 more
2020-03-10 13:00:10.400 [ERROR] [org.quartz.core.ErrorLogger         ] - Job (DEFAULT.Timer 38 2020-03-10T13:00:10.340+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {
  var iBright
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@561d46 (conditionalExpression: false)
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@bdae58 (conditionalExpression: false)
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@af2fb0 (conditionalExpression: false)
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@2dd27a (conditionalExpression: false)
  <XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)
  logInfo(<XStringLiteralImpl>,<XStringLiteralImpl>,<XFeatureCallImplCustom>)
  org.eclipse.xtext.xbase.impl.XIfExpressionImpl@1d65a70 (conditionalExpression: false)
} ] threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception.
        at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [bundleFile:?]
        at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [bundleFile:?]
Caused by: java.lang.IllegalStateException: Could not invoke method: org.eclipse.xtext.xbase.lib.IntegerExtensions.operator_minus(int,int) on instance: null
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1192) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1150) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1136) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:1081) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:991) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:237) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:475) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:255) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]
        at com.sun.proxy.$Proxy162.apply(Unknown Source) ~[?:?]
        at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]
        at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]
        ... 1 more
Caused by: java.lang.IllegalArgumentException: argument type mismatch
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_222]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_222]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_222]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_222]
  at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1175) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeOperation(XbaseInterpreter.java:1150) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1136) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:1081) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:991) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:237) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:475) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:255) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:458) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:239) ~[?:?]
        at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:215) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:201) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]
        at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]
        at com.sun.proxy.$Proxy162.apply(Unknown Source) ~[?:?]
        at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:48) ~[?:?]
        at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]
        ... 1 more
2020-03-10 13:00:12.314 [INFO ] [marthome.model.script.tradfri_button] - tradfri_button changed to brightness_stop

And the up and down is not working!

About the additional toughts, pure gold to me … and lots of stuff to study! Many thanks! :slight_smile:

Best regards,
francis3

Based on the Events.log I’m guessing that the loop is too fast. You send the first command to move from 80 to 75 which goes off to the bulb. In the mean time over the next second you send two more commands to go to 70 and then to 65. At that point the bulb has finally processed the command to go to 75 and reported back to OH that’s its state is now 75 which causes the binding to update the Item.

That’s why it jumps from 65 back to 75. The bulb hasn’t received those two commands yet.

tl;dr, you are sending the command way to fast for the technology to handle. You’ll have to experiment with how fast you can send the commands. It’s a limitation of the technology. There isn’t anything you can do about it unless you can get the dimmer switch to talk to the light directly without going through OH.

Thank you for your fine explanation @rlkoshak

Before posting in the forum I was suspecting that the issue was in the bulb not receiving all the commands,
and that my rule was not written too badly.

Maybe I’m gonna send to the bulb a 10 point increase o decrease instead of 5.

Anyway I’m pretty happy with it :slight_smile:

Regards,
francis3

Yes, that’s correct.

Jepp, I did another Mistake…

iBright = tradfri01_dimmer.state as Number

has to be

iBright = (tradfri01_dimmer.state as Number).intValue

I changed the code above…

Your code is working fine now.

Had to increase the timer

tDim.reschedule(now.plusMillis(1600))                                    // reschedule timer

as in my code to have a smooth behavior.

Thanks @Udo_Hartmann !

francis3