For my upcoming project, I am interested to control my heating and hot water system with an arduino.
I have a fairly old "combi boiler"* a Worcester-Bosch RD 537i. It has a fairly complex control interface, with a simple computer and user interface on the boiler, and a remote "Bosch TR2" thermostatic room controller.
Most room thermostats simply read the air temperature and send an open/closed signal to the heating system. However in this case, the boiler is vendor-locked to the TR2. No 3rd party controllers are supported, and sparse information from people who have connected the boiler's undocumented external controller interface shows that the boiler does not actually behave correctly (https://www.diynot.com/diy/threads/connecting-a-thermostat-to-a-wb-rd537i-pump-running-query.197085/)
The TR2 uses three wires to send three control inputs:
- measured room temperature
- demanded temperature
- one of four user modes
Someone online writes that they reverse-engineered the protocol the TR2 uses to communicate to the boiler (Worcester Bosch TR2 room stat - reverse engineered | DIY Forums). If I understand the notes correctly, the resistance between one pair of wires sends the measured room temperature, and the resistance between a different pair of wires sends a sum of the user mode (a large resistance value) plus the demanded temperature (a small resistance value) which is interpreted in increments of 0.5˚C ranging from 5˚C to 30˚C.
I would like to build a controller capable of emulating the TR2 so that I can replace it with something else, maybe even building an OpenTherm interface if appropriate.
So I'd like to write a sketch that will set very accurate resistance values on some sort of digitally actuated potentiometer. No search result I can find however, is using the resistance to communicate information so I want to be sure I have the correct terminology for the sort of components I need to buy.
- Wire "A" - presumably, 24V or 25V input
- Wire "B" - return from A providing a resistance indicating the measured room temperature
- Wire "C" - return from A providing a resistance indicating the demanded mode and temperature
- I have a spare TR2
- I have on order, a spare boiler control panel of the exact same model, including the 25V transformer, working PCB with temperature controller knobs, and programmer user interface
- measure resistances on the spare TR2, documenting exactly its values for various control states
- connect the TR2 to the spare programmer, confirming how it works
- Author an arduino powered controller, confirm against the spare programmer that it works in the same way
- Additional modification (detailed in "off-topic" section below)
* "combi boiler" is UK terminology for a combination domestic hot water and central hot-water heating appliance.
Off topic section for later (I am happy to receive advice or input on the below problem as well)
The boiler is natural gas fired, and heats a "core" of hot water that it then passes through heat exchangers to provide two different temperature outputs, one for on-demand hot water, and the other a time-modulated heating circuit. The local controls include a manual heating water temperature, and a manual domestic hot water temperature, both I think 2.2kOhm rheostats mounted directly on the boiler PCB. A user programming module is an independent computer accepting stored commands like mode-dependent on/off scheduling, and two different "default" temperatures used in nighttime and pipe-freeze-prevention modes.
Radiator water control
In the existing design, user manually guesses what is the best radiator water temperature, and the system modulates high/low gas firings to maintain that output temperature. If the weather warms, the system will still work fine to maintain room temperature, but it will not be running in its optimal efficiency mode. For optimum efficiency, the radiator water has to be no warmer than necessary to maintain the set temperature
The only thing this boiler does not provide automatically is temperature modulation of the heating water.