Very nice rules. Here are mine, much simpler as I only have a controllable heating source in my living room - so just one heatpump (Daikin), one temp sensor, and one setpoint. Thought it might be useful for those with simple setups like mine;
// living room setpoint
Number Heating_LivingSetpoint "Living Setpoint [%.1f °C]" <degreesc> (HeatingSetpoint)
// Daikin online controller
String Heating_DaikinMode "Daikin Mode" <heating> (Heating) { daikin="living:mode" }
Number Heating_DaikinTemp "Daikin Temp [%.0f °C]" <degreesc> (Heating) { daikin="living:temp" }
Switch Heating_DaikinPower "Daikin Power" <fire> (HeatingSource) { daikin="living:power" }
// Daikin temp sensors
Number Heating_DaikinTempIn "Living Room [%.1f °C]" <temperature> (SensorTemperature,TemperatureChart) { daikin="living:tempin" }
rule "Living room heating"
when
Item Heating_LivingSetpoint changed or
Item Heating_DaikinTempIn changed
then
// only activate heating if someone home and not in bed
if (Scene_Presence.state == ON && Scene_Bed.state == OFF) {
// get the current setpoint for the living room
var Number setpoint = Heating_LivingSetpoint.state as DecimalType
var Number hysteresis = 1
// get the current temperature in the living room
var Number tempIn = Heating_DaikinTempIn.state as DecimalType
// check if the current temp is below the setpoint (+ hysteresis)
if (tempIn < (setpoint - hysteresis)) {
// make sure the heatpump is set to a temp higher than the setpoint
var Number daikinTemp = Heating_DaikinTemp.state as DecimalType
if (daikinTemp <= setpoint)
Heating_DaikinTemp.sendCommand(setpoint + 1)
// make sure the heatpump is in 'heat' mode
if (Heating_DaikinMode.state != "Heat")
Heating_DaikinMode.sendCommand("Heat")
// turn on the heatpump
if (Heating_DaikinPower.state == OFF)
Heating_DaikinPower.sendCommand(ON);
} else if (tempIn >= setpoint) {
// setpoint has been reached so switch off the heatpump
if (Heating_DaikinPower.state == ON)
Heating_DaikinPower.sendCommand(OFF);
}
}
end