Timer Rule reschedule will never end

Hi, I have a problem with a reschedule Timer that never ends in a rule:

rule "Bad UG Fenster"
when
	Item Mi_DW_BadUG_Status changed
then
	if (Heating_Mode.state == "NORMAL" && Mi_DW_BadUG_Status.state == OPEN && Heating_Day.state == ON) {
        ZWave_Danfoss_BADUG_Setpoint.sendCommand(TempOff)
        logInfo(logfilename, "Heating NORMAL: Bad UG AUS, Fenster AUF")
        Timer_BADUG = createTimer(now.plusMinutes(30)) [| 
            sendNotification("XXXXXX@XXX", "Bad UG Fenster offen")
            Timer_BADUG.reschedule(now.plusMinutes(5))
        ]
    }
    else if (Heating_Mode.state == "NORMAL" && Mi_DW_BadUG_Status.state == CLOSED && Heating_Day.state == ON && Timer_BADUG !== null) {
        Timer_BADUG?.cancel
        ZWave_Danfoss_BADUG_Setpoint.sendCommand(TempHoliday)
        logInfo(logfilename, "Heating NORMAL: Bad UG 13°C, Fenster ZU")
    }
    else if (Heating_Mode.state == "NORMAL" && Mi_DW_BadUG_Status.state == CLOSED && Heating_Day.state == OFF && Timer_BADUG !== null) {
        Timer_BADUG?.cancel
    	ZWave_Danfoss_BADUG_Setpoint.sendCommand(TempOff)
        logInfo(logfilename, "Heating NORMAL: Bad UG 4,5°C, Fenster ZU")
    }
end

What would you like to happen instead?

The rule should work like this:
When the Bathroom window (Mi_DW_BadUG_Status) is open the radiator (ZWave_Danfoss_BADUG_Setpoint) should go off immediately. After 30min i want a message that the window is open, this message repeats every 5min untill i close the window. When the window is closed the radaiator should set back to day or night temperature (depands on Heating_Day.state is ON or OFF).

Based on your description this could work. You will probably want to add some error checking in case Items are NULL or UNDEF

var Timer Timer_BADUG = null

rule "Bad UG Fenster"
when Item Mi_DW_BadUG_Status changed
then
    if(Mi_DW_BadUG_Status.state == OPEN) {
        ZWave_Danfoss_BADUG_Setpoint.sendCommand(TempOff)
        logInfo(logfilename, "Heating NORMAL: Bad UG AUS, Fenster AUF")
        Timer_BADUG = createTimer(now.plusMinutes(30)) [| 
            sendNotification("XXXXXX@XXX", "Bad UG Fenster offen")
            Timer_BADUG.reschedule(now.plusMinutes(5))
        ]
    } else {
        Timer_BADUG?.cancel
        Timer_BADUG = null
        if(Heating_Day.state == ON) {
            ZWave_Danfoss_BADUG_Setpoint.sendCommand(TempHoliday)
            logInfo(logfilename, "Heating NORMAL: Bad UG 13°C, Fenster ZU")
        } else {
            ZWave_Danfoss_BADUG_Setpoint.sendCommand(TempOff)
            logInfo(logfilename, "Heating NORMAL: Bad UG 4,5°C, Fenster ZU")
        }
    }
end 
1 Like

Hey David, this is working but i get an error when the Timer is canceld:

2021-01-04 20:26:29.806 [ERROR] [org.quartz.core.JobRunShell         ] - Job DEFAULT.Timer 5 2021-01-04T20:24:49.502+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {
  sendNotification(<XStringLiteralImpl>,<XStringLiteralImpl>)
  <XFeatureCallImplCustom>.reschedule(<XMemberFeatureCallImplCustom>)
} ] 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._doEvaluate(XbaseInterpreter.java:857) ~[?:?]
	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.$Proxy1308.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:?]
2021-01-04 20:26:29.818 [ERROR] [org.quartz.core.ErrorLogger         ] - Job (DEFAULT.Timer 5 2021-01-04T20:24:49.502+01:00: Proxy for org.eclipse.xtext.xbase.lib.Procedures$Procedure0: [ | {
  sendNotification(<XStringLiteralImpl>,<XStringLiteralImpl>)
  <XFeatureCallImplCustom>.reschedule(<XMemberFeatureCallImplCustom>)
} ] 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._doEvaluate(XbaseInterpreter.java:857) ~[?:?]
	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.$Proxy1308.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

Is your variable “logfilename” defined?

Yes.

// logfilename
val String logfilename = "heating.rules"

Did you saved your rule after opening the window? In this case the timer variable is set back to null, but the generated timer is active and tries to access the variable after 30 minutes.

Yes thats possibile, i will test with some shorter time values. But thanks anyway for the working template!