github springfall2008/batpred v9.7.5
Sigenergy car holds and full discharge rate, Teslemetry freezes above 80%, multi-inverter calibration fix

one hour ago

What's Changed

This release makes car and iBoost holds work on Sigenergy Cloud, and lets Sigenergy export at the battery modules' full discharge rating. A Powerwall freeze above 80% no longer fills the battery to 100%. On systems with more than one inverter, the others no longer keep charging or exporting while one calibrates. GivTCP REST now reads the export limit from the inverter, and Deye retries control orders the device rejected.

Fixes

  • Sigenergy: car and iBoost holds now hold the battery. On Sigenergy Cloud, "Hold for car" and the iBoost discharge hold did nothing: the battery kept discharging into the car while Predbat reported the hold as applied. A hold now sends self-consumption with charging power pinned to 0, which holds the SoC flat. Behaviour change: while a car or iBoost hold is active, surplus PV won't charge the battery, because the Sigenergy API can't block discharge on its own. During a car charge that surplus mostly goes to the car anyway. Not yet confirmed on a real plant. @springfall2008 in #6047
  • Sigenergy: discharge and export use the modules' discharge rating. Predbat used the modules' charge rating for both directions. Sigenergy modules discharge faster than they charge, so a 10 kW inverter with two 8 kWh modules was planned and commanded at 8.4 kW on export instead of 9.6 kW. New sensors battery_charge_rate_max and battery_discharge_rate_max set the charge and discharge limits separately. Both are still capped at the inverter rating, and an inverter_limit_charge / inverter_limit_discharge set in apps.yaml still wins. Charging is unchanged. Not yet confirmed on a real plant. @springfall2008 in #6054
  • Teslemetry: a freeze above 80% holds at 80% with short top-ups, instead of filling to 100%. Powerwall firmware since 25.18.4 only accepts a backup reserve of 0–80% or exactly 100%, and a 100% reserve charges from the grid. Predbat rounded a freeze at 81–99% up to 100%, so the Powerwall charged itself to full while Predbat reported Freeze charging. A hold at 81–96% now sets an 80% reserve and lets the battery cover the house. When the SoC falls more than 3% below the hold level, Predbat tops it back up. A hold at 97% or more still uses 100%. In simulation an 86% freeze now drew 0.63 kWh from the grid instead of 1.9 kWh. The hold survives a restart. A hold for the car still uses 100% above 80%, so the battery doesn't feed the car. Not yet tested on a live Powerwall. @springfall2008 in #6050, fixes #6046
  • Multi-inverter systems: while one inverter calibrates, the others stop charging and exporting. Previously, inverters handled before the calibrating one kept the charge or export this cycle's plan gave them. Calibration also sets full rates and reserve 0, so one could grid charge or force export at full rate for hours. Now no inverter is given the plan during calibration. Any charge or export on the non-calibrating inverters is cancelled, and the calibrating inverter is left to its firmware. Single-inverter systems behave as before. In practice this affects GivEnergy fleets, the only integration that reports calibration. A car or iBoost hold on another inverter is also dropped during calibration. @chalfontchubby in #5858
  • Deye: a control order the device rejects is sent again. Predbat counted an order as applied whenever the poll itself succeeded, even when the device had rejected the order (status 500). It then skipped re-writing an "unchanged" control while the battery drained. A rejected order is now logged as a warning and sent again in the same cycle. @springfall2008 in #6036, fixes #6017
  • Deye: sensors carry the Home Assistant classes the Energy dashboard needs. SoC, power, temperature and the daily energy counters now have a unit, device_class and state_class. The daily counters are now total_increasing, where they were measurement. Home Assistant may raise a one-off repair on upgrade saying the state class changed. That is expected. @springfall2008 in #6053, addresses #6045
  • Octopus: BOOST and bump-charge car slots are split at tariff boundaries. A boost that started in a free or off-peak band kept that rate for the whole dispatch. So every half hour after the boundary showed a 0.00p car rate while the house was already on peak. These slots are now split and priced at the tariff like a charger schedule. This fixes the plan display and the cost accounting. It doesn't change the plan. @Huyvux12 in #6051, fixes #6048
  • Predheat: volume_temp is now read from the predheat section of the configuration. @graememorgan in #6038
  • Web interface: on narrow windows the Internals Browser thread rows now stay inside their box. @springfall2008 in #5968, fixes #5967
  • Plan HTML: a 0% manual SoC maximum now shows its ⬇ marker. @springfall2008 in #6039

New features

  • GivTCP REST: the export limit is read from the inverter. A new sensor.predbat_givtcp_<n>_export_limit (W) publishes the inverter's export limit. It sets export_limit automatically when every inverter reports one. An export_limit already in apps.yaml still wins, and the log notes it once if it differs from the inverter's figure. GivTCP v2 and three-phase inverters don't report the limit, so nothing changes for them. @springfall2008 in #6035

Documentation

  • Home Assistant 2026.11 Marketplace. From 2026.11, HACS is built in as the Marketplace and can no longer be installed separately. Every install step now has a Marketplace version alongside the HACS steps for 2026.10 and older. The deprecated AppDaemon method notes that the Marketplace no longer updates AppDaemon apps. @springfall2008 in #6041, fixes #6040
  • iBoost section rewritten for clarity and consistency, with defaults shown the same way throughout. iboost_on_export and iboost_prevent_discharge have moved into the basic configuration. @llbbdd in #5922
  • Plan card: the legend now explains the weather alert (⚠), manual SoC target (✎) and manual SoC maximum (⬇) symbols on the SoC % cell. @springfall2008 in #6039, fixes #6037

For developers

  • Components get HTTP sessions and MQTT clients from the component base. ComponentBase.http_session() and mqtt_client() can be overridden per instance, so two Predbat instances in one process, or a test, can each supply their own. Methods that write to a device are marked with @writes. Sigenergy, the gateway and Enphase also use a per-instance clock. Default behaviour is unchanged. @mgazza in #5920 and #5963
    • This also fixes timers in Sigenergy and the gateway that ran on wall-clock time. A clock change could suppress a repeated Sigenergy battery command for about an hour, or stretch the gateway's staleness and retry windows. They now use the monotonic clock.
  • Debug journal updated with the 30–31 October triage findings. @springfall2008 in #6043

New Contributors

Full Changelog: v9.7.4...v9.7.5

Don't miss a new batpred release

NewReleases is sending notifications on new releases.