[SOLVED] Dimmer Rule with exec Binding

Use the Exec actions:

For a Dimmer rule:

val int timeoutMills = 3 * 600 // 60000 divided by 100 dim levels
var int dimLevel = 1
var Timer timer = null

rule "Slowly Dim Up"
when
    Item Outlet2_Switch changed to ON
then
    if (timer === null) {
        timer = createTimer(now.plusSeconds(0), [ |   //Starts immediately
            Light1_Dimmer.sendCommand(dimLevel)
            if (dimLevel == 100) {
                timer = null // cancel timer
            } else {
                dimLevel = dimLevel + 1
                timer.reschedule(now.plusMillis(timeoutMills)) // reschedule timer is 3 * 600 mills
            }
        ])
    }
end

Or

Have a go and let us know how you get on

hmm I dont know if this is working for me. I mean I have no dimmer with a dim level. Im using PWM with a value between 0 and 1024.
“GPIO PWM 1 0” (<- 100% light)
“GPIO PWM 1 512” (<- 50% light)
and so on

So im looking for a command which change the “0” in “GPIO PWM 1 0” constantly to 1024 in 15min (around +1 each second)

Yes, that’s exaclty what I posted before
Build a string with the dimmer value:

var dimmerValue = DimmerItem.state as Number
val int pwmValue = ((dimmerValue * 1024) / 100).intValue
val commandString = "GPIO PWM 1 " + pwmValue
executeCommandLine(commandString)

That’s it, now you need to put this is in a dimmer loop as above
Change the item names or whatever.

Come back with your working outs.
We are not here to write code for you. You need to learn
So have a go, use the examples above. Read them, understand them
Make use of them for your own use.

If it doesn’t work then post your code here and we’ll point you in the right direction again

Oh I’m sorry. Its always hard for me to understand things in a foreign language :smiley: Im going to try this now

OK I’m really stucking. It starts with “dimLevel” and PWMValue"

Variable ‘pwmValue’ on rule file ‘xyz.rules’ cannot be initialized…

Same with dim Level

Post you code
Use the code fences

val int timeoutMills = 3 * 600 // 60000 divided by 100 dim levels
var int dimLevel = 1
var Timer timer = null

var dimmerValue = DimmerItem.state as Number
val int pwmValue = ((dimLevel * 1024) / 100).intValue
val commandString = "GPIO PWM 1 " + pwmValue


rule "Slowly Dim Up"
when
    Item GPIO1 changed to ON
then
    if (timer === null) {
        timer = createTimer(now.plusSeconds(0), [ |   //Starts immediately
            executeCommandLine(commandString)
            if (dimLevel == 100) {
                timer = null // cancel timer
            } else {
                dimLevel = dimLevel + 1
                timer.reschedule(now.plusMillis(timeoutMills)) // reschedule timer is 3 * 600 mills
            }
        ])
    }
end

Well, I really dont know what im doing :smiley:
And why did you write “3 * 600” an not 1800?

Try this and watch the logs like a hawk

val int timeoutSecs = 9 // 9 seconds for 15 minutes
var int dimLevel = 0 // Start from 0
var Timer timer = null // Initialise timer to null

rule "Slowly Dim Up"
when
    Item GPIO1 changed to ON
then
    if (timer === null) { // If there is no timer
        logInfo("TIMER", "Starting dimmer loop")
        timer = createTimer(now.plusSeconds(0), [ |   //Starts immediately
            if (dimLevel == 100) { //If we have reached 100
                timer = null // cancel timer
            } else {
                dimLevel = dimLevel + 1 // Increase dimLevel by 1
                val int pwmValue = ((dimLevel * 1024) / 100).intValue // Scale dimLevel from 0-100 to 0-1024
                val commandString = "GPIO PWM 1 " + pwmValue // Create command String
                logInfo("LOOP Command Line: ", commandString)
                executeCommandLine(commandString) // Execute command String
                timer.reschedule(now.plusMillis(timeoutMills)) // reschedule timer like a loop
            }
        ])
    }
end

"couldn’t execute commandLine ‘GPIO PWM 1 10’

java.io.IOException: Cannot run program “GPIO”"

I think this is a problem with the rights now :frowning:

Yep, I am not too good with those unfortunately.
@H102, can you help with this one?

Yep, make sure openhab is a member of the GPIO group. You can do it manually or use the openhabian-config tool to fix permissions.

Using the openhabian tool it’s:
Apply Improvements > Fix Permissions (#14).

1 Like

OK I added user openhab to gpio but I still get this error:

2019-01-20 18:07:08.728 [ERROR] [lipse.smarthome.io.net.exec.ExecUtil] - couldn’t execute commandLine ‘GPIO PWM 1 10’

java.io.IOException: Cannot run program “GPIO”: error=2, file not found

You have the GPIO binding installed?

Yep, I solved the problem now with “sudo GPIO PWM 1”

But I think there is still something wrong:

Log

2019-01-20 18:13:49.208 [INFO ] [eclipse.smarthome.model.script.TIMER] - Starting dimmer loop

2019-01-20 18:13:49.513 [INFO ] [ome.model.script.LOOP Command Line: ] - sudo GPIO PWM 1 10

2019-01-20 18:13:49.519 [INFO ] [lipse.smarthome.io.net.exec.ExecUtil] - executed commandLine ‘sudo GPIO PWM 1 10’

2019-01-20 18:13:49.532 [ERROR] [org.quartz.core.JobRunShell ] - Job DEFAULT.2019-01-20T18:13:49.234+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

org.eclipse.xtext.xbase.impl.XIfExpressionImpl@15e6960

} ] threw an unhandled Exception:

