Is there a simple way to use createTimer, or equivalent, to trigger something at a specific time? I have an configuration that, if set, should trigger at 2am. I wanted to avoid creating an entire rule with a cron at that time, and instead use something like createTimer. The problem with doing something like createTimer(now.withTimeAtStartOfDay.plusHours(26)) is what happens if the automation is enabled between 0:00 and 1:59am. I guess ideally I should do math to see if I am before or after midnight, and based on this I could set the right counter, but I’m not sure if I am going about it the right way.
Thanks.
can you create a timer without a rule?
Why not just use a simple cron rule, something like
rule "dostuffattwo"
when
Time cron "0 0 2 ? * * *"
then
//do stuff
end
Because it seems wasteful. The rule would exist even if it mostly never gets executed. The context is that I have a bunch of thermostats and a HOLD function. I want the HOLD to cancel after a period of time which is dictated by a menu.
Selection item=Therm_tmr_minutes icon=time mappings=[0="Off",1="1day",2="2day",3="2am"]
For the first three, it’s simple:
if ((Therm_tmr_minutes.state==1) || (Therm_tmr_minutes.state==2)) // 1 and 2 are number of days to reset { myTimer_therm = createTimer(now.plusDays((Therm_tmr_minutes.state as DecimalType).intValue)) [| logInfo("Therm","Canceling existing therm timer.") Therm_commands.sendCommand("0") ] }
I want to handle the 2am reset in the same manner and avoid using a different model.
I agree that a cron makes the most sense. With the 2am cron rule, you could just set a condition to cancel the hold if Therm_tmr_minutes.state == 3. It’ll run every day, see that the condition is false most of the time, and do nothing. I don’t think that’s wasteful if it’s fulfilling its purpose and achieving your goals.
Well, you’ve either got a rule or a Timer hanging around for their appointed time. Must have one or the other. There’s no performance advantage either way.
The cron-triggered rule is the simplest, and takes care of after-midnight and rebooted issues by itself. Plus it’s so easy to check again at 3am etc. I wouldn’t resist it any further
Simple way:
item:
Switch timer2amActive "Timer @ 2 a.m. [%s]"
rule
var Timer t2amTimer = null
rule "2am timer"
when
Item timer2amActive received command
then
t2amTimer?.cancel
if(receivedCommand == ON)
t2amTimer = createTimer(now.withTimeAtStartOfDay.plusHours(2).plusDays(if(now.getHourOfDay > 1) 1 else 0),[ |
// do stuff
] )
end
Of course you could use
now.withTimeAtStartOfDay.plusHours(if(now.getHourOfDay > 1) 26 else 2)
instead.
Thanks everyone for your help!