Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
386 commits
Select commit Hold shift + click to select a range
82a512f
build: point the type-checker path at the library checkout, not a wor…
cayossarian Aug 26, 2026
cb6b9d4
fix(sensors): a derived reading is unknown while its inputs are
cayossarian Aug 26, 2026
f16c208
fix(dip): a compensation offset the next reading disproves is retracted
cayossarian Aug 26, 2026
0cb4379
build: hold span-panel-api to the checkout, at commit time and at run…
cayossarian Aug 25, 2026
6349b7e
test(library-path): prove the gate against the commits it exists for
cayossarian Aug 26, 2026
2d4405f
test(dip): an outage delays a dip's verdict rather than deciding it
cayossarian Aug 26, 2026
6a705af
docs: state what dip compensation now does, and how to check an old o…
cayossarian Aug 26, 2026
dd4dbbc
test(control): pin that disabling control keeps the entity_ids it sto…
cayossarian Aug 26, 2026
898ca92
chore: 2.1.0b15
cayossarian Aug 26, 2026
8f46050
docs(changelog): one sentence per entry in 2.1.0
cayossarian Aug 26, 2026
0c82de7
fix(config-flow): pin the panel's authority without stopping to ask
cayossarian Aug 26, 2026
a143aa0
feat(config-flow): believe a panel that says where it serves TLS
cayossarian Aug 26, 2026
06947cb
chore: 2.1.0b16
cayossarian Aug 26, 2026
4413c96
feat(naming): build the base Core composes a circuit entity id from
cayossarian Aug 26, 2026
297f9b4
feat(naming): one release of the registry name, for every name we eve…
cayossarian Aug 26, 2026
ebafddf
feat(entity): let a circuit entity hand Core its object-id base
cayossarian Aug 26, 2026
be54a12
feat(sensor): supply a base and let Core compose the circuit sensor id
cayossarian Aug 26, 2026
e569b13
fix(sensor): keep the old id shape for entities the route change woul…
cayossarian Aug 26, 2026
f44bedc
feat(switch,select): supply a base instead of presetting the entity id
cayossarian Aug 26, 2026
f8ab17c
test(naming): one generic install helper for the four circuit platforms
cayossarian Aug 26, 2026
921f2be
refactor(naming): delete the preset id builders
cayossarian Aug 26, 2026
93d6711
test(naming): composed ids match the preset shape for the names a pan…
cayossarian Aug 26, 2026
383484c
test(naming): a SPAN-app rename still reaches the display name throug…
cayossarian Aug 26, 2026
bd352bc
docs: circuit entity ids follow the user's entity-id settings
cayossarian Aug 26, 2026
42bccf1
docs: say exactly what the release does to the registry name field
cayossarian Aug 26, 2026
5d5e511
fix(naming): keep ids on generated panel names, and read the suffix b…
cayossarian Aug 26, 2026
eaaab2d
security(config-flow): pin the CA on reauth before the passphrase is …
cayossarian Aug 26, 2026
e8143a6
fix(config-flow): bootstrap an FQDN install over the address the leaf…
cayossarian Aug 26, 2026
bef90bd
refactor(naming): the base never bypasses entity_id_parts
cayossarian Aug 26, 2026
dbbdc42
docs: existing EVSE feed sensors compose like any other on Recreate
cayossarian Aug 26, 2026
348728a
fix(config-flow): never persist a pinned host the leaf does not name
cayossarian Aug 26, 2026
e1eab50
fix(control): the control lock keeps its state across a reload
cayossarian Aug 26, 2026
616ccf0
fix(control): one outcome path for every control, adopted ones included
cayossarian Aug 26, 2026
700fa55
fix(adoption): a vendor format we cannot parse yields a reading, not …
cayossarian Aug 26, 2026
614c1d2
security(ca): never pin a CA that does not sign the panel's own certi…
cayossarian Aug 26, 2026
8fee804
security(ca): verify the pin against the port it guards
cayossarian Aug 26, 2026
fb3ae9b
security(discovery): a pinned entry follows a discovered host only wh…
cayossarian Aug 26, 2026
83ef9a7
refactor(config-flow): one implementation of which address reaches th…
cayossarian Aug 26, 2026
115e477
fix(services): rotate_credentials names its panel, reports a failed r…
cayossarian Aug 26, 2026
2a3ac79
test(services): rotate_credentials tests pass ruff, and two wording nits
cayossarian Aug 26, 2026
2cc502d
fix(coordinator): a dead transport makes entities unavailable, not zero
cayossarian Aug 26, 2026
b9c35bb
fix(dip): a confirmed dip that then returns to its baseline is still …
cayossarian Aug 26, 2026
95ecab0
fix(sensor): do not present a default as the at_service_entrance reading
cayossarian Aug 26, 2026
60994db
fix(dip): a dip inside a confirmed window is judged against its own b…
cayossarian Aug 26, 2026
6272091
test(sensor): pin the at_service_entrance adapter gate to the install…
cayossarian Aug 26, 2026
86b0745
fix(control): debounce only delivered commands, refuse under DISABLED…
cayossarian Aug 26, 2026
5904201
fix(adoption,extension,additions): five robustness defects from the r…
cayossarian Aug 26, 2026
38d2e3c
fix(adoption): deterministic collision winner, digested capability to…
cayossarian Aug 26, 2026
6c3c686
refactor: runtime-data types in a leaf module, one guard, no casts
cayossarian Aug 26, 2026
39491ff
fix(coordinator): follow settability changes in both directions
cayossarian Aug 26, 2026
152da89
docs: the security release, its limits, and two stale pins
cayossarian Aug 26, 2026
0dd4e82
docs: reauthenticate is the on-screen route to a pin
cayossarian Aug 26, 2026
4da0b7f
fix: close the final-review items — reconfigure fails closed, the pin…
cayossarian Aug 26, 2026
dbdfa3b
chore: 2.1.0b17
cayossarian Aug 27, 2026
9e82bde
docs: entity id and name handling rules
cayossarian Aug 27, 2026
af2c1d4
remove extraneous test files
cayossarian Aug 27, 2026
b2115a2
chore(tests): drop two empty test modules and the README documenting one
cayossarian Aug 27, 2026
dd24bc5
refactor(evse): one empty-charger sentinel, in util beside the builde…
cayossarian Aug 27, 2026
cc5881c
refactor(binary_sensor): name the offline-visible sensor set once
cayossarian Aug 27, 2026
66d0db2
refactor(controls): drop the client capability checks that cannot fail
cayossarian Aug 27, 2026
560769a
refactor(diagnostics): read device_type and tabs straight off the cir…
cayossarian Aug 27, 2026
d6d3ae7
docs(extension): describe the fall-through the hint actually takes; f…
cayossarian Aug 27, 2026
181dc11
chore(tests): drop two more empty test files
cayossarian Aug 27, 2026
51b0abc
refactor(sensor_circuit): one circuit-sensor base, one API key map
cayossarian Aug 27, 2026
c95841d
refactor: remove the remaining guards that cannot fail
cayossarian Aug 27, 2026
61f5e3f
style(tests): organize imports in the three files this sweep edited
cayossarian Aug 27, 2026
662e945
fix(number): name the charger the user sees when a charge-limit write…
cayossarian Aug 27, 2026
9d24aec
perf(config_flow): fetch the CA once per FQDN readiness wait, not onc…
cayossarian Aug 27, 2026
839e707
chore: pin span-panel-api 3.1.1 and schema-0 1.1.1
cayossarian Aug 27, 2026
42ac5fd
chore: 2.1.0b18
cayossarian Aug 27, 2026
5c3f155
chore: pin span-panel-api-schema-1 1.1.1
cayossarian Aug 27, 2026
5679858
chore: 2.1.0b19
cayossarian Aug 27, 2026
f10aea3
chore: pin span-panel-api-schema-1 1.1.2 and follow its reference cap…
cayossarian Aug 27, 2026
e2b495d
chore: 2.1.0b20
cayossarian Aug 27, 2026
254398b
chore: read the adapter reference payloads from the pinned wheels; th…
cayossarian Aug 28, 2026
47b34e0
chore: 2.1.0b21
cayossarian Aug 28, 2026
fa2800e
docs: lead 2.1.0 with a summary, collapse the adopted-entity entries,…
cayossarian Aug 28, 2026
b9a8a3f
docs: trim the security notes in the changelog and README
cayossarian Aug 28, 2026
04549a5
docs: let the security section's two lead-ins stand on their own
cayossarian Aug 28, 2026
65a17f0
Clean up change log
cayossarian Aug 28, 2026
c707146
ci(deps): take the pending dependabot bumps — setup-python 7, mypy 2.…
cayossarian Aug 28, 2026
54454ce
chore: 2.1.0
cayossarian Aug 28, 2026
4ab4c29
Merge pull request #257 from SpanPanel/fix/circuit-numbers-recreate
cayossarian Aug 28, 2026
e4cce69
fix(config_flow): tell a moved panel apart from an impersonated one
cayossarian Aug 28, 2026
a2674c9
fix(config_flow): a moved panel with no address to fall back to is re…
cayossarian Aug 28, 2026
cf23c30
test(config_flow): prove the refusal form is not a dead end
cayossarian Aug 28, 2026
4e805e7
docs: make the security section guidance, not narrative
cayossarian Aug 28, 2026
4243ec3
fix(repairs): tell the user when the panel is not at the configured a…
cayossarian Aug 29, 2026
0a03afa
fix(config_flow): a Supervisor discovery reallocates ports, not the host
cayossarian Aug 29, 2026
b1a134f
chore(release): 2.1.0
cayossarian Aug 29, 2026
ded8806
Merge pull request #261 from SpanPanel/fix/reconfigure-leaf-name-mism…
cayossarian Aug 29, 2026
4deec35
deps(deps): bump the ha-core group with 3 updates
dependabot[bot] Aug 31, 2026
3863b93
Merge pull request #262 from SpanPanel/dependabot/pip/ha-core-11e01b8026
github-actions[bot] Aug 31, 2026
710e9a4
deps(deps): bump the dev-dependencies group with 6 updates
dependabot[bot] Aug 31, 2026
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
566bf1c
security(rest): ride the pinned CA at runtime, and fail closed with r…
cayossarian Aug 31, 2026
2356323
fix(deps): pair pytest-homeassistant-custom-component with the pinned…
cayossarian Aug 31, 2026
dfd3545
feat(curation): adopted/curate websocket command — validate, save, sc…
cayossarian Aug 31, 2026
ce9711d
style: fold in the formatter fix the first commit left unstaged
cayossarian Aug 31, 2026
fc5ddf1
docs: wrap the 2.1.1 changelog to the markdown line limit
cayossarian Aug 31, 2026
bc6d7d0
fix(curation): warn statistics_removed whenever a save leaves no stat…
cayossarian Aug 31, 2026
095cc22
Merge branch 'main' into dependabot/pip/dev-dependencies-a49a97acf0
cayossarian Aug 31, 2026
9ec565b
Merge pull request #263 from SpanPanel/dependabot/pip/dev-dependencie…
github-actions[bot] Aug 31, 2026
2afc32c
Merge branch 'main' into fix/runtime-rest-pinned-ca
cayossarian Aug 31, 2026
f0c544b
feat(curation): report stored curation in diagnostics
cayossarian Aug 31, 2026
5f01ad0
chore(release): 2.1.1b1 on span-panel-api 3.4.0
cayossarian Aug 31, 2026
4d3fbee
docs: curation of adopted entities
cayossarian Aug 31, 2026
444e3ac
security(discovery): probe a pinned entry's configured host over its pin
cayossarian Sep 1, 2026
725f117
feat(curation): ship the Adopted tab frontend
cayossarian Sep 1, 2026
738d09c
chore(deps): span-panel-api 3.4.1
cayossarian Sep 1, 2026
7f7c840
chore(release): 2.1.1b2 on span-panel-api 3.4.1
cayossarian Sep 1, 2026
b6443df
docs: the Adopted tab edits unit and precision, not area
cayossarian Sep 1, 2026
aff2e30
docs: one changelog sentence for #264, as a user reads it
cayossarian Sep 1, 2026
95c8997
chore(release): 2.1.1
cayossarian Sep 1, 2026
d82244f
Merge pull request #265 from SpanPanel/fix/runtime-rest-pinned-ca
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
ca13e81
Merge pull request #266 from SpanPanel/feat/adopted-curation
cayossarian Sep 1, 2026
7896a2e
docs: troubleshoot the Adopted tab missing in the Favorites view
cayossarian Sep 1, 2026
150b073
docs: rewrite the Security section for accuracy and plain language
cayossarian Sep 1, 2026
d288609
deps(deps): bump the ha-core group with 3 updates
dependabot[bot] Sep 7, 2026
69a3e16
Merge pull request #267 from SpanPanel/dependabot/pip/ha-core-9cf20077e2
github-actions[bot] Sep 7, 2026
8281ad7
fix(registry): move off the device registry's multi-entry APIs
cayossarian Sep 11, 2026
07de2bc
build(frontend): sync dist bundle with the empty sub-device skip
cayossarian Sep 11, 2026
56ef38b
chore(release): 2.1.2b1
cayossarian Sep 11, 2026
7e63c7f
chore(release): 2.1.2
cayossarian Sep 11, 2026
cb4d5c2
fix(registry): keep child devices out of the panel and sub-device checks
cayossarian Sep 11, 2026
f6fad43
Merge main: Home Assistant 2026.9.0
cayossarian Sep 11, 2026
4080933
Merge pull request #270 from SpanPanel/fix/scoped-device-identifier-l…
cayossarian Sep 11, 2026
a7e5614
deps(deps-dev): bump the dev-dependencies group across 1 directory wi…
dependabot[bot] Sep 11, 2026
0b41c30
Merge pull request #268 from SpanPanel/dependabot/pip/dev-dependencie…
github-actions[bot] Sep 11, 2026
2f77328
deps(deps): bump the ha-core group with 3 updates
dependabot[bot] Sep 14, 2026
f0f6394
Merge pull request #271 from SpanPanel/dependabot/pip/ha-core-d4f8e6b759
github-actions[bot] Sep 14, 2026
2fdff10
deps(deps-dev): bump the dev-dependencies group across 1 directory wi…
dependabot[bot] Sep 21, 2026
54749b9
Merge pull request #273 from SpanPanel/dependabot/pip/dev-dependencie…
github-actions[bot] Sep 21, 2026
d55b321
deps(deps): bump the ha-core group with 3 updates
dependabot[bot] Sep 28, 2026
a4d15ed
Merge pull request #275 from SpanPanel/dependabot/pip/ha-core-2a4a08bb77
github-actions[bot] Sep 28, 2026
ac0ad0b
fix: return the rotated passphrase from rotate_credentials; gate the …
dcj Oct 3, 2026
9ce5197
fix: address review: serialize rotations, recovery advice, GFE gate, …
dcj Oct 3, 2026
c0697da
style: ruff format services.py
cayossarian Oct 3, 2026
cda74a0
fix: rotate_credentials rotates a v2 entry that is not loaded
cayossarian Oct 3, 2026
5488c92
docs(changelog): credit @dcj for #277
cayossarian Oct 3, 2026
1f2356d
chore(deps): require span-panel-api 3.5.0 and span-panel-api-schema-1…
cayossarian Oct 3, 2026
de28c46
Merge pull request #277 from dcj/dcj/credential-and-islanding-fixes
cayossarian Oct 3, 2026
937db2e
chore(release): 2.1.2b2
cayossarian Oct 3, 2026
febcaa2
Merge pull request #278 from SpanPanel/chore/release-2.1.2b2
cayossarian Oct 3, 2026
8ad41d4
deps(deps): bump the ha-core group with 3 updates
dependabot[bot] Oct 5, 2026
e73fd6c
Merge pull request #279 from SpanPanel/dependabot/pip/ha-core-da4972d12e
github-actions[bot] Oct 5, 2026
cc922f5
build(deps): pair the HA test harness with Home Assistant 2026.9.4
cayossarian Oct 5, 2026
d53d9ed
Merge pull request #281 from SpanPanel/fix/ha-core-pin
cayossarian Oct 5, 2026
b8b9f9b
deps(deps-dev): bump the dev-dependencies group across 1 directory wi…
dependabot[bot] Oct 5, 2026
eff9751
Merge pull request #280 from SpanPanel/dependabot/pip/dev-dependencie…
github-actions[bot] Oct 5, 2026
895c2fd
feat: support SPAN firmware r202639
cayossarian Oct 6, 2026
fcffa17
feat(security): default control without a logged-in user to off for n…
cayossarian Oct 6, 2026
926f20a
fix(security): tidy the contextless-control default change
cayossarian Oct 6, 2026
4d5b35e
ci: bump span-panel-api by hand with each integration release
cayossarian Oct 6, 2026
0ea3494
Merge pull request #283 from SpanPanel/feat/dependabot-hold-span-api
cayossarian Oct 6, 2026
b495819
Merge remote-tracking branch 'origin/main' into feat/r202639
cayossarian Oct 6, 2026
ab89d51
build(deps): span-panel-api 3.6.0 for SPAN firmware r202639
cayossarian Oct 6, 2026
eeccdde
Merge pull request #282 from SpanPanel/feat/r202639
cayossarian Oct 6, 2026
f92635d
chore(release): 2.1.3b1
cayossarian Oct 6, 2026
f411de8
Merge pull request #285 from SpanPanel/chore/release-2.1.3b1
cayossarian Oct 6, 2026
2e27a82
chore(release): 2.1.2b3
cayossarian Oct 6, 2026
bdc693f
Merge pull request #286 from SpanPanel/chore/release-2.1.2b3
cayossarian Oct 6, 2026
9c0868d
build(deps): drop homeassistant-stubs; Core ships its own types
cayossarian Oct 6, 2026
59faf50
Merge remote-tracking branch 'origin/main' into build/drop-ha-stubs
cayossarian Oct 6, 2026
1e18614
Merge pull request #287 from SpanPanel/build/drop-ha-stubs
cayossarian Oct 6, 2026
04aee01
ci: bump the HA test harness by hand with Home Assistant
cayossarian Oct 6, 2026
00fd3ad
Merge pull request #289 from SpanPanel/ci/dependabot-ignore-harness
cayossarian Oct 6, 2026
ca5bcb8
deps(deps-dev): update vulture requirement from >=2.14 to >=2.16
dependabot[bot] Oct 6, 2026
c986a14
Merge pull request #290 from SpanPanel/dependabot/pip/vulture-gte-2.16
github-actions[bot] Oct 6, 2026
628c938
feat(pv): decide which inverter the Solar card's PV entities read, once
cayossarian Oct 7, 2026
f28d44b
feat(pv): resolve and record the Solar card's PV binding at setup
cayossarian Oct 7, 2026
6f64766
feat(pv): report the Solar card's binding in diagnostics and keep the…
cayossarian Oct 7, 2026
4f8b95c
chore(deps): relock for the vulture>=2.16 requirement pyproject.toml …
cayossarian Oct 7, 2026
dbb2f66
feat(pv): keep existing PV entities on the inverter they read and giv…
cayossarian Oct 7, 2026
76b9876
fix(pv): place each inverter's vendor readings by the binding that pl…
cayossarian Oct 7, 2026
34ae665
fix(diagnostics): type the pv block, report the legacy key, and prove…
cayossarian Oct 7, 2026
fb8cb80
test(pv): pin card detection, the record write and setup's snapshot f…
cayossarian Oct 7, 2026
adc41da
fix(setup): build every platform from the snapshot the PV binding was…
cayossarian Oct 7, 2026
84a1e9a
fix(pv): decide the Solar card's link entity from the registry and th…
cayossarian Oct 7, 2026
0d46142
build(deps): pin and lock span-panel-api 3.6.1b1 and span-panel-api-s…
cayossarian Oct 7, 2026
735e99b
chore(release): 2.1.2b4
cayossarian Oct 7, 2026
d1d9a23
fix(pv): keep a registered inverter link like the Solar one, and repo…
cayossarian Oct 7, 2026
9276e66
docs(readme): describe an additional inverter's panel link as present…
cayossarian Oct 7, 2026
0c02c04
Merge pull request #291 from SpanPanel/feat/pv-nothing-moves
cayossarian Oct 7, 2026
a37296b
feat(pv): read a PV device identifier back to the inverter it names
cayossarian Oct 7, 2026
ef2ab7d
feat(pv): describe each PV device's tile: its identity and the circui…
cayossarian Oct 7, 2026
a2e0389
feat(websocket): tell the card each inverter's identity and the circu…
cayossarian Oct 7, 2026
f6ea1e0
test(websocket): unwrap commands through one typed helper, and requir…
cayossarian Oct 7, 2026
1a5f006
fix(websocket): resolve the panel's own entities in this config entry…
cayossarian Oct 7, 2026
b85242c
fix(pv): read each solar block's vendor and model live, as the PV sen…
cayossarian Oct 7, 2026
266fcd9
test(websocket): pin a restored store end to end, through the real bi…
cayossarian Oct 7, 2026
e77589f
docs(websocket): say when a solar block is absent and when its circui…
cayossarian Oct 7, 2026
1043ddc
fix(websocket): look the panel status up in this config entry only
cayossarian Oct 7, 2026
77b23c6
test(pv): keep an inverter's block, with no identity, once it leaves …
cayossarian Oct 7, 2026
e86b0bc
build(frontend): bundle the solar inverter tiles and the editor's Sol…
cayossarian Oct 7, 2026
bf549c8
chore(release): 2.1.2b5
cayossarian Oct 7, 2026
525feea
Merge pull request #292 from SpanPanel/feat/inverter-tiles
cayossarian Oct 7, 2026
f6ac132
feat(energy): define which counter a net sensor credits
cayossarian Oct 7, 2026
03190d0
refactor(sensor): declare energy roles and meters on the descriptions
cayossarian Oct 7, 2026
e5cccb6
fix(energy): orient every Net Energy's dip adjustment like its value
cayossarian Oct 7, 2026
9e6c65c
test(energy): pin Net reading this update's offsets through the real …
cayossarian Oct 7, 2026
6f7238f
fix(controls): remove switches and selects the panel no longer offers
cayossarian Oct 7, 2026
7cb9cc5
fix(websocket): offer only the controls the integration provides
cayossarian Oct 7, 2026
45ec7b3
test(controls): pin which restored control asks for the reload
cayossarian Oct 7, 2026
68a5a89
fix(energy): make counters and roles plain enums so a string never ke…
cayossarian Oct 7, 2026
7173aa8
docs(websocket): show the circuit's relay, priority and backup fields…
cayossarian Oct 7, 2026
9092e29
refactor(energy): declare each Net once and bind every energy sensor'…
cayossarian Oct 7, 2026
d31fa73
build(frontend): bundle the card's control and reload fixes
cayossarian Oct 7, 2026
9593493
chore(release): 2.1.2b6
cayossarian Oct 7, 2026
99a4870
Merge pull request #293 from SpanPanel/feat/pv-energy-controls
cayossarian Oct 7, 2026
f33ccc1
test(energy): pin Net through a retracted dip and across a restart
cayossarian Oct 8, 2026
5d16385
fix(energy): apply a dip compensation change made while Home Assistan…
cayossarian Oct 8, 2026
bbd4cf9
docs(readme): note the 2.1.2 Net Energy step and say dip notices come…
cayossarian Oct 8, 2026
a71bc95
build(frontend): bundle span-card 0.9.5
cayossarian Oct 8, 2026
650729c
fix(energy): read the dip compensation option as a bool
cayossarian Oct 8, 2026
d8fd069
test(energy): prove a restart moves no entity id
cayossarian Oct 8, 2026
1bdbdd3
docs(readme): say which Net Energy sensors step on upgrading, and to …
cayossarian Oct 8, 2026
6cec332
test(init): give each entry changed during start-up its own reload
cayossarian Oct 8, 2026
bc9b5ea
fix(init): keep the deferred reload's record right whichever order it…
cayossarian Oct 8, 2026
68c1786
fix(options): pre-fill energy dip compensation as the sensors read an…
cayossarian Oct 8, 2026
9b2291d
chore(release): 2.1.2b7
cayossarian Oct 8, 2026
fddfa17
Merge pull request #294 from SpanPanel/feat/dip-followups
cayossarian Oct 8, 2026
b4e0a8c
docs(changelog): consolidate 2.1.2 into user-facing grouped entries
cayossarian Oct 8, 2026
fb47371
Merge pull request #295 from SpanPanel/docs/changelog-2.1.2
cayossarian Oct 8, 2026
34d73f2
chore(release): 2.1.2b8
cayossarian Oct 8, 2026
538a125
Merge pull request #296 from SpanPanel/release/2.1.2
cayossarian Oct 8, 2026
e9d5cbb
docs(changelog): say to install 2.1.2 before firmware r202639
cayossarian Oct 8, 2026
f3e63aa
Merge pull request #297 from SpanPanel/docs/changelog-r202639-timing
cayossarian Oct 8, 2026
a808508
chore(release): 2.1.2
cayossarian Oct 8, 2026
1071f72
Merge pull request #298 from SpanPanel/release/2.1.2-final
cayossarian Oct 8, 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
7 changes: 4 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
# Copy this file to .env and adjust paths for your local setup.

