Skip to content

Report the standby state that Init() actually wrote - #75

Merged
BorisBrock merged 2 commits into
BorisBrock:mainfrom
sadilek:fix/standby-state-from-hardware
Aug 4, 2026
Merged

BorisBrock merged 2 commits into
BorisBrock:mainfrom
sadilek:fix/standby-state-from-hardware

Conversation

@sadilek

@sadilek sadilek commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Init() writes register 258 to configure standby, but it did not record what it wrote. mStandbyEnabled therefore kept its header default of true while the register held the opposite, since AllowStandby is false.

GetStandbyEnabled() reads the register on every publish and corrects the flag, so the mismatch normally lasts less than a publish cycle and is invisible. It stops being invisible when reads fail: the getter then falls back to the flag and returns the stale default, so the Standby Mode entity reports enabled while the wallbox has standby suppressed. That is the state described in the second half of issue #72, alongside the plug state reading "disconnected" for the same reason. The underlying cause there was the Lilygo RTS pin, fixed in 4.0.1; this only stops one of its symptoms from misreporting.

Init() now stores the value it wrote, on success only.

The transition check in SetStandbyEnabled is deliberately left alone. It is safe because GetStandbyEnabled() keeps the flag in sync with the register on every publish, and because a failed write leaves the flag unchanged, so repeating the command still writes.

sadilek and others added 2 commits August 4, 2026 09:30
Init() writes register 258 to configure standby, but it did not record what it
wrote. mStandbyEnabled therefore kept its header default of true while the
register held the opposite, since AllowStandby is false.

GetStandbyEnabled() reads the register on every publish and corrects the flag,
so the mismatch normally lasts less than a publish cycle and is invisible. It
stops being invisible when reads fail: the getter then falls back to the flag
and returns the stale default, so the Standby Mode entity reports enabled while
the wallbox has standby suppressed. That is the state described in the second
half of issue BorisBrock#72, alongside the plug state reading "disconnected" for the same
reason. The underlying cause there was the Lilygo RTS pin, fixed in 4.0.1; this
only stops one of its symptoms from misreporting.

Init() now stores the value it wrote, on success only.

The transition check in SetStandbyEnabled is deliberately left alone. It is safe
because GetStandbyEnabled() keeps the flag in sync with the register on every
publish, and because a failed write leaves the flag unchanged, so repeating the
command still writes.
@BorisBrock
BorisBrock merged commit 931733f into BorisBrock:main Aug 4, 2026
3 checks passed
@sadilek
sadilek deleted the fix/standby-state-from-hardware branch August 4, 2026 09:15
sadilek added a commit to sadilek/HeidelBridge that referenced this pull request Aug 4, 2026
…rock#75, BorisBrock#76) into kupa5

Our three fixes are now upstream, so the fork no longer carries them. Boris made
two edits when merging: ClampToWallboxRange and WriteCurrentLimitRegister moved
from a file-local anonymous namespace to private members of HeidelbergWallbox,
and InitialChargingCurrentLimitA is now defined as MaxChargingCurrentA instead
of repeating 16.0f.

Conflicts resolved in favour of upstream throughout, except for two items that
stay fork-specific in MQTTManager.cpp:

- The Enable Charging unique_id keeps its underscore. Upstream still has
  "%control_enable_charging"; reverting ours would orphan the existing entity in
  Home Assistant and break the automation that references it by entity id.
- The diagnostic echo to {DeviceName}/internal/last_command is kept. It is not
  upstream and is deliberately not proposed, since it adds public topic surface.

Also adopted from upstream: the discovery publish retry (publish() can silently
return 0 when the TCP send buffer is full) and the Last Will plus
availability_topic on every entity, which together complement the retained
discovery from BorisBrock#73.
sadilek added a commit to sadilek/HeidelBridge that referenced this pull request Aug 4, 2026
All three fixes are upstream now, so the "candidates for a PR" framing was
stale. Replaced with a short history keyed to BorisBrock#73/BorisBrock#74/BorisBrock#75, plus Boris's edits
when merging: the two helpers became private members, and
InitialChargingCurrentLimitA is defined as MaxChargingCurrentA.

Added an explicit list of what kupa5 still diverges on, so a future upstream
merge does not discard it: the Enable Charging unique_id underscore (reverting
would orphan the Home Assistant entity the automation references) and the
diagnostic echo topic.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants