With battery modes on, a day/night or fixed static_profile, no price feed and arbitrage off, tariff_refresh_wanted() was false: no tariff task, no tariff_plan, mode_runs None, so Leftover solar / Cheap hours never charged from the grid and the Batteries screen said "No prices". packmode.enabled(opts) is now a third term of the gate. With price_provider off the task is pure arithmetic on static_profile, so no HTTPS call is added. Also: version 0.19.1, CHANGELOG entry, DECISIONS note, test_tariff24.py, and a shorter tariff_refresh_wanted() docstring (history stays in DECISIONS). Co-Authored-By: Claude <noreply@anthropic.com>
2.0 KiB
TARIFF-24 - battery modes need the tariff task
Status: FIXED in 0.19.1 (hotfix from 0.19.0, owner go 2026-10-28).
Follows TARIFF-10 (fetching is not trading). Tests: test_tariff24.py.
The defect. The control cycle gets prices only from
Controller.tariff_plan, which only run_tariff_refresh() stores. amain()
starts that task when tariff_refresh_wanted(opts), which was
provider_configured(opts) or arbitrage.enabled(opts). Battery modes read the
plan but were not a term. With battery modes on, a day/night or fixed
static_profile, price_provider: off and arbitrage_enabled: false (the
site trade switch is not read with modes on) no task ran. Then
fresh_tariff_plan() was None, _price_runs() was None and mode_runs was
None, so Leftover solar and Cheap hours never charged from the grid. The
Batteries screen said "No prices, so it follows the house" while Home priced
the day from static_plan() itself (homeview.build_plan()).
The fix (main.py, tariff_refresh_wanted()). packmode.enabled(opts)
is a third term. The gate stays a widening: nothing that started the task
before stops. No HTTPS call is added: with price_provider: off,
resolve_tariff() is the pure static_plan().
Not changed. Modes off, arbitrage off, no feed still starts no task. The control law, the price runs and every message are untouched.
One rule, not two. Gating on "modes on and a static profile" was
considered. It saves one arithmetic pass every 30 min on a site with modes on
and no prices at all, and it adds a second condition that has to track what
resolve_tariff() accepts. With no profile and no feed the plan is no_data,
exactly what the cycle sees without the task.
UX-55. Home said "no prices have arrived" (mode_runs None) with every
battery on Solar first. The same cause, and this fix clears it for a site with
a static profile (test_tariff24.py part 5). A site with no profile and no
feed still has no prices, and Home still says so.