SAT icon indicating copy to clipboard operation
SAT copied to clipboard

EMS-ESP Bosch boiler toggles on/off multiple times per minute

Open enricoschroeder opened this issue 6 months ago • 17 comments

Hi!

I have the following setup: Bosch gas boiler controlled by EMS-ESP with underfloor heating and multiple room thermostats.

I am currently trying to set up SAT. It works fine during normal load scenarios, however during low load (apartment is heated up, most room valves closed), the SAT climate entry toggles between "off" and "heating" multiple times per minute. As soon as it turns on, the selected flow temperature goes to 50 and the modulation of the boiler goes to 62%. After a few seconds, it turns "off" again. I assume that this is not ideal for the longevity of the boiler... See the attached screenshots that demonstrate the behavior.

I calculated the OPV as 22° as per the manual method described in another issue.

Any help is greatly appreciated!

Image Image

enricoschroeder avatar Oct 07 '25 08:10 enricoschroeder

Hi and welcome. Please change the Overshopt protection value to 32 instead of 22. EMS reports the ABSOLUTE modulation instead of the Relative modulation that OpenTherm reports.

sergeantd83 avatar Oct 07 '25 11:10 sergeantd83

Thank you!

I have changed the OPV to 32 and this has improved things a lot, however the burner still seems to start for a couple of seconds every few minutes (~10 times per hour).

enricoschroeder avatar Oct 07 '25 15:10 enricoschroeder

Thanks for the feedback. Further raise the OPV to 35 now. The correct amount of cycles is 3 per hour.

sergeantd83 avatar Oct 07 '25 18:10 sergeantd83

Changed the value to 35, but it still does this in low-load scenarios:

Image

I have observed that the SAT climate entry toggles between Heating and Idle in the same frequency as the graph, so it seems not to be an issue of the boiler toggling on and off while trying to hold a certain temperature but instead SAT turning on and off while the room temperature is around the target temperature (sometimes 0.1° below, sometimes 0.1° above).

enricoschroeder avatar Oct 09 '25 06:10 enricoschroeder

Any further advice on this? I would be happy to aid in debugging, if you tell me what information or data you would find useful.

In the meantime, the behavior that is shown in the original message has more or less returned (no matter the OPV value). The boiler toggles between 60% and 0% multiple times per minute. At the same time, the requested temperature toggles between 50° (the maximum) and 5° (the "off" value). By starting at 50° it immediately overshoots (in low load scenarios, most of the individual room valves are closed, so the heat does not go anywhere this fast) and then probably turns off again for this reason. I do not really understand the control strategy here, should it not start rather at the OPV and then increase gradually?

enricoschroeder avatar Oct 20 '25 11:10 enricoschroeder

After some further debugging, I think this might be related to #106.

