Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
1486db5
fix(button): read dsm_state for the GFE override guard, not the GFE
cayossarian Aug 11, 2026
4d8a723
feat(sensor): name the grid-forming device as an attribute on the GFE…
cayossarian Aug 11, 2026
6635a8f
feat!: move onto span-panel-api 3.0.0b3 and the normalised DER identity
cayossarian Aug 11, 2026
a074d6b
feat: surface the MID as a device, with utility-supply health as its …
cayossarian Aug 11, 2026
d45b5ed
fix: declare both schema adapters in the manifest, not just the boots…
cayossarian Aug 11, 2026
d176ff0
Reload on a firmware schema change, and keep Grid Islandable alive ac…
cayossarian Aug 12, 2026
5664383
Declare each enum sensor's real states instead of discovering them
cayossarian Aug 12, 2026
ff7351b
Say what the upgrade actually changed, which is less than the repair …
cayossarian Aug 12, 2026
9a4c084
Link sub-devices by registry id, and scope the panel lookup to its entry
cayossarian Aug 12, 2026
4ccaff0
Classify the MID, and stop reading the identifier grammar in two places
cayossarian Aug 13, 2026
987f29b
Release 2.1.0, and say that the Home Assistant floor moved
cayossarian Aug 13, 2026
6c1bf4d
feat(mid): show the firmware and hardware revision the MID publishes
cayossarian Aug 17, 2026
19e555f
test: add adapter distributions and vendored schema fixtures
cayossarian Aug 19, 2026
4ff4e3d
chore: pin span-panel-api 3.0.0b4 and both schema adapters
cayossarian Aug 19, 2026
56e552c
chore: pin b4 in project dependencies and document fixture provenance
cayossarian Aug 19, 2026
2536942
refactor: declare snapshot field paths on entity descriptions
cayossarian Aug 19, 2026
0a15c2a
refactor: return a frozenset of producible field paths
cayossarian Aug 19, 2026
f4d0de0
refactor: rename RESIDUAL_DERIVED_PATHS to RESIDUAL_EXEMPT_PATHS
cayossarian Aug 19, 2026
8b70c29
refactor: complete the exempt field path enumeration
cayossarian Aug 19, 2026
06ef60f
test: assert declared field paths are producible by both adapters
cayossarian Aug 19, 2026
863a429
test: pin field path gate coverage and surface the unread inventory i…
cayossarian Aug 19, 2026
b72bd2b
test: verify field_path declarations against their value_fns
cayossarian Aug 19, 2026
d5b83ca
test: introspect binary sensor declarations and fail on unmapped classes
cayossarian Aug 19, 2026
eb32550
test: assert schema unit strings are recognised HA units
cayossarian Aug 19, 2026
608d247
feat: surface the BESS part number as a diagnostic sensor
cayossarian Aug 19, 2026
fa8a4e2
test: pin the unit sample floor and the part number's disabled default
cayossarian Aug 19, 2026
80d8259
refactor: classify schema findings from the adapter's resolved signal
cayossarian Aug 19, 2026
4bff08f
test: cover the resolved-unitless and undeclared-description branches
cayossarian Aug 19, 2026
a95243c
fix: excuse the known-bad schema_0 circuit power unit label
cayossarian Aug 19, 2026
997971c
feat: raise Repairs for unresolved fields and unit mismatches
cayossarian Aug 19, 2026
a495c67
fix: record affected entities from the entities themselves
cayossarian Aug 19, 2026
7404352
test: pin that undeclared and derived entities are not tracked
cayossarian Aug 19, 2026
30738a4
fix: retry schema validation while the answer is unknown, and name re…
cayossarian Aug 19, 2026
e35bba9
feat: mark entities unavailable when their field is unresolved
cayossarian Aug 19, 2026
47d50e8
fix: evse_ev_connected declares evse.status instead of claiming derived
cayossarian Aug 19, 2026
7befb2f
Merge feat/field-path-declarations: field-path declarations and schem…
cayossarian Aug 19, 2026
cb1b776
chore: point editable sources at the base library worktree
cayossarian Aug 19, 2026
6cdbaeb
fix(repairs): do not raise a Repair nothing the user owns is affected by
cayossarian Aug 19, 2026
9b78cc7
feat(repairs): notice entities that were added disabled
cayossarian Aug 19, 2026
488b2fe
fix(repairs): state the observation, not a cause the trigger cannot e…
cayossarian Aug 19, 2026
86e477c
test(field-paths): assert every exemption's reason against both adapters
cayossarian Aug 19, 2026
242bebc
refactor(field-paths): derive residual paths from the entities that r…
cayossarian Aug 19, 2026
e3e64c2
test(field-paths): derive the recorder prefix from the value_fn annot…
cayossarian Aug 19, 2026
d7ce6f9
feat(field-paths): say why a description is derived, and verify the r…
cayossarian Aug 19, 2026
18971d0
test(field-paths): pin the residual read no other entity class claims
cayossarian Aug 19, 2026
587701a
Merge feat/reduce-declaration-burden: verify the declarations, delete…
cayossarian Aug 19, 2026
0caf292
chore: pin the library and schema-1 at b5
cayossarian Aug 19, 2026
d86af33
feat(sensor): surface the shed forecast as two duration sensors
cayossarian Aug 20, 2026
eb8f9a6
feat(field-paths): degrade a schema-conditional entity like any other
cayossarian Aug 20, 2026
a14d099
test(declarations): fail when the panel declares what nothing reads
cayossarian Aug 20, 2026
1178243
feat(sensor): surface what the BESS reports about itself
cayossarian Aug 20, 2026
0cbcb4a
feat(sensor): surface the panel's power control system
cayossarian Aug 20, 2026
d42a18e
test(pcs): pin that only one PCS sensor carries the arbitration
cayossarian Aug 20, 2026
78989f1
feat(binary_sensor): surface the panel's link to each DER it feeds
cayossarian Aug 20, 2026
e1552a9
fix(coordinator): derive capabilities once, so an upgrade actually re…
cayossarian Aug 20, 2026
3d18abb
feat(sensor): give the panel its own identity, and give the SSID back
cayossarian Aug 20, 2026
bc3e19a
feat(number): give each charger the charge-current limit its panel de…
cayossarian Aug 20, 2026
85ca619
feat(device): give the solar inverter a card of its own, and move its…
cayossarian Aug 20, 2026
18937d0
docs(changelog): record the two catch-up tasks that shipped without a…
cayossarian Aug 20, 2026
c418ff1
Revert "feat(device): give the solar inverter a card of its own, and …
cayossarian Aug 20, 2026
2d7b5f9
feat(device): give the solar inverter a card of its own
cayossarian Aug 20, 2026
2508b44
fix(strings): say what the new-entity count actually counts
cayossarian Aug 20, 2026
67f00eb
feat(binary_sensor): put the Wi-Fi network name on the Wi-Fi link
cayossarian Aug 20, 2026
f2a4998
refactor(sensor): move the Wi-Fi network name rather than duplicate it
cayossarian Aug 20, 2026
94d55ae
Merge branch 'feat/v10-capability-catchup'
cayossarian Aug 20, 2026
4e717b7
docs(developer): explain the declared-but-unread gate
cayossarian Aug 20, 2026
8e33fce
feat(diagnostics): carry what the panel declares and this integration…
cayossarian Aug 20, 2026
8c63d2b
feat(adoption): surface devices this integration models nothing for
cayossarian Aug 20, 2026
3eacbd3
docs(developer): explain device-scoped adoption and the rules that bo…
cayossarian Aug 20, 2026
a3f8a4d
feat(adoption): build the controls, authorised by the snapshot not by…
cayossarian Aug 20, 2026
90aa8c8
feat(additions): announce added entities in a notification that names…
cayossarian Aug 20, 2026
1c4f207
fix(adoption): build adopted unique ids in the integration's own grammar
cayossarian Aug 20, 2026
52ae9e0
test(id_builder): close the suffix mappings against silent id moves
cayossarian Aug 20, 2026
0784d05
feat(adoption): report whether an adopted device is proxied by a peer
cayossarian Aug 20, 2026
530e2b8
fix(sensors): disable the five unreliable panel readings, withdraw th…
cayossarian Aug 20, 2026
4e4da04
fix(sensors): restore bess_meter_power, withdrawn on a premise the ca…
cayossarian Aug 21, 2026
4bdadd3
test(fixtures): read the adapter's published capture instead of vendo…
cayossarian Aug 21, 2026
0a8741d
docs(sensors): the shared battery convention is discharge-positive, m…
cayossarian Aug 21, 2026
3ef4b26
fix(additions): tell sub-device entities apart in the notification
cayossarian Aug 21, 2026
4e8a764
refactor(notices): the firmware upgrade is a notification, not a repair
cayossarian Aug 21, 2026
d12f867
fix(additions,notices): adopted entities are switched off, and a bad …
cayossarian Aug 21, 2026
54e84af
feat(sensor): the grid power sensor says whether it is metering the grid
cayossarian Aug 21, 2026
cda28ab
feat: hand the panel client Home Assistant's shared HTTP client
cayossarian Aug 21, 2026
8eb8b31
fix(scripts): make the dependency sync actually match a version
cayossarian Aug 21, 2026
b659d57
chore: declare 2.1.0b1, so the version reads as the beta it is
cayossarian Aug 21, 2026
8b3d1e6
chore: 2.1.0b2, because b1 was cut from the wrong branch
cayossarian Aug 21, 2026
b294509
feat(diagnostics): report the entity registry, because the UI will not
cayossarian Aug 21, 2026
faf7e49
docs(changelog): one 2.1.0b2 section, and the PV area move it was mis…
cayossarian Aug 21, 2026
7da9603
docs: warn before the firmware lands, and correct the battery sign in…
cayossarian Aug 21, 2026
218285a
docs(readme): the entities the reference tables never caught up with
cayossarian Aug 21, 2026
de1a305
chore: 2.1.0b3, on the library release that fixes the upgrade reload
cayossarian Aug 21, 2026
cc8e284
chore: pin span-panel-api 3.0.0b9
cayossarian Aug 21, 2026
d15f367
chore: 2.1.0b4 on span-panel-api 3.0.0b10
cayossarian Aug 21, 2026
9b5c1a6
fix(binary_sensor): create Grid Islandable when the answer is knowable
cayossarian Aug 21, 2026
0442c04
chore: 2.1.0b5 on 3.0.0b11, and document the two blank entities
cayossarian Aug 21, 2026
08c9142
refactor(sensor): file Import Limit as a diagnostic, with its siblings
cayossarian Aug 21, 2026
e1413de
chore: 2.1.0b6, so the Import Limit move ships
cayossarian Aug 21, 2026
973c615
fix(circuits): report the voltage we can justify, not a default
cayossarian Aug 22, 2026
66624a5
docs: one 2.1.0 entry, written for the people upgrading
cayossarian Aug 22, 2026
2120074
feat(extension): surface vendor properties on devices we already model
cayossarian Aug 22, 2026
1a7639d
chore: 2.1.0b7, and the changelog stops saying the opposite
cayossarian Aug 22, 2026
d15b5f8
docs(readme): adopted vendor readings, and what the delete button does
cayossarian Aug 22, 2026
9b8513e
fix(additions): name a handful of vendor readings instead of counting…
cayossarian Aug 22, 2026
13e68ed
chore: 2.1.0b8, so the naming fix reaches the panel that showed the p…
cayossarian Aug 22, 2026
9567cb9
fix(extension): four defects an adversarial review found in b8
cayossarian Aug 22, 2026
ce5a79b
chore(deps): follow span-panel-api to its release versions
cayossarian Aug 22, 2026
ac78671
fix(naming): circuit energy descriptors match the suffixes they ship …
cayossarian Aug 23, 2026
5411212
chore(deps): pin span-panel-api 3.0.1
cayossarian Aug 23, 2026
83bf98b
chore(deps): point the local sources at the primary checkout
cayossarian Aug 23, 2026
87c640e
fix(naming): Recreate entity IDs proposes what the panel says now
cayossarian Aug 23, 2026
f91d3b2
chore(release): 2.1.0b10
cayossarian Aug 23, 2026
28e6035
docs(changelog): the entity-id fix and the energy sensor rename
cayossarian Aug 23, 2026
d1c580a
fix(naming): keep the entity-id suffix an install already has
cayossarian Aug 23, 2026
348754e
fix(naming): stop the registry name deciding circuit-numbered entity ids
cayossarian Aug 23, 2026
fc6dfe1
docs: correct the 2.1.0 notes and the adoption docstring
cayossarian Aug 23, 2026
f3eb929
chore: 2.1.0b13
cayossarian Aug 23, 2026
b5074a9
chore: 2.1.0b14
cayossarian Aug 23, 2026
f76f32c
docs: troubleshooting entry for entity IDs surviving a reinstall
cayossarian Aug 24, 2026
a7776a9
fix(translations): move notification strings out of the hassfest-vali…
cayossarian Aug 24, 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
163 changes: 134 additions & 29 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,136 @@

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

