La session unique tenait le contacteur, pas l energie

La veille de nuit a rendu son verdict : UNE seule bascule sur 69 releves entre
01:26 et 07:07. La session reseau unique fait ce pour quoi elle a ete concue,
EDF ferme d un bout a l autre de la fenetre sans creneau ni oscillation.

Mais a 02:50, la voiture finie, le sourceMode est passe a bloque et la consigne
reseau est retombee de 5078 a 50 W. Contacteur ferme, reseau disponible, heures
creuses, et l ESS ne demandait que 50 W pendant que la maison tirait 770 W sur
la batterie. Trois heures et demie, SOC 44 vers 17 pour cent, 2,60 kWh pris a la
batterie quand le reseau etait la et bon marche. L Auto Charge Manager est reste
pret a recharger avec DVCC a 30 A, mais la consigne ne demandait jamais l
energie. C est le defaut du 01/09 revenu ailleurs : j avais etabli que fermer le
contacteur ne suffit pas, puis cree la veille une nouvelle raison de le garder
ferme sans la brancher sur la consigne.

gridSessionActive inclut desormais l engagement de session. Regle : tant que le
contacteur est ferme a notre demande, la consigne couvre la maison, peu importe
laquelle des deux raisons le tient.

Consigne de repos portee de 50 a 200 W a la demande du proprietaire, avec une
justification mesuree : sur 12 074 echantillons du point de raccordement, 17 %
sont negatifs, mediane -18 W. Ce n est pas de l injection — la batterie
debitait 744 W au meme moment et les 22,7 Wh cumules representent 0,9 % de ce
qu elle perdait — c est le regulateur qui chasse autour d une cible trop proche
de zero. A 200 W le point de fonctionnement reste positif sur l essentiel des
excursions, sans supprimer les pointes les plus fortes.

Consigne aussi que le 20 % n est pas le notre mais le plancher de l ESS, qui a
fini par faire de lui-meme a 06:20 ce que la session aurait du faire depuis
02:50, apres avoir vide la batterie de 27 points.

Golden 78 -> 80, deux mutations ciblees. Piege rencontre et documente : la
premiere redaction du contrefactuel portait deux fois la clef balance_status, et
en JavaScript la derniere gagne — il testait donc l inverse de son libelle. Un
contrefactuel doit reposer sur une difference physique, pas sur la surcharge d
une clef deja presente.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
Tallagrand Thierry
2026-09-04 07:21:08 +02:00
parent a189ad958c
commit cf6e9afe31
5 changed files with 197 additions and 6 deletions

View File

@@ -1143,6 +1143,71 @@ export const scenarios = [
},
},
// ===== 04/09/2026 : LA SESSION TENAIT LE CONTACTEUR, PAS L'ENERGIE =====
// Releve de la nuit du 03-04/09. La session unique a fonctionne — une seule
// bascule du contacteur, EDF ferme jusqu'a 07:24. Mais a 02:50, la voiture
// finie, le sourceMode est passe a 'blocked' et la consigne reseau est
// retombee de 5078 W a 50 W. Contacteur ferme, heures creuses, et la maison
// a tire 770 W SUR LA BATTERIE pendant trois heures et demie :
// SOC 44 % -> 17 %, 2,60 kWh pris a la batterie quand le reseau etait la.
{
id: 'consigne-session-engagee-couvre-la-maison',
label: "Nuit 03:30, session engagée mais voiture finie (source bloquée) → la consigne DOIT couvrir la maison au lieu de retomber au repos",
time: '2026-08-08T03:30:00+02:00',
overrides: {
...VEHICLE_NIGHT, allow_grid_hc_night: 'on',
grid_state: 'on', victron_acin1_available: '1',
battery_current_a: '-16', night_takeover_prev: 'on',
evcs_charging_switch: 'off', evcs_ac_power_w: '0',
house_ac_power_w: '770', vebus_ac_out_l1_power_w: '770',
prev_surplus_state: 'night_session_done_idle',
night_grid_session_committed_prev: 'on',
soc_percent: '40',
balance_required_soc: '57.2', balance_energy_to_cover_kwh: '7.58',
balance_status: 'ok', balance_last_run: '08/08 03:28',
},
expect: {
profile: 'night_hc',
takeoverNeeded: true,
// 770 W de maison + le plafond de courant en marge. Ce qui compte n'est
// pas la valeur exacte mais qu'on ne retombe PAS au repos.
gridSetpointW: 5595,
},
},
{
// CONTREFACTUEL. La difference est PHYSIQUE et non un drapeau force : le
// SOC est au-dessus de la ligne du bilan, donc la nuit est couverte, donc
// aucune session ne s'engage — et la consigne doit bien retomber au repos.
// Sans ce scenario, le correctif pourrait fuir hors session.
//
// ⚠️ Premiere redaction fausse : elle portait DEUX fois `balance_status`
// dans le meme objet. En JavaScript la derniere gagne, donc le scenario
// testait l'inverse de ce que son libelle annoncait — et il l'a signale en
// renvoyant 5595. Ne jamais construire un contrefactuel en surchargeant une
// clef deja presente.
id: 'consigne-sans-engagement-retombe-au-repos',
label: "Même relevé mais SOC 70 au-dessus de la ligne : aucune session engagée → la consigne retombe à la valeur de repos",
time: '2026-08-08T03:30:00+02:00',
overrides: {
...VEHICLE_NIGHT, allow_grid_hc_night: 'on',
grid_state: 'on', victron_acin1_available: '1',
battery_current_a: '-16', night_takeover_prev: 'off',
evcs_charging_switch: 'off', evcs_ac_power_w: '0',
house_ac_power_w: '770', vebus_ac_out_l1_power_w: '770',
prev_surplus_state: 'night_recovery_done_idle',
night_grid_session_committed_prev: 'off',
soc_percent: '70',
balance_required_soc: '57.2', balance_energy_to_cover_kwh: '7.58',
balance_status: 'ok', balance_last_run: '08/08 03:28',
},
expect: {
profile: 'night_hc',
takeoverNeeded: false,
gridSetpointW: 200,
},
},
// ===== 03/09/2026 : SESSION RESEAU UNIQUE DE LA NUIT =====
// Engagement sur le bilan, relachement a la FIN DE LA FENETRE — jamais sur
// un seuil de SOC. Deux raisons, toutes deux mesurees le 03/09 : un seuil de
@@ -1929,7 +1994,7 @@ export const scenarios = [
grid_setpoint_w: '4000',
},
expect: {
gridSetpointW: 50,
gridSetpointW: 200,
},
},
{
@@ -1976,7 +2041,7 @@ export const scenarios = [
grid_setpoint_w: '4000',
},
expect: {
gridSetpointW: 50,
gridSetpointW: 200,
},
},
];