# Path to span-panel-api repo (for editable pip install)
export SPAN_PANEL_API_DIR=../span-panel-api
#
# Consumed by the shell scripts under `scripts/`, which source it. Nothing in the
# test suite reads it: the library the suite resolves is named by
# `[tool.uv.sources]` in `pyproject.toml`, not by an environment variable.

# Path to span-card frontend repo (for build-frontend.sh)
export SPAN_CARD_DIR=../cards/span-card
Expand Down
25 changes: 11 additions & 14 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,7 @@ updates:
allow:
- dependency-type: "all"
groups:
# Home Assistant core, stubs, and test component must upgrade together.
# A version mismatch between any of these causes resolution failures.
ha-core:
patterns:
- "homeassistant"
- "homeassistant-stubs"
- "pytest-homeassistant-custom-component"
# Group remaining development dependencies together
# Group development dependencies together
dev-dependencies:
patterns:
- "pytest*"
Expand All @@ -35,10 +28,6 @@ updates:
- "types-*"
- "voluptuous-stubs"
- "pyright"
exclude-patterns:
- "homeassistant"
- "homeassistant-stubs"
- "pytest-homeassistant-custom-component"
reviewers:
- "cayossarian"
assignees:
Expand All @@ -50,9 +39,17 @@ updates:
- "dependencies"
- "python"
ignore:
# Ignore major version updates for span-panel-api since it's a local dependency
# Bumped by hand with each integration release, together with
# manifest.json, so the manifest and the pip pins never drift.
- dependency-name: "span-panel-api"
update-types: ["version-update:semver-major"]
- dependency-name: "span-panel-api-schema-0"
- dependency-name: "span-panel-api-schema-1"
# Bumped by hand as a pair, as in #281: each harness release pins one
# exact Home Assistant, often a beta, so the harness moves only to the
# release that pins the `homeassistant` version chosen. `homeassistant`
# is ignored too, because bumping it alone breaks the same pairing.
- dependency-name: "pytest-homeassistant-custom-component"
- dependency-name: "homeassistant"

