[1.5.0] - 2026-10-04
Added
- High Price Sale (#270, #237): a select (Off / Surplus only / Surplus + arbitrage) that sells stored energy into price peaks. Surplus only sells what the house won't need before tomorrow's solar refills the battery (needs an Energy-dashboard solar forecast, e.g. Solcast); Surplus + arbitrage also exports when the spread clears the Minimum arbitrage margin, which now governs both buying and selling.
- Price-aware discharge reserve (#273, #270, opt-in): keeps stored energy for the dearer hours that still need it, crediting only the PV the fleet can actually absorb, through to the next sunrise. Its status sensor lists every claim behind the reserve. Thanks to @syphernl.
- Price-aware solar surplus absorption (#237, #346, opt-in): lets PV surplus export while a clearly cheaper export window is still ahead, and charges in the cheapest hours instead. Adds an optional export price sensor. Thanks to @syphernl.
- Zonneplan dynamic pricing, with an opt-in export bonus (zonnebonus): €0.02/kWh plus 10% on the export price curve. Thanks to @hprax and @JonavdBrink.
- Mixed-fleet charging (#335): each battery's charge share follows the room it has left, so all of them aim at one finish time. Charge order follows the day, and a new
Charge priorityselect can override it. Thanks to @sphings79. - Primary battery and demand feedforward (#335, opt-in): for installations where a second regulator shares the meter.
- Excluded devices can claim part of the solar forecast (#341): point an excluded device (e.g. an evcc charger) at a remaining-demand sensor, optionally gated by a presence entity, and predictive charging reserves that share of the sun. Thanks to @syphernl.
- Predictive charging re-plans when the solar forecast moves by 1.5 kWh or more (Dynamic Pricing and Time Slot), and when tomorrow's prices are published. Thanks to @syphernl.
- Excluded devices no longer push grid import above the contracted power: when an excluded load alone would exceed "Maximum contracted power", the battery covers the excess. Always on.
omnibattery.exclude_consumption_daysaction (#427): keeps whole days (last 35) out of the learned consumption.- New energy-flow diagram drawn on the house's cables, now the default; the old one is one click away. EV chargers get their own cable via the new EV charger option on excluded devices.
- Per-pack cell voltage on Venus A/D (#439): Cell Delta now follows the worst pack and names it; 14 per-pack sensors ship disabled. Thanks to @FrankieV040.
- "Reached through an RS485 gateway" option for Marstek (#411): drops the inter-message wait to 30 ms (v3 poll cycle 1.9 s → 0.7 s). Thanks to @ShockWaveFlash.
- Remove any battery from the options flow (Batteries → Remove a battery), including its device and entities.
- Zendure SolarFlow 3000 Mix AC+ (#432, #242): own profile with a 3000 W envelope. Thanks to @HenriMatthijssen and @SnarfW.
- Anker battery state of health (SoH) from register 10015. Thanks to @wouterbouvy.
- Dashboard: "Advanced settings" toggle hides the predictive-charging fine-tuning sliders, and a lock button on the Control tab freezes every control so a phone scroll can't change a setting.
Changed
- Predictive-charging setup forms now only ask for sensors (Dynamic Pricing: 21 fields → 5); every setting lives on the Control tab, where changing it no longer reloads the integration. The predictive-charging card is split into groups, one per feature.
- "Predictive grid charge margin (%)" removed; the kWh solar safety margin does that job and defaults to 5% of battery capacity on new installs. A migration deletes the entity, so update automations that used it.
dp_price_discharge_controlandrt_price_discharge_controlmerged intoprice_discharge_control(#270); the active entity keeps itsentity_idand state.- "Pre-discharge export limit" slider removed: pre-discharge uses the fleet's discharge power limit.
- Pre-discharge reserve SOC defaults to 20% (was 0%); a value you had set is kept.
- Marstek block reads cover every adjacent register (#361): Venus D fast poll 15 → 11 requests.
- Dashboard health rows are entity-driven: no more empty placeholders for readings a battery doesn't provide. Thanks to @wouterbouvy.
- Hourly Balance Target and Deadband sliders move in 0.05 kWh steps (was 0.1).
Fixed
- Predictive charging covers the night through to sunrise (#410, #344): every planning layer stopped at midnight, so the battery reached the morning peak empty.
- Time Slot windows are read again (#447):
HH:MM:SSwindows were discarded, so Time Slot never got a chronological plan. Thanks to @tkarsk. - Dynamic Pricing no longer books dearer slots after a morning SOC drop (#472). Thanks to @benediktarnold.
- Dynamic Pricing no longer re-buys the same deficit across closely following slots (#518).
- A battery past its predictive target keeps absorbing solar surplus (#470). Thanks to @RobtoCopter.
- Predictive charging plans against the peak shaving limit (#502). Thanks to @alainsch.
- Peak shaving holding the battery overnight no longer triggers a phantom minimum-SOC grid charge; fleet-wide no-discharge slots are projected the same way.
- Guaranteed minimum SOC: charges in one go instead of short bursts all night, and a battery already below the floor charges instead of reporting "no energy quota". Thanks to @ssorgatem.
- The weekly full charge completes without sun (#404, #489): the gap to 100% enters the energy balance and a cheap slot after sunset is reserved.
- A Time Slot SOC ceiling holds during predictive charging.
- Predictive charging re-plans when you change max SOC, the floor or a margin; the Re-evaluate button now also exists in Time Slot.
- A forecast that publishes late no longer books a full day of grid charging or disables Charge Delay (#457). Thanks to @schraller.
- Charge Delay leaves enough time for the slowest battery in a mixed fleet (#498), and no longer loads the CPU (#421, #511). Thanks to @sphings79 and @syphernl.
- Charge Delay Status keeps
energy_needed_kwhwhile holding (PR#488). Thanks to @syphernl. - Overcast days no longer reset a mature solar profile.
- Sunrise and solar noon match the almanac (#410, #516). Thanks to @syphernl.
- Re-evaluate no longer fails with a template-recalculated Nordpool sensor.
- A Modbus dropout no longer inflates the learned consumption (#427). Thanks to @dannyverk-byte.
- Vacation mode no longer freezes Home Assistant (#499).
- A battery charging from its own panels no longer refuses to discharge or gets excluded (#399, #366). Thanks to @TheOops and @foretbruno-design.
- Batteries are no longer excluded as
non_deliveryfor normal behaviour: brief 0 W dips while cycling, a top-of-charge taper (#525) or a full battery's stale Repair (#524). Thanks to @sphings79. - A BMS that cuts off below 100% while flapping Charge ↔ Standby is recognised as full.
- A battery stuck not delivering, a silent grid meter or an unreadable phase sensor now raise Repairs (#452, #451). Thanks to @mhjansen79 and @janruehle-spec.
- Losing a phase sensor no longer raises the current on that phase (#451). Thanks to @mhjansen79.
- Phase-sensor events respect the control-cycle pacing, so a fast P1 no longer floods slow bridges (#452).
- Minimum relay time no longer holds a battery at minimum power forever.
- A frozen ESPHome bridge is no longer mistaken for a working one (#452). Thanks to @mhjansen79.
- Backup Function no longer keeps a Venus excluded while the grid is present (#540): in Bypass a load on the backup port read as an outage; the port now counts as idle while the inverter reports Bypass. Thanks to @sphings79.
- LilyGo/ESPHome: Backup Function releases the battery (#534): reads AC Offgrid Power (32302); the docs give the YAML block to add. Thanks to @Reinvented0.
- A manual forced charge/discharge survives a Modbus stall (#477). Thanks to @Remueb.
- A Marstek that accepts the connection but answers nothing no longer defeats the back-off (#445). Thanks to @TheGoodHubs.
- A Venus D no longer loses a reply every five minutes (#503), and v3/A/D no longer wait out a timeout on unimplemented registers. Thanks to @sphings79.
- A refused Marstek block read falls back to per-register reads instead of dropping them silently (#501). Thanks to @sphings79.
- Venus A/D multi-pack: charge taper waits for the least full pack (#415), the discharge floor follows the first pack to empty (#350), a seventh pack slot is probed (#415), and packs added or removed at runtime are picked up without a reload (#526). Thanks to @sphings79.
- A Marstek reporting a 0 W power ceiling after restart no longer locks itself out (#380), and native daily counters no longer zero the system energy totals (#380). Thanks to @sphings79.
- A battery switched off at start-up no longer takes the system down (#403). Thanks to @syphernl.
- Huawei: "no data" markers no longer reach the control loop, the real 5% discharge floor is reachable, and the array is no longer curtailed under sun (#381). Thanks to @sphings79.
- Anker E5000 with a CT meter no longer caps fleet discharge (#468).
- A Hoymiles HiBattery 4020 X reports its own solar production (#467). Thanks to @TheOops.
- A Zendure charging from its own panels no longer skews Home Consumption (#453). Thanks to @adonix31.
- System SOC no longer goes unknown on a Zendure or Sessy fleet (#438). Thanks to @Casantos75.
- A power limit raised in the vendor app reaches the system sliders (#449). Thanks to @jfhautenauven.
- Re-saving the sensors options no longer wipes a configured solar or off-grid sensor (#419). Thanks to @sincze.
- Configuration forms keep what you entered after a validation error. Thanks to @JonavdBrink.
- Guaranteed minimum SOC help text no longer promises "0 = off" (#422).
- Daily timeline: respects the charge hysteresis, keeps hourly-balance history when the feature is off, explains a flat afternoon forecast, and updates faster (#409).
- Sessy and Hoymiles battery pages show the configured capacity, and the MAC-tracking fields are translated.