DIY OpenTherm Thermostat?

Yep, you should flash my sketch and then setup an automation to publish room temperature to the highlighted topic. I’ve done this via node-red on every 30 seconds basis.


You can grab the code either from an article or from the github repo (second is preferred, there are some comments with explanations there).
Getter topic is a return from ESP itself. It represents the same value you’ve published to a setter or an internal ESPs readings, if setter was not used.

1 Like

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.


1 Like

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).

IMG_20210120_150014

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);

to

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
heatingEnabled = CURRENT_TEMP_GET_TOPIC < TEMP_SETPOINT_GET_TOPIC;
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

Hi
That thing wouldn’t work:

heatingEnabled = CURRENT_TEMP_GET_TOPIC < TEMP_SETPOINT_GET_TOPIC;

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

heatingEnabled = t < sp;

you should place it before Line ~90

ot.setBoilerStatus(...)

@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

@shcherban, very nice topic and thanks for all the information! I have a Vaillant boiler and i want to start smart heating for every room in the house independently. Do you see this working with the DIY OpenTherm thermostat? Do you have experience with such a setup?

For sure, currently im using such a setup in my house. However i have quite dumb system, when boiler temperature is driven by the coldest room (or a room where i’m currently in) and the rest ones are controlled by wall units. Its working great, even felt some gas economy. All my radiators has thermoelectric valves which i can control. Currently in a few weeks i start to work on my setup to turn it into fully automatic, because for now ‘master’ room is defined once and thats it, and i want my system to track setpoints and decide itself which room gets ‘master’ and drive boiler accordingly. And i think i’ll use a node-red for automation because writing complex logic and conditions gets damn hard in HA and much easier (at least for me) in nodered blocky style or javascript code.
Also you can get some ideas from here.

1 Like

put this into configuration.yaml after sensor: section:

- platform: mqtt
  name: "OT flame enable"
  state_topic: "opentherm-thermostat/flame-status/get"
  value_template: "{{ value }}"
  unit_of_measurement: ''
  icon: mdi:thermometer

Hello. I just got my master shield and D1 mini. I went already through many articles so I think I got some common understanding on how it works. What I’m wondering however is … how can I use it with external (outside) temp sensor so that boiler could use it’s one of predefined heating curves. Normally when I connect external temp directly to boiler it will automatically block possibility for setting up a heating temp, instead boiler will give ma a possibility to chose one of the heating curves. I’m wondering how could I achieve similar effect with this opentherm termostat.

It is not totaly clear to me what you try to accomplish.
you want to attach external temperature probe to the opentherm thermostat? then you have to implement “heating curve” logic by yourself in the thermostat sketch.
if temperature probe is attached to the boiler - you should read the manuals, some boilers allows ‘weather dependent’ regulation through opentherm using internal boilers curves, however you also need to write a custom sketch whcih will issue the right commands to the boiler.
And if youre using weather-dependent regulation - there is no much profit from opentherm other than just monitoring a few params.