Nuit : la recovery batterie est une passe unique, pas un oscillateur

La bande de 2 points du Fix A engageait le takeover a SOC 33 et le relachait
a 35 : 0,34 kWh, soit une demi-heure de conso nocturne plate. Trois cycles EDF
la nuit du 26-27/08, six la nuit du 20-21/08, 2,5 kWh importes pour rien.

Une seule passe de recovery par session de nuit. Le plancher dur reste un
terme independant, l hysteresis garde sa bande 20/30, et le vrai critere de
re-engagement (un budget d energie) appartient au bilan, pas a une constante
de plus ici.

Golden 40 -> 42, preuve par mutation. Documente aussi deux acteurs non lus :
les charges programmees de l ESS (45 % la nuit, contre notre cible 35 %) et
le regime majoritairement hors reseau.

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-08-27 10:33:21 +02:00
parent 8ad34f8c93
commit f18c6e07f6
5 changed files with 183 additions and 13 deletions

View File

@@ -582,8 +582,8 @@ export const scenarios = [
},
},
{
id: 'night-recovery-rearm-sous-bande',
label: 'Nuit HC 05:30, recovery done mais SOC 32 ≤ cible−2 → ré-engagement takeover (recharge batterie)',
id: 'night-recovery-done-pas-de-reengagement',
label: 'Nuit HC 05:30, recovery done et SOC 32 sous la cible → AUCUN ré-engagement (la recovery est une passe unique, 27/08)',
time: '2026-08-08T05:30:00+02:00',
overrides: {
...VEHICLE_NIGHT, soc_percent: '32', allow_grid_hc_night: 'on',
@@ -595,15 +595,65 @@ export const scenarios = [
expect: {
profile: 'night_hc',
sourceMode: 'blocked',
state: 'night_session_done_idle',
// Collant désormais : la recovery ayant eu lieu, l'état reste
// 'night_recovery_done_idle' même sous la cible — c'est lui qui autorise
// la coupure EDF immédiate côté hystérésis (E2) dès SOC >= grid_soc_off.
state: 'night_recovery_done_idle',
decision: 'hold',
desiredCharging: false,
currentA: 6,
takeoverNeeded: true,
takeoverNeeded: false,
edfOnAction: false,
takeoverHelperService: 'turn_off',
},
},
{
// L'oscillateur mesuré : nuit du 26-27/08, Jeep pleine restée branchée,
// cible 35. L'ancienne bande de 2 points ré-engageait le takeover pile à
// SOC 33 -> EDF ON 04:24/05:31/07:05, OFF 05:16/06:50/07:30, 2,5 kWh
// importés une nuit où le lendemain était annoncé à 43 kWh.
id: 'night-oscillateur-nuit-2627',
label: 'Nuit HC 05:31, recovery done et SOC 33 (cible 35 − 2) → le takeover NE se ré-engage pas : plus d\'oscillateur',
time: '2026-08-27T05:31:00+02:00',
overrides: {
...VEHICLE_NIGHT, soc_percent: '33', allow_grid_hc_night: 'on',
grid_state: 'off', victron_acin1_available: '0',
battery_current_a: '-11', night_takeover_prev: 'off',
evcs_charging_switch: 'off',
prev_surplus_state: 'night_recovery_done_idle',
},
expect: {
profile: 'night_hc',
sourceMode: 'blocked',
state: 'night_recovery_done_idle',
takeoverNeeded: false,
edfOnAction: false,
takeoverHelperService: 'turn_off',
},
},
{
// Le filet de sécurité doit rester intact : sous le plancher dur, le
// takeover se ré-engage même si la recovery a déjà eu lieu, parce que
// batteryBelowHardFloor est un terme INDÉPENDANT de nightGridTakeoverNeeded.
id: 'night-recovery-done-plancher-dur',
label: 'Nuit HC 05:31, recovery done mais SOC 21 sous le plancher dur 22 → ré-engagement du takeover (sécurité)',
time: '2026-08-27T05:31:00+02:00',
overrides: {
...VEHICLE_NIGHT, soc_percent: '21', allow_grid_hc_night: 'on',
grid_state: 'off', victron_acin1_available: '0',
battery_current_a: '-11', night_takeover_prev: 'off',
evcs_charging_switch: 'off',
prev_surplus_state: 'night_recovery_done_idle',
},
expect: {
profile: 'night_hc',
takeoverNeeded: true,
takeoverHelperService: 'turn_on',
},
},
{
id: 'night-vw-statut-charged',
label: 'Nuit HC 03:00, statut EVCS brut 3 (charged), sans état VDF préalable → fin de charge immédiate (Fix D)',