Skip to main content
  1. Posts/

openHAB and Fireplace Rules Part 5

·499 words·3 mins
Table of Contents
openHAB Fireplace - This article is part of a series.
Part 5: This Article

Now that everything is humming along we can make some fancy rules. This includes creating a flexible timer and auto mode based on room temperature. I went through a lot of iterations but ended up with some nice rules that work well. I will post the current version here but any updates will be maintained on Github.

Fireplace Radio Waves

Timer
#

Items

Number  tempFire_TimerValue     "Fireplace Timer [%d min(s)]"    (gHeating)  
Switch  tempFire_TimerSwitch    "Start Timer"     (gHeating)  
DateTime tempFire_TimerStart    "Timer stated at [%1$tr]"        (gHeating)  
Number tempFire_TimerElapsed    "Time elapsed [%d min(s)]"       (gHeating)  
Number tempFire_TimerLeft       "Time remaining [%d min(s)]"     (gHeating)

Sitemap

 Setpoint item=tempFire_TimerValue minValue=5 maxValue=60 step=5  
 Switch  item=tempFire_TimerSwitch  
 Text item=tempFire_TimerStart   visibility=[tempFire_TimerSwitch==ON]  
 Text item=tempFire_TimerElapsed visibility=[tempFire_TimerSwitch==ON]  
 Text item=tempFire_TimerLeft    visibility=[tempFire_TimerSwitch==ON]

Rules

rule "Fireplace Timer"  
when  
        Item tempFire_TimerSwitch changed from OFF to ON  
then  
        val fireMin = (tempFire_TimerValue.state as DecimalType).intValue  
        val counter = 0  
        sendCommand(tempFire_Web, ON)  
        postUpdate(tempFire_TimerStart, new DateTimeType())  
        while(counter < fireMin){  
                Thread::sleep(60000)  
                counter = counter + 1  
                fireMin = (tempFire_TimerValue.state as DecimalType).intValue  
        }  
        sendCommand(tempFire_TimerSwitch, OFF)  
        sendCommand(tempFire_Web, OFF)  
        //FireplaceTimer = createTimer(now.plusMinutes(fireMin))[  
        //      sendCommand(tempFire_TimerSwitch, OFF)  
        //      sendCommand(tempFire_Web, OFF)  
        //]

end
rule “Stop timer”
when
Item tempFire_TimerSwitch changed from ON to OFF
then
sendCommand(tempFire_Web, OFF)
end

rule “Time left”
when
Item tempFire_TimerSwitch changed from OFF to ON
then
var start = now.millis
while(tempFire_TimerSwitch.state==ON){
val timerMin = (tempFire_TimerValue.state as DecimalType).intValue
val dt1 = ((now.millis-start)/1000/60)
postUpdate(tempFire_TimerElapsed, dt1)
val dt2 = timerMin - dt1
postUpdate(tempFire_TimerLeft, dt2)
Thread::sleep(60000)

}
end

I switched from using the timer function to writing my own so that I can update the time left if someone wants to add time to the timer. Beforehand, if you added time it wouldn’t do anything. Now it checks every iteration. Much better.

Auto Mode
#

This mode allows you to just set a temperature and forget about it. It’s very basic but it will try to maintain the room temperature using the senor node from the living room node.

Items

Number  tempFire_Setpoint "Set Temperature [%.1f °F]"      (gHeating)  
Switch  tempFire_AutoSwitch     "Auto Mode"       (gHeating)

Sitemap

Switch item=tempFire_AutoSwitch  
Setpoint item=tempFire_Setpoint minValue=60 maxValue=75 step=1

Here you can limit how hot someone could set it.

Rules

rule "Fireplace Auto Control"  
when  
        Time cron "0 0/5 * 1/1 * ? *" OR  
        Item temp_livingroom received update  
then  
        if(tempFire_AutoSwitch.state == ON){  
                if(tempFire_Web.state==ON){  
                        if(temp_livingroom.state >= tempFire_Setpoint.state){  
                                tempFire_Web.sendCommand(OFF)  
                        }  
                }  
                else if(temp_livingroom.state < tempFire_Setpoint.state){  
                                tempFire_Web.sendCommand(ON)  
                }  
        }  
        else {  
        }

end

rule “Start auto mode”
when
Item tempFire_AutoSwitch changed from OFF to ON
then
tempFire_Web.sendCommand(ON)
end

rule “Stop auto mode”
when
Item tempFire_AutoSwitch changed from ON to OFF
then
if(tempFire_TimerSwitch.state == OFF){
tempFire_Web.sendCommand(OFF)
}
end

I might rewrite this so that it starts a while loop when you set the Auto Control from Off to On instead of a CRON that is always checking. I also should add a max run time. Just in case you forget it and leave the house or go to bed. Ooo, I could use a NFC tag on my bedside to start bed mode.

Hopefully that will get you started so you can adapt it to your own set-up. Please comment below if it helped you out.

openHAB Fireplace - This article is part of a series.
Part 5: This Article

Related