The new status row's id `solar_forecast` had no Home title, so Home showed it under the fallback "Inverter connection". Add "Solar forecast" / "Zonneprognose" to ui_text, and checks for the title, the tomorrow-gap hint and blank list rows (review mutations R7, R9, R14 now killed). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Bdqr7PiaHcBnzPituu2yTC
4.0 KiB
4.0 KiB
OPT-17 - the solar forecast from several entities, summed
Status: for review. Tests: test_opt17.py. Two options added.
A site whose forecast comes as several Home Assistant sensors (one per inverter or roof side) had to build a template sensor to sum them. Now each day can list them.
Options
pv_forecast_entitiesandpv_forecast_tomorrow_entities: lists of sensors, default[], the same shape aspv_entities.pv_forecast_entityandpv_forecast_tomorrow_entityare unchanged. An install that uses them needs no edit.- Why new keys, not "string or list" in the old ones. Measured on
Supervisor 2026.08.0 by
tools/supervisor_shape_probe.py§J, as TEL-12's §G did forpv_entity. Declared as a list, each forecast key refuses the string an install already stores (Invalid list for option 'pv_forecast_entity'), and a[]default does not rescue it. The one spelling that takes both,match(.*)?, also takes the integer 417 and shows a plain text box, so a second sensor cannot be added in the UI. - §J also shows: a 0.17.0 blob validates unchanged with the lists at
[]; the lists render as repeatable fields; a downgrade drops them and keeps the single keys. []inoptions:is load-bearing, as forpv_entities.
Rules
- One key per day. Setting the single key and the list for the same day
is refused at start, with one message: keep the list, clear the single one.
The list can hold that entity too. (TEL-12 lets
pv_entitiesreplacepv_entitywith a caution row. Here the brief asked for a refusal: a doubled or dropped forecast changes what a battery buys, and no install has both keys yet, so the refusal breaks nothing.) - Each member in its own unit. Every member is read as one forecast
sensor is today (
solarfc._day()): Wh, kWh or MWh, never guessed. Then the day's kWh are added up. A repeated id counts once. - One member not usable means the day is not usable. Missing, unavailable, unknown, stale, not an energy unit, or a bad number: that day's sum is not used, exactly as when the single sensor reads that way. No today means no forecast (P3 option A). No tomorrow means today only.
- Hourly split. If every member has a split, the splits are joined (overlapping periods add up). If any member has none, the sum is spread over the bell, as for a state-only sensor.
- Time. The forecast is as old as its oldest member.
- One read. All members of both days are read in one gather, inside the gather that reads the inverters, so a slow sensor does not delay control.
- Shown and logged once. With two or more members, each one not usable is named on the status page by its place in the list (STYLE.md: no entity ids on the page), as a caution row titled "Solar forecast" on Home. The action log names the entity id, once when the set of failing members changes.
- One member is the single key. A one-member list reads, plans, shows and logs exactly as the single key with that entity.
Why
- A partial sum is a smaller number that looks real. Two of three inverters' forecasts read as a duller day, and Leftover solar would then buy grid energy the sun was going to give. TEL-12 took the same rule for the same reason. No forecast is a known state with a tested fallback.
- The bell for a mixed list: joining one member's hours with another's total has no honest shape, and the bell is the existing state-only rule.
Cost
- One flaky member costs the whole day's forecast. A site with three sensors loses the plan more often than one with a template sum that hides gaps.
- Two more options (85).
What this does not cover
- No weighting or calibration per member; FCST-01 is still the own forecast.
- Members on different integrations with different refresh times: each must be fresh (3 h) on its own; there is no wait for a lagging one.
- The day plan itself, the trust and the house profile are unchanged.
- The Batteries screen still says only "no solar forecast now". The member is named on the status page.