Charge HC manuelle : un plancher qui CONTRAINT le bilan, pas une cible qui le remplace
Decision du proprietaire, dans ses termes : « contraindre le bilan, un seul arbitre ». Ce projet a deja paye cher les automates concurrents — charges programmees de l ESS, consigne a 4200 W, plancher SOC du GX — et un bouton qui ecrirait sa propre cible en aurait cree un quatrieme. ⚠️ LE FORCAGE EST EN AMONT, DANS coverage(), ET NULLE PART AILLEURS. Mesure sur banc : ecrire directement dans balance_required_soc engage bien la session — contacteur ferme, takeover ON — mais laisse la consigne reseau a 700 W, donc la batterie recoit une centaine de watts. C est le defaut du 01/09 a l identique, et le seul des trois resultats INDIAGNOSTICABLE depuis le tableau de bord : il a l air de marcher. La raison est que required_soc ENGAGE la session et grid_energy_needed_kwh la FINANCE. Pose dans coverage(), le plancher fait bouger les deux ensemble par construction. Sens unique, comme les cablages de §38, §39 et §40 : le plancher ne peut que RELEVER l exigence. Un reglage trop bas est sans effet, il ne desarme rien. DEUX NOMBRES ET PAS UN, et c est architectural. `..._target` est le reglage du proprietaire ; `..._floor` est sa valeur EFFECTIVE, mise a zero hors des fenetres d heures creuses par une automatisation Home Assistant, et c est elle que le bilan lit. Le bilan repond a « de combien la batterie a besoin », pas a « quand est-ce bon marche » : il ne contient aucune notion d heure creuse (zero occurrence de hc_night ou hc_midday dans tout src/energy-balance/) et doit le rester. Home Assistant detient le calendrier tarifaire, le bilan detient l energie. Sans ce filtrage le plancher fuit dans la journee et mord sur BATTERY_CLOUD_LOCKS — eveningSocStartFloorPct = max(eveningSocStartMin, balanceRequiredSocPct) — au point de bloquer le demarrage de la charge du vehicule le soir. Ce n est pas theorique, c est une ligne qui s applique tous les soirs. Le bouton se desarme a la sortie de la fenetre ou il a servi : une demande de charge est un geste ponctuel, pas un reglage permanent oublie. ⚠️ EFFET STRUCTUREL CONSIGNE, qu aucune echeance ne corrige : coverage() est appelee pour le profil typique ET le profil prudent, donc le plancher releve aussi required_soc_prudent, qui est le plancher de P12. Pendant une charge manuelle, la voiture cesse de descendre la batterie. Coherent, mais une nuit ou l on veut les deux on n aura que l un. Bilan 48 -> 50. Mutations : plancher ignore -> le scenario qui le releve ; plancher qui remplace au lieu de relever -> le contrefactuel a 25 %. Chacune tombe sur un jeu different. gridEnergyNeededKwh ajoute au resume de test : il manquait alors qu il est desormais consomme en aval par la consigne reseau. Gabarit du bilan rendu contre Home Assistant : 42 champs, JSON valide, helper absent lu « unknown » donc plancher nul — le repli est sur avant meme que les helpers existent. ⚠️ AUCUN PUT VERS n8n. Le workflow du bilan tourne toujours sans ce changement. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
This commit is contained in:
@@ -83,6 +83,10 @@ const SUMMARIZE = {
|
||||
energyToCoverKwh: o.coverage.energyToCoverKwh,
|
||||
requiredSocPct: o.coverage.requiredSocPct,
|
||||
gridNeeded: o.coverage.gridNeeded,
|
||||
// Le MANQUE, et pas l'energie a couvrir. C'est lui qui finance la session :
|
||||
// depuis le 18/09 la consigne reseau dimensionne sa part batterie dessus.
|
||||
// Il manquait au resume alors qu'il est desormais consomme en aval.
|
||||
gridEnergyNeededKwh: Math.round(o.coverage.gridEnergyNeededKwh * 100) / 100,
|
||||
prudentRequiredSocPct: o.coverage.prudent.requiredSocPct,
|
||||
deficitTrustworthy: o.confidence.deficitTrustworthy,
|
||||
nextDeficitFound: o.nextDeficit.found,
|
||||
|
||||
@@ -66,6 +66,61 @@ export const balanceScenarios = [
|
||||
deficitTrustworthy: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
// ======== CHARGE HC MANUELLE (18/09/2026) ========
|
||||
// Le plancher manuel est pose EN AMONT, dans `coverage()`, et non en ecrivant
|
||||
// `balance_required_soc` : mesure sur banc, un forcage en aval engage la
|
||||
// session mais laisse la consigne reseau a 700 W — contacteur ferme, batterie
|
||||
// a cent watts, et ca A L'AIR de marcher. Ici la cible ET le manque bougent
|
||||
// ensemble, ce que ce scenario verifie en exigeant les deux.
|
||||
node: 'BALANCE',
|
||||
id: 'bilan-plancher-manuel-releve-la-cible-et-le-manque',
|
||||
label: 'Charge HC manuelle a 85 % : la cible passe de 30,5 a 85 % ET le manque suit (9,95 kWh au lieu de 0,82)',
|
||||
snapshot: {
|
||||
nowMs: Date.parse('2026-08-24T06:43:00+02:00'),
|
||||
consumption_p50: P50,
|
||||
consumption_p80: P80,
|
||||
horizon: horizonFrom('2026-08-24T06:43:00+02:00', 18, PROD_24_08),
|
||||
soc_percent: 21,
|
||||
usable_capacity_kwh: 15,
|
||||
soc_floor_percent: 22,
|
||||
manual_hc_floor_percent: 85,
|
||||
},
|
||||
expect: {
|
||||
usable: true,
|
||||
requiredSocPct: 85,
|
||||
gridNeeded: true,
|
||||
// 21 -> 85 traverse le genou de 33 % : 12 points a 0,097 puis 52 a 0,169.
|
||||
gridEnergyNeededKwh: 9.95,
|
||||
// Le plancher passe par `coverage()`, appelee pour les DEUX profils : la
|
||||
// cible prudente monte aussi. Consequence assumee — pendant une charge
|
||||
// manuelle, P12 cesse de descendre la batterie pour la voiture.
|
||||
prudentRequiredSocPct: 85,
|
||||
},
|
||||
},
|
||||
{
|
||||
node: 'BALANCE',
|
||||
id: 'bilan-plancher-manuel-ne-baisse-jamais-la-cible',
|
||||
label: 'CONTREFACTUEL — plancher manuel a 25 %, sous les 30,5 % calcules : le bilan garde SA cible',
|
||||
snapshot: {
|
||||
nowMs: Date.parse('2026-08-24T06:43:00+02:00'),
|
||||
consumption_p50: P50,
|
||||
consumption_p80: P80,
|
||||
horizon: horizonFrom('2026-08-24T06:43:00+02:00', 18, PROD_24_08),
|
||||
soc_percent: 21,
|
||||
usable_capacity_kwh: 15,
|
||||
soc_floor_percent: 22,
|
||||
manual_hc_floor_percent: 25,
|
||||
},
|
||||
expect: {
|
||||
// Sens unique, comme les cablages de §38, §39 et §40 : le plancher ne peut
|
||||
// que RELEVER l'exigence. Un reglage manuel trop bas ne desarme pas le
|
||||
// bilan, il est simplement sans effet.
|
||||
usable: true,
|
||||
requiredSocPct: 30.5,
|
||||
prudentRequiredSocPct: 41,
|
||||
},
|
||||
},
|
||||
{
|
||||
node: 'BALANCE',
|
||||
id: 'bilan-modules-valeur-aberrante-retombe-sur-sept',
|
||||
|
||||
Reference in New Issue
Block a user