Just ended with a new rule to control my temperature (HVAC).
I’ve got 4 big components:
- TemperatureSensor (SCH_PRAK4_TEMP), sends temperature every 30 seconds.
- Heating (PraktijkVerwarming), just ON/OFF
- Cooling (PraktijkKoeling). just ON/OFF
- OutsideTemperature: If outside is hotter then 20 degrees, then the Cooling kicks in. Is it colder, then the heating should work. This is triggered by AircoWeer ON/OFF.
At first sight, my concept is working. Except when my degrees reach the wanted heated temperature.
Then it goes above, below, above… And the heater goes on, off, on, off… Don’t think this is very ‘healthy’ for the heater?
What would be a good way to deal with this?
Maybe build in a kind of timer that it’s only been triggered every 5 minutes or so?
My current rule:
rule "HVAC Praktijk"
when
Item SCH_PRAK4_TEMP received update
then
if (Heating_Mode.state.toString == "Uit") {
logInfo("HVAC_Praktijk", "HVAC201: Modus is UIT")
}
else if (Heating_Mode.state.toString == "Werk") {
if ((((Praktijk_TargetTemp.state as DecimalType))>(SCH_PRAK4_TEMP.state as DecimalType)) && (AircoWeer.state == OFF)) {
if(HVAC_PraktijkVerwarming.state != ON) HVAC_PraktijkVerwarming.sendCommand(ON)
logInfo("HVAC_Praktijk", "HVAC211: De verwarming is opgezet naar " + Praktijk_TargetTemp.state + ". Actueel is het {}", (((SCH_PRAK4_TEMP.state as Number)*100).intValue)/100.0)
}
else if ((((SCH_PRAK4_TEMP.state as DecimalType))>(Praktijk_TargetTemp.state as DecimalType)) && (AircoWeer.state == ON)) {
if(HVAC_PraktijkKoeling.state != ON) HVAC_PraktijkKoeling.sendCommand(ON)
logInfo("HVAC_Praktijk", "HVAC212: De Airco is opgezet naar " + Praktijk_TargetTemp.state + ". Actueel is het {}", (((SCH_PRAK4_TEMP.state as Number)*100).intValue)/100.0)
}
else {
if(HVAC_PraktijkVerwarming.state != OFF) sendCommand( HVAC_PraktijkVerwarming, OFF )
if(HVAC_PraktijkKoeling.state != OFF) sendCommand( HVAC_PraktijkKoeling, OFF)
logInfo("HVAC_Praktijk", "HVAC213: Verwarming & Airco inactief (Temperatuur is {}", (((SCH_PRAK4_TEMP.state as Number)*100).intValue)/100.0 + " en target is " + Praktijk_TargetTemp.state as DecimalType + ")")
}
}
else if (Heating_Mode.state.toString == "Afwezig") {
if ((((Praktijk_TargetTempAfwezigMin.state as DecimalType))>(SCH_PRAK4_TEMP.state as DecimalType)) && (AircoWeer.state == OFF)) {
if(HVAC_PraktijkVerwarming.state != ON) HVAC_PraktijkVerwarming.sendCommand(ON)
logInfo("HVAC_Praktijk", "HVAC221: De verwarming is opgezet naar " + Praktijk_TargetTempAfwezigMin.state + ". Actueel is het {}", (((SCH_PRAK4_TEMP.state as Number)*100).intValue)/100.0)
}
else if ((((SCH_PRAK4_TEMP.state as DecimalType))>(Praktijk_TargetTempAfwezigMax.state as DecimalType)) && (AircoWeer.state == ON)) {
if(HVAC_PraktijkKoeling.state != ON) HVAC_PraktijkKoeling.sendCommand(ON)
logInfo("HVAC_Praktijk", "HVAC222: De Airco is opgezet naar " + Praktijk_TargetTempAfwezigMax.state + ". Actueel is het {}", (((SCH_PRAK4_TEMP.state as Number)*100).intValue)/100.0)
}
else {
if(HVAC_PraktijkVerwarming.state != OFF) sendCommand( HVAC_PraktijkVerwarming, OFF )
if(HVAC_PraktijkKoeling.state != OFF) sendCommand( HVAC_PraktijkKoeling, OFF)
logInfo("HVAC_Praktijk", "HVAC223: Verwarming & Airco inactief (Temperatuur is {}", (((SCH_PRAK4_TEMP.state as Number)*100).intValue)/100.0 + " en target ligt tussen " + Praktijk_TargetTempAfwezigMin.state as DecimalType + " & " + Praktijk_TargetTempAfwezigMax.state as DecimalType + ")")
}
} ```