i would like to execute a function within a time slot (5min) after detecting a switch change. but if the switch is not activated within the time slot, another function should be activated.
how can you program this?
i would like to execute a function within a time slot (5min) after detecting a switch change. but if the switch is not activated within the time slot, another function should be activated.
how can you program this?
With Rules and Timers. There are lots of examples on the forum.
Trigger the rule when the Switch changes. Set a Timer for 5 minutes. When the Timer goes off, check to see if the Switch activated. If so do one thing. If not do something else.
thank you.
but how can i change something in between will change in this 5 minutes? the timer only will work after 5min. What is, wenn i change a switch in 2 minutes, so i want to make the timer more reactive if another task comes in the way.
An event occurs, right? So trigger a Rule when the event occurs, cancel the Timer and do the other action.
right. i am not sure how to cancel the timer when another action triggers.
rule "Tuertimer"
when
Item Tuertimer changed to ON //received update ON
then
logInfo("FILE", "Timer rescheduled")
var Number remain = MinutesRemainingOnTimer.state as DecimalType
if(WaschmaschineShelly_Relay_Output.state == ON) {
logInfo("FILE", "if")
Wohnzimmer_Licht.sendCommand(ON)
sendTelegram("bot1", "Die Türe wurde geöffnet (((!)))")
Tuertimer.sendCommand(OFF)
}
else {
createTimer(now.plusMinutes(1), [ |
Tuertimer.sendCommand(OFF)
logInfo("FILE", "else")
])
}
end
As shown in all of those examples I linked to, save the timer to a global variable, let’s call it var timer
. Then call timer.cancel
.
thank you. now i got it
rule "Tuertimer"
when
Item Tuertimer received update ON
then
if(occupancyTimer === null || occupanctTimer.hasTerminated()) {
occupancyTimer = createTimer(now.plusMinutes(1), [|
Tuertimer.sendCommand(OFF)
occupancyTimer = null
])
}
else {
logInfo("FILE", "else 1")
occupancyTimer.reschedule(now.plusMinutes(timeoutMinutes ))
}
end
rule "Cancel Tuertimer"
when
Item Klingel changed to OPEN
then
if(occupancyTimer !== null) {
Tueroffner.sendCommand(ON)
occupancyTimer.cancel() //Terminate timer if someone rings the bell
}
end
is it also possible to change the timer time (min) with a Setpoint in sitemaps?
Yes, just show a Number item on the setpoint and use the state of the item as the value to pass to plusMinutes.
You might need to cast and call intValue.
now.plusMinutes((MyItem.state as Number).intValue)
i got this Timer Error. Do you know how to solve it?
*.rule
rule "Tuertimer"
when
Item Tuertimer received update ON
then
if(occupancyTimer === null || occupanctTimer.hasTerminated()) {
Tuertimer_M.sendCommand(7)
occupancyTimer = createTimer(now.plusMinutes((Tuertimer_M.state as Number).intValue), [|
Tuertimer.sendCommand(OFF)
occupancyTimer = null
])
}
else {
logInfo("FILE", "else 1")
occupancyTimer.reschedule(now.plusMinutes(timeoutMinutes ))
}
end
12:17:17.728 [ERROR] [org.quartz.core.JobRunShell ] - Job DEFAULT.Timer 7 2020-01-11T12:17:17.724+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {
<XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)
<null>.occupancyTimer = <XNullLiteralImplCustom>
} ] threw an unhandled Exception:
java.lang.NullPointerException: null
at org.eclipse.smarthome.model.script.engine.ScriptError.<init>(ScriptError.java:65) ~[?:?]
at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:140) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:991) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:954) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:235) ~[?:?]
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.evaluateArgumentExpressions(XbaseInterpreter.java:1205) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1135) ~[?:?]
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.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.$Proxy171.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:?]
12:17:17.787 [ERROR] [org.quartz.core.ErrorLogger ] - Job (DEFAULT.Timer 7 2020-01-11T12:17:17.724+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {
<XFeatureCallImplCustom>.sendCommand(<XFeatureCallImplCustom>)
<null>.occupancyTimer = <XNullLiteralImplCustom>
} ] 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
at org.eclipse.smarthome.model.script.engine.ScriptError.<init>(ScriptError.java:65) ~[?:?]
at org.eclipse.smarthome.model.script.interpreter.ScriptInterpreter.invokeFeature(ScriptInterpreter.java:140) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:991) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._doEvaluate(XbaseInterpreter.java:954) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter.doEvaluate(XbaseInterpreter.java:235) ~[?:?]
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.evaluateArgumentExpressions(XbaseInterpreter.java:1205) ~[?:?]
at org.eclipse.xtext.xbase.interpreter.impl.XbaseInterpreter._invokeFeature(XbaseInterpreter.java:1135) ~[?:?]
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.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.$Proxy171.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
Have you declared your occupancyTimer variable somewhere? Where?
While editing rules with long running timers involved, you also need to keep in mind the problem of orphan timers.
yes
as a global variable in my *.rule file
var Timer occupancyTimer = null
Find out about orphaned timers, then you will be able to decide if you have a real problem or it is just a consequence of editing rules after a timer has been started.
It wouldn’t cause the error, but there’s a typo here. Actually, I’m surprised the rule would pass validation tests.
i got a warning in visual studio code
The method or field timeoutMinutes is undefined
it means “occupanctTimer” is the problem.