Like most houses in the UK, I have “wet radiant heating”. If you have radiators on your walls or an underfloor heating system that uses pipes, chances are you do too. There are several commercial systems for upgrading these to smart heating including the Google Nest (you’ll also need the Heat Link), Hive, and Tado. Out of the three, only Tado can control each radiator individually, though all are rather expensive at ~£200 ($256) each.

As a second wave of winter approaches the country, I set out to build my own automated heating system for a fraction of the cost. This is obviously customised to my particular setup, though you can easily add more or less to suit yours.

Caution. This project involves mains electricity which can kill you. If you have any doubts as to what you’re doing, stop and contact a qualified electrician. I can guarantee that they will be happy to help you avoid getting injured.

Caution. Many heating systems involve gas boilers. Faulty gas systems can, and will, kill you and others. If you are not formally qualified do deal with these systems (i.e. CORGI registered), do not attempt any alterations to the gas side of your system. Stop and contact a qualified plumber or gas technician who will be happy to help.

Boiler Control

With the formalities taken care of, let’s get started. At the heart of my heating system is a boiler, this heats water which gets pumped around the radiators to give it’s heat out to different parts of the house. Any reliable heating system will need to be able to turn on the boiler when somewhere starts getting cold (this is known as a “Call for Heat”).

In the UK, many houses use heating designs origanaly created in the 80s and mine is no different. From various repairs over the years, I know mine is based on Honeywell’s Y system, and from this I was able to find full schematics and wiring diagrams online. This is a rather enginious system, reminiscent of the relay logic common at the time. Yours may be different, so please do some research and don’t assume you can wire things into the same places.

The existing system uses an ST699 timer for both heating and hot water, which will need to be left in place to keep the hot water control. Luckily, the Y system also uses (in my case, cheap copy) a T6360 room thermostat. This is a great place to add our control, as it means we can override the automations to turn the heating on (turn up the room thermostat) or off (turn off the timer) in case there are any problems.

Because all the existing components used a switch mains signal, we’ll need to do the same to make things easier. For this I turned to the Sonoff Basic R2, which can switch up to 10A at 230v. This will be plenty for the few components that run off the switched supply directly (in my case, the selector valve and pump) with a generous safety margin, as the control systems are on a 3A fuse. Note that this Sonoff does require a neutral connection for it’s control system, but there’s no need to run the neutral output back through the Sonoff.

For controlling this Sonoff, I’m a big fan of ESPHome. This is highly customisable and can be used with a huge variety of devices. Another popular firmware for these is Tasmota. I won’t go over the exact details for setting up ESPHome as this is well covered elsewhere, but here’s the config used on mine:

--- esphome: name: boiler_switch platform: ESP8266 board: esp01_1m wifi: ssid: !secret wifi_ssid password: !secret wifi_psk # Enable logging logger: # Enable Home Assistant API api: ota: binary_sensor: - platform: gpio pin: number: GPIO0 mode: INPUT_PULLUP inverted: True name: "Boiler Switch Button" on_press: - switch.toggle: relay - platform: status name: "Boiler Switch Status" sensor: - platform: wifi_signal name: "Boiler Switch Signal" switch: - platform: gpio name: "Boiler Switch Relay" pin: GPIO12 id: relay status_led: pin: number: GPIO13 inverted: yes 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 -- - esphome : name : boiler_switch platform : ESP8266 board : esp01_1m wifi : ssid : ! secret wifi_ssid password : ! secret wifi_psk # Enable logging logger : # Enable Home Assistant API api : ota : binary_sensor : - platform : gpio pin : number : GPIO0 mode : INPUT_PULLUP inverted : True name : "Boiler Switch Button" on_press : - switch . toggle : relay - platform : status name : "Boiler Switch Status" sensor : - platform : wifi_signal name : "Boiler Switch Signal" switch : - platform : gpio name : "Boiler Switch Relay" pin : GPIO12 id : relay status_led : pin : number : GPIO13 inverted : yes

Radiators

Though the boiler is the heart of our heating system, it would be nothing without limbs to actually do work. In this case, those limbs are the radiators. Radiators come in many shapes and sizes, but we can use a cleverly designed feature of most modern radiators to easily control them. Well, kind of. The Thermostatic Radiator Valve (TRV) it attached between the flow pipe and the radiator, and controls the flow of hot water into the radiator. This is not to be confused with the lockshield valve on the other end of the radiator, which is used to restrict the flow for radiators closer the the boiler (known as balancing) to even out the available heat throughout the building.

The particularly cleaver part or a TRV is that they’re designed in two parts; the valve body, attached to the pipes to actually control the water, and the valve head, containing a wax element and dial to set the temperature. More importantly, these two parts can easily be separated by unscrewing then without the need to drain the radiator first. This means we can easily replace the valve head to add our control without risking anything getting wet.

Here’s where things get even better, because nobody likes re-inventing the wheel, you can buy off-the-shelf electronic valves to replace the TRV heads. These are known as thermal actuators, and are really designed for larger systems with seperate timers and themostats, so they’re available in 24v or 230v versions as well as relay-style normally open and normally closed. I picked one on amazon for no particular reason, and it worked great.

To make the control as easy as possible, I chose a valve that ran on 230v and closed when power was removed. This means we can use another Sonoff to control them. In this case, the Sonoff TH10, which includes a handy temperature sensor that can be used as a room thermostat.

A quick note on these, while the sensor socket looks like a normal headphone jack, it’s actually a 2.5mm TRRS socket. I learnt this the hard way after ordering half a dozen headphone extension leads and finding they don’t fit.

As before, I’m using ESPHome for the firmware on these. The configuration is very similar to the boiler switch, but with the added temperature sensor. I may rethink this in the future to make the button work as a temperature boost for an hour or so, as Home Assistant will turn the valve off again if it’s changed manually. As before, here’s my current config for one of them:

