Skip to content

Eco-Smart "Off" unreachable from Home Assistant — eco_mode select bounces back (esm stays pegged) #29

Description

@xtux77

Summary

From Home Assistant, the Eco Smart Mode select (eco_mode) cannot be set to Off: choosing "Off" appears to do nothing and the entity bounces back to its previous value ("Solar + Grid" / "Full Green"). The same happens with the "Solar charging" switch. This is not a Home Assistant / integration problem — it reproduces purely at the gateway level.

Environment

  • Charger: Wallbox Pulsar MAX Pro, charger app FW 6.11.25
  • Gateway FW v3.2.1, control over BLE, entities via MQTT discovery
  • Home Assistant with the MQTT-discovered device (also reproduced earlier with the HACS integration)

Root cause (two independent issues)

1. Read-back discards esesrc/wb_ble.cpp

merged["eco_mode"] = d["r"]["esm"] | 0;   // publishes only esm, ignores ese

g_ecos returns both ese (master enable) and esm (mode). When Eco-Smart is turned off, the charger firmware leaves esm pegged at its last value (e.g. 2) and only clears ese. Because the gateway publishes eco_mode straight from esm, HA shows a phantom "Solar + Grid" even though the feature is actually disabled.

Field evidence with the feature genuinely off:

g_ecos -> {"ese":0,"esm":2,"esp":100}
r_lse  -> {"active_feature":{"feature":0,...}, ...}   # nothing is managing the charge

2. Disabling write is self-defeating — src/wb_mqtt.cpp

// "Off" -> mode 0
String p = "{\"esm\":0,\"ese\":0,\"esp\":100}";

The mode change (esm:0) is sent together with ese:0. The charger ignores an esm change that arrives while it is being disabled, so esm never clears — it stays at whatever it was. This is what makes "Off" impossible via the normal path.

Manual workaround (proves the fix)

Driving BAPI directly, a two-step write does clear it:

s_ecos {"ese":1,"esm":0,"esp":100}   # flag still ON -> mode change accepted
s_ecos {"ese":0,"esm":0,"esp":100}   # drop the flag, mode already 0
# result: g_ecos -> {"ese":0,"esm":0,"esp":100}

Proposed fix

  • Read-back: eco_mode = ese ? esm : 0 so a disabled feature always reports Off, independent of the stuck esm.
  • Write: when the target mode is 0, do the two-step ({esm:0,ese:1} then {esm:0,ese:0}) so esm is actually cleared.

Either change alone stops the visible bounce; together they also leave the charger state clean. PR incoming.

Note: the web Eco-Smart form (src/wb_web.cpp) builds the same one-shot {ese:0,esm:0} payload when saving "Disabled", so it shares issue #2 (its status readout already shows ese separately, so it's less misleading there).

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions