OPT-11 P4: solar forecast and day plan

A Home Assistant solar forecast (Forecast.Solar, Solcast or Open-Meteo
shapes) and the add-on's own hourly house use decide, before each cheap
run, whether the sun will fill each battery before the expensive hours.
Leftover solar then buys from the grid only the shortfall; Cheap hours only
skips the part the sun covers; Solar first never grid-charges. No, stale or
failed forecast: P3 option A exactly (12 digests pinned from 5a4cdc2).

Replay (16 recorded days, forecast errors from Elia's day-ahead BE solar):
year-earlier prices P4 19.15 vs P2 19.33 / option A 19.44 / old trade 18.14;
real 2026 prices P4 29.19 vs 32.26 / 32.01 / 31.40 EUR net.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Claude
2026-09-29 19:29:32 +02:00
parent 5a4cdc273e
commit eb10537aee
24 changed files with 1984 additions and 35 deletions
+11
View File
@@ -446,7 +446,17 @@
e.textContent = ok ? e.dataset.kwNote.replace("{kw}", window.UX13.kw(mp.peak_w) + " kW") : "";
});
}
// OPT-11 P4: the solar forecast card shows the add-on's forecast line.
function fillSolar() {
const st = window.UX13.status();
const line = st && st.solar ? st.solar.line : "";
document.querySelectorAll("#simple [data-solar-note]").forEach((e) => {
e.textContent = line || "";
e.hidden = !line;
});
}
document.addEventListener("ux13:status", fillNotes);
document.addEventListener("ux13:status", fillSolar);
function simpleField(f) {
const row = fieldRow(f, null, "simple");
row.querySelector(".head").append(chip(f.applies));
@@ -458,6 +468,7 @@
const help = row.querySelector(".help");
if (help) help.textContent = n.description;
}
if (f.note === "forecast") row.append(h("div", { class: "small muted", "data-solar-note": "", hidden: true }));
return h("div", { class: "card" }, row);
}
function renderSimple() {