Un depassement souple de la batterie doit durer pour compter
La table des bandes SOC declarait depuis toujours un courant souple tolere pendant des minutes et un courant dur tolere quelques secondes. Les deux tolerances etaient calculees, exportees dans le debug, et lues par aucune decision : le controleur comparait un echantillon instantane a un plancher, toutes les 30 s. A SOC 94 la batterie est en float et son courant oscille entre +1,8 et -2,6 A d'un echantillon a l'autre. Le test devenait un tirage a pile ou face et la charge du vehicule s'arretait sur du bruit : deux fois le 01/09, quatre a six fois par jour la semaine precedente. Chaque arret coutait environ 0,45 kWh, la batterie etant pleine et le vehicule le seul preneur. Le correctif est purement temporel : aucun seuil n'est deplace, aucune constante ajoutee. La tolerance de la bande est branchee sur les trois conditions de MAINTIEN, via un helper de persistance qui porte le debut du depassement en cours. Le plancher de demarrage et le garde dur restent instantanes : la tolerance est du confort, jamais du risque. Golden 56 -> 61. Preuve par mutation dans les deux sens : tolerance supprimee -> 2 echecs cibles, tolerance infinie -> 3 echecs cibles, l'arret dur restant vert dans les deux cas. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
@@ -909,6 +909,147 @@ export const scenarios = [
|
||||
},
|
||||
},
|
||||
|
||||
// ===== 01/09/2026 : le depassement souple de la batterie doit DURER =====
|
||||
// Incident du 01/09 (14:26 et 14:56) : SOC 94, batterie en float, courant
|
||||
// oscillant entre +1,8 et -2,6 A d'un echantillon a l'autre. Le controleur
|
||||
// comparait un echantillon instantane a un plancher de 0 A toutes les 30 s :
|
||||
// pile ou face. Chaque arret coutait ~0,45 kWh de production refusee, la
|
||||
// voiture etant le seul preneur d'une batterie pleine.
|
||||
// La table des bandes SOC declarait deja une tolerance de 12 min a SOC > 90 ;
|
||||
// elle n'etait branchee nulle part. Aucun seuil n'est deplace ici.
|
||||
{
|
||||
id: 'batt-float-bruit-ne-coupe-pas',
|
||||
label: "Relevé du 01/09 14:26 : SOC 94, batterie en float à -1 A, charge à 20 A → le bruit de régulation NE DOIT PAS arrêter la charge",
|
||||
time: AFTERNOON,
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||
evcs_charging_switch: 'on', control_latch: 'on', charge_permission_now: 'on',
|
||||
last_start_at: '2026-08-08 14:00:00',
|
||||
soc_percent: '94',
|
||||
evcs_current_a: '20', evcs_set_current_a: '20', evcs_command_current_a: '20',
|
||||
evcs_ac_power_w: '3600',
|
||||
pv_power_w: '6600', pv_power_10m_avg_w: '6000', pv_trend_w: '0',
|
||||
house_ac_power_w: '6000', vebus_ac_out_l1_power_w: '6000',
|
||||
battery_current_a: '-1',
|
||||
},
|
||||
expect: {
|
||||
profile: 'outside_window',
|
||||
sourceMode: 'solar_only',
|
||||
state: 'charging_hold',
|
||||
decision: 'hold',
|
||||
desiredCharging: true,
|
||||
currentA: 20,
|
||||
takeoverNeeded: false,
|
||||
edfOnAction: false,
|
||||
takeoverHelperService: 'turn_off',
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'batt-decharge-soutenue-coupe',
|
||||
label: "CONTREFACTUEL : mêmes mesures, mais le dépassement dure depuis 20 min > tolérance 12 min de la bande gt90 → la garde reprend la main et arrête",
|
||||
time: AFTERNOON,
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||
evcs_charging_switch: 'on', control_latch: 'on', charge_permission_now: 'on',
|
||||
last_start_at: '2026-08-08 14:00:00',
|
||||
soc_percent: '94',
|
||||
evcs_current_a: '20', evcs_set_current_a: '20', evcs_command_current_a: '20',
|
||||
evcs_ac_power_w: '3600',
|
||||
pv_power_w: '6600', pv_power_10m_avg_w: '6000', pv_trend_w: '0',
|
||||
house_ac_power_w: '6000', vebus_ac_out_l1_power_w: '6000',
|
||||
battery_current_a: '-1',
|
||||
battery_soft_breach_at: '2026-08-08 15:10:00',
|
||||
},
|
||||
expect: {
|
||||
profile: 'outside_window',
|
||||
sourceMode: 'solar_only',
|
||||
state: 'stop_conditions_lost',
|
||||
decision: 'stop',
|
||||
desiredCharging: false,
|
||||
currentA: 6,
|
||||
takeoverNeeded: false,
|
||||
edfOnAction: false,
|
||||
takeoverHelperService: 'turn_off',
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'batt-pointe-maison-ne-coupe-pas',
|
||||
label: "Relevé du 01/09 14:56 : pointe maison à 8 kW, batterie à -42 A → réduction graduée au plafond système (18 A), PAS un arrêt",
|
||||
time: AFTERNOON,
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||
evcs_charging_switch: 'on', control_latch: 'on', charge_permission_now: 'on',
|
||||
last_start_at: '2026-08-08 14:00:00',
|
||||
soc_percent: '94',
|
||||
evcs_current_a: '20', evcs_set_current_a: '20', evcs_command_current_a: '20',
|
||||
evcs_ac_power_w: '3600',
|
||||
pv_power_w: '9100', pv_power_10m_avg_w: '6000', pv_trend_w: '0',
|
||||
house_ac_power_w: '8000', vebus_ac_out_l1_power_w: '8000',
|
||||
battery_current_a: '-42',
|
||||
},
|
||||
expect: {
|
||||
profile: 'outside_window',
|
||||
sourceMode: 'solar_only',
|
||||
state: 'charging_step_down_system_cap',
|
||||
decision: 'step_down_fast',
|
||||
desiredCharging: true,
|
||||
currentA: 18,
|
||||
takeoverNeeded: false,
|
||||
edfOnAction: false,
|
||||
takeoverHelperService: 'turn_off',
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'batt-decharge-dure-arret-immediat',
|
||||
label: "SÉCURITÉ : batterie à -120 A, sous le seuil DUR de la bande (-100 A) → arrêt immédiat, aucune tolérance. La tolérance est du confort, jamais du risque",
|
||||
time: AFTERNOON,
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||
evcs_charging_switch: 'on', control_latch: 'on', charge_permission_now: 'on',
|
||||
last_start_at: '2026-08-08 14:00:00',
|
||||
soc_percent: '94',
|
||||
evcs_current_a: '20', evcs_set_current_a: '20', evcs_command_current_a: '20',
|
||||
evcs_ac_power_w: '3600',
|
||||
pv_power_w: '1000', pv_power_10m_avg_w: '6000', pv_trend_w: '0',
|
||||
house_ac_power_w: '9000', vebus_ac_out_l1_power_w: '9000',
|
||||
battery_current_a: '-120',
|
||||
},
|
||||
expect: {
|
||||
profile: 'outside_window',
|
||||
sourceMode: 'solar_only',
|
||||
state: 'battery_current_hard_stop',
|
||||
decision: 'stop_hard',
|
||||
desiredCharging: false,
|
||||
currentA: 6,
|
||||
takeoverNeeded: false,
|
||||
edfOnAction: false,
|
||||
takeoverHelperService: 'turn_off',
|
||||
},
|
||||
},
|
||||
{
|
||||
id: 'batt-plancher-demarrage-reste-instantane',
|
||||
label: "FRONTIÈRE : véhicule branché mais à l'arrêt, batterie à -1 A → on NE DÉMARRE PAS sur une batterie qui se décharge. Le plancher de démarrage reste instantané",
|
||||
time: AFTERNOON,
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||
soc_percent: '94',
|
||||
pv_power_w: '6600', pv_power_10m_avg_w: '6000', pv_trend_w: '0',
|
||||
house_ac_power_w: '6000', vebus_ac_out_l1_power_w: '6000',
|
||||
battery_current_a: '-1',
|
||||
},
|
||||
expect: {
|
||||
profile: 'outside_window',
|
||||
sourceMode: 'solar_only',
|
||||
state: 'idle_wait_conditions',
|
||||
decision: 'hold',
|
||||
desiredCharging: false,
|
||||
currentA: 6,
|
||||
takeoverNeeded: false,
|
||||
edfOnAction: false,
|
||||
takeoverHelperService: 'turn_off',
|
||||
},
|
||||
},
|
||||
|
||||
// ================= STRATÉGIES MANUELLES =================
|
||||
{
|
||||
id: 'force-grid-jour',
|
||||
@@ -1034,7 +1175,7 @@ export const scenarios = [
|
||||
// le test ne prouverait rien.
|
||||
{
|
||||
id: 'etablissement-maintien-charge',
|
||||
label: 'Réseau fermé il y a 30 s, PV effondrée à 600 W et batterie à -15 A : la charge en cours NE DOIT PAS être arrêtée',
|
||||
label: 'Réseau fermé il y a 30 s, PV effondrée à 600 W, batterie à -15 A depuis 10 min : dans la fenêtre, la mesure batterie est neutralisée, la charge NE DOIT PAS être arrêtée',
|
||||
time: MORNING,
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||
@@ -1047,6 +1188,7 @@ export const scenarios = [
|
||||
pv_power_w: '600', pv_power_10m_avg_w: '3900', pv_trend_w: '-2000',
|
||||
grid_state: 'on', victron_acin1_available: '1', grid_power_w: '1800',
|
||||
battery_current_a: '-15',
|
||||
battery_soft_breach_at: '2026-08-08 08:50:00',
|
||||
acin1_last_changed_ts: String(MORNING_TS - 30),
|
||||
grid_switch_last_changed_ts: String(MORNING_TS - 30),
|
||||
},
|
||||
@@ -1064,7 +1206,7 @@ export const scenarios = [
|
||||
},
|
||||
{
|
||||
id: 'etablissement-termine-arret-normal',
|
||||
label: 'CONTREFACTUEL : mêmes mesures, transition vieille de 400 s → fenêtre fermée, la garde de maintien reprend la main et arrête',
|
||||
label: 'CONTREFACTUEL : mêmes mesures ET même dépassement de 10 min, transition vieille de 400 s → fenêtre fermée, la garde reprend la main et arrête (10 min > tolérance 4 min de la bande 40_60)',
|
||||
time: MORNING,
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||
@@ -1077,6 +1219,7 @@ export const scenarios = [
|
||||
pv_power_w: '600', pv_power_10m_avg_w: '3900', pv_trend_w: '-2000',
|
||||
grid_state: 'on', victron_acin1_available: '1', grid_power_w: '1800',
|
||||
battery_current_a: '-15',
|
||||
battery_soft_breach_at: '2026-08-08 08:50:00',
|
||||
acin1_last_changed_ts: String(MORNING_TS - 400),
|
||||
grid_switch_last_changed_ts: String(MORNING_TS - 400),
|
||||
},
|
||||
@@ -1124,7 +1267,7 @@ export const scenarios = [
|
||||
},
|
||||
{
|
||||
id: 'etablissement-ouverture-aucune-fenetre',
|
||||
label: "ASYMÉTRIE : réseau DISPARU il y a 30 s → aucune fenêtre. Les onduleurs reprennent tout, les gardes doivent agir plus vite, pas moins",
|
||||
label: "ASYMÉTRIE : réseau DISPARU il y a 30 s → aucune fenêtre. Les onduleurs reprennent tout, les gardes doivent agir plus vite, pas moins (dépassement de 10 min > tolérance 4 min)",
|
||||
time: MORNING,
|
||||
overrides: {
|
||||
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
|
||||
@@ -1138,6 +1281,7 @@ export const scenarios = [
|
||||
grid_state: 'on', victron_acin1_available: '1', grid_power_w: '1800',
|
||||
battery_current_a: '-15',
|
||||
grid_state: 'off', victron_acin1_available: '0', grid_power_w: '0',
|
||||
battery_soft_breach_at: '2026-08-08 08:50:00',
|
||||
acin1_last_changed_ts: String(MORNING_TS - 30),
|
||||
grid_switch_last_changed_ts: String(MORNING_TS - 30),
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user