La fenetre de midi est aussi une fenetre d heures creuses

Signale par le proprietaire avant le PUT : « il faut ajouter la periode HC
12h24 jusqu a 14h24 ». Il avait raison, et le trou etait plus profond qu une
borne manquante — l engagement de session etait gate sur `night_hc` SEUL,
parce que §40 ne traitait que la nuit.

Consequence : la charge HC manuelle qu on venait d ecrire ne pouvait RIEN faire
a midi. Le plancher relevait bien la cible du bilan, mais aucune session ne
s engageait, donc pas de takeover, pas de contacteur, pas de consigne. Le
reglage aurait releve le plancher de demarrage du soir — donc bloque la charge
du vehicule — sans jamais charger la batterie. Le pire des deux mondes.

⚠️ ET LE CRITERE N EST PAS LE MEME AUX DEUX FENETRES. La nuit, on compare le SOC
a `batteryMorningTargetPct`, qui contient le palier de prevision (35/55/85). A
midi ce palier n a aucun sens : il vaut 35 par beau temps, donc un SOC de 30 %
EN PLEIN SOLEIL engagerait une session reseau — la substitution du solaire par
le reseau qu on a mis des semaines a eteindre.

A midi le critere honnete est le SOC requis du bilan lui-meme, qui s auto-regule :
le croisement PV etant passe, l energie a couvrir vaut zero et le requis retombe
au plancher dur. Releve du 17/09 a 13:51, plein soleil : required_soc = 22,0 pour
energy_to_cover = 0,0. Il ne remonte qu un jour sombre — ou quand le proprietaire
pose un plancher manuel, ce qui est exactement le cas d usage.

Golden 106 -> 108. Les deux scenarios sont une paire : meme heure, meme profil,
seul le ciel change. Sombre avec un bilan qui reclame 85 % -> la session
s engage ; ensoleille avec un bilan a 22 % et un SOC de 30 % SOUS le palier du
matin -> aucun engagement.

Mutations : retour au gate night_hc seul -> le scenario sombre ; critere de la
nuit applique a midi -> le contrefactuel ensoleille. Chacune tombe sur un jeu
different. Hysteresis 24, ACM 20, bilan 50 inchanges.

⚠️ AUCUN PUT. Il en faut desormais DEUX — le bilan et le controleur — et ils
attendent tous les deux sa validation.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
This commit is contained in:
Tallagrand Thierry
2026-09-18 08:09:30 +02:00
parent 2654592b64
commit 3b81038739
3 changed files with 86 additions and 3 deletions

View File

@@ -705,9 +705,40 @@ const nightGridSessionUncovered =
// sous le seuil OFF de l'hysteresis (30), donc le contacteur reste ferme et
// la maison passe au PLEIN TARIF jusqu'au croisement PV — le 1,49 kWh deja
// consigne le 03/09.
// ⚠️ LA FENETRE DE MIDI EST AUSSI UNE FENETRE D'HEURES CREUSES (18/09/2026).
// L'engagement de session etait gate sur `night_hc` seul, parce que §40 traitait
// la nuit. Consequence mesuree : la charge HC manuelle demandee par le
// proprietaire ne pouvait RIEN faire a midi — le plancher relevait bien la cible
// du bilan, mais aucune session ne s'engageait, donc le contacteur ne se fermait
// pas et la consigne restait au repos. Le reglage aurait releve le plancher du
// soir (donc bloque la voiture) sans jamais charger la batterie.
//
// ⚠️ ET LE CRITERE N'EST PAS LE MEME AUX DEUX FENETRES. La nuit, on compare le
// SOC a `batteryMorningTargetPct`, qui contient le palier de prevision
// (35/55/85). A midi ce palier n'a aucun sens : il vaut 35 par beau temps, donc
// un SOC de 30 % en plein soleil engagerait une session reseau — c'est-a-dire la
// substitution du solaire par le reseau qu'on a mis des semaines a eteindre.
//
// A midi le critere honnete est le SOC requis du bilan lui-meme, qui
// s'auto-regule : le croisement PV etant passe, `energyToCoverKwh` vaut zero et
// `required_soc` retombe au plancher dur. Releve du 17/09 a 13:51, plein soleil :
// `required_soc` = 22,0 pour `energy_to_cover` = 0,0. Il ne remonte qu'un jour
// sombre — ou quand le proprietaire pose un plancher manuel, ce qui est
// exactement le cas d'usage.
const middayGridSessionUncovered =
balanceMorningTargetApplied &&
Number.isFinite(params.balanceRequiredSocPct) &&
parsed.soc < params.balanceRequiredSocPct;
const gridSessionInHcWindow =
profile === 'night_hc' || profile === 'midday_hc_or_solar';
const gridSessionUncovered =
profile === 'night_hc' ? nightGridSessionUncovered : middayGridSessionUncovered;
const nightGridSessionCommitted =
profile === 'night_hc' &&
(nightGridSessionUncovered || nightGridSessionCommittedPrev);
gridSessionInHcWindow &&
(gridSessionUncovered || nightGridSessionCommittedPrev);
const nightGridTakeoverNeeded =
nightGridSessionCommitted ||