[1.6.0b1] - 2026-11-05
Added
- Dynamic Pricing: plans across tomorrow once its prices are published (#710): the charge planner now looks up to the sunrise after tomorrow when tomorrow's prices and a dated solar forecast (Energy dashboard) are available, so tonight's slots are weighed against tomorrow's solar and evening peak and tomorrow's cheap slots can replace overbuying tonight. Only slots before the next sunrise are scheduled; the rest is planned again at the next daily evaluation. Without either input nothing changes.
- Frank Energie (NL) price source (PR#696): import and export price curves from the Frank Energie HACS integration, hourly or quarter-hourly. Thanks to @GruttePier013.
- EnergyZero (NL) price source (PR#705): import and export price curves from the official EnergyZero integration (
energyzero.get_energy_prices), market or all-in, hourly or quarter-hourly, picked from the selected sensor. Thanks to @mhspelt. - Repairs warning when Recorder excludes the sensors used to recover forecast history (Home Consumption, solar production, excluded-device power). Thanks to @thomasvt1.
Changed
- Discharge reserve: the solar credit follows the forecast provider's hourly curve (#754): the reserve spread the solar forecast over a sine from the astronomical sunrise, as if the horizon were flat, while predictive charging already used the provider's dated periods. Where the provider has them (the sensor's own, or the Energy dashboard forecast from Solcast, Forecast.Solar, Open-Meteo...), each day's solar is now split hour by hour as the provider expects it: a late morning behind a hill, the low winter sun, the provider's damping. The day's total is unchanged, and the sine stays wherever the periods do not cover the day. Thanks to @anorakophobia.
- Device registry lookups use the per-entry API on HA 2026.10+, avoiding the
async_get_devicedeprecation. Thanks to @tkaspersNL. - Manifest no longer lists
pyserial: Home Assistant ships it, and hassfest now rejects it. Modbus RTU is unaffected.
Fixed
- Predictive charging slot ended when every battery dropped off Modbus (#623): batteries excluded as non-responsive (e.g. EMS V150 stalls) left an empty pool that was read as "target reached", so the slot stopped and never resumed. The slot is now held and charging resumes when a battery is back. Thanks to @khh-dot.
- Dynamic Pricing: arbitrage ceiling counted peaks that were already over (#649): one ceiling for the whole horizon let an evening peak justify night charging that comes after it, and the plan was dropped when that peak left the horizon. Each slot is now valued only against the slots that follow it; Guaranteed Minimum SOC energy still uses Max Price Threshold (Charge) as its cap.
- PD Min Cycle Interval / No-PD Command Delay ignored by the 2 s safety timer (#654): with a fast meter the timer sent a new command almost every tick, so batteries that dislike fast changes (Anker) still got one every 1-3 s. Ticks inside the window now keep the last command; safety checks still act at once. PD Min Cycle Interval now goes up to 5 s. Thanks to @principis and @tkaspersNL.
- Predictive charging bought night energy the midday solar then exported (#704): the plan sized the grid charge from the day balance without checking that the battery could still hold it under the solar peak, so on sunny days part of it was clipped at full and exported. The planner now charges only what the forecast says the battery can keep; Guaranteed Minimum SOC energy is exempt. Thanks to @Wassman2020.
- Battery at ≤ 20% SOC left in Standby after a short AC interruption (#720): a discharge that delivered nothing at low SOC was always taken as a BMS cutoff, so a battery stuck in Standby was never woken; it now gets the one-shot standby wake (fresh reconnect) first and is only treated as cut off if it still delivers nothing. Thanks to @ShockWaveFlash.
- Overview: available power counted Anker batteries twice (#716): the overview summed both the hardware-limit sensor and the max charge/discharge setting of each Anker battery, so one 3.5 kW unit showed "7.00 kW available"; it now counts one value per battery (the lower of the two). Thanks to @EDplusED.
- Dynamic Pricing: estimated cost counted every slot at full charge power (#715): the notification's estimated cost and average price now use the energy planned per slot (Weekly Full Charge slots included) plus charging losses, so slots without an allocation no longer inflate them. Thanks to @arno-millenaar and @tkaspersNL.
- Dynamic Pricing: Guaranteed Minimum SOC lifted the arbitrage margin off the whole plan (#724): with the floor active, every deficit kWh could be bought above the margin, up to the evening peak. Now only the floor's own energy skips it (still capped by Max Price Threshold (Charge)). Thanks to @locmer and @Varashi.
- Discharge reserve: the floor slid down with the SOC while PV credit was left (#700): when dearer-hour demand exceeded the stored energy, the claims equalled the stored energy and the PV credit came off that, so the reserve was always just under the SOC and never held anything. The claims now run against the stored energy plus the solar the battery can still take, and the reserve is capped at what is stored. When the sun covers all demand the battery is still released. Thanks to @MarkB-HA.
- Discharge reserve: a battery whose stored energy is all reserved could still discharge one step: the reserved floor is then exactly the SOC, and float rounding put it just below a whole-percent SOC in about 2% of cases (5 + 22.999999999999996 against 28), so the battery was not held until it dropped another percent. The comparison now allows for the rounding.
- Discharge reserve: the horizon jumped to the next day's sunrise at midnight (#725): the reserve then planned for the coming evening instead of the slots before this morning's sunrise, and counted that day's solar forecast as credit against it, so the battery was no longer held for a price peak at 06:00. Between midnight and sunrise the horizon now stays on this morning's sunrise, as documented; it moves on to the next sunrise once the sun is up.
- Discharge reserve: the morning lost its reserve at sunrise while the house still ran on the battery: PV starts at sunrise but carries the house only hours later, and the dearest import of the morning often falls in between. The morning's horizon now ends at the first slot where forecast PV meets the load, in that slot and over the hour it starts; a day the sun never covers the house keeps the evening in the plan, and once it has covered the house a later forecast dip no longer pulls the horizon back to the morning. The sun is also read over the whole day, so a remaining-today forecast no longer lands in full on the sunrise slot after midnight, which then lost its claim.
- Daily Operation timeline: weekly full charge day projected to Max SOC (PR#680): the projection capped the battery at the configured Max SOC while the planner charges to 100% on the weekly full charge day, so the timeline showed the battery stopping short. It now uses the same 100% ceiling until the weekly charge completes, and the next-day extension shown the evening before already charges to 100% from midnight. Thanks to @syphernl.
- Dynamic Pricing: evening recharge booked the evening price peak (#721): the evening re-evaluation never applied the Minimum Arbitrage Margin, so without a static Max Price Threshold (Charge) it had no price limit at all and could grid-charge at the most expensive hours of the day while cheaper night hours followed. It now uses the same effective ceiling as the main evaluation uses for deficit charging (static threshold or arbitrage ceiling, whichever is stricter), including for a weekly full charge top-up. The exception, as in the main evaluation, is when Guaranteed Minimum SOC is the binding requirement (a battery under its floor band, with a floor gap larger than the remaining deficit): only the floor energy then skips the margin (#724). Thanks to @Nieass.
- Dynamic Pricing: running slot stuck after a re-plan that selects nothing (#642): a re-plan that found no slots cleared the schedule but left the running slot active, so the battery stayed in
grid_chargingat full SOC and never discharged until predictive charging was switched off. The slot is now released in the same cycle and normal PD control takes over. Thanks to @syphernl. - Discharge reserve: with several batteries, only some were held (#700): the reserve was one percentage of the fleet's capacity, applied above each battery's floor. With batteries at different charge levels, floors or sizes, that floor sat below the fuller battery and above the emptier one, so the fuller one kept discharging and the fleet's usable energy, and with it the floor, followed it down. Each battery now keeps the same share of what it holds above its own floor, so the fleet keeps exactly the reserve and every battery is held at the same moment. The status shows each battery's share as
battery_reserve_soc_pct. Thanks to @Edidotc. - Chronological planning on the autumn DST change (PR#679, #678): every plan whose horizon crossed the repeated 02:00 hour fell back with "energy interval end must be after start", so Daily Operation showed no plan for the whole day before the change. Quarter-hour boundaries now carry a fixed UTC offset, so the repeated hour sorts after its first pass and the quarter across the skipped spring hour lasts 15 minutes instead of 75. Thanks to @syphernl.
- Anker Solarbank 4: System Battery Cell Power counted solar twice (#738): the sensor and the dashboard's Charge/Discharge blocks added the solar input on top of the battery pack power, which already includes it, so they now show the real charge power. The Daily Operation diary no longer counts it twice either. Thanks to @Hellsing.
- Battery form capped Min SOC at 30% on v3/vA/vD (PR#741, #707): saving the form lowered a higher Min SOC set on the SOC limit entity (up to 50%). The form now offers the same range as that entity; v2 keeps 30%, its hardware register limit. Thanks to @amys94fr.
- Battery form capped Max SOC at 80% on v3/vA/vD (PR#756): saving the form raised a lower Max SOC set on the SOC limit entity (down to 50%). The form now offers the same range as that entity; v2 and other brands keep 80%. Thanks to @amys94fr.
- Grid sensor dead: automatic control now stops: after 5 min without a valid grid reading (frozen, unavailable or never reported since restart), automatic batteries go to 0 W until it returns, with a Repair explaining why. Thanks to @tkaspersNL.
- Dynamic Pricing: a slot still running at midnight never stopped: the new-day reset left grid charging on; it now stops the slot (a slot continuing past 00:00 restarts). Thanks to @StalkersGlue.
- Dynamic Pricing: an extra re-evaluation just after midnight (PR#749): at 00:00 the solar sensor's new-day total read as a forecast revision, so a re-evaluation (and its notification) ran 5 min before the daily one. 00:00 to 00:05 is now left to the daily evaluation. Thanks to @anorakophobia.
- Slow-starting battery stuck at 99% or excluded: BMS cutoff detection waits out the engage grace, charge hysteresis remembers the Max SOC it latched under, and a big power step restarts the engage grace. Thanks to @tkaspersNL.
- Full battery got a "not delivering power" Repair after a direction switch: the non-delivery reason now survives a charge/discharge flip, so the full-battery check ends the episode. Thanks to @tkaspersNL.
- "Not delivering power" Repair pointed HTTP/MQTT batteries at Modbus: the advice now says "the battery itself or its connection". Thanks to @tkaspersNL.
- PD Quality showed "Sluggish" while the grid sat on target: time inside the deadband now counts. Thanks to @tkaspersNL.
- PD safety timer delayed meter updates by up to 2 s: a tick that only keeps the last command no longer restarts PD Min Cycle Interval. Thanks to @tkaspersNL.
- Backup Function: Bypass with load on the backup port stuck in cooldown (#660): per-key poll times are now published together with the data. Thanks to @pando85.
- Configure turned off MAC tracking of an existing battery. Thanks to @tkaspersNL.
- Panel: Net balance showed a green "+0.00 kWh" while hourly balance was off: it now shows "Disabled". Thanks to @tkaspersNL.
- Zendure/Hoymiles: 0 kWh capacity failed to save (#675): 0 now means automatic detection (Zendure from its packs); a positive value still overrides it. Thanks to @thomasvt1.
- Panel: daily-operation tooltip showed "Source" twice for unmeasured quarters. Thanks to @tkaspersNL.
- Chronological plan counted all solar as battery charge in no-discharge slots (#616): in fleet-wide no-discharge time slots and price-blocked discharge hours, the projection now credits only the solar left after household load, so the projected SOC is no longer overstated and needed grid charging is planned. Thanks to @iwanvandaele.
- Solar timeline: next-day forecast periods caused a false provider_gap (#752): the overnight gap before tomorrow's forecast was counted as a gap in today's daylight, so a complete provider forecast was rejected and the sinusoidal curve used instead; only gaps inside the daylight window are now checked. Thanks to @Hellsing.
- Time Slot: Manual mode with both charge and discharge allowed (#614): the form now rejects it. Such a slot silently fell back to PD and never forced the configured power. Thanks to @UsiuO.