Le conseiller recoit enfin de quoi decider

Diagnostic du proprietaire, et il est juste : le conseiller n est pas
utilisable parce qu on lui donne des consignes fausses et des informations
partielles.

CONSIGNES FAUSSES. Son briefing enoncait mot pour mot la regle des paliers
(« forecast fort >= 18 kWh => cible ~35 % »), celle que le bilan a demontree
fausse le 03/09. Il declarait 17,5 kWh de batterie (mesure : 6,8 sur quatre
modules) et 9 kWc de panneaux (16,1 en realite). Retires. La capacite est
desormais CALCULEE depuis la courbe mesuree et le parc declare.

INFORMATIONS PARTIELLES. Il ne recevait AUCUNE sortie du bilan. Il ignorait
donc l heure de croisement, l energie a couvrir et le SOC requis -- les
seules grandeurs sur lesquelles la question se decide. +23 champs au
snapshot : bilan complet, parc, limites BMS, consigne reseau, modes des
chargeurs solaires, vehicule selectionne.

Ajoute aussi ce que personne ne lui disait : sans vehicule branche il y a
quand meme quelque chose a decider (c est la maison qui traverse la nuit),
les chargeurs declarent eux-memes s ils se brident, la cuisson du soir se
decale de trois heures, l hiver la nuit est plus longue de deux heures en
temps solaire.

PREUVE. Rejeu de la nuit bloquee du 12/09 a 04:00, sans aucune aide :
  avant  auto_solar_plus, cible 35 %, « prevision forte => cible basse »
  apres  force_grid_now,  cible 60 %, « bilan exige 3.13 kWh avant 09h »
Le bilan demandait 59,1 %. En production a la meme heure, il n avait rien vu
-- quatre fois de suite.

COMPTEUR. Il comparait la STRATEGIE, constante a auto_solar_plus : 517
accords contre 23, soit 95,7 % — un score qui mesurait une constante. Il
compare desormais la CIBLE, contre le BILAN, et ne compte rien quand le
bilan est indisponible plutot que de compter faux.

Tests advisor : 3 nouveaux sur le compteur (ecart 2 pts -> accord, 13 pts ->
divergence, bilan indisponible -> aucun comptage). Perimetre mode ombre
inchange et toujours verifie.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
This commit is contained in:
Tallagrand Thierry
2026-09-12 05:56:54 +02:00
parent 8aa4c1c591
commit 3cde737af8
7 changed files with 204 additions and 38 deletions

View File

@@ -52,11 +52,30 @@ if (status === 'ok' && advice) {
const divergenceText = diffs.length ? diffs.join(' | ') : 'accord avec le réel';
setText('input_text.evcs_advisor_divergence', divergenceText);
// Compteurs accord/divergence sur la stratégie (base des critères de bascule)
if (advice.strategy === context.userStrategy) {
setNumber('input_number.evcs_advisor_agree_count', context.agreeCount + 1);
} else {
setNumber('input_number.evcs_advisor_diverge_count', context.divergeCount + 1);
// ⚠️ LE COMPTEUR MESURAIT LE MAUVAIS CHAMP (corrige le 12/09/2026).
// Il comparait la STRATEGIE, qui vaut `auto_solar_plus` la quasi-totalite du
// temps : 517 accords contre 23 divergences, soit 95,7 % — un score qui
// mesurait une constante, pas une decision. Pendant ce temps la cible SOC,
// seul champ reellement cable, divergeait de treize points du bilan sans
// que rien ne le compte (12/09 05:30 : conseiller 35 %, bilan 48,4 %).
//
// On compte desormais l'accord sur la CIBLE, et contre le BILAN — la
// reference, pas contre la valeur appliquee qui peut elle-meme etre fausse.
// Bilan indisponible => on ne compte rien plutot que de compter faux.
const refSoc = Number(context.balanceRequiredSoc);
const bilanUtilisable = context.balanceStatus === 'ok' && Number.isFinite(refSoc);
if (bilanUtilisable) {
const ecart = Math.abs(advice.nightTargetSoc - refSoc);
if (ecart <= 5) {
setNumber('input_number.evcs_advisor_agree_count', context.agreeCount + 1);
} else {
setNumber('input_number.evcs_advisor_diverge_count', context.divergeCount + 1);
}
setText(
'input_text.evcs_advisor_divergence',
`cible: agent=${advice.nightTargetSoc}% vs bilan=${Math.round(refSoc)}% (ecart ${Math.round(ecart)} pts)`
+ (diffs.length ? ` | ${diffs.join(' | ')}` : '')
);
}
// Trace logbook pour l'historique long terme