java.lang.reflect.UndeclaredThrowableException: null

at com.sun.proxy.$Proxy131.apply(Unknown Source) ~[?:?]

at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) ~[?:?]

at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh240]

at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh240]

Caused by: org.eclipse.smarthome.model.script.engine.ScriptExecutionException: The name ‘timeoutMills’ cannot be resolved to an item or type; line 39, column 49, length 12

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:141) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:902) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:865) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:224) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluateArgumentExpressions(XbaseInterpreter.java:1116) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:992) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:772) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:220) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluateArgumentExpressions(XbaseInterpreter.java:1116) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:992) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:772) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:220) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:447) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:228) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:464) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:244) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:447) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:228) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:190) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.ClosureInvocationHandler.doInvoke(ClosureInvocationHandler.java:46) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.AbstractClosureInvocationHandler.invoke(AbstractClosureInvocationHandler.java:29) ~[?:?]

... 4 more

2019-01-20 18:13:49.628 [ERROR] [org.quartz.core.ErrorLogger ] - Job (DEFAULT.2019-01-20T18:13:49.234+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {

org.eclipse.xtext.xbase.impl.XIfExpressionImpl@15e6960

} ] threw an exception.

org.quartz.SchedulerException: Job threw an unhandled exception.

at org.quartz.core.JobRunShell.run(JobRunShell.java:213) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh240]

at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [107:org.eclipse.smarthome.core.scheduler:0.10.0.oh240]

Caused by: java.lang.reflect.UndeclaredThrowableException

at com.sun.proxy.$Proxy131.apply(Unknown Source) ~[?:?]

at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) ~[?:?]

at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]

... 1 more

Caused by: org.eclipse.smarthome.model.script.engine.ScriptExecutionException: The name ‘timeoutMills’ cannot be resolved to an item or type; line 39, column 49, length 12

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:141) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:902) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:865) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:224) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluateArgumentExpressions(XbaseInterpreter.java:1116) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:992) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:772) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:220) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluateArgumentExpressions(XbaseInterpreter.java:1116) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1046) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.invokeFeature(XbaseInterpreter.java:992) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:151) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:772) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:220) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:447) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:228) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:464) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:244) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:447) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:228) ~[?:?]

at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.doEvaluate(ScriptInterpreter.java:226) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.internalEvaluate(XbaseInterpreter.java:204) ~[?:?]

at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.evaluate(XbaseInterpreter.java:190) ~[?:?]

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.$Proxy131.apply(Unknown Source) ~[?:?]

at org.eclipse.smarthome.model.script.internal.actions.TimerExecutionJob.execute(TimerExecutionJob.java:49) ~[?:?]

at org.quartz.core.JobRunShell.run(JobRunShell.java:202) ~[?:?]

... 1 more

Try that command with sudo -u openhab GPIO PWM 1 to verify that user openhab can execute it.

Yes, this is working.
Oh I think the problem is the “GPIO” I need to write “gpio”

It workes without “sudo” now. But same problem as above. Something with:

The name ‘timeoutMills’ cannot be resolved to an item or type; line 39, column 49, length 12

Yep, I was looking at the rules and the errors. I don’t think the issue is necessarily related to gpio. At least for the moment.:smile:

The error message said it all
I forgot to change the rechedule

change the last line:

val int timeoutSecs = 9 // 9 seconds for 15 minutes
var int dimLevel = 0 // Start from 0
var Timer timer = null // Initialise timer to null

rule "Slowly Dim Up"
when
    Item GPIO1 changed to ON
then
    if (timer === null) { // If there is no timer
        logInfo("TIMER", "Starting dimmer loop")
        timer = createTimer(now.plusSeconds(0), [ |   //Starts immediately
            if (dimLevel == 100) { //If we have reached 100
                timer = null // cancel timer
            } else {
                dimLevel = dimLevel + 1 // Increase dimLevel by 1
                val int pwmValue = ((dimLevel * 1024) / 100).intValue // Scale dimLevel from 0-100 to 0-1024
                val commandString = "GPIO PWM 1 " + pwmValue // Create command String
                logInfo("LOOP Command Line: ", commandString)
                executeCommandLine(commandString) // Execute command String
                timer.reschedule(now.plusSeconds(timeoutSecs)) // reschedule timer like a loop
            }
        ])
    }
end

I was just about to say that timeoutMills was never declared.:wink:

AWESOME. Its working now…but way to fast. I think you wanted to show me that :slight_smile: