La consigne garde de quoi encaisser un nuage
Incident 11/09 18:00, voiture a 28 A : la descente avait amene la consigne a 1281 W alors que le solaire portait tout (PV 6058 W, reseau 1163 W). Un nuage a fait chuter la PV de 4,6 kW en une minute ; le reseau etant plafonne a 1281 W, toute la difference est tombee sur la batterie -- 87 A pour une limite dure de 70 -> `battery_current_hard_stop`, charge coupee, redemarrage a 6 A. Sans injection la production peut s'effondrer de plusieurs kW en quelques secondes, et une boucle a 30 s ne rattrape pas cela : le reseau doit etre DEJA autorise a prendre le relais. Second plancher : la consigne ne descend jamais au point ou la perte totale du solaire depasserait ce que la batterie sait encaisser, budget pris sur la politique par bande de SOC (§35) avec 20 % de marge sous la limite DURE -- c'est elle qui coupe. Sur le releve de l'incident, le plancher vaut 4829 W : au moment du nuage la batterie n'aurait pris que 28 A au lieu de 87. Contrepartie assumee : a 28 A la descente est nettement moins profonde qu'a 6 A. C'est proportionne, le courant de la voiture est ce qui cree l'exposition -- et proteger le materiel prime sur les kilowattheures. Golden 90 -> 91. Mutation : plancher retire -> 2 scenarios tombent ; budget pris sur la limite souple au lieu de la dure -> 3 tombent. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
This commit is contained in:
@@ -402,8 +402,43 @@ const gridSetpointCurrentW = Number.isFinite(parsed.gridSetpointW)
|
||||
// a notre demande, couvre la maison. On ne libere que la part VOITURE, qui est
|
||||
// exactement celle qui evince le solaire. Le solaire pourrait souvent couvrir
|
||||
// la maison en plus, mais l'affirmer demanderait ses propres scenarios.
|
||||
// ⚠️ SECOND PLANCHER : LE NUAGE (ajoute 11/09 18:05, apres incident).
|
||||
// Premiere version de la descente : consigne tombee a 1281 W alors que le
|
||||
// solaire portait tout (PV 6058 W, reseau 1163 W, voiture a 28 A). Un nuage a
|
||||
// fait chuter la PV de 4,6 kW en une minute ; le reseau etant plafonne a
|
||||
// 1281 W, la difference est tombee entierement sur la batterie -- 87 A pour
|
||||
// une limite dure de 70 A -> `battery_current_hard_stop`, charge coupee.
|
||||
//
|
||||
// Sans injection, la production peut s'effondrer de plusieurs kW en quelques
|
||||
// secondes. Une boucle a 30 s ne peut pas rattraper cela : il faut que le
|
||||
// reseau soit DEJA autorise a prendre le relais. La consigne ne descend donc
|
||||
// jamais au point ou la perte totale du solaire depasserait ce que la batterie
|
||||
// sait encaisser.
|
||||
//
|
||||
// Le budget vient de la politique batterie deja calibree par bande de SOC
|
||||
// (§35), pas d'une constante nouvelle, et on garde 20 % de marge sous la
|
||||
// limite DURE -- c'est elle qui coupe la charge, et une coupure est plus
|
||||
// couteuse que quelques centaines de watts de solaire non captes.
|
||||
//
|
||||
// Contrepartie assumee, et elle est reelle : voiture a 28 A, la descente est
|
||||
// nettement moins profonde qu'a 10 A. C'est proportionne -- c'est le courant
|
||||
// de la voiture qui cree l'exposition. Et c'est la regle du proprietaire :
|
||||
// protéger le materiel prime sur l'economie de kilowattheures.
|
||||
// `derived.batteryVoltageRef` est deja la tension retenue en amont (mesure
|
||||
// vebus, repli 51,2 V) : meme grandeur que celle qui sert a convertir le
|
||||
// courant batterie en puissance dans BATTERY_CLOUD_LOCKS.
|
||||
const batterySurgeBudgetW = Math.max(
|
||||
0,
|
||||
Math.abs(batteryPolicy.batteryDischargeHardDynamicA) * derived.batteryVoltageRef * 0.8
|
||||
);
|
||||
const gridSetpointLoadW =
|
||||
derived.houseNonEvcsW + derived.physicalCapA * derived.acVoltageRef;
|
||||
const gridSetpointCloudFloorW = Math.round(
|
||||
Math.max(0, gridSetpointLoadW - batterySurgeBudgetW)
|
||||
);
|
||||
|
||||
const gridSetpointHouseFloorW = clamp(
|
||||
Math.round(derived.houseNonEvcsW),
|
||||
Math.max(Math.round(derived.houseNonEvcsW), gridSetpointCloudFloorW),
|
||||
params.gridSetpointIdleW,
|
||||
GRID_SETPOINT_MAX_W
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user