## [2.1.0] - 8/2026

### You will need this release before SPAN updates your panel

SPAN firmware `r202633` replaces the way the panel publishes its data — the wire model every release up to 2.0.8 is retired in the same update that introduces
the new one. There is no wire overlap and no setting to keep the old behaviour. **2.0.8 cannot read a panel on `r202633`**: it stays connected, reports every
circuit as missing, and shows nothing useful.

We do not control when that update reaches you, and the schedule belongs exclusively to SPAN. Panels update on SPAN's timing, not on yours or ours. If
uninterrupted integration matters to you, install this release **before** your panel changes — afterwards you are looking at a blank integration while you work
out why.

**The transition itself is seamless.** Install 2.1.0 early and your only outage is the firmware update itself. A log line and a one-time notification tell you
exactly what happened, so take a screenshot.

**A panel that is still rebooting is waited out, for as long as your panel takes.** Taking the firmware upgrade drops the panel's connection for several minutes
— four or more is not uncommon once the panel receives its upgrade file. If you experience an extended delay (over 5 minutes), reload the integration (reload is
a menu item, not a reinstallation).

### Requires Home Assistant 2026.8.0 or newer

This release raises the minimum from 2026.5.4. Home Assistant 2026.8 replaced the two device-registry calls this integration relies on — the old forms stop
working entirely in 2027.8.