# GitHub Actions dependencies
- package-ecosystem: "github-actions"
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ jobs:
uses: actions/checkout@v7

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v6
uses: actions/setup-python@v7
with:
python-version: ${{ matrix.python-version }}
allow-prereleases: true
Expand Down
3 changes: 2 additions & 1 deletion .github/workflows/dependabot-auto-approve.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,9 @@ jobs:
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"

# Not `span-panel-api`, for the reason given in dependabot-auto-merge.yml.
- name: Auto-approve patch and minor updates
if: ${{ steps.metadata.outputs.update-type == 'version-update:semver-patch' || steps.metadata.outputs.update-type == 'version-update:semver-minor' }}
if: ${{ (steps.metadata.outputs.update-type == 'version-update:semver-patch' || steps.metadata.outputs.update-type == 'version-update:semver-minor') && !contains(steps.metadata.outputs.dependency-names, 'span-panel-api') }}
uses: hmarr/auto-approve-action@v4
with:
review-message: "Auto-approved ${{ steps.metadata.outputs.update-type }} update for ${{ steps.metadata.outputs.dependency-names }}"
Expand Down
4 changes: 3 additions & 1 deletion .github/workflows/dependabot-auto-merge.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,10 @@ jobs:
with:
github-token: "${{ secrets.GITHUB_TOKEN }}"

