PRICE-01 round 2: the token on no page, fixed-tariff note, token length, F3 words, test gaps
checks / unit (pull_request) Successful in 39m0s
infra-pin / fresh (pull_request) Successful in 2s

F1: every password option is shown as ******** (set) or empty in /config/model
(options, running, ui) and in a stale refusal; the classic page draws it as a
password field; a save or validate that sends ******** or nothing keeps the
stored value. F2: a static_profile beside price_service is said once at start
(notification and log), not refused. F3 (owner, 2026-10-14): the no-price row,
Home line and notification only while maintenance_enabled is on. F4: tests for
the reviewer's R01 and R10. F5: price_service_token must be 16+ characters.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bdqr7PiaHcBnzPituu2yTC
This commit is contained in:
glenn schrooyen
2026-10-14 18:56:51 +02:00
co-authored by Claude
parent 4eb88f7fda
commit 0801776645
12 changed files with 767 additions and 17 deletions
+16 -4
View File
@@ -291,7 +291,7 @@ When the add-on refuses to start, each reason names the setting by its label and
- **Fixed or day/night tariff** (`static_profile`): the periods must cover every day type exactly once with no gap and no overlap, and a gap is refused rather than filled. A window 22:00-07:00 on mon-fri does not cover Saturday morning, so a weekend row is required. See [Static day/night and fully-fixed tariffs](#static-daynight-and-fully-fixed-tariffs-static_profile).
- **Your own tariff and injection formula** (`price_formula`, `price_export_formula`): type the card's numbers in the card's units. The `card` block is required on the tariff formula: the add-on recomputes the card's example price and refuses to start if it does not come out. Injection is VAT-exempt in Belgium, so `vat_pct` there is normally 0. See [Your own tariff formula](#your-own-tariff-formula-custom_formula) and [`price_export_formula`, field by field](#price_export_formula-field-by-field).
- **Price feed URL override** (`price_feed_url`): only a host the chosen source declares is accepted. Nothing is added to the URL, not even the date range, so an override often returns one day and the rest of the plan is carried over and excluded from trading. The log warns on every refresh.
- **Price service token** (`price_service_token`): a password field, shown masked on the Configuration tab and never drawn on the add-on page. It is needed with `price_provider: price_service`, and the add-on refuses to start without it. It never appears in the log, the status page, a refusal or a notification. See [`price_service`](#price_service--your-own-price-server-and-what-it-falls-back-to).
- **Price service token** (`price_service_token`): a password field. Every page of the add-on, and every answer its web app gives, shows only `********` when a token is set and nothing when not; the token itself is never sent to a page. A save that leaves the field empty or as `********` keeps the stored token, and a new value replaces it. It must be at least 16 characters. It is needed with `price_provider: price_service`, and the add-on refuses to start without it. It never appears in the log, the status page, a refusal or a notification. See [`price_service`](#price_service--your-own-price-server-and-what-it-falls-back-to).
- **Current and average price entities** (`price_now_entity`, `price_avg_entity`): kept because removing them would take the maintenance cycle's only price signal away from a live site.
- **Trade on the price spread** (`arbitrage_enabled`): off as shipped, on purpose, because it moves energy against the meter by design. It needs a price source and a P1 meter, and the add-on refuses combinations that cannot work.
- **Battery cycle cost** (`cycle_cost_threshold_eur`): wear plus conversion losses. It is not derived from a measurement: 0.10 is a product decision still open with the owner (OPT-08). At this value a fixed day/night site does not trade, since a realistic Belgian day/night spread is about 0.08 EUR/kWh.
@@ -2294,7 +2294,8 @@ service answers again.` The refresh runs every 30 minutes.
**When there is no price for now (step none).** One status line, `Prices: No
prices since 00:00, maintenance waits.` (on the add-on page; the Home screen says
the same in English and Dutch), and one notification, *No prices*. Both go when a
source has a price for now again. "Since" is the moment the last price ran out.
source has a price for now again. They show only while **Run the monthly battery cycle**
(`maintenance_enabled`) is on; with it off, neither is shown. "Since" is the moment the last price ran out.
Before the first refresh has finished there is no line, so a start-up is not a
gap. Control is not touched: the battery follows the meter as ever, battery
modes and trading read what prices there are, and only the maintenance charge
@@ -2327,7 +2328,9 @@ Do this on the Configuration tab, in one save, and restart once:
decide on. The maintenance charge gate does not depend on them.
5. Keep **Fixed or day/night tariff** (`static_profile`) if you have one. It
is still the tariff used, marked as estimated and without trading, while no
source has a price.
source has a price. It no longer decides *Cheap window* or the maintenance
charge: the provider's prices do. The add-on says so once at start (*Fixed
tariff not used*) and does not refuse the setting.
6. Remove the `price_service` REST and template sensors from Home Assistant
when you are satisfied. They are no longer read.
@@ -3372,7 +3375,15 @@ not energy-charts, and nothing saved. The monthly battery cycle waits, because
it will not charge from the grid without a price to judge by. Control of the
battery goes on as before. Check that the add-on can reach the internet and that
the price service token is right. The notification goes by itself when a price
is back.
is back. It is shown only while the monthly battery cycle is switched on.
### Fixed tariff not used
A fixed or day/night tariff (`static_profile`) is set, and so is the price
service. The price service gives the prices, so the fixed tariff does not
decide *Cheap window* or the monthly battery cycle's charge. The setting is
kept and not refused. Clear it, or choose another price source, to remove the
message. It is shown once each time the add-on starts.
### For installers: notifications
@@ -3395,6 +3406,7 @@ default `info` hides it.
| Meter reading may be stuck | alarm | `goodwe_meter_frozen` | SAFETY-18 |
| Battery cycle did not finish | warning | `goodwe_maint_failed_<name>` | MAINT-13 |
| No prices | warning | `goodwe_no_prices` | PRICE-01 |
| Fixed tariff not used | warning | `goodwe_fixed_tariff_unused` | PRICE-01 |
**The Details link.** Home Assistant 2026.2 and newer show add-on pages at
`/config/app/<slug>/documentation`; 2026.5 removed the old