Skip to content

release: v10.1.0 - #674

Merged
johanzander merged 1 commit into
mainfrom
release-10.1.0
Aug 22, 2026
Merged

release: v10.1.0#674
johanzander merged 1 commit into
mainfrom
release-10.1.0

Conversation

@johanzander

Copy link
Copy Markdown
Owner

[10.1.0] - 2026-08-22

Added

  • Optional PV export-limit curtailment on negative sell prices — when enabled and a period is exporting at a sell price below a configurable floor, Growatt GEN2/GEN3/GEN4 hardware (via solax_modbus, with a grid CT/smart meter) now throttles PV production at the panel instead of paying to export. Off by default. (#269)
  • Inverter service domain is now configurable — a compatible integration exposing the same TOU services under its own domain works as a setting instead of needing a new BESS platform. (#412)
  • Grid connection import capacity modeling — the DP now caps planned grid import at the house's fuse limit instead of planning unbounded imports, gated on power_monitoring_enabled. (#429)
  • Solis inverter platform (solis_modbus) is now stable — confirmed working against real Solis installations by two beta testers, no longer marked experimental. (#130)
  • ENTSO-e / Belpex price provider is now stable — confirmed working against a real Belgian Belpex/Luminus Dynamic contract over an extended live-test period, no longer marked experimental. (#126)

Changed

  • Huawei LUNA2000 no longer rewrites TOU periods the battery already holds — BESS reads the programmed periods back and skips the write when they match, sparing needless flash wear. (#431)
  • Finer battery optimization grid — the DP's state/action resolution is halved (0.1 kW / 0.025 kWh), recovering 2.43 SEK/day of savings across the benchmark corpus while reducing solve time. (#512)
  • Debug bundles are several times smaller — prediction snapshots now record only the periods whose plan changed, in a compact encoding, instead of rewriting the whole forecast each run. (#555)

Fixed

  • A brief Nordpool hiccup no longer produces a daily "recovered from an earlier issue" notice — the health check re-fetched today's prices every five minutes instead of using the ones already held. (#662)
  • Growatt VPP now lets the inverter and BMS sleep through a long idle at minimum SoC — an empty battery was still held under continuous remote control, which nothing was protecting. (#592)
  • A tiny solar surplus is no longer planned as an export the inverter will absorb — below the export the plan can express, the battery charged anyway and ran fuller than planned, spilling the difference later. (#630)
  • The setup wizard no longer locks you out of an inverter platform it failed to auto-detect — every platform stays selectable, and a re-scan keeps the one you picked. (#621)
  • System no longer gets stuck on "initializing" when many consecutive periods are near-tied — a long run of volatile prices could make every hourly optimization fail, leaving no schedule at all. (#624)
  • Grid charging now reaches the planned amount instead of stopping just short — the charge rate is written as a whole percent, and rounding it down meant the battery charged slightly less than the plan counted on.
  • Growatt VPP no longer briefly executes the previous period's power command when switching modes — enabling remote control commits immediately, so the power target is now written before it, and cleared on release. (#593)
  • The battery now covers house load exactly instead of exporting a few Wh and committing the inverter — a period whose load fell between two discharge steps was planned as a small export, which forces grid_first at a fixed rate and imports any load spike. (#352)
  • Huawei, native SolaX and Solis installs no longer report a discharge as negative charging, or an export as negative import — the signed battery/grid sensor split now works on settings saved before the sensor pairing existed, with no wizard re-run. (#604)
  • The battery schedule no longer varies between otherwise identical runs — when two plans were worth exactly the same, the optimizer picked between them on floating-point noise, so the same day could plan differently on different machines. (#606)
  • Growatt MIN TOU segments are now written to the inverter only once they are about to take effect, roughly halving inverter writes: a segment hours away no longer gets rewritten every time the plan shifts around a marginal period. (#554)
  • A running Growatt MIN TOU segment's end is no longer rewritten hours before the change matters — nudging a live window's end waited on nothing, so it was written immediately even when the difference was hours away. (#589)
  • A running Growatt MIN TOU segment is no longer rewritten every 15 minutes — its start time was being truncated forward each cycle, so an unchanged two-hour window cost 16 inverter writes instead of 2. (#554)
  • A temporary Nordpool outage no longer tells you to fix your configuration — the health check now reports the price source as temporarily unavailable, and the expected daily "tomorrow's prices not published yet" call no longer counts as a runtime failure. (#583)
  • SolaX (native), Solis, Huawei and Growatt SPH no longer get a plan their hardware can't deliver — the optimizer's exact-load-cover action assumes the inverter throttles a discharge to the real house load; it is now offered only on platforms that actually do that. Growatt (cloud and solax_modbus, both control modes) is unaffected. (#580)
  • Huawei solar production now comes from the PV input counter instead of the inverter's AC yield, which rose while the battery discharged — inflating reported house consumption and total savings. (#569)
  • Reported lifetime house consumption is now correct on SolaX, Solis and Huawei, which have no load register — it previously overstated load by the battery's lifetime net charge. (#528)
  • A missing consumption sensor no longer leaves the dashboard stuck on "Initializing" — with the sensor strategy selected and no 48h_avg_grid_import entity, the health check now reports a critical error, that strategy can't be selected without its sensor, and new installs default to fixed. (#558)
  • The setup wizard no longer completes with a configuration that cannot work — it now blocks on inverter sensors whose Home Assistant entity is disabled (naming them so you can enable them) and on a price provider that isn't configured, instead of reporting "SYSTEM DEGRADED" afterwards. (#549)
  • Growatt MIN TOU segments are now written against the inverter's real state, ending repeated "500 Server Error" write failures and leaving no unplanned segments running on the battery. (#551)
  • House load spikes during a battery-supported period are now covered from the battery instead of the grid, on TOU/register platforms, whenever the stored energy is worth less than importing at that moment (buy_price × discharge_efficiency ≥ shadow_price, decided by the optimizer). When the battery is genuinely being reserved for a pricier later period the reserve is still protected and the spike is imported. (#520)
  • Near-tied battery decisions now prefer the fullest load-covering discharge even when the tie surfaces at a partial cover, closing a gap where residual import stayed exposed to consumption spikes. (#512)
  • Sub-period battery discharge is no longer permitted on an uncomputed value — the ceiling opened whenever the battery sat at its reserve floor, where no marginal value exists. (#526)
  • Isolated periods no longer import from a battery with charge to spare — the discharge gate priced stored energy from the wrong point on its value curve, occasionally holding for one period while the periods either side discharged. (#571)
  • Health checks for Battery Control, Battery Monitoring, and Energy Monitoring now report ERROR instead of OK when a required sensor is entirely unmapped, not just when it's unavailable.
  • Huawei TOU writes no longer fail on installs with no working-mode select (e.g. behind an EMMA energy manager); the health check reports this explicitly. (#412)
  • Editing the Huawei battery Device ID in Settings now saves to the inverter section and applies without a restart, instead of being written to the Growatt section.
  • The Savings chart's bars could flicker invisible in Safari, especially with many thin bars (e.g. quarter-hourly resolution) — Safari fails to reliably anti-alias sub-pixel-width SVG shapes. Bars now use a fixed minimum width so they stay visible regardless of window size.
  • Growatt VPP-mode IDLE periods no longer drain the battery for house self-consumption overnight — IDLE now holds the battery via battery_first instead of falling back to native self-use. (#466)
  • Near-tied IDLE vs battery-powering decisions now resolve to powering the house (fail-safe when consumption exceeds forecast) instead of IDLE, which hard-disables discharge at the inverter. Deliberate energy-holding periods (genuine arbitrage) are unaffected. (#466)
  • Sunrise and sunset periods where solar nearly covers the house no longer sit IDLE and import the small remainder from the grid — the battery now serves it. (#466)
  • Huawei LUNA2000 installs now auto-discover lifetime solar/battery energy sensors, fixing a false "SYSTEM DEGRADED" health check and zero-valued savings graphs. (#471)
  • Local E2E verification for Growatt VPP scenarios now completes a full schedule build instead of failing partway through. (#469)
  • Predicted savings no longer include export revenue the inverter cannot earn — the optimizer stopped planning discharges the hardware would silently throttle, so predicted and actual results now agree. (#497)
  • Solis installs now auto-configure grid export power, derived from the same signed sensor as import power. Previously export power was always unconfigured. (#475)
  • Native SolaX and Huawei installs now auto-configure battery discharge power, derived from the same signed sensor as charge power, instead of needing hand-built template sensors. (#542)
  • Phase current sensors on a Huawei smart meter are now auto-detected — meter-side Phase A/B/C current naming is recognised alongside current_l1/l2/l3, so fuse protection no longer needs manual entry. (#120)
  • Phase currents are now always taken from a single device — a sub-circuit meter (heat pump, EV charger) could supply some phases and the grid meter the rest, giving a house current measured at no one point. The house feed is preferred over a sub-circuit, and a complete three-phase set over a partial one. (#120)
  • Huawei LUNA2000 installs now auto-discover all sensors (SOC, battery control, power monitoring) instead of requiring manual entity entry for every field, and gain real-time solar/grid power monitoring. (#438)
  • Growatt VPP Remote Control no longer keeps overriding the inverter after switching away from VPP mode — switching control mode to TOU, or switching to a different inverter platform entirely, now disables the VPP override automatically. (#479)
  • Dashboard timeline no longer shows a stale intent (e.g. "Selling to Grid") for an elapsed hour that actually executed differently — the color bar now always reflects true per-quarter data. (#486)
  • Near-tied grid-DP decisions could resolve to a suboptimal schedule — those windows are now re-solved exactly with a windowed piecewise-linear solver instead of relying on the fast DP's approximation alone. (#450)
  • The schedule table showed SOLAR_STORAGE/GRID_CHARGING/LOAD_SUPPORT labels with the kWh amount hidden as "--" for small-but-real periods (0.01–0.1 kWh) — the frontend's display threshold is now aligned with the backend's classification threshold. (#484)
  • Power monitoring could be enabled without the phase-current sensors it needs, crash-looping the schedule updater while the health check reported "OK" — enabling it now requires those sensors to be mapped, at the settings UI, setup wizard, and API layers, and the health check flags the gap if it occurs anyway. (#492)
  • Dashboard could crash with "Minified React error Wrote tou while running vpp #310" during a background data refresh — the timeline's tooltip state hook was declared after two conditional early returns, changing the number of hooks called between renders.
  • Planned PV curtailment is now shown as "Curtailed" across the dashboard's schedule, timeline, and status views, instead of looking like a profitable Solar Export. (#501)
  • "-0.00" no longer displays for values that round to zero — e.g. a curtailed period's export revenue now shows as "0.00".
  • Reported cost and savings no longer include a phantom charge for periods that will actually be curtailed at runtime by PV export-limit curtailment. (#502)
  • Growatt VPP installs with AC charging disabled at the inverter now get it re-enabled on restart — an inverter reporting VPP Status enabled but AC charging disabled was treated as fully configured, so planned grid-charging periods silently drew nothing from the grid. Each of the two registers is now checked and repaired on its own, so a drifted one is fixed without rewriting the healthy one. (#539)
  • With PV export-limit curtailment enabled, the battery now fills from below-floor surplus solar instead of deferring the charge — the sell-price floor makes every below-floor export worth exactly 0 to the optimizer, so charge-now and curtail-now tied on float noise and the deferred pick clipped PV to house load while multi-kWh of battery headroom sat unused. (#510)
  • The consumption forecast now refreshes intraday like solar already does, instead of caching stale data until the 23:55 job. (#395)
  • Inverter schedule display no longer shows a fictional TOU mode label for VPP/period-list-controlled installs. (#415)
  • A silently dropped quarterly schedule-update tick permanently lost a period's actuals with no trace it ever happened — the missed tick is now logged and surfaced as a runtime failure. (#403)
  • The "Enable Live Control" pre-flight dialog showed a green check for optional components that were genuinely failing (e.g. a misconfigured InfluxDB), not just ones left unconfigured. Those now show an amber warning — they still never block enabling live control.
  • Settings → Savings History silently displayed "0 days recorded" when the disk-usage request failed, and swallowed errors when clearing the history. Both now surface the actual error.

Removed

  • "Min Action Profit" setting — the DP optimizer stopped reading it when the profitability gate was replaced by pure backward induction (v10.0.0), but the field stayed in Settings → Battery and the setup wizard, still describing behaviour ("the optimizer skips cycles where the expected gain is below this value") that no longer happened. Removed from the UI, the settings schema, and the API. Existing configs are migrated automatically; no action needed.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@johanzander
johanzander merged commit 9739af5 into main Aug 22, 2026
8 checks passed
@johanzander
johanzander deleted the release-10.1.0 branch August 22, 2026 09:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant