Soon after moving into my home in 2018, the old boiler packed in, and I needed to order a replacement. During this time of strife, I was convinced that one of these new-fangled cloud-connected thermostats would be a good idea to replace the old but still functional programmable thermostat that came with the old boiler. The idea of being able to adjust my heating from anywhere seemed like a good idea at the time, but then COVID happened and I began homeworking so over the years I've perhaps used that capability all of 3 times.
Then during Christmas of 2025, the thermostat stopped working. It would not talk to the receiver at the boiler, and I spent a good number of hours trying to resolve the problem as a matter of urgency while snow clouds were on the horizon. The generic advice was to perform a factory reset, replace the batteries, reprovision the thermostat in the app and none of this worked, in fact the last one made things worse because now the thermostat couldn't be even seen by the app anymore.
I contacted Hive support for advice and after waiting for a long while to get through to online chat, I was asked for account information and told without any recourse that it was out of warranty, and I could get support by paying them £30 for a year of premium support. I was done; I'm trying to keep my family warm during winter and I felt they were holding me to ransom over an issue that I was pretty sure had nothing to do with my hardware and everything to do with their cloud service. I do still have the old thermostat, and I was prepared to reinstall it if it got things working quickly. I told the agent I'd rather throw this rubbish in the bin and left the call.
Home Assistant and the Generic Thermostat
I started looking at how I might replace the Hive unit with the old wireless programmable thermostat. The receiver at the boiler is mounted on a plate screwed to the wall so I took it off to understand how it was wired up. There were 6 terminals but only 4 were connected, live and neutral from the power feed. There was a 4-core flex cable to the boiler, two were joined to the live and neutral terminals and two others that terminated on two of the terminals which I figured was the call for heat. I did a bit of online research, and it was as simple as I expected, a switch in the receiver shorts the two non-power wires and the boiler clicks on. I tested this and indeed it did work. This gave me the seed of an idea.
(NOTE: here is another standard call opentherm that provides more granular control over low-voltage lines, but that isn't how mine is configured, don't apply this to your own set up and risk damaging your boiler, call in an expert if needed)
I have had Home Assistant installed for many years that, while I'm aware has a lot of potential for fancy automated controls, for me it simply served to control assorted smart devices without going through multiple apps. It had zero automations configured and I used its automatically generated dashboard. It was low effort, low maintenance and that was fine. I was aware that it had a module that could act as a thermostat called cryptically "generic_thermostat". I decided to see what I could do with this.
All the thermostat receiver is is a relay, and because it shorts two signal lines and not connecting one of them directly to live, I needed a "dry contact" relay that would connect input terminal to output terminal. Most of my smart switches are the wet contact type, where they short their output to live, but I identified one dry contact module in my collection, a Shelly One. This was being used for something else that didn't need dry contacts so I swapped it out and wired it in parallel with the Hive at the boiler so that it could override the Hive system without completely removing it.
Configuring the generic_thermostat was very simple, it just needs to be told where to get temperature readings, I selected a cheap Xiaomi LYWSD03MMC BLE thermometer in a colder part of the house, and which relay triggers the boiler. It has a range of pre-defined presets "away", "comfort", "eco", "home" and "sleep". I assigned each a temperature in Celsius and that's all it needs. It now reads the temperature and decides if more heat was needed and if so, it shorts the relay which brings on the boiler until the target temperature is reached.
I've always used programmable thermostats and I didn't want to go back to manually adjusting the heat so I wanted to set up a schedule that sets an appropriate preset throughout the day/week. For this I used Home Assistant's schedule helper creating one called "central_heating".
I set appointments spanning the whole week and during each appointment I have added a python dictionary to the additional data field naming the desired profile during that window of time {"profile": "eco"} for example. An automation script reads this data and applies it to the thermostat. It also has a condition to do this only when someone is home although I may remove that after more testing.
alias: Call for heat to schedule
description: Call for heat on schedule.
triggers:
- trigger: state
entity_id:
- schedule.heating_schedule
attribute: preset
conditions:
- condition: or
conditions:
- condition: device
device_id: a5573d154303aa74bcc1dd1490efdb53
domain: device_tracker
entity_id: b68ccbfb6bb4ee9b6cd0daac6289baa8
type: is_home
- condition: device
device_id: 1a55117d2cb7a02ecf1f5c61f8fe26c1
domain: device_tracker
entity_id: c01f1cda0de049072d25bffe10de8147
type: is_home
actions:
- action: climate.set_preset_mode
metadata: {}
target:
entity_id: climate.central_heating
data:
preset_mode: "{{ state_attr('schedule.heating_schedule', 'preset') }}"
mode: single
This does work, but I'm not convinced there isn't a simpler way to achieve it, for now though if it ain't broke, don't fix it applies. I will investigate this more in the summer when central heating is less critical.
Since setting all this up, I've run it with the Hive system disabled and it has worked much more conveniently than that ever did and since I already have remote access to my Home Assistant my heating is now covered for this.
This isn't half the story though, if anything it was the spark that drove me to de-cloud as much of my smart home system as I can, but I'll leave the rest for another day.