La provocation solaire se demande aux chargeurs, pas au SOC

Le correctif precedent bloque l incident de 19:44, mais un excedent proche de
zero est ambigu : c est la signature de la censure ET celle de l equilibre de
fin de journee. Le releve du 03/09 contient les deux avec le meme excedent —
18:50 : +14 W, ressource refusee ; 19:41 : +1 W, plus rien a donner. Rejeu du
19:41 : batteryAssistSolarStartOk etait encore vrai. Trois minutes avant
l incident, le systeme aurait commis la meme faute.

Le plan annoncait de lire evcs_balance_pv_censored. Lecture de CENSORSHIP.js :
ce drapeau est un OU de motifs dont l un est exactement le proxy qu on voulait
remplacer (socPct >= 90 et batterie sans puits). Et il est reste ON jusqu au
calcul de 19:50, soit cinq minutes APRES le demarrage de la charge — ce qui l a
fait basculer n est pas la censure mais sun_elevation passant sous 10 degres.
Il n aurait pas bloque l incident.

Le signal juste, ce sont les chargeurs eux-memes : sept entites
sensor.*_mppt_operation_mode, jamais lues par aucun workflow. mppt_active = je
suis a mon point de puissance maximale, je donne tout ; voltage_current_limited
ou off = je me retiens faute de preneur. Le 03/09 elles ont bascule a 19:20,
soit 24 minutes avant pv_censored, sans aucun proxy et a la cadence de la
boucle. Contre-verification le 01/09 a 14:22 : les trackers restaient limites
PENDANT une charge de 3,4 kW sous 6,9 kW de PV, donc le signal ne s auto-annule
pas a midi.

Collecte sans aucun entity_id code en dur (selectattr sur mppt et
operation_mode), expression testee sur /api/template puis gabarit complet
re-rendu : 191 champs, JSON valide, aucun null. Lectures inexploitables
ecartees, et repli sur le comportement anterieur quand il n en reste aucune.

Garde de DEMARRAGE uniquement, structurellement : la lier au sourceMode ou au
maintien ferait que la charge, en donnant un preneur au MPPT, detruirait sa
propre condition d autorisation — le bistable de l abondance P6 corrige le
24/08.

Golden 64 -> 66. Mutation dans trois directions : garde neutralisee -> 1 echec
cible, provocation toujours refusee -> 3 echecs, lecture illisible traitee
comme "a fond" -> 1 echec sur le scenario de repli.

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-03 21:41:31 +02:00
parent ef3d7ed7b2
commit 7a26078e73
7 changed files with 239 additions and 4 deletions

View File

@@ -903,6 +903,7 @@ export const scenarios = [
soc_percent: '95', pv_power_w: '430', pv_power_10m_avg_w: '430',
pv_trend_w: '0', battery_current_a: '2',
house_ac_power_w: '400', vebus_ac_out_l1_power_w: '400',
mppt_operation_modes: 'voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited',
},
expect: {
profile: 'outside_window',
@@ -936,6 +937,7 @@ export const scenarios = [
pv_power_w: '769.1', pv_power_10m_avg_w: '800', pv_trend_w: '0',
house_ac_power_w: '755', vebus_ac_out_l1_power_w: '755',
evcs_ac_power_w: '0',
mppt_operation_modes: 'voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited,voltage_current_limited',
},
expect: {
profile: 'evening_high_soc',
@@ -991,6 +993,56 @@ export const scenarios = [
},
},
// ===== 03/09/2026 : la provocation doit etre justifiee par les chargeurs =====
// Un excedent proche de zero est AMBIGU. Meme releve, meme excedent, deux
// situations opposees a 51 min d'ecart le 03/09 :
// 18:50 excedent +14 W, trackers LIMITES -> ressource refusee, on y va
// 19:41 excedent +1 W, trackers MPPT_ACTIVE -> plus rien a donner, on reste
// Aucun seuil de puissance ne les separe ; les chargeurs, eux, le disent.
{
id: 'provocation-trackers-a-fond-ne-demarre-pas',
label: "Relevé du 03/09 19:41 : excédent +1 W (équilibre au crépuscule), SOC 94, mais les 7 trackers en mppt_active → plus rien à révéler → PAS de provocation",
time: '2026-08-08T19:41:00+02:00',
overrides: {
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
soc_percent: '94', battery_current_a: '-1.4',
pv_power_w: '816.9', pv_power_10m_avg_w: '850', pv_trend_w: '0',
house_ac_power_w: '816', vebus_ac_out_l1_power_w: '816',
evcs_ac_power_w: '0',
mppt_operation_modes: 'mppt_active,mppt_active,mppt_active,mppt_active,mppt_active,mppt_active,mppt_active',
},
expect: {
profile: 'evening_high_soc',
state: 'idle_wait_conditions',
decision: 'hold',
desiredCharging: false,
},
},
{
// Le repli doit etre sur le comportement ANTERIEUR, jamais sur une
// supposition : integration muette => on ne sait pas => on autorise comme
// avant. Meme releve que ci-dessus, seules les lectures changent.
id: 'provocation-trackers-illisibles-comportement-anterieur',
label: "Même relevé, mais chargeurs illisibles (unavailable) → on ne sait pas → repli sur le comportement antérieur, la charge démarre",
time: '2026-08-08T19:41:00+02:00',
overrides: {
evcs_vehicle_connected: 'on', evcs_device_connected: 'on',
soc_percent: '94', battery_current_a: '-1.4',
pv_power_w: '816.9', pv_power_10m_avg_w: '850', pv_trend_w: '0',
house_ac_power_w: '816', vebus_ac_out_l1_power_w: '816',
evcs_ac_power_w: '0',
mppt_operation_modes: 'unavailable,unknown,',
},
expect: {
profile: 'evening_high_soc',
state: 'start_min_current',
decision: 'start',
desiredCharging: true,
currentA: 6,
},
},
// ===== 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