How nymea runs the heating of my home

I have spent quite some time setting up the heating control system for my home. I present here the solution I have found for anyone attempting to do this. Feedback and suggestions are, of course, welcome, as are questions.

My home is a small house with nine rooms on three floors (including one corridor, bathroom, kitchen, bedroom and so on). Each of those rooms has one radiator with a thermostat (TVR) and one temperature sensor. One room has two radiators, each with a TVR.

Each room has to be heated only when it’s anticipated that it will be used. The rooms are used according to rather constant weekly schedules.

I defined one AC zone and one Generic Thermostat for each room. The AC zone is associated with the Generic Thermostat and the temperature sensor in its room. Each room has, of course, one thing representing the real thermostat in the room (as opposed to the generic one controlled by the AC zone).

There is one magic for each temperature sensor which has the sole purpose of setting the actual temperature of the generic thermostat to the temperature reported by the temperature sensor.

There is another magic for each generic thermostat. It sets the target temperature of the real thermostat to a high value (about 30°C) when the target temperature for that generic thermostat is higher than the actual temperature; otherwise, it sets the target temperature to a low value (about 14°C).

There are three special magics which control all generic thermostats at once. They are run on the 1st and 16th day of each month:

at 9:50 AM: set the target temperature of each real thermostat to 30°C, thus causing all real thermostats to fully open the valves on their respective radiators.
at 9:55 AM: set the target temperature of each real thermostat to 0°, causing all teal thermostats to fully close their respective valves
at 10:00 AM and on demand (signalled by the press of a button): set the actual temperature of each generic thermostat to the value reported by the temperature sensor in its respective room. This will eventually restore the correct target temperatures.

Hardware used (all ZigBee):

All TVRs are H1 by Ubisys.

Temperature sensors:
Lupus Electronics Temp Sensor mini (by nymea reported as Tuyatec RH3052).
This runs very reliably.

Sonoff SNZB-02 (by nymea reported as eWeLink TH01)
This reliably reports the temperature readings. Most of the time they fail to report the humidity reading. Some but not all instances report changes in temperature every few minutes, presumably inducing much noise and using much battery power. However, they’re cheap and seem to work well enough for that purpose.

The TVRs are mounted on the radiators. Whenever the radiator (or even the tubing supplying the hot water) are warm, their sensors will report temperatures that are much higher than the actual room temperature. That’s why I use a separate temperature sensor in each room.

The generic thermostat for each room and its magic are needed because the real thermostats (H1 by Ubisys) do not accept externally provided values for the actual temperature.

Ubisys is considering a change to the software of the H1 which will allow it to accept externally provided temperature readings. That would obviate the need for the generic thermostats with their magics. The magics which supply the reported temperature to the thermostat would remain in place, of course, unless that could be done by binding the temperature sensors to the thermostats using ZigBee bindings. We will see.

The three special magics (run on the 1st and 16th of each month) are needed to ensure that each valve in each radiator is moved once in a while. This is necessary because otherwise the valves might get stuck, requiring manual intervention.

It’s conceivable that some of the thermostat will not follow this regime correctly when the temperature sensors report any temperature changes during the time the valves are supposed to be fully open or closed. However, I don’t think that any of the thermostats will fail consistently each time the routine is run, so that in the end all valves will have been operated often enough. This operation would be more reliably covered by a script or even a plugin.

The third of the three specials is also needed to bring the generic thermostats to a defined state after a system restart, I believe. In any event, I needed it after building the whole system, so the effort was not wasted.