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
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