Skip to content

Fix Delta 2 AC Ports switch stuck unavailable while AC output is off#356

Merged
rabits merged 1 commit into
rabits:mainfrom
GnoX:fix/default-ac-ports-off-on-connect-timeout
May 30, 2026
Merged

Fix Delta 2 AC Ports switch stuck unavailable while AC output is off#356
rabits merged 1 commit into
rabits:mainfrom
GnoX:fix/default-ac-ports-off-on-connect-timeout

Conversation

@GnoX
Copy link
Copy Markdown
Collaborator

@GnoX GnoX commented May 29, 2026

The inverter heartbeat is the only message that carries cfg_ac_enabled (which drives the ac_ports field), and the firmware stops sending it entirely while AC output is off. After a fresh connect with AC off, ac_ports is therefore never populated, the switch reports unavailable (its value stays None), and HA blocks turn_on on unavailable entities - so the AC ports can't be enabled from HA at all until the inverter is turned on physically or via the app.

Delta2Base now arms a 10 second fallback when the device authenticates: if no inverter heartbeat arrives within the window, ac_ports falls back to off so the switch becomes controllable. It is deliberately left unavailable during the grace period instead of defaulting immediately, so we never assume off (and send an on command) for a port that is actually on but slow to report. A real heartbeat at any point still overrides the fallback.

Resolves #351, resolves #334

@GnoX GnoX self-assigned this May 29, 2026
@GnoX GnoX added the bug Something isn't working label May 29, 2026
@GnoX GnoX marked this pull request as ready for review May 29, 2026 19:39
@GnoX GnoX requested a review from rabits May 29, 2026 19:39
Copy link
Copy Markdown
Owner

@rabits rabits left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great fix!

@rabits rabits merged commit 5ccc1ec into rabits:main May 30, 2026
4 checks passed
@GnoX GnoX deleted the fix/default-ac-ports-off-on-connect-timeout branch May 30, 2026 22:46
rabits pushed a commit that referenced this pull request May 31, 2026
…#361)

This is a followup of #356 - in there, we only updated switch, but all other fields are also unavailable so this PR adds a functionality that allows setting defaults for all fields. This also addresses a comment in #351 (comment) that reported this issue happens for River 2.

This adds a small, generic mechanism rather than patching one field. A field can declare its off value with `Field.default_when_missing(value)`. When a device has any such field, `DeviceBase` schedules a one-shot fallback after authentication (`MISSING_DEFAULT_GRACE = 10s`): for each marked field that is still unset once the grace period elapses, it applies the declared value through `notify_field`. A real message arriving at any point - before or after - still wins. The field iteration and a `TypeIs` guard live on `UpdatableProps` (`is_props` / `fields_with_missing_default`), so `DeviceBase` never reaches into props internals.

Config / spec fields (configured charge speed, rated power, etc.) are deliberately left unmarked - an empty inverter reading should not clobber a setpoint to `0`, so those stay unavailable until the device actually reports them.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

2 participants