La nuit sans voiture, la maison a aussi droit aux heures creuses

Nuit du 11-12/09, vehicule rendu la veille : le bilan a reclame entre
92 % et 59 % de SOC a CHAQUE calcul de la nuit, `reseau_necessaire` vrai
partout, et rien ne s'est passe. SOC fige a 20 % de 23:43 a l'aube,
consigne reseau a 700 W depuis 18:36 -- soit exactement la maison.

L'hysteresis avait bien ferme le contacteur (SOC <= 20), mais fermer le
contacteur ne suffit pas : il faut DEMANDER la puissance (lecon du
01/09). Personne ne la demandait, parce que la session reseau de nuit
exigeait un vehicule branche.

Or le besoin n'a rien a voir avec la voiture : c'est la MAISON qui doit
traverser la nuit, et le bilan sait exactement ce qu'il lui faut. La
fenetre HC suffit comme condition d'engagement. Le relachement reste la
fin de fenetre, donc monotone, donc toujours immune a l'oscillation
(§40) -- la mutation le verifie.

Cout evite : a 07:24 le SOC etait encore sous le seuil OFF de
l'hysteresis (30), donc le contacteur serait reste ferme et la maison
serait passee au PLEIN TARIF jusqu'au croisement PV de 9 h. C'est le
1,49 kWh deja consigne le 03/09.

Golden 91 -> 95. Mutation : exigence de vehicule retablie -> seul le
scenario d'incident tombe ; borne de fenetre retiree -> le scenario de
fin de fenetre du 03/09 tombe AUSSI, donc la monotonie est bien testee.

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:02:31 +02:00
parent dd56c6b48b
commit 2493b5baa1
3 changed files with 112 additions and 2 deletions

View File

@@ -630,11 +630,31 @@ const nightGridSessionCommittedPrev =
const nightGridSessionUncovered = const nightGridSessionUncovered =
balanceMorningTargetApplied && batteryBelowMorningTarget; balanceMorningTargetApplied && batteryBelowMorningTarget;
// ⚠️ SANS VEHICULE AUSSI (12/09/2026).
// Nuit du 11-12/09, voiture rendue la veille : le bilan a reclame entre 92 %
// et 59 % de SOC a CHAQUE calcul de la nuit, `reseau_necessaire` vrai partout,
// et rien ne s'est passe. SOC bloque a 20 % de 23:43 a l'aube, consigne reseau
// figee a 700 W depuis 18:36 — soit exactement la maison. L'hysteresis avait
// bien ferme le contacteur (SOC <= 20), mais fermer le contacteur ne suffit
// pas : il faut DEMANDER la puissance (lecon du 01/09). Personne ne la
// demandait, parce que la session exigeait un vehicule branche.
//
// Or le besoin n'a rien a voir avec la voiture : c'est la maison qui doit
// traverser la nuit, et le bilan sait exactement ce qu'il lui faut. La
// fenetre HC suffit. Le relachement reste la FIN DE FENETRE, donc monotone,
// donc toujours immune a l'oscillation (§40).
//
// Sans cette correction, le cout se paye le matin : a 07:24 le SOC est encore
// sous le seuil OFF de l'hysteresis (30), donc le contacteur reste ferme et
// la maison passe au PLEIN TARIF jusqu'au croisement PV — le 1,49 kWh deja
// consigne le 03/09.
const nightGridSessionCommitted = const nightGridSessionCommitted =
nightSessionActive && profile === 'night_hc' &&
(nightGridSessionUncovered || nightGridSessionCommittedPrev); (nightGridSessionUncovered || nightGridSessionCommittedPrev);
const nightGridTakeoverNeeded = const nightGridTakeoverNeeded =
nightGridSessionCommitted ||
(
nightSessionActive && nightSessionActive &&
( (
nightGridSessionCommitted || nightGridSessionCommitted ||
@@ -651,6 +671,7 @@ const nightGridTakeoverNeeded =
nightTakeoverLatched nightTakeoverLatched
) )
) )
)
); );
const nightPreferredSourceMode = const nightPreferredSourceMode =

View File