### Added

- **Your panel's Microgrid Interconnect Device appears as its own device**, carrying **Grid State** — the health of the utility supply itself, which your panel
never reported before.
- **Grid Power now says whether it is really measuring the grid**, through a new `at_service_entrance` attribute: false where a battery or another panel sits
between the utility and your main lugs, which is when it and **Grid Power Flow** legitimately disagree.

- **Your solar inverter gets a device of its own** rather than rendering as diagnostic sensors on the panel's card; the five PV entities keep the entity ids,
unique ids and history they have today.
- **Assign the new Solar device to an area** — those five no longer inherit the panel's area, which quietly drops them from area-scoped dashboards, automations
and voice commands until you do.
- New installations get `sensor.span_panel_solar_pv_vendor` and friends where existing ones keep `sensor.span_panel_pv_vendor`; both are correct and neither
will change again.

- **EVSE Charge Current Limit** — a settable ceiling on each commissioned SPAN Drive, the first control this integration has that changes something on a charger
rather than on the panel.
- The maximum is the one your installer commissioned, read from the panel: a higher value is refused rather than quietly rounded down, and the control is
unavailable rather than invented where the rating is not published.
- The control appears only where the panel says the limit can be changed, and reports a change still in flight as a `charge_current_limit_target` attribute.

- **PV Panel Link and EVSE Panel Link** — the panel's own report of the link to your inverter and to each charger, which is the fact **BESS Connected** has
always shown for the battery.
- **EVSE Panel Link is not EV Connected**: one is the panel reaching the charger at all, the other is the charger reporting a plugged-in vehicle, and they can
disagree mid-session.