When looking at the logs, I see that SAT correctly calculates a sensible flow temperature and sends it to the boiler. However, this often seems to be ignored by the boiler, which instead reverts to the pre-selected heating temperature (selected physically at the boiler). Apparently, for some boilers (Bosch/Junkers?) the selected flow temperature needs to be re-send every couple of seconds, otherwise it reverts to the pre-selected value. Also, I can see that SAT repeatedly sends "heatingoff: off" which may also lead to the observed behavior (see https://github.com/emsesp/EMS-ESP32/discussions/2641#discussioncomment-14611481).

Here is an excerpt from the logs, while the selected flow temperature actually stays at 45° (which is the pre-selected value configured directly at the boiler).

2025-10-28 11:51:21.098 DEBUG (MainThread) [custom_components.sat.climate] Outside Sensor Changed.
2025-10-28 11:51:21.098 INFO (MainThread) [custom_components.sat.climate] Updating error value to 0.5 (Reset: False)
2025-10-28 11:51:21.098 INFO (MainThread) [custom_components.sat.climate] Pulse Width Modulation is disabled or in IDLE state. Running normal heating cycle.
2025-10-28 11:51:21.099 DEBUG (MainThread) [custom_components.sat.climate] Calculated setpoint for normal cycle: 33.1°C
2025-10-28 11:51:21.099 DEBUG (MainThread) [custom_components.sat.mqtt] Publishing MQTT command: payload='{"cmd": "selflowtemp", "value": 33.1}', topic='ems-esp/boiler', simulation='False'
2025-10-28 11:51:21.103 DEBUG (MainThread) [custom_components.sat.config_flow] Discovered MQTT at [mqtt://ems-esp/boiler]
2025-10-28 11:51:21.103 DEBUG (MainThread) [custom_components.sat.config_flow] Identified gateway type ems: ems-esp
2025-10-28 11:51:22.105 INFO (MainThread) [custom_components.sat.coordinator] Set control boiler setpoint to 33°C
2025-10-28 11:51:22.105 INFO (MainThread) [custom_components.sat.climate] Control setpoint has been updated to: 33.1°C
2025-10-28 11:51:22.105 DEBUG (MainThread) [custom_components.sat.climate] Relative modulation value unchanged (100%). No update necessary.
2025-10-28 11:51:22.106 DEBUG (MainThread) [custom_components.sat.climate] Attempting to set heater state to: DeviceState.ON
2025-10-28 11:51:22.106 DEBUG (MainThread) [custom_components.sat.mqtt] Publishing MQTT command: payload='{"cmd": "heatingoff", "value": "off"}', topic='ems-esp/boiler', simulation='False'
2025-10-28 11:51:22.107 DEBUG (MainThread) [custom_components.sat.config_flow] Discovered MQTT at [mqtt://ems-esp/boiler]
2025-10-28 11:51:22.107 DEBUG (MainThread) [custom_components.sat.config_flow] Identified gateway type ems: ems-esp
2025-10-28 11:51:23.108 INFO (MainThread) [custom_components.sat.coordinator] Set central heater state DeviceState.ON
2025-10-28 11:51:29.571 INFO (MainThread) [custom_components.sat.climate] Pulse Width Modulation is disabled or in IDLE state. Running normal heating cycle.
2025-10-28 11:51:29.571 DEBUG (MainThread) [custom_components.sat.climate] Calculated setpoint for normal cycle: 33.2°C
2025-10-28 11:51:29.571 DEBUG (MainThread) [custom_components.sat.mqtt] Publishing MQTT command: payload='{"cmd": "selflowtemp", "value": 33.2}', topic='ems-esp/boiler', simulation='False'
2025-10-28 11:51:29.572 DEBUG (MainThread) [custom_components.sat.config_flow] Discovered MQTT at [mqtt://ems-esp/boiler]
2025-10-28 11:51:29.572 DEBUG (MainThread) [custom_components.sat.config_flow] Identified gateway type ems: ems-esp
2025-10-28 11:51:30.573 INFO (MainThread) [custom_components.sat.coordinator] Set control boiler setpoint to 33°C
2025-10-28 11:51:30.573 INFO (MainThread) [custom_components.sat.climate] Control setpoint has been updated to: 33.2°C
2025-10-28 11:51:30.573 DEBUG (MainThread) [custom_components.sat.climate] Relative modulation value unchanged (100%). No update necessary.
2025-10-28 11:51:30.574 DEBUG (MainThread) [custom_components.sat.climate] Attempting to set heater state to: DeviceState.ON
2025-10-28 11:51:30.574 DEBUG (MainThread) [custom_components.sat.mqtt] Publishing MQTT command: payload='{"cmd": "heatingoff", "value": "off"}', topic='ems-esp/boiler', simulation='False'

enricoschroeder avatar Oct 28 '25 11:10 enricoschroeder

We use the same approach as OpenTherm: all commands are sent every 30 seconds. That’s why you often see these messages. It would be great if you could help us improve the EMS support by making it work correctly on your boiler.

sergeantd83 avatar Oct 28 '25 11:10 sergeantd83

I will try to look into it. First thing I'll try is to avoid sending heatingoff: off regularly (as this might result in the observed behavior as suggested by https://github.com/emsesp/EMS-ESP32/discussions/2641#discussioncomment-14611481).

So we need some logic like "if manufacturer is Bosch/Junkers, do not send heatingoff". Could you point me to the right spot in the sources where this manufacturer-specific behavior is best implemented? Thanks!

enricoschroeder avatar Oct 28 '25 12:10 enricoschroeder

Can you update to the latest dev version? It might help by not sending the heatingoff command so often.

sergeantd83 avatar Oct 28 '25 12:10 sergeantd83

In fact, we should not send heatingoff at all, as it interferes with EMS (see link above).

I have fixed the behavior by making some changes to the ems class. See https://github.com/enricoschroeder/SAT/commit/8fce77d4d944fcfea0c2fad1d01597bef8f14674

The boiler now seems to respect the flow temp sent by SAT, although I will monitor it further. Does this behavior look correct to you as well?

Image

enricoschroeder avatar Oct 29 '25 07:10 enricoschroeder

It looks you made it, well done! Now we need to look at the selburnpow command. If the boiler continues to work when the the boiler follows the selected selburnpow command.

sergeantd83 avatar Oct 29 '25 10:10 sergeantd83

This is how it looks now. The boiler seems to work with selburnpow. However, when it fires, it seems to always start at a certain power regardless of this setting (in my case 12kW, which is ~60% of the nominal power). Might be due to the way the boiler control works... I did not yet have an instance where the boiler fired for a longer period of time with a selburnpow<100%, so it might work after all. I will continue to observe.

Another thing: We can see that in this instance SAT keeps the selected flow temperature pretty constant most of the time. The boiler fires every 10min (this a setting that we could adjust through EMS), then directly overshoots and turns off. My understanding was that SAT tries to prevent this from happening via clever control of the flow temperature. Any advice here to improve this? Should we look into the other parameters that EMS offers?

Image

enricoschroeder avatar Oct 30 '25 09:10 enricoschroeder

Do you have any TRVs in your installation? It looks like only a few are open, which results in a higher boiler flow water temperature. Normally, when you’re in normal mode, the boiler should stay ON continuously (when selburnpow is 100% and selflowtemp is higher than 32 in your case).

sergeantd83 avatar Oct 31 '25 04:10 sergeantd83

I have underfloor heating with individual Danfoss room thermostats. I do not have any regular radiators or anything. The scenario above is a very low load scenario (I believe only one room valve was open).

enricoschroeder avatar Oct 31 '25 08:10 enricoschroeder

Ok, that makes sense. We have a development that can keep the boiler ON more time. You need to enable the dynamic minimum setpoint in advanced settings and then in general settings check the option boiler flow water. Hopefully it will work better. Thanks!

sergeantd83 avatar Oct 31 '25 08:10 sergeantd83

How do I access the advanced settings? I only have "General", "Presets" and "System Configuration". None of those offers the settings you mentioned.

enricoschroeder avatar Oct 31 '25 17:10 enricoschroeder

Open the sidebar -> Tap your username -> Enable advanced mode

sergeantd83 avatar Oct 31 '25 18:10 sergeantd83