@@ -2350,4 +2350,93 @@ export const scenarios = [
gridSetpointW: 4829, gridSetpointW: 4829,
}, },
}, },
// ======== SESSION RESEAU DE NUIT SANS VEHICULE (12/09/2026) ========
// Nuit du 11-12/09, voiture rendue la veille : le bilan a reclame 92 % puis
// 59 % de SOC toute la nuit, `reseau_necessaire` vrai a chaque calcul, et
// rien ne s'est passe -- SOC fige a 20 %, consigne reseau a 700 W depuis
// 18:36. La session exigeait un vehicule branche.
{
id: 'nuit-sans-vehicule-session-engage',
label: "INCIDENT 12/09 04:00 — HC, AUCUN vehicule, SOC 20, le bilan demande 59,1 % : la session reseau doit s'engager pour la MAISON",
time: '2026-08-08T04:00:00+02:00',
overrides: {
evcs_vehicle_connected: 'off', evcs_device_connected: 'on',
grid_state: 'on', victron_acin1_available: '1',
soc_percent: '20', battery_current_a: '0',
pv_power_w: '0', pv_power_10m_avg_w: '0', pv_trend_w: '0',
house_ac_power_w: '612', vebus_ac_out_l1_power_w: '612',
evcs_ac_power_w: '0',
grid_setpoint_w: '700',
balance_required_soc: '59.1', balance_energy_to_cover_kwh: '3.13',
balance_status: 'ok', balance_last_run: '08/08 03:58',
},
expect: {
profile: 'night_hc',
takeoverNeeded: true,
takeoverHelperService: 'turn_on',
sessionCommittedService: 'turn_on',
gridSetpointW: 5437,
},
},
{
id: 'nuit-sans-vehicule-batterie-couverte',
label: "CONTREFACTUEL — meme nuit sans vehicule mais SOC 70 au-dessus des 59,1 % requis : aucune session, la batterie passe la nuit seule",
time: '2026-08-08T04:00:00+02:00',
overrides: {
evcs_vehicle_connected: 'off', evcs_device_connected: 'on',
grid_state: 'on', victron_acin1_available: '1',
soc_percent: '70', battery_current_a: '-12',
pv_power_w: '0', pv_power_10m_avg_w: '0', pv_trend_w: '0',
house_ac_power_w: '612', vebus_ac_out_l1_power_w: '612',
evcs_ac_power_w: '0',
grid_setpoint_w: '700',
balance_required_soc: '59.1', balance_energy_to_cover_kwh: '3.13',
balance_status: 'ok', balance_last_run: '08/08 03:58',
},
expect: {
profile: 'night_hc',
takeoverNeeded: false,
sessionCommittedService: null,
},
},
{
id: 'nuit-sans-vehicule-hors-fenetre',
label: "CONTREFACTUEL — meme deficit mais a 23:00, HORS fenetre HC : aucune session. Le relachement reste la fin de fenetre, donc monotone.",
time: '2026-08-08T23:00:00+02:00',
overrides: {
evcs_vehicle_connected: 'off', evcs_device_connected: 'on',
grid_state: 'on', victron_acin1_available: '1',
soc_percent: '20', battery_current_a: '-12',
pv_power_w: '0', pv_power_10m_avg_w: '0', pv_trend_w: '0',
house_ac_power_w: '612', vebus_ac_out_l1_power_w: '612',
evcs_ac_power_w: '0',
grid_setpoint_w: '700',
balance_required_soc: '92.2', balance_energy_to_cover_kwh: '6.33',
balance_status: 'ok', balance_last_run: '08/08 22:58',
},
expect: {
takeoverNeeded: false,
sessionCommittedService: null,
},
},
{
id: 'nuit-sans-vehicule-bilan-perime',
label: "CONTREFACTUEL — HC sans vehicule, SOC 20, mais bilan vieux de 2 h : comportement historique, aucune session",
time: '2026-08-08T04:00:00+02:00',
overrides: {
evcs_vehicle_connected: 'off', evcs_device_connected: 'on',
grid_state: 'on', victron_acin1_available: '1',
soc_percent: '20', battery_current_a: '0',
pv_power_w: '0', pv_power_10m_avg_w: '0', pv_trend_w: '0',
house_ac_power_w: '612', vebus_ac_out_l1_power_w: '612',
evcs_ac_power_w: '0',
grid_setpoint_w: '700',
balance_required_soc: '59.1', balance_energy_to_cover_kwh: '3.13',
balance_status: 'ok', balance_last_run: '08/08 02:00',
},
expect: {
takeoverNeeded: false,
sessionCommittedService: null,
},
},
]; ];

File diff suppressed because one or more lines are too long