- **BESS Meter Power** — what the battery itself reports it is charging or discharging at, beside the panel's arbitrated **Battery Power**. Enabled by default.
- **BESS Communication State** — the battery's own `OK` / `DEGRADED` / `LOST` / `UNKNOWN` view of its link, which can differ from the panel's. Diagnostic, off
by default.
- **Both battery power sensors read positive when discharging**, settled by measurement on a live panel — the same convention as PV Power producing and Grid
Power Flow importing.

- **Time to Priority Shed and Backup Time Remaining** — how long before the panel starts shedding circuits and how long before the battery is spent. Enabled by
default.
- Each forecast carries its full-charge equivalent and the panel's own `forecast_confidence` as attributes, rather than as two more near-constant entities.

- **Import Limit, Binding Constraint and PCS Active** — the current limit your panel enforces, which rule set it, and whether anything is being throttled right
now. Filed under Diagnostics with the panel's other electrical characteristics. Import Limit carries the whole arbitration as attributes.
- **Every circuit's power sensor gains `pcs_managed` and `pcs_priority`** where the circuit reports them — the shed order when an import limit binds, which is
not the backup tier the existing `shed_priority` names.
- **New kinds of device your panel gains no longer wait for a release.** SPAN's data model is vendor-extensible, so a device type nobody has modelled can turn
up at any time; one now gets a card of its own hanging off the panel, with whatever it publishes as entities beneath it, all disabled and diagnostic.
- **A property an adopted device accepts writes to becomes a control**: a boolean becomes a switch, an enum a select, a bounded number a number entity,
constrained to what the device declared and nothing invented.
- **Nothing adopted enters long-term statistics** — `state_class` is not declared on the wire and a wrong guess writes corrupt statistics; wrap an adopted
reading in a template sensor or utility meter if you want them.
- **A new reading a vendor adds to a device you already have now appears too**, on the card that device already has — the battery, the Microgrid Interconnect
Device, a SPAN Drive or the solar inverter, with circuit and lugs readings landing on the panel's own card. Previously only whole new _devices_ were picked
up, so a battery vendor adding a field reached you nowhere.
- These new readings arrive switched off and filed as diagnostics, like everything else adopted, and they are readings only — never switches or number boxes,
because a control here would sit beside the curated ones without their limits and translations.
- **They keep the panel's own wording** (`Battery 2 Cell Temperature`), which is deliberately plainer than a curated entity's name so you can tell at a glance
which is which.
- **Deleting one hides it until the next reload while your panel is still publishing it, and removes it for good once your panel stops.** There is no setting to
suppress one, because the delete button already does both jobs, decided by what your panel is actually sending.

