Files
goodwe-addon/goodwe_controller/DECISIONS/TARIFF-24-modes-need-the-tariff-task.md
T
glenn schrooyenandClaude d667f3f3a8 TARIFF-24: battery modes start the tariff task (hotfix 0.19.1)
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>
2026-10-28 01:02:32 +01:00

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.