Prevision de nuit : bilan degrade relaye sous reserve, plus muet

18:03 le 29/09 : « prevision indisponible » avec 16 points de marge, parce
que le bilan etait `degrade` (forme minoree sur une heure de deficit, chaque
soir ~1 h). Statut `sous_reserve` avec la reserve dans le texte ;
`indisponible` seulement sans bilan, perime ou statut inconnu, avec la raison.
Diagnostics 90/90.

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:10:00 +02:00
parent c2f9e83a39
commit 0975e62bda
3 changed files with 52 additions and 4 deletions

View File

@@ -632,10 +632,26 @@ export function previsionNuit(st, maintenant = new Date()) {
? 'la production du matin vient de la prevision VRM, en essai depuis le 28/09 : l heure de retour du solaire reste une estimation'
: 'la production du matin vient de Forecast.Solar, qui sous-estime ces jours-ci : l heure de retour du solaire peut etre plus precoce',
};
if (statut !== 'ok' || age === null || age > BILAN_FRAIS_MIN || aCouvrir === null || retour === null) {
// `degrade` n'est PAS une panne (29/09, 18:03 : « prevision indisponible »
// en vocal avec 16 points de marge). Le bilan passe `degrade` chaque soir
// pendant une heure environ (19 h depuis le 23/09, 18 h le 29/09) : une
// heure de deficit dont l'historique de production est censure (batterie
// souvent pleine a cette heure) est marquee « forme minoree ». Le calcul est
// fait et publie ; on le relaie AVEC la reserve. Muet seulement sans bilan,
// bilan perime, ou statut inconnu.
const degrade = statut === 'degrade';
const pourquoi = age === null || age > BILAN_FRAIS_MIN
? `le bilan energetique n a pas ete recalcule depuis ${age === null ? 'un moment' : `${age} min`}`
: statut !== 'ok' && !degrade ? `le bilan energetique est en etat « ${statut ?? 'inconnu'} »`
: 'le bilan ne donne pas l energie a couvrir ou l heure de retour du solaire';
if ((statut !== 'ok' && !degrade) || age === null || age > BILAN_FRAIS_MIN || aCouvrir === null || retour === null) {
return { etat: 'indisponible', attributs: { ...attributs, statut: 'indisponible',
explication: 'Le bilan energetique n est pas a jour : prevision de la nuit indisponible.' } };
explication: `Prevision de la nuit indisponible pour l instant : ${pourquoi}. Elle revient au prochain calcul du bilan (toutes les 5 min).` } };
}
const reserveBilan = degrade
? ' Sous reserve : l historique de production de ces heures de fin de journee est incomplet (batterie souvent pleine a cette heure) ; la decision reelle est reprise ' + (hcDebut ? `a ${hcDebut}` : 'a l ouverture des heures creuses') + '.'
: '';
attributs.reserve_bilan = degrade ? 'forme de production minoree sur les heures de deficit' : null;
const voiture = attributs.voiture === 'aucune'
? 'Aucun vehicule branche.'
: attributs.voiture === 'branchee'
@@ -684,9 +700,9 @@ export function previsionNuit(st, maintenant = new Date()) {
explication: texteJour, texte_rapport: texteJour } };
}
const texte = `La maison doit couvrir environ ${aCouvrir} kWh jusqu au retour du solaire vers ${retour}. ` +
`${edf} Batterie a ${soc !== null ? Math.round(soc) : '?'} %. ${voiture}`;
`${edf} Batterie a ${soc !== null ? Math.round(soc) : '?'} %. ${voiture}${reserveBilan}`;
const etat = verdict === 'edf_engage' || verdict === 'reseau_necessaire' ? (importPrevu ?? manqueKwh) : 0;
return { etat, attributs: { ...attributs, statut: 'frais', explication: texte, texte_rapport: texte } };
return { etat, attributs: { ...attributs, statut: degrade ? 'sous_reserve' : 'frais', explication: texte, texte_rapport: texte } };
}
// ---------------------------------------------------------------------