--- esphome: name: kitcen_heating platform: ESP8266 board: esp01_1m board_flash_mode: dout wifi: ssid: !secret wifi_ssid password: !secret wifi_psk # Enable logging logger: # Enable Home Assistant API api: ota: binary_sensor: - platform: gpio pin: number: GPIO0 mode: INPUT_PULLUP inverted: True name: "Kitchen Heating Button" on_press: - switch.toggle: relay - platform: status name: "Kitchen Heating Status" switch: - platform: gpio name: "Kitchen Heating Relay" pin: GPIO12 id: relay status_led: pin: number: GPIO13 inverted: yes sensor: - platform: dht model: SI7021 pin: GPIO14 humidity: name: Kitchen Humidity temperature: name: Kitchen Temperature update_interval: 60s - platform: wifi_signal name: "Kitchen Heating Signal" 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 -- - esphome : name : kitcen_heating platform : ESP8266 board : esp01_1m board_flash_mode : dout wifi : ssid : ! secret wifi_ssid password : ! secret wifi_psk # Enable logging logger : # Enable Home Assistant API api : ota : binary_sensor : - platform : gpio pin : number : GPIO0 mode : INPUT_PULLUP inverted : True name : "Kitchen Heating Button" on_press : - switch . toggle : relay - platform : status name : "Kitchen Heating Status" switch : - platform : gpio name : "Kitchen Heating Relay" pin : GPIO12 id : relay status_led : pin : number : GPIO13 inverted : yes sensor : - platform : dht model : SI7021 pin : GPIO14 humidity : name : Kitchen Humidity temperature : name : Kitchen Temperature update_interval : 60s - platform : wifi_signal name : "Kitchen Heating Signal"

Automations

The automations really tie this system together, and the various elements don’t really function without them. Ultimately, this is going to need some heavy customisation to suit your needs, but there are some basics you’ll definitely want.

First off is the climate component, this will let you set a target temperature either manually or through an automation, and Home Assistant will turn on and off the radiator as needed to get to this temperature. Each entry needs a name, a heater entity that gets turned on when the room needs heating, and a target sensor entity that reports the current temperature of the room.

--- - platform: generic_thermostat name: "Kitchen Heating" heater: switch.kitchen_heating_relay target_sensor: sensor.kitchen_temperature away_temp: 18 1 2 3 4 5 6 -- - - platform : generic_thermostat name : "Kitchen Heating" heater : switch . kitchen_heating_relay target_sensor : sensor . kitchen_temperature away_temp : 18

We can also add an automation to turn the boiler on and off whenever any radiator is on, because a radiator with cold water isn’t going to do much for heating the room. These are set to trigger when any radiator goes on or off, but the off automation has an extra condition to make sure all the rooms are up to temperature before allowing the boiler to turn off

--- - alias: Boiler On trigger: - platform: template value_template: "{{is_state_attr('climate.kitchen_heating', 'hvac_action', 'heating')}}" - platform: template value_template: "{{is_state_attr('climate.bedroom_heating', 'hvac_action', 'heating')}}" action: service: switch.turn_on entity_id: switch.boiler_switch_relay - alias: Boiler Off trigger: - platform: template value_template: "{{is_state_attr('climate.kitchen_heating', 'hvac_action', 'idle')}}" - platform: template value_template: "{{is_state_attr('climate.bedroom_heating', 'hvac_action', 'idle')}}" condition: - condition: template value_template: "{{is_state_attr('climate.kitchen_heating', 'hvac_action', 'idle')}}" - condition: template value_template: "{{is_state_attr('climate.bedroom_heating', 'hvac_action', 'idle')}}" action: service: switch.turn_off entity_id: switch.boiler_switch_relay 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 -- - - alias : Boiler On trigger : - platform : template value_template : "{{is_state_attr('climate.kitchen_heating', 'hvac_action', 'heating')}}" - platform : template value_template : "{{is_state_attr('climate.bedroom_heating', 'hvac_action', 'heating')}}" action : service : switch . turn_on entity_id : switch . boiler_switch_relay - alias : Boiler Off trigger : - platform : template value_template : "{{is_state_attr('climate.kitchen_heating', 'hvac_action', 'idle')}}" - platform : template value_template : "{{is_state_attr('climate.bedroom_heating', 'hvac_action', 'idle')}}" condition : - condition : template value_template : "{{is_state_attr('climate.kitchen_heating', 'hvac_action', 'idle')}}" - condition : template value_template : "{{is_state_attr('climate.bedroom_heating', 'hvac_action', 'idle')}}" action : service : switch . turn_off entity_id : switch . boiler_switch_relay

Bonus Round: Underfloor Heating

I’ve also got a small underfloor heating loop running off the boiler. This was always a bit annoying to use as it required the timer and thermostat at the opposite end of the house to be on, as well as the ones for the underfloor heating. Because of this, now is a great time to upgrade it. I used the same Sonoff TH10 as the radiators, but this time wired it to the separate pump that runs the underfloor loop.

Some underfloor heating systems already have separate control for different zones using thermal actuators on the manifold, if so you’ll also need to wire these in to a Sonoff and use similar automations to the boiler switch to ensure the pump is running whenever one of the zones needs more heat. However mine doesn’t, so this wasn’t needed.

Final Thoughts

Overall this system gives a lot more control than the Nest or Hive systems. It’s also significantly cheaper than all three main competitors. My system which included the boiler, 4 radiators, and the underfloor heating came to just over £130. More importantly, it’s fully integrated with Home Assistant, which means you get wonderful automations like “when I leave work around 5pm, and I’m heading towards home, start warming the house up”.

Like this: Like Loading...