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:
Tallagrand Thierry
2026-09-29 18:26:29 +02:00
parent 0975e62bda
commit 98c7e6b1d0
4 changed files with 34 additions and 7 deletions

View File

@@ -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