- **Your panel's own card shows what the panel says it is** — manufacturer, model and hardware revision read from the enclosure rather than assumed, once your
panel publishes them.
- **Part Number** diagnostic sensor on every SPAN Drive, matching the one the battery already has. Off by default.
- **Circuit Priority's shed policy is readable**: `dsm_state` gains `shed_algorithm` and the two state-of-charge thresholds that decide when circuits shed and
when they come back.
- **Grid-forming device name** as an attribute on the Grid Forming Entity sensor.
- **Diagnostics include your entity registry** — every entity this integration owns, its unique id, and what disabled it, which Home Assistant will not
otherwise tell you.

### Changed

- **`DSM Grid State` is now more trustworthy**, reading the islanding state the Microgrid Interconnect Device actually senses rather than inferring it from the
battery, the dominant power source and which way power was crossing the grid connection. It keeps its entity id and all of its history.
- **`Grid Islandable` keeps working** across the upgrade: the new firmware publishes no panel-level islandable property and makes the question structural
instead, so the entity now reflects whether a Microgrid Interconnect Device is present. A panel without one reads `Off`, which is an answer, rather than going
unavailable.
- **Battery model** may read differently after upgrading: the new firmware separates the human-readable designation from the SKU, and this entity now shows the
designation. The normalisation happens in the library on both sides of the upgrade, so it lands once, at this release, rather than unpredictably when your
panel changes over.

