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>
36 lines
2.0 KiB
Markdown
36 lines
2.0 KiB
Markdown
# 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.
|