Execute function in a time slot

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.