While I’ve been adding simple on/off controls and rules controlling timers for my heating, I noticed something that was missing was the idea of a 1+ hour boost button, so I decided to create one.
The standard pattern for building this type of thing is to create a “dummy” Switch – one not bound to any channel, and make use of that + timers in the rules to handle the off transition. In my sitemap however, I was aiming to have a push button type setup, rather then a toggle.
One pattern I found for this made use of an additional dummy Switch to store the state, and use the “visibility” options in the sitemap to show the “on” or “running” buttons depending on that state. While nice, I prefer not to have a second dummy variable, so I don’t 🙂
Define the item
First I define the “dummy” switch:
Group gVirtual
Switch HeaterTimer "1 Hour Boost" <temperature> (gHeating, gVirtual, gSwitches)
The rules
Then I define my rules for this switch:
var Timer boostTimer = null
rule "One Hour Heat On"
when
Item HeaterTimer received command
then
Heating.sendCommand(ON)
postUpdate(HeaterTimer, ON)
if(boostTimer === null || boostTimer.hasTerminated){
boostTimer = createTimer(now.plusHours(1), [|
Heating.sendCommand(OFF)
postUpdate(HeaterTimer, OFF)
boostTimer = null
])
}
else{
boostTimer.reschedule(now.plusHours(1)) // if pressed a second time keep it on for another hour from now
}
end
So what I’m doing here is triggering on the HeaterTimer receiving a command, then I turn the heating on, and update the state of HeaterTimer to ‘On’.
If the timer is equal to null, or has ended, I create a timer set at 1 hour from now, and when the timer triggers I switch the heating off, update the state, and set the timer to null.
If we have an command, and the timer is already running e.g. I pushed the button again, then I reschedule to 1 hour from now.
Now for the sitemap
Frame label="Heating" {
Switch item=HeaterTimer mappings=[ON="Boost"] icon="fire-off" visibility=[HeaterTimer == OFF, HeaterTimer == "NULL"]
Switch item=HeaterTimer mappings=[ON="Running"] icon="fire-on" visibility=[HeaterTimer == ON]
}
This is where it gets a little interesting.
The first switch is showing an ON/Boost button, with the icon in the off state. This is only visible if the HeatingTimer is OFF, or equal to “NULL”.
Why the second/NULL check?
When the “dummy” switch is created, it is created with a null state – my persistence config will restore the state if we ever reload, but for the very first time, we need to handle the lack of ON/OFF state. You could update the sitemap after the first time you use it to remove the NULL comparison as it will only be used once. The other option is to only add the visibility options after you run for the first time.
The second switch should be obvious now – we have a “Running” button, that if you push it, will add 1 hour from now (remember the rules) to the timer.