- **Five panel sensors are switched off for new installations** (#234), because the SPAN API documented three defects that predate SPAN firmware r202633: the
feedthrough energy registers can decrease or go negative, the feedthrough power reading is inverted relative to every other terminal, and the feedthrough
currents report the _upstream_ service conductors. The affected entities are **Feedthrough Produced Energy**, **Feedthrough Consumed Energy**, **Feedthrough
Power**, and the two **Downstream** current sensors.
- **If you already have those five, nothing changes and they stay exactly where they are**, because Home Assistant consults the enabled-by-default setting only
when an entity is first created — so an existing installation keeps them, keeps its history and keeps its entity IDs. If you use any of the five on a
dashboard or in an automation they are worth removing, but that is your decision to make, not something an upgrade should do to you.
- **Your other panel readings are unaffected, and that is now checked against a real panel rather than assumed.** A capture from a live upgraded panel shows the
four power-flow values summing to zero exactly and the battery power definition byte-for-byte what 2.0.8 shipped, with the upstream lugs, the main panel meter
and every circuit in the correct frame.

- **New entities are now announced in a notification, whether or not they arrived switched on.** The notification now splits what arrived into ready to use and
switched off and names each entity.

- **The Wi-Fi network name attribute moved to the Wi-Fi Link sensor**, which is where you would look for it: the entity that tells you whether Wi-Fi is up now
also tells you which network it is up on, as a `wifi_ssid` attribute. It is absent rather than blank on a panel that publishes no SSID.
- **It is no longer an attribute of the Software Version sensor**, where a network name never made sense attribute block. If you have a template reading
`state_attr('sensor.span_panel_software_version', 'wifi_ssid')`, point it at the Wi-Fi Link binary sensor instead.

- **The three circuit energy sensors are renamed to match the ids they are given**: "Produced Energy", "Consumed Energy" and "Net Energy" become **Energy
Produced**, **Energy Consumed** and **Energy Net**, the order the `energy_produced`, `energy_consumed` and `energy_net` suffixes already use. **Entity ids,
unique ids and history are unchanged**; only the name shown in the UI reorders.

### Fixed

- **Recreate entity IDs proposes the ids your panel would produce now** (#252), in your installation's naming style; unique ids and statistics are untouched.
- **Enum sensors advertise the states they can actually report.** Nine sensors declared only `unknown`, so `DSM Grid State` sitting at `On Grid` showed
"Possible states: Unknown".
- **The README described Battery Power's sign backwards.** The sensor reports **discharging** as positive and always has, as release 2.0.5 established (#184)
and a measured panel confirms — **no entity changed and no reading moved**, only the documentation was ever wrong.

## [2.0.8] - 5/2026

### Fixed
Expand Down Expand Up @@ -35,11 +165,6 @@ All notable changes to this project will be documented in this file.

## [2.0.6] - 4/2026

**Important** 2.0.x cautions still apply — read those carefully if not already on 2.0.x BEFORE proceeding:

- Requires firmware `spanos2/r202603/05` or later (v2 eBus MQTT)
- You _must_ already be on v1.3.x or later of the SpanPanel/span integration if upgrading

### Added

- **By Activity and By Area views** — Two new circuit views available in both the integration panel and the Lovelace card (span-card 0.9.2):
Expand All @@ -61,11 +186,6 @@ All notable changes to this project will be documented in this file.

## [2.0.5] - 4/2026

**Important** 2.0.x cautions still apply — read those carefully if not already on 2.0.x BEFORE proceeding:

- Requires firmware `spanos2/r202603/05` or later (v2 eBus MQTT)
- You _must_ already be on v1.3.x or later of the SpanPanel/span integration if upgrading

### Added

- **Current monitoring and dashboard** — Real-time monitoring of circuit and mains current draw, managed from a new sidebar panel with Panel, Monitoring, and
Expand Down Expand Up @@ -99,11 +219,6 @@ All notable changes to this project will be documented in this file.

## [2.0.4] - 3/2026

**Important** 2.0.1 cautions still apply — read those carefully if not already on 2.0.1 BEFORE proceeding:

- Requires firmware `spanos2/r202603/05` or later (v2 eBus MQTT)
- You _must_ already be on v1.3.x or later of the SpanPanel/span integration if upgrading

### Added

- **Grid Power sensor** — New `Grid Power`. Previously only `Current Power` (upstream lugs measurement) was available; the new sensor surfaces the panel's own
Expand Down Expand Up @@ -133,23 +248,13 @@ All notable changes to this project will be documented in this file.

## [2.0.3] - 3/2026

**Important** 2.0.1 cautions still apply — read those carefully if not already on 2.0.1 BEFORE proceeding:

- Requires firmware `spanos2/r202603/05` or later (v2 eBus MQTT)
- You _must_ already be on v1.3.x or later of the SpanPanel/span integration if upgrading

### Fixed

- **Force dependency re-resolution** — Version bump to ensure HACS re-installs `span-panel-api` for users who had the earlier 2.0.2 release. Users upgrading HA
without re-downloading the integration could be left with a stale library missing required imports. (#191)

## [2.0.2] - 3/2026

**Important** 2.0.1 cautions still apply — read those carefully if not already on 2.0.1 BEFORE proceeding:

- Requires firmware `spanos2/r202603/05` or later (v2 eBus MQTT)
- You _must_ already be on v1.3.x or later of the SpanPanel/span integration if upgrading

### Fixed

- **Panel size always available** — `panel_size` is now sourced from the Homie schema by the underlying `span-panel-api` Previously some users could see fewer
Expand All @@ -165,13 +270,13 @@ All notable changes to this project will be documented in this file.

## [2.0.1] - 3/2026

⚠️ **STOP — If your SPAN panel is not on firmware `spanos2/r202603/05` or later, do not upgrade. Ensure you are on v1.3.0 or later BEFORE upgrading to 2.0. This
upgrade migrates to the SPAN official eBus API. Make a backup first.** ⚠️
**This is the release that moved the integration to the SPAN official eBus API**, which every release since reads and every panel now runs. The prerequisites
below applied while panels were still being updated to `spanos2/r202603/05`; they are recorded here for history.

### Breaking Changes

- Requires firmware `spanos2/r202603/05` or later (v2 eBus MQTT)
- You _must_ already be on v1.3.0 or later of the SpanPanel/span integration if upgrading
- Required firmware `spanos2/r202603/05` or later (the eBus MQTT API)
- You had to already be on v1.3.0 or later of the SpanPanel/span integration to upgrade
- After upgrading, you must re-authenticate using your **panel passphrase** (found in the SPAN mobile app under On-premise settings) or **proof of proximity**
(open and close the panel door 3 times). See the [README](README.md) for details.
- If you were running a beta or RC, ensure you reload the integration after upgrade
Expand Down
Loading
Loading