I’ve an example that I use to put down my blinds:
var Timer RSTimerUp = null
var Timer RSTimerDown = null
rule "Auto Rollershutter based on time"
when
Member of RollerShutters_Auto_Timer received update
then
val tdir = triggeringItem.name.split("_").get(3)
val tstate = triggeringItem.state
val timer_time = RollerShutters_Auto_Timer_Time.allMembers.findFirst[i|i.name.contains(tdir)]
val timer_hour = (RollerShutters_Auto_Timer_HoursMinutes.allMembers.findFirst[i|i.name.contains(tdir+"_Hour")].state as Number).intValue
val timer_minute = (RollerShutters_Auto_Timer_HoursMinutes.allMembers.findFirst[i|i.name.contains(tdir+"_Minute")].state as Number).intValue
if (now.isBefore(now.withTime(timer_hour,timer_minute,0,0)) ){
timer_time.postUpdate(now.withTime(timer_hour,timer_minute,0,0).toString)
}else{
timer_time.postUpdate(now.withTime(timer_hour,timer_minute,0,0).plusHours(24).toString)
}
if (tstate==ON){
switch tdir{
case "Down" :{
if (RSTimerDown === null){
logInfo("RSTimerDown","start Timer Down")
RSTimerDown = createTimer(new DateTime(RollerShutters_Auto_Timer_Down_Time.state.toString), [|
logInfo("RSTimerDown","Timer wordt uitgevoerd")
RollerShutters_Auto_Timer_Down.allMembers.filter[i|i.state==ON].forEach[i|
checkFirstRS.apply(RollerShutters.members.findFirst[j|j.name.contains(i.name.split("_").get(1))] as GenericItem, DOWN)
]
RollerShutters_Auto_Timer_Down_Time.postUpdate(now.plusDays(1).toString)
RSTimerDown.reschedule(now.plusDays(1))
])
}
}
case "Up" :{
if (RSTimerUp === null){
logInfo("RSTimerUp","start Timer Up")
RSTimerUp = createTimer(new DateTime(RollerShutters_Auto_Timer_Up_Time.state.toString), [|
logInfo("RSTimerUp","Timer wordt uitgevoerd")
RollerShutters_Auto_Timer_Up.allMembers.filter[i|i.state==ON].forEach[i|
checkFirstRS.apply(RollerShutters.members.findFirst[j|j.name.contains(i.name.split("_").get(1))] as GenericItem, UP)
]
RollerShutters_Auto_Timer_Up_Time.postUpdate(now.plusDays(1).toString)
RSTimerUp.reschedule(now.plusDays(1))
])
}
}
}
}else{
switch tdir{
case "Down": {
if (RollerShutters_Auto_Timer_Down.state == OFF){
logInfo("RSTimerDown","stop Timer Down")
RSTimerDown?.cancel
RSTimerDown = null
}
}
case "Up": {
if (RollerShutters_Auto_Timer_Up.state == OFF){
logInfo("RSTimerUp","stop Timer Up")
RSTimerUp?.cancel
RSTimerUp = null
}
}
}
}
end
In a sitemap I can set a time (hours/minutes) and a on/off that will start/stop de timer. The timer itself will restart everyday.