DIY OpenTherm Thermostat?

Slave shield is for emulation open-therm device. Can be usefull if you already have some third-party open-therm compatible room unit (Vitotrol 100, Nest, Salus RT520) and want to override some of its commands. I.e. temporary disable heating or turn it to a maximum level.
Another option is a case when you have a heat pump and gas boiler connected together via open-therm. Heat pump goes at night when electricity is cheaper and/or when outside temp >= -10…-15 °C, and when it gets colder - gas boiler comes to help. The you can use slave shield to intercept commands between theese two guys for just of curiocity or to override some commands.
However slave shield is only for reading, thus you’ll need either slave+master/thermostat shield or opentherm gateway bundle to accomplish any of above.
If you want simply to control your boiler - master or thermostat shields are good to go.

1 Like

Oh my god, that’s insane!
I’ve got an electric car recently (MG ZS) and am looking into cheap battery and solar for when I find a new place (current house doesn’t suit EV it Solar really).
Alongside that I looked at air source heat pumps for almost “free” heating in the day time over autumn but keeping gas for the winter/cold snaps.

I had never considered how the heating could interact with other heating elements (gas boiler) and balancing act between the two.

Let alone also balancing based on surplus of solar/battery for the heat pump!

I have added the opentherm gateway to my setup with your sketch and it works except for one thing. I see the boiler-target-temperature vary depending on the requested temperature but after the requested temperature exceeds the actual temperature and the boiler-target-temperature is way below the boiler-temperature the heating (flame) does not turn off. The only way to turn off the heating is by using the power button (in the climate card).

Is there something I am doing wrong?

Thats strange. It should be driven by the boiler. Can you specify you boiler model and vendor/manufacturer?
Do you have any sensor(s) attached to the biler? (room temp, ext. temp)?
Does boiler show any error code on its display while working with custom OT Thermostat?

I have nothing but the gateway connected to the boiler. The boiler is an Intergas Kombi Kompact HRE 36/30, the linked one is an updated version, my version is without RF I cannot find mine on their website anymore. The boiler does support openTherm although I cannot find anything about the version supported. I had the Honeywell Chronotherm Modulation connected to it which uses the openTherm protocol for communication.

The boiler display shows “code 5” which stands for normal boiler operation, this does not change when the boiler-target-temperature is reached.

Anything I can try / test to solve this?

Does it show ’ Code 5 with Honeywell Chronotherm Modulation connected?
You can try to modify sketch to set boiler target temp to 40 °C, and then increase it every 3-5 min by 1 °C until 50 °C reached, and then reset to 40 °C. And see if it still works, boiler should follow setpoint temperature. Remove all code related to MQTT and PID calculation, leave only set_boiler_temp, get_boiler_status and Serial.Print() to view what is going on.
P.S. are you sure code 5 is ok? bacause all i can find about code 5 is related to valve status and burner/flame limiting.

Code 5 is normal operation also displayed when the Honeywell Chronotherm Modulation was connected. The boiler has 2 displays, one for the temperature and one for the operation-code. In case of an error, “err” is shown in the temperature display and the errorcode in the operation display. I have no error but operational code 5.

I looked closer into the manual and changed a setting that can override the OT min boiler temperature from 40 to 10 degrees. This results in the pump to start pushing the boiler water to the rooms but not starting the flame since the boiler temperature is above the minimum (which is set by the OT to 15 degrees). This looks like normal operation to me. The issue is the pump runs and thereby the boiler temperature gets below the minimum resulting in the flame to turn on regardsless the room temperature demand.

Below is what the display looks like when the min boiler temperature is set to 10 (OT overrides it to be 15) and the code 1 means the pump is running (manual says code 1 means: desired temp reached flame is blocked).


I will try the steps you mentioned to change the sketch later.

If you changed minimum temp override - now it should work fine without sketch chnanges. And pump running all the time is normal condition (at least for me). When water gets colder - flame starts, water gets above setpoint - flame stops, but pump is running always. In that way my boiler works. Here’s my graphs

Middle plot is for boiler, light red fill is ‘flame on’
Bottom plot is room temp. As you can see when room temp gets over setpoint - boiler target temp falls, when room temp below setpoint - boiler target rises. And pump is always runing. This operation mode is less gas/electricity saving than turn off pump completely when room does not need heating, but gives more comfort (temp is over\undershooting less and rooms heats faster if room target temp changes). In my case significant (more than 0.3 °C) overshoots happens when i’m near the sensor (xiaomi bluetooth one) and it gets heated from human body.
Maybe in future i’ll implement ‘full stop - eco’ mode, when room temp is above - stop pump to save some energy.
For test purposes you can change this line of code (line 88)

unsigned long response = ot.setBoilerStatus(heatingEnabled, enableHotWater, enableCooling);


heatingEnabled = room < roomTarget;
unsigned long response = ot.setBoilerStatus(heatingEnabled, enableHotWater, enableCooling);

That should stop both flame and pump.

1 Like

Thanks for the explanation, that clears the behavior I experience (the boiler by default overrides the min temp set by OT and was setting it to 40 degrees). I would really like to have the eco option you mention since my heating is running only limited time of the day and therefore the pump electricity usage increases a lot when it is on all the time (I have floor heating in a very well isolated house, it is not that cold outside and I don’t need it to be too hot inside…).
I lack the knowledge to adjust your sketch but if you can add the mentioned “room < roomTarget” dependency (it needs some more code) and if the flame-status also gets send to mqtt you would make the gateway a lot better for my situation :blush:

hello how are you ?

i did the change but the boiler don react even when I press on.

i put also like this
and no luck.

can you help

also how can I get the status of the flame and the errors of the boiler?

thanks in advance.

You should compare temperatures, not topics. Ill be back at my workstation in a few days and try to help you.

i used the topic to get the values but I believe it doesn’t work like that .
i appreciate if you could help

That thing wouldn’t work:


you need to compare temperatures, not topics. Here is the change you need:

heatingEnabled = t < sp;

you should place it before Line ~90


@Ron365 FYI, i think that is the option you needed.

many many thanks i would like to have a sensosr that tells me the ot.isflameon, hou can i do that. if not pushing too much