# Not `span-panel-api`: it is bumped by hand with manifest.json (see
# .github/dependabot.yml), so a bump that slips through must not land alone.
- name: Auto-merge for patch and minor updates
if: ${{ steps.metadata.outputs.update-type == 'version-update:semver-patch' || steps.metadata.outputs.update-type == 'version-update:semver-minor' }}
if: ${{ (steps.metadata.outputs.update-type == 'version-update:semver-patch' || steps.metadata.outputs.update-type == 'version-update:semver-minor') && !contains(steps.metadata.outputs.dependency-names, 'span-panel-api') }}
run: |
echo "Auto-merging ${{ steps.metadata.outputs.dependency-names }}"
gh pr merge --auto --merge "$PR_URL"
Expand Down
4 changes: 3 additions & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,9 @@ forget action). Services that perform actions without returning data omit `suppo
### 6. Runtime Data Guards

Handlers that access `entry.runtime_data` MUST verify the entry is loaded and its runtime data is the expected type before accessing coordinator or other
runtime objects. Use `hasattr` and `isinstance` checks — never assume runtime data is present.
runtime objects. Call `runtime.loaded_runtime_data(entry)`, which answers `SpanPanelRuntimeData | None` — never inline the check and never assume runtime data
is present. It reads the attribute with a default, because core deletes `runtime_data` on unload, and then narrows it with `isinstance`, because what is there
is whatever the owning integration put there.

### 7. Domain-Level Registration

Expand Down
Loading
Loading