[SOLVED] Cancel timer started by other Rule before execution

Hi.
I have a Switch item that turns on a Bulb and a Fan. the Bulb needs to be turned on/off immediately, but the Fan needs to be switched on/off after determined delay (after 1 minute for instance).

But if the Switch have been turned off/on earlier than delay finished i need to cancel the opposite timer.

I believe that i should define timers globally at definitions

Yes you should

In fact, i’ve already solved the problem right after posting. I should ask a moderator to delete the postt, but have no idea how to.

Anyway, thank you for answer.

It would be nice if you could post the solution. Someone else might benefit from your findings. :slight_smile:

1 Like

Here is what worked for me (some my integration-specific lines are deleted):

val Toilet_Fan_TurnOn_Delay_sec  = 60
val Toilet_Fan_TurnOff_Delay_sec = 300

var Timer Toilet_Fan_TurnOn_Timer
var Timer Toilet_Fan_TurnOff_Timer

rule "Toilet: Turn ON the light"
	when
		Item Toilet_Switch changed from "OFF" to "ON"
	then
		

        if (Toilet_Fan_TurnOff_Timer !== null) {
			Toilet_Fan_TurnOff_Timer.cancel()
		}
		
		Toilet_Fan_TurnOn_Timer		= createTimer(now.plusSeconds(Toilet_Fan_TurnOn_Delay_sec))  [| Toilet_Fan.sendCommand(ON) ]
		
	end

rule "Toilet: Turn OFF the light"
	when
		Item Toilet_Switch changed from "ON" to "OFF"
	then
		

		if (Toilet_Fan_TurnOn_Timer !== null) {
			Toilet_Fan_TurnOn_Timer.cancel()
		}
		
		Toilet_Fan_TurnOff_Timer	= createTimer(now.plusSeconds(Toilet_Fan_TurnOff_Delay_sec))  [| Toilet_Fan.sendCommand(OFF) ]

	end

Tidied up a bit and added resetting timer to null
Also, please mark the thread as solved, thanks

val Toilet_Fan_TurnOn_Delay_sec  = 60
val Toilet_Fan_TurnOff_Delay_sec = 300

var Timer Toilet_Fan_TurnOn_Timer
var Timer Toilet_Fan_TurnOff_Timer

rule "Toilet: Turn ON the light"
when
    Item Toilet_Switch changed from OFF to ON
then
    if (Toilet_Fan_TurnOff_Timer !== null) {
        Toilet_Fan_TurnOff_Timer.cancel()
        Toilet_Fan_TurnOff_Timer = null
    } else if (Toilet_Fan_TurnOff_Timer === null) {
        Toilet_Fan_TurnOn_Timer = createTimer(now.plusSeconds(Toilet_Fan_TurnOn_Delay_sec), [ |
            Toilet_Fan.sendCommand(ON)
            Toilet_Fan_TurnOn_Timer = null  // Cancels the timer when run out
        ])
    }
end

rule "Toilet: Turn OFF the light"
when
    Item Toilet_Switch changed from ON to OFF
then
    if (Toilet_Fan_TurnOn_Timer !== null) {
        Toilet_Fan_TurnOn_Timer.cancel()
        Toilet_Fan_TurnOn_Timer = null
    } else if (Toilet_Fan_TurnOn_Timer === null) {
        Toilet_Fan_TurnOff_Timer = createTimer(now.plusSeconds(Toilet_Fan_TurnOff_Delay_sec), [ |
            Toilet_Fan.sendCommand(OFF)
            Toilet_Fan_TurnOff_Timer = null   // Cancels the timer when run out
        ])
    }
end
5 Likes