[1.4.0] - 2026-09-16
Stable release. Promotes the 1.4.0 line to general availability after the
public beta window (beta.1 2026-09-11 → beta.11 2026-09-16) closed with
no unresolved regressions. No code changes relative to 1.4.0-beta.11.
This is the cumulative 1.3.x → 1.4.0 change set, developed and validated
across the eleven pre-releases listed below. The integration gains
account-free local-only setup, resilience to a V2C Cloud outage or
authentication failure without losing LAN control, and a new diagnostic
sensor for which transport is actually carrying the data.
Breaking (auto-migrated): the config entry schema is upgraded from v2 to
v3 on first load. No user action is required.
Added
- Local-only setup. The integration can be configured without a V2C
account: enter the charger's IP address and the device id is read from the
charger itself. Such an entry never calls the cloud; cloud-only controls are
unavailable on it. - Per-charger manual IP override in the integration options, for the
cases where the cloud can't currently supply — or supplies the wrong —
address for a charger. - LAN entries keep working through a V2C Cloud outage or authentication
failure. Polling and control continue over the local network, a repair
notice is raised, and it clears itself automatically as soon as the cloud
authenticates again — including after a Reconfigure or an HA restart, not
just within the same running session. Cloud-only (4G) entries, which have
no second transport, still require reauthentication. Active transportdiagnostic sensor per charger —Local network,
V2C CloudorOffline— exposing the address in use and its source
(manual, cloud, cache, charger) as attributes. A charger whose LAN address
changes after a DHCP renewal is found again automatically, without a
manual IP.- Six per-phase measurement sensors:
IntensityMeasure_L1/L2/L3(A) and
VoltageMeasure_L1/L2/L3(V). LAN-only, so they report as unavailable in
cloud-only mode. days_of_weekfield onv2c_cloud.program_timer— digits 1-7 with
1 = Monday (e.g."123"= Mon+Tue+Wed), defaulting to every day.
Changed
- Config entry schema v2 → v3, adding
manual_ipsandlan_only. - The connection type stored on the entry is the only thing that selects the
transport. LAN entries keep their LAN polling interval regardless of cloud
availability, and switching it in the integration options no longer needs
a separate reload step — the entry's own update listener handles it. - Contracted power can now be set down to -5 kW (previously the slider
stopped at 1 kW), for installations that use a negative value to reserve
headroom for the rest of the house. - Controls that exist only in the V2C Cloud API — OCPP, the RFID reader,
installation type, slave device, language, the reboot and firmware update
buttons, and the cloud connectivity sensor — honestly report as
unavailable while the cloud is unauthenticated, or on an entry set up
without an account, instead of offering a command that would be silently
dropped. Everything served over the local network keeps working. - A switch whose command fails falls back to the value the charger actually
reports (or Unknown if there is none) rather than keeping an unconfirmed
guess; overlapping commands are tracked individually so one failure can no
longer discard the state a later command established. - The manual-IP options UX reflects the stored configuration end to end:
the checkbox is ticked whenever addresses are set, each charger's form
opens on the address in force, the options list every address currently
in use, and clearing the box hands every override back to cloud discovery
(except when switching to Cloud only, where it is kept for the return
trip to Wi-Fi). ChargeStatefollows the LAN enum (0/1/2/4/5/6, no code 3); cloud values
are translated onto it during cloud→LAN synthesis.DynamicPowerMode: 2 = minimum power mode, 3 = exclusive PV mode.POST /device/timersends exactlytimeStart,timeEndanddaysOfWeek
withtimerIdas a query parameter, and rejects malformed day strings.IntensityMeasure_L1yis normalised onto the documented
IntensityMeasure_L1.- Entities report
Unavailableinstead ofUnknownwhen the reading cannot
be produced by the active transport. /device/logo_ledis documented in the published cloud spec.- Dependencies:
aiohttp>=3.14.3,aioresponses>=0.7.9,colorlog6.12.0,
ruff0.16.6,pip>=26.2.1, andpytest-covnow pinned in
requirements_test.txt. Actions:actions/setup-pythonv7,actions/stale
v11.0.0,softprops/action-gh-releasev3.0.3,home-assistant/actions/hassfest
SHA refresh. - Dependabot additionally tracks the
devcontainersanddockerecosystems. .ruff.tomlignoresCPY001.
Deprecated
activefield ofv2c_cloud.program_timer— accepted for compatibility
but ignored. Use the Timer switch to enable or disable programmed timers.
Fixed
entry.datais read as aMapping, not adict. Home Assistant hands
real config entries aMappingProxyType; anisinstance(entry.data, dict)
guard was silently discarding manual IPs and cached pairings on every real
instance while passing hundreds of tests built on dict test doubles.- A V2C Cloud authentication failure is detected on every refresh. It was
previously possible for the pairings cache to mask an outage for up to an
hour after a restart. - The Active Transport sensor's unique_id now carries the same
v2c_prefix
every other entity uses; an existing installation is migrated onto it
automatically so entity_id, history and automations survive the update. - Two account-setup UI bugs: the "With a V2C account" step showed the wrong
title/description, and a local-connectivity error showed a raw translation
key instead of a message. async_shutdownis awaited on config-entry unload, so each local
coordinator's scheduled refresh is cancelled.- Control errors distinguish a cloud-only entry from an unreachable charger
and point at the manual-IP option. - A handful of manual-IP options-flow edge cases: opting in with no known
charger now reports why nothing was saved, clearing the checkbox also
clears stored addresses on a Cloud only (4G) entry, and the flow no longer
writes anything (or reloads) until it actually completes. - A command the cloud refuses surfaces a readable error instead of a
traceback, no longer opens the reauthentication dialog from a service
call, and makes the integration re-check the connection immediately
rather than waiting for the next scheduled refresh.
Security
pip-auditruns--strictwith zero ignored advisories on both runtime and
test dependencies.