Bilan : plus de faux statut degrade le soir (heure lue dans la courbe horaire)
Chaque soir ~1 h, une heure de deficit encore ensoleillee etait classee « minoree » d'apres le taux de censure de l'enveloppe, alors que sa production venait de la courbe horaire VRM / Forecast.Solar. Le bilan passait `degrade` et le controleur l'ignorait (plancher du soir a 85 % fixe). Les heures lues dans la courbe sont desormais `courbe`. Verifie : 18:20 ok, chiffres identiques a 18:15 degrade. Bilan 72/72. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011uJ47NxgfpGnuuMr3f2n7Z
This commit is contained in:
12
HANDOFF.md
12
HANDOFF.md
@@ -1179,11 +1179,13 @@ affiner ; demarrage solaire de l'apres-midi toujours non couvert par le besoin d
|
||||
l'historique de production de ces heures de fin de journee est incomplet … la decision
|
||||
reelle est reprise a 01:24 » ; `indisponible` seulement sans bilan, bilan perime ou
|
||||
statut inconnu, avec la raison dans `explication`. Diagnostics 90/90, mutation qui mord.
|
||||
⚠️ **OUVERT, decision du proprietaire** : pendant cette heure, le controleur ignore
|
||||
AUSSI le bilan (`balanceStatusOk`) -> plancher du soir retombe sur 85 % fixe, cible et
|
||||
session sur les regles historiques. A 01:24 le statut est `ok` (pas d'effet sur la
|
||||
session de nuit constate). Piste : ne pas degrader sur une forme minoree quand la
|
||||
production horaire vient de la courbe de prevision (et non de l'enveloppe).
|
||||
Pendant cette heure, le controleur ignorait AUSSI le bilan (`balanceStatusOk`) :
|
||||
plancher du soir retombe sur 85 % fixe. **Corrige a la source (accord du proprietaire,
|
||||
18:20)** : `RESOURCE_ESTIMATE` classe `courbe` toute heure dont l'energie est lue dans la
|
||||
courbe horaire ; `minoree` ne qualifie plus que les heures reparties sur l'enveloppe
|
||||
(repli). Verifie en reel : 18:15 `degrade`, 18:20 `ok`, chiffres IDENTIQUES (67,2 /
|
||||
81,5 / 13,56 kWh) — l'etiquette ne changeait rien au calcul. Bilan 72/72, mutation qui
|
||||
mord. Le statut `sous_reserve` de la prevision ne doit plus apparaitre qu'en repli.
|
||||
- SPARK : les transcripts SQLite (`openclaw-agent.sqlite`, droits 600) remontent au
|
||||
18/07, AUCUNE rotation ; un evenement contient le jeton HA (l'agent a lu `.ha-token`).
|
||||
Signale au proprietaire par SPARK, base non modifiee.
|
||||
|
||||
@@ -216,10 +216,14 @@ const tomorrowSlots = slots.filter(s => s.day !== today);
|
||||
|
||||
if (hourlyAvailable) {
|
||||
// Lecture directe : chaque heure porte déjà son énergie prévue.
|
||||
for (const slot of todaySlots) slot.expectedKwh = Math.max(0, hourlyForToday[slot.hour] ?? 0);
|
||||
for (const slot of todaySlots) {
|
||||
slot.expectedKwh = Math.max(0, hourlyForToday[slot.hour] ?? 0);
|
||||
slot.fromCurve = true;
|
||||
}
|
||||
if (hourlyForTomorrow) {
|
||||
for (const slot of tomorrowSlots) {
|
||||
slot.expectedKwh = Math.max(0, hourlyForTomorrow[slot.hour] ?? 0);
|
||||
slot.fromCurve = true;
|
||||
}
|
||||
} else {
|
||||
// Courbe decalee : on connait aujourd'hui, pas demain. L'enveloppe mesuree
|
||||
@@ -232,6 +236,19 @@ if (hourlyAvailable) {
|
||||
distribute(tomorrowSlots, tomorrowKwh);
|
||||
}
|
||||
|
||||
// Une heure lue dans la COURBE HORAIRE ne doit rien a l'enveloppe (29/09/2026).
|
||||
// La classer « minoree » d'apres le taux de censure de l'enveloppe faisait
|
||||
// passer le bilan `degrade` chaque soir pendant une heure (19 h du 23 au 28/09,
|
||||
// 18 h le 29/09) : l'heure du soir encore ensoleillee est une heure de deficit,
|
||||
// et son historique est censure parce que la batterie est souvent pleine a
|
||||
// cette heure. Or sa production venait de VRM / Forecast.Solar, pas de cet
|
||||
// historique. Pendant cette heure le controleur ignorait le bilan (plancher du
|
||||
// soir retombe a 85 % fixe). « minoree » ne qualifie plus que les heures dont
|
||||
// l'energie a ete repartie sur l'enveloppe (repli).
|
||||
for (const slot of slots) {
|
||||
if (slot.fromCurve && slot.quality !== 'nuit') slot.quality = 'courbe';
|
||||
}
|
||||
|
||||
// Repère de vraisemblance, sans écrêtage : l'enveloppe est minorée l'après-midi.
|
||||
for (const slot of slots) {
|
||||
slot.aboveEnvelope = !!envelope && envelope[slot.hour] > 0
|
||||
|
||||
@@ -319,6 +319,12 @@ export const resourceScenarios = [
|
||||
mode: 'courbe_horaire_api',
|
||||
// Reste de la journée à partir de 09 h : lu dans la courbe, pas recalculé.
|
||||
todayExpected: 42.8,
|
||||
// 29/09 : une heure lue dans la courbe ne doit rien a l'enveloppe, meme
|
||||
// censuree (14 h : taux 0,63) — plus de faux « minoree », plus de faux
|
||||
// `degrade` du bilan chaque soir. La nuit reste la nuit.
|
||||
qualityAtHour14: 'courbe',
|
||||
qualityAtHour3: 'nuit',
|
||||
shapeConfidenceBelow: false,
|
||||
},
|
||||
},
|
||||
{
|
||||
@@ -338,6 +344,8 @@ export const resourceScenarios = [
|
||||
usable: true,
|
||||
mode: 'repli_enveloppe',
|
||||
todayExpected: 15.9,
|
||||
// Repli sur l'enveloppe : la forme minoree reste signalee.
|
||||
qualityAtHour14: 'minoree',
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user