La protection regardait la maison, pas ce qu on demande au parc

Deux fermetures ce dimanche midi. Mesurees a l instant de la decision,
contacteur encore ouvert donc production non censuree : maison 4025 et 4981 W,
mais parc reellement sollicite 1132 et 772 W pour un plafond de 5100. La
decharge batterie mesuree aux memes instants — 1345 et 1223 W — colle a
maison moins PV, pas a la maison brute. Le solaire couvrait la cuisson ; la
regle a ferme le contacteur pour rien, 0,50 kWh importes en plein soleil.

Elle n avait bien fonctionne hier soir que parce qu il n y avait plus de PV.
Les deux seuils portent desormais sur max(0, maison - PV). Contacteur ouvert
cette grandeur EST la decharge batterie ; ferme, un bridage du MPPT la fait
surestimer, donc l erreur pousse a rester ferme et jamais a relacher tot.

Golden 20 -> 24, dont les deux releves de midi et le contrefactuel du nuage.
Le test de mutation a montre que la premiere serie ne couvrait que le seuil de
fermeture : il a fallu ecrire le cas du soleil revenu pour qu elle morde.

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-06 13:50:28 +02:00
parent 66d071684e
commit c7e665cd5c
7 changed files with 341 additions and 1 deletions

View File

@@ -66,6 +66,7 @@ function summarize(out) {
shouldNotify: !!d.should_notify,
evcsGridOverride: !!c.evcs_grid_override,
plafondDechargeW: c.plafond_decharge_w,
demandeParcW: c.demande_parc_w,
dwellMinutes: c.dwell_minutes,
dwellEcoule: c.dwell_ecoule,
reserveDejaCondamnee: !!c.reserve_deja_condamnee,

View File

@@ -63,6 +63,13 @@ const recoveryBase = {
const parcQuatreModules = {
battery_max_discharge_a: '100',
battery_voltage_v: '51',
// ⚠️ PV NULLE, ET C'EST STRUCTUREL. Depuis le 06/09 les deux seuils portent
// sur `max(0, maison - PV)`, ce que le parc est REELLEMENT sollicite de
// fournir, et non sur la maison brute. Les scenarios de protection decrivent
// le soir : le parc est seul, la maison brute EST la demande sur le parc. Les
// scenarios `h-midi-*` couvrent le cas diurne, ou le solaire couvre la
// cuisson et ou la regle ne doit PAS fermer.
pv_power_w: '0',
};
export const scenarios = [
@@ -405,6 +412,7 @@ export const scenarios = [
...recoveryBase,
battery_max_discharge_a: '100',
battery_voltage_v: 'unavailable',
pv_power_w: '0',
soc_percent: '65',
house_ac_power_w: '2000',
last_on_at: minutesAgo(T_MS, 40),
@@ -426,6 +434,7 @@ export const scenarios = [
...recoveryBase,
battery_max_discharge_a: 'unavailable',
battery_voltage_v: 'unavailable',
pv_power_w: '0',
soc_percent: '65',
house_ac_power_w: '2000',
last_on_at: minutesAgo(T_MS, 40),
@@ -447,6 +456,7 @@ export const scenarios = [
...recoveryBase,
battery_max_discharge_a: 'unavailable',
battery_voltage_v: 'unavailable',
pv_power_w: '0',
soc_percent: '65',
house_ac_power_w: '2000',
last_on_at: minutesAgo(T_MS, 40),
@@ -459,4 +469,102 @@ export const scenarios = [
gridAction: 'turn_off',
},
},
// =====================================================
// MIDI ENSOLEILLE : LE SOLAIRE COUVRE LA CUISSON (06/09/2026)
// =====================================================
// Deux fermetures ce dimanche, mesurees a la resolution native A L'INSTANT
// DE LA DECISION, contacteur encore ouvert donc production non censuree :
//
// 12:07, cuisson seule maison 4 025 W parc sollicite 1 132 W
// 13:34, cuisson + JEEP maison 4 981 W parc sollicite 772 W
//
// Controle croise : la decharge batterie valait 1 345 et 1 223 W aux memes
// instants — elle colle a `maison - PV`, pas a la maison brute. Le plafond du
// parc est de 5 100 W : il etait a 22 % et 15 % de sa limite, et la regle a
// ferme le contacteur pour rien.
{
id: 'h-midi-solaire-couvre-la-cuisson',
label: 'RELEVE 06/09 12:07 : maison 4025 W mais PV 2893 W, le parc ne fournit que 1132 W — aucune fermeture',
time: T,
overrides: {
...recoveryBase,
...parcQuatreModules,
grid_latch: 'off',
grid_state: 'off',
soc_percent: '69',
house_ac_power_w: '4025',
pv_power_w: '2893',
},
expect: {
state: 'observe_only',
gridAction: 'none',
latchAction: 'none',
demandeParcW: 1132,
},
},
{
id: 'h-midi-jeep-en-plus-solaire-couvre-encore',
label: 'RELEVE 06/09 13:34 : maison 4981 W dont la JEEP, PV 4209 W, parc a 772 W — aucune fermeture non plus',
time: T,
overrides: {
...recoveryBase,
...parcQuatreModules,
grid_latch: 'off',
grid_state: 'off',
soc_percent: '86',
house_ac_power_w: '4981',
pv_power_w: '4209',
evcs_ac_power_w: '1621',
evcs_charging: 'on',
evcs_surplus_state: 'charging_step_up_battery',
evcs_source_mode: 'Solaire',
},
expect: {
state: 'observe_only',
gridAction: 'none',
demandeParcW: 772,
},
},
{
id: 'h-midi-nuage-le-parc-encaisse-tout',
label: 'CONTREFACTUEL : meme cuisson a 4500 W mais le nuage passe, PV 200 W — le parc encaisse 4300 W, on ferme',
time: T,
overrides: {
...recoveryBase,
...parcQuatreModules,
grid_latch: 'off',
grid_state: 'off',
soc_percent: '69',
house_ac_power_w: '4500',
pv_power_w: '200',
},
expect: {
state: 'turn_on_charge_au_dessus_du_parc',
gridAction: 'turn_on',
latchAction: 'turn_on',
demandeParcW: 4300,
},
},
{
id: 'h-midi-soleil-revenu-relache',
label: "Le nuage est passe, contacteur ferme : la cuisson continue a 3000 W mais le PV en couvre 2000 — le parc n'est plus sollicite qu'a 1000 W, on rend le reseau",
time: T,
overrides: {
...recoveryBase,
...parcQuatreModules,
soc_percent: '69',
house_ac_power_w: '3000',
pv_power_w: '2000',
last_on_at: minutesAgo(T_MS, 40),
charge_high_last_at: minutesAgo(T_MS, 25),
balance_required_soc: '92',
balance_last_run: bilanRunAgo(T_MS, 3),
},
expect: {
state: 'turn_off_vehicle_unplugged',
gridAction: 'turn_off',
demandeParcW: 1000,
setChargeHighLastAt: false,
},
},
];