Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
f0f0b74
feat(curation): record type and validation for user-asserted adopted …
cayossarian Aug 31, 2026
0d9ee30
test(curation): cover the refusal paths the validation core is built on
cayossarian Aug 31, 2026
0447aad
feat(curation): per-entry storage overlay with stale-record sanitisation
cayossarian Aug 31, 2026
6451a83
fix(curation): a record asserting nothing clears the key instead of s…
cayossarian Aug 31, 2026
7da69d3
feat(curation): description helpers; AST guard added for extension.py
cayossarian Aug 31, 2026
f40c013
feat(curation): load the overlay at setup, ahead of the platforms
cayossarian Aug 31, 2026
78e7b60
feat(curation): adopted-device entities are born with curated metadata
cayossarian Aug 31, 2026
6114eb0
feat(curation): vendor readings on modelled devices honour the overlay
cayossarian Aug 31, 2026
7d73cdd
feat(curation): adopted/list reports every curatable row and its choices
cayossarian Aug 31, 2026
a851212
fix(curation): adopted/list skips the loser of a flattened-id collision
cayossarian Aug 31, 2026
dfd3545
feat(curation): adopted/curate websocket command — validate, save, sc…
cayossarian Aug 31, 2026
bc6d7d0
fix(curation): warn statistics_removed whenever a save leaves no stat…
cayossarian Aug 31, 2026
f0c544b
feat(curation): report stored curation in diagnostics
cayossarian Aug 31, 2026
4d3fbee
docs: curation of adopted entities
cayossarian Aug 31, 2026
725f117
feat(curation): ship the Adopted tab frontend
cayossarian Sep 1, 2026
b6443df
docs: the Adopted tab edits unit and precision, not area
cayossarian Sep 1, 2026
5075590
Merge remote-tracking branch 'origin/main' into worktree-adopted-cura…
cayossarian Sep 1, 2026
234cd40
chore(release): 2.1.1b3
cayossarian Sep 1, 2026
262a491
fix(curation): numeric readings parse by declared datatype, and devic…
cayossarian Sep 1, 2026
3b35f14
feat(curation): sync the icon-less editor; docs follow
cayossarian Sep 1, 2026
1118c05
chore(release): 2.1.1b4
cayossarian Sep 1, 2026
c0fdf5c
style: two blank lines after declares_a_number, as ruff format asks
cayossarian Sep 1, 2026
42b7ecb
docs: repair README markup and normalize prose to US spelling
cayossarian Sep 1, 2026
332d80c
chore(release): 2.1.1
cayossarian Sep 1, 2026
3b84067
docs: fold the Adopted tab entry into the 2.1.1 changelog
cayossarian Sep 1, 2026
3c21307
chore(deps): relock against the pinned Home Assistant and library rel…
cayossarian Sep 1, 2026
7612188
fix(scripts): make a nested worktree resolve the library checkout
cayossarian Sep 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@

All notable changes to this project will be documented in this file.

## [2.1.1]
## [2.1.1] - 8/2026

### Added

- **Adopted entities can now be curated from the dashboard's new Adopted tab** — set a device class, a statistics class and whether the entity stays under
Diagnostics, with the change applied on an automatic reload.

### Fixed

Expand All @@ -19,7 +24,7 @@ All notable changes to this project will be documented in this file.
grid.
- **EVSE Charge Current Limit** is the first control here that changes something on a SPAN Drive rather than on the panel.
- **The battery says when things run out** — Time to Priority Shed and Backup Time Remaining, beside its own power and link state.
- **Vendor extensions are adopted on a reload**, so a device type or reading nobody has modelled no longer waits for a release.
- **Vendor extensions are adopted on a reload**, so a device type or reading nobody has modeled no longer waits for a release.
- **Your passphrase is no longer stored and the panel's certificate is pinned before credentials cross the network**, with control lockable or admin-only.
- **Nothing you have moves** — entity ids, unique ids and history survive the upgrade.

Expand Down Expand Up @@ -89,7 +94,7 @@ This release requires Home Assistant 2026.8 to avoid a deprecated API — the ol
battery and the dominant power source, and keeping its entity id and its history.
- **`Grid Islandable` keeps working across the upgrade** by reflecting whether a Microgrid Interconnect Device is present, so a panel without one reads `Off`
rather than going unavailable.
- **Battery model may read differently after upgrading**, now showing the human-readable designation rather than the SKU, normalised in the library on both
- **Battery model may read differently after upgrading**, now showing the human-readable designation rather than the SKU, normalized in the library on both
sides of the upgrade so it lands once at this release.
- **Five panel sensors are switched off for new installations** (#234) because of three SPAN-documented defects predating firmware r202633: **Feedthrough
Produced Energy**, **Feedthrough Consumed Energy**, **Feedthrough Power**, and the two **Downstream** current sensors.
Expand Down Expand Up @@ -247,9 +252,9 @@ This release requires Home Assistant 2026.8 to avoid a deprecated API — the ol
### Changed

- **Simulation moved to dedicated add-on** — Panel cloning and simulation are no longer part of the integration's options flow. A new `export_circuit_manifest`
service provides panel parameters to the standalone [SPAN Panel Simulator](https://github.com/SpanPanel/simulator) add-on, which now supports upgrade
modelling (evaluate firmware or integration upgrades in a sandbox before applying them to your real panel) and panel clone (replicate your panel's circuit
layout for testing).
service provides panel parameters to the standalone [SPAN Panel Simulator](https://github.com/SpanPanel/simulator) add-on, which now supports upgrade modeling
(evaluate firmware or integration upgrades in a sandbox before applying them to your real panel) and panel clone (replicate your panel's circuit layout for
testing).

### Fixed

Expand Down
134 changes: 47 additions & 87 deletions README.md

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions custom_components/span_panel/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
)
from .control_gate import ControlGate, ControlLock, ControlPolicy
from .coordinator import SpanPanelCoordinator
from .curation import async_forget_curation, async_load_curation
from .current_monitor import CurrentMonitor
from .extension import async_notice_declined_extensions
from .frontend import (
Expand Down Expand Up @@ -677,6 +678,7 @@ def _on_fatal_transport_error(error: SpanPanelError) -> None:
panel_device_id=await ensure_device_registered(
hass, entry, snapshot, smart_device_name
),
curation=await async_load_curation(hass, entry),
)

# Before the forward, because a sub-device's `via_device_id` has to name a
Expand Down Expand Up @@ -750,6 +752,11 @@ async def async_remove_entry(hass: HomeAssistant, entry: SpanPanelConfigEntry) -
The announcement record goes with them, and for a sharper reason: it outliving
the entry would mean re-adding the same panel announces none of the entities
it recreates, because every one of them is already recorded as announced.

The curation overlay goes for the same reason. Its keys are wire addresses
rather than registry ids, so a store left behind is one the next entry for
the same panel would load and apply, re-asserting metadata the user is no
longer here to have asked for.
"""
async_clear_schema_issues(hass, entry)
# The CA family too, for the same reason — and the two persistent ones most
Expand All @@ -760,6 +767,7 @@ async def async_remove_entry(hass: HomeAssistant, entry: SpanPanelConfigEntry) -
async_clear_rest_tls_untrusted(hass, entry)
async_clear_leaf_name_mismatch(hass, entry)
await async_forget_announcements(hass, entry)
await async_forget_curation(hass, entry)
await async_forget(hass, entry)


Expand Down
Loading