What's Changed
New features
- docs(anker): Anker SOLIX X1 template, Home Assistant package and setup guide (#5066) by @pietrouk in #5677
- feat(web): optional web_username/web_password login for settings pages by @springfall2008 in #6104
- feat(config): currency_scale widens the range of money settings (#6155) by @springfall2008 in #6156
- feat(fox): configurable fox_poll_seconds for the live data refresh by @springfall2008 in #6139
- feat(core): share embedded startup stages and complete cycle policy by @mgazza in #5932
- Leave Octopus saving sessions out of the History billing comparison, and estimate their Octopoints by @chalfontchubby in #6135
Bug fixes
- fix(predheat): correct setpoint fallback, hysteresis and history lookback by @anzimber in #5767
- fix(predheat): convert °F temperatures to °C on the way in, and publish in the user's unit by @chalfontchubby in #5958
- fix(predheat): publish unknown instead of 0 for heat_to_temp when heating is off by @Huyvux12 in #6134
- fix(predheat): allow the persisted volume temperature above 40 °C by @psweens in #6173
- fix(ha): retry Home Assistant API during Predbat startup by @anzimber in #5766
- fix(hass): log an unparseable apps.yaml to predbat.log with a !secret hint (#5530) by @springfall2008 in #5642
- fix(inverter): accept inverter_reserve_max as one value or a per-inverter list (#5369) by @chalfontchubby in #5651
- fix(inverter): ignore a battery_min_soc that names a reserve entity (#4013) by @chalfontchubby in #6137
- fix(inverter): learn the charge curve from soc_percent without rescaling by battery_scaling (#6183) by @chalfontchubby in #6184
- fix(prediction): a manual SoC target still costs something to miss at a 0p or negative rate (#5162) by @chalfontchubby in #6140
- fix(execute): let a Hold charging battery discharge to its target on inverters with no target SoC (#5937) by @chalfontchubby in #5959
- fix(sigenergy): use the plant's reported power ceiling when it is above the rating (#5784) by @chalfontchubby in #6180
- fix(sigenergy): hold the reserve with a zero discharge rate in Demand (#5358) by @chalfontchubby in #6164
- fix(sigenergy): send no commands when the plan cannot reach the component (#4894) by @chalfontchubby in #6167
- fix(deye): read PV power on models without TotalSolarPower (#5016) by @Zedas030 in #6066
- fix(growatt): release by clearing slots, back off unconfirmed writes, retry 105, open the export limit before exporting by @springfall2008 in #6177
- fix(gateway): publish timeline_sub so devices can tell holds from charging by @mgazza in #5916
- fix(gateway): hold set_read_only until the handover reset has written the safe state (#6175) by @springfall2008 in #6187
- fix(solar): hash the solar forecast cache key so long URLs fit the filename limit (#6161) by @springfall2008 in #6165
- fix(web): give older History days a daily stale-warning threshold by @chalfontchubby in #6128
- fix(history): take the standing charge off the row that starts at midnight by @chalfontchubby in #6129
Performance
- perf(memory): replace the requests library with an aiohttp-based helper by @springfall2008 in #6153
- perf(memory): cut ~7 MB of idle memory (state cache, temperature history, unittest.mock import) by @springfall2008 in #6152
- perf(mcp): sign MCP tokens with the standard library instead of PyJWT by @springfall2008 in #6176
Docs
- Correct and clarify Predheat documentation by @graememorgan in #6032
- docs(anker): add Marketplace install steps and drop stale watch_list entries by @springfall2008 in #6192
- docs(hanchu): leave import_today automatic when the EV charger is outside the meter by @upton68 in #6149
- docs(hanchu): move the hanchu-ess-ha bridge guide out of the Predbat docs by @upton68 in #6148
- docs(debug-journal): keep the Deye error-sentinel conjecture marked as suspected by @springfall2008 in #6179
- docs(debug-journal): fold the 2026-11-05..11-06 queue slice (15 candidates) by @springfall2008 in #6159
- docs(debug-journal): fold the 2026-11-03..11-05 queue slice (13 of 15 folded, 2 dropped); correct entries fixed by #5907/#6038/#6101/#6098; rewrite the Growatt section for the merged component by @springfall2008 in #6141
Maintenance
- refactor(givtcp): asynchronous REST client on one shared session by @springfall2008 in #6160
- refactor(components): Hanchu and Gateway use the shared on_component_loop hand-over by @springfall2008 in #6162
- ci: give every workflow job a timeout by @springfall2008 in #6191
- style(tests): apply black to test_savings_bookkeeping.py (code-quality red on main) by @chalfontchubby in #6186
- fix(tests): web auth test uses http_sync, not the removed requests library by @springfall2008 in #6163
- Ask for log files and an update up front: template note, triage skills and an attachment nudge by @chalfontchubby in #6166
- feat(triage): let the bot replay a reporter's log forwards from their debug yaml by @springfall2008 in #6168
New Contributors
- @Zedas030 made their first contribution in #6066
- @anzimber made their first contribution in #5766
- @pietrouk made their first contribution in #5677
Full Changelog: v9.7.10...v9.7.11