Releases: hilman2/ha-sunspec2
Release list
v2026.10.4
What's Changed
- Add charging and one-action updates to the battery plan @hilman2 (#103)
- docs: restore CLAUDE.md as tracked agent guidance @hilman2 (#102)
Full Changelog: v2026.10.3...v2026.10.4
v2026.10.3
What's Changed
- chore: v2026.10.3 @hilman2 (#101)
- fix: stop a scheduled discharge at the reserve, not at the end of the window @hilman2 (#100)
Full Changelog: v2026.10.2...v2026.10.3
v2026.10.2
What's Changed
Full Changelog: v2026.10.1...v2026.10.2
v2026.10.1
What's Changed
- chore: v2026.10.1 @hilman2 (#98)
- fix: keep the Kostal profile off the PIKO CI, which has its own register map @hilman2 (#97)
- feat: Kostal battery control, the SoC bounds, the power limits and the G3 watchdog @hilman2 (#96)
- feat: Kostal profile, the house consumption split and the battery's own registers @hilman2 (#95)
- fix: tick one half of a measurement pair, not both, where a device has both @hilman2 (#94)
- fix: tick the float halves of the inverter and meter models by default @hilman2 (#93)
Full Changelog: v2026.10.0...v2026.10.1
v2026.10.0
The transport is modbus-connection now
The integration talks to the inverter through modbus-connection, the Modbus transport Home Assistant's own integrations moved to in 2026, and the SunSpec model layer awaits it. Nothing in the read or write path leaves the event loop any more. The fork's own socket and serial clients and pyserial are gone; RS-485 goes through the same library. Same entities, same options, no migration. #89, #90
Tested on a KACO Powador 7.8 TL3: stable at a 10 s interval, no warnings, reconnect after the nightly drop. Two things changed underneath and are worth knowing: a refused connect costs 10 s now instead of 2 s, and a dropped session is closed with a FIN rather than an RST. RS-485 over the new library has not been tried for lack of hardware; say so in an issue if you run it.
Not in this release: Home Assistant's shared-connection helper, which needs HA 2026.9. That comes next, and with it one socket for this integration and core's Fronius, SolarEdge or KACO integration on the same inverter.
Three more vendor profiles
- SolarEdge: the batteries and the inverter's own registers as devices, and the storage control, site limit and active power limit as entities, with a re-arm switch for the command the inverter forgets and a counter for the writes that wear its flash. See
docs/solaredge.md. #84, #85 - SMA: SunSpec on unit ID 126, SMA's own registers on 3, the battery and the external power setpoint with a keep-alive. The config flow knows the unit ID trap. See
docs/sma.md. #86 - Fronius Datamanager generation (Symo, Primo, Eco, Galvo, Symo Hybrid): told apart from the GEN24 by what the inverter reports; the Symo Hybrid's
String 2is its battery. Seedocs/fronius-symo.md. #87
What's Changed
- fix: read the model definitions in a thread, not on the event loop @hilman2 (#90)
- feat: poll through modbus-connection, with the SunSpec layer awaiting it @hilman2 (#89)
- test: wait for the background task a fired timer starts @hilman2 (#88)
- feat: Fronius Datamanager generation, Symo Hybrid battery as String 2 @hilman2 (#87)
- feat: SMA profile, SunSpec on unit id 126 and SMA's own registers on 3 @hilman2 (#86)
- feat: SolarEdge storage control, site limit and active power limit @hilman2 (#85)
- feat: SolarEdge profile, the battery and the inverter's own registers @hilman2 (#84)
- docs: say in the README that 2026.10.0 polls through modbus-connection @hilman2
Full Changelog: v2026.9.3...v2026.10.0
v2026.10.0b2
Since v2026.10.0b1
- The model definitions are read from disk in a worker thread before the first scan, once per process. On b1 Home Assistant logged "Detected blocking call to open" from
pysunspec2/mdef.pyduring the first scan. #90
First build on modbus-connection
The integration talks to the inverter through modbus-connection now, the Modbus transport Home Assistant's own integrations use, and the SunSpec model layer awaits it. No executor threads in the read or write path. The fork's own socket and serial clients and pyserial are gone. The change is #89; this pre-release series is its hardware test.
What to watch:
- Cycle time and success rate at the 30 s interval. Before: 20 of 20 cycles at 1.6 s.
- The first connect after the nightly drop. A refused connect costs 10 s now instead of 2 s. A lost cycle there is the signal to ask upstream for tmodbus's connect timeout.
- Entry reloads. The close is a FIN now, not an RST. Ten reloads in a row, how many first connects succeed.
- Warnings from tmodbus in the log about discarded frames or transaction ids.
- RS-485 goes through tmodbus and serialx, untested for lack of hardware.
The diagnostics download lists the modbus-connection and tmodbus versions.
Also since v2026.9.3
- feat: SolarEdge profile, the battery and the inverter's own registers by @hilman2 in #84
- feat: SolarEdge storage control, site limit and active power limit by @hilman2 in #85
- feat: SMA profile, SunSpec on unit id 126 and SMA's own registers on 3 by @hilman2 in #86
- feat: Fronius Datamanager generation, Symo Hybrid battery as String 2 by @hilman2 in #87
- test: wait for the background task a fired timer starts by @hilman2 in #88
Full Changelog: v2026.9.3...v2026.10.0b2
v2026.10.0b1
First build on modbus-connection
The integration talks to the inverter through modbus-connection now, the Modbus transport Home Assistant's own integrations use, and the SunSpec model layer awaits it. No executor threads in the read or write path. The fork's own socket and serial clients and pyserial are gone. The change is #89; this pre-release is its hardware test.
What to watch:
- Cycle time and success rate at the 30 s interval. Before: 20 of 20 cycles at 1.6 s.
- The first connect after the nightly drop. A refused connect costs 10 s now instead of 2 s. A lost cycle there is the signal to ask upstream for tmodbus's connect timeout.
- Entry reloads. The close is a FIN now, not an RST. Ten reloads in a row, how many first connects succeed.
- Warnings from tmodbus in the log about discarded frames or transaction ids.
- RS-485 goes through tmodbus and serialx, untested for lack of hardware.
The diagnostics download lists the modbus-connection and tmodbus versions.
Also since v2026.9.3
- feat: SolarEdge profile, the battery and the inverter's own registers by @hilman2 in #84
- feat: SolarEdge storage control, site limit and active power limit by @hilman2 in #85
- feat: SMA profile, SunSpec on unit id 126 and SMA's own registers on 3 by @hilman2 in #86
- feat: Fronius Datamanager generation, Symo Hybrid battery as String 2 by @hilman2 in #87
- test: wait for the background task a fired timer starts by @hilman2 in #88
Full Changelog: v2026.9.3...v2026.10.0b1
v2026.9.3
What's Changed
- chore: v2026.9.3 @hilman2 (#83)
- feat: the Fronius web interface, for what a GEN24 does not put in a register @hilman2 (#82)
Full Changelog: v2026.9.2...v2026.9.3
v2026.9.2
What's Changed
- feat: the battery controls work without the beta switch @hilman2 (#81)
- feat: a scheduled discharge, the battery gives its surplus back over a window @hilman2 (#80)
- feat: an option to cycle the enable around a new Fronius export limit @hilman2 (#79)
- feat: Fronius battery and PV sensors from the model 160 module labels @hilman2 (#78)
- feat: v2026.9.2 - Fronius battery modes in watts, the first vendor profile @hilman2 (#77)
- fix: connect again when the device hangs up, instead of failing the cycle @hilman2 (#76)
- fix: write a single register with function code 16, not 6 @hilman2 (#75)
- fix: hold an energy counter that goes down instead of booking a reset @hilman2 (#74)
- fix: v2026.9.1 - count a repeating group by its full length, subgroups included @hilman2 (#72)
- test: mock the serial port before the RTU device opens it @hilman2 (#73)
- ci: publish the release-drafter draft under the pushed tag @hilman2 (#71)
- test: stop sleeping through the model read pacing, run CI on all cores @hilman2 (#70)
- chore: v2026.9.0 - version numbers follow the Home Assistant scheme @hilman2 (#69)
- fix: v0.31.2 - log a dropped late Modbus response as a warning @hilman2 (#67)
- chore: v0.31.1 - SunSpec model definitions from sunspec/models 90b4a33 (2026-08-20) @hilman2 (#65)
- test: follow the HA 2026.9 device lookup and schema serialiser @hilman2 (#66)
- ci: fetch the SunSpec model definitions every second month @hilman2 (#64)
- fix: v0.31.0 - check the Modbus TCP transaction id, drop late answers @hilman2 (#63)
- feat: v0.30.0 - embed pysunspec2 as a fork instead of installing it from PyPI @hilman2 (#62)
- ci: resolve the Home Assistant version at run time, and watch the beta @hilman2 (#61)
- ci: move to Python 3.14 so the tests see the Home Assistant users run @hilman2 (#60)
- docs: move the long sections out of the README into docs/ @hilman2 (#59)
- docs: rewrite the README for the people who install it @hilman2 (#58)
Full Changelog: v0.29.0...v2026.9.2
v2026.9.2b1
What's Changed
- feat: v2026.9.2 - Fronius battery modes in watts, the first vendor profile by @hilman2 in #77
- feat: Fronius battery and PV sensors from the model 160 module labels by @hilman2 in #78
- feat: an option to cycle the enable around a new Fronius export limit by @hilman2 in #79
- feat: a scheduled discharge, the battery gives its surplus back over a window by @hilman2 in #80
- feat: the battery controls work without the beta switch by @hilman2 in #81
Full Changelog: v2026.9.1b1...v2026.9.2b1