La cible du matin devient une energie a couvrir, plus un palier

La regle classait le lendemain en trois paliers a partir de son TOTAL (>= 18 kWh
-> 35 %, >= 10 -> 55 %, sinon 85 %) et ignorait donc l heure d arrivee de
l energie. Le 03/09 demain annoncait 33,9 kWh — donc "fort", donc 35 % — avec un
matin creux (0,03 kWh a 7 h, 0,77 a 8 h) et un croisement a 9 h. Meme defaut que
le plancher du soir, a l autre bout de la nuit.

Releve de la nuit 02-03/09, requis contre reel : 00:30 62,4 / 53 ; 03:00
50,4 / 45 ; 04:30 41,7 / 37 ; 06:00 37,1 / 22 — cible fixe a 35 tout du long.
Le required_soc decroit proprement avec la nuit qui se consomme (6,1 -> 0 kWh a
couvrir), la batterie est restee sous la ligne toute la nuit, et le bilan le
savait des 00:30. A 03:00 EDF a ete relache cinq points sous la ligne ; le
reseau est revenu de 07:24 a 10:33 au plein tarif, 1,49 kWh.

La cible vaut desormais min(90, max(palier ou advisor, required_soc)). Sens
unique delibere : la direction corrigee est celle de l echec observe, et le
principe unificateur des deux cablages est que le bilan ne pousse jamais dans le
sens "couvre moins bien la nuit". Plafond 90 parce qu au-dela la batterie cesse
d etre un puits et evince la production du matin, et parce que le bilan publie
sans ecretage des valeurs superieures a 100 — sans ce plafond la cible serait
inatteignable et EDF resterait allume toute la nuit. C est deja la borne du
chemin advisor, aucune constante nouvelle.

Pas d oscillateur : required_soc decroit de facon monotone pendant la nuit et la
passe unique de recovery reste en place. Gardes et repli identiques au plancher
du soir, kill-switch existant.

Golden 70 -> 75. Quatre mutations font tomber chacune exactement un scenario
different. Un cinquieme scenario fige une LIMITE CONNUE, mesuree par sonde : la
passe unique de recovery latche le relachement pour toute la session, donc la
cible dynamique n ameliore que la premiere passe. §26 avait deja designe le bon
critere de re-engagement — un budget d energie restant a couvrir, qui appartient
au bilan ; la suite touche la machine a etats de la nuit et fera l objet d un
chantier propre.

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 22:51:09 +02:00
parent 6f3f98e8b6
commit 05bdf019c2
7 changed files with 344 additions and 9 deletions

View File

@@ -2821,3 +2821,105 @@ pas, et c'est tout l'interet.
---
*Document mis a jour le : 03/09/2026 (~22:25) — plancher du soir issu du bilan energetique, golden 70/70, deploye*
## 39. Session du 03/09/2026 (suite) — La cible du matin devient une energie
### Le defaut, symetrique de la §38
La regle historique classe le lendemain en trois paliers a partir de son TOTAL :
`>= 18 kWh -> 35 %`, `>= 10 -> 55 %`, sinon 85 %. Elle est donc aveugle a
**l'heure d'arrivee** de l'energie. Le 03/09, demain annoncait 33,9 kWh — donc
« fort », donc 35 % — mais avec un matin creux (0,03 kWh a 7 h, 0,77 a 8 h,
1,81 a 9 h) et un croisement a 9 h. C'est le meme defaut que le plancher du soir
de la §38, a l'autre bout de la nuit.
### Le releve qui a motive le cablage (nuit 02-03/09)
| heure | requis (bilan) | SOC reel | cible fixe |
|---|---:|---:|---:|
| 00:30 | 62,4 | 53 | 35 |
| 03:00 | **50,4** | **45** | 35 |
| 04:30 | 41,7 | 37 | 35 |
| 06:00 | 37,1 | 22 | 35 |
`required_soc` decroit proprement avec la nuit qui se consomme (6,1 -> 0 kWh a
couvrir) : c'est une cible instantanee, pas une constante deguisee. **La
batterie est restee sous la ligne toute la nuit, et le bilan le savait des
00:30.** A 03:00 EDF a ete relache cinq points sous la ligne ; la batterie est
tombee a 20 % vers 06:30 et le reseau est revenu de 07:24 a 10:33 —
**1,49 kWh AU PLEIN TARIF**.
### Le correctif (deploye 03/09 22:50, golden 75/75)
Dans `WINDOWS_SOURCEV2.js` :
```js
batteryMorningTargetPct = balanceApplique
? Math.min(90, Math.max(batteryMorningTargetBasePct, params.balanceRequiredSocPct))
: batteryMorningTargetBasePct;
```
`batteryMorningTargetBasePct` = advisor si son toggle est actif, sinon les
paliers. L'ordre est donc : paliers ou advisor d'abord, puis le bilan ne peut
que RELEVER.
**SENS UNIQUE**, comme en §38 : la direction corrigee est celle de l'echec
observe — cible trop basse, batterie a plat avant le croisement, reseau au
plein tarif le matin. L'abaisser ouvrirait un risque neuf que rien n'a valide.
Principe unificateur des deux cablages : **le bilan ne pousse jamais dans le
sens « couvre moins bien la nuit »**.
**PLAFOND 90 %** : au-dela la batterie cesse d'etre un puits et la production du
matin se fait evincer (mesures du 31/08). Charger au reseau au-dela de 90
echangerait un kWh bon marche cette nuit contre plusieurs kWh censures demain.
C'est deja la borne du chemin advisor : aucune constante nouvelle. Le bilan
publie sans ecretage des valeurs > 100 (voulu, §26 : signal de dimensionnement),
donc ce plafond n'est pas cosmetique — sans lui la cible serait inatteignable
et EDF resterait allume toute la nuit.
**PAS D'OSCILLATEUR** : `required_soc` decroit de facon monotone pendant la nuit,
et la passe unique de recovery (§26) reste en place.
**Gardes et repli** identiques a la §38 (fraicheur 30 min, statut `ok`, valeur
finie ; kill-switch `evcs_balance_enabled` deja existant). Trace logbook :
`Nuit EVCS: target=X% (BILAN)`.
### Golden 70 → 75
| scenario | attendu |
|---|---|
| `cible-bilan-tient-le-reseau` (releve 03:00, SOC 45, requis 50,4) | reseau MAINTENU |
| `cible-bilan-perime-relache-comme-avant` (bilan vieux de 2 h) | relache — le comportement qui a coute 1,49 kWh |
| `cible-bilan-ne-baisse-pas-la-cible` (SOC 30, requis 25) | palier 35 maitre, reseau maintenu |
| `cible-bilan-plafonnee-a-90` (SOC 92, requis 118,9) | plafonnee, relache |
Mutation, quatre directions (bilan ignore / `Math.max` en affectation directe /
plafond 90 supprime / garde de fraicheur supprimee) : **chacune fait tomber
exactement UN scenario, different a chaque fois**.
### ⚠️ LIMITE CONNUE, MESUREE ET FIGEE — la passe unique
Scenario `cible-bilan-limite-passe-unique`, verifie par sonde : recovery deja
latchee, SOC 30 repassant sous un requis de 37,1 % => **le reseau reste
relache**, et la raison affiche meme « batterie a la cible » sept points sous
la ligne. La passe unique de recovery (§26, anti-oscillateur) latche
`nightRecoveryDone` pour toute la session : la cible dynamique n'ameliore donc
que la PREMIERE passe.
Filet restant : l'hysteresis a SOC ≤ 20 %, mais elle peut tomber HORS heures
creuses — c'est exactement le 1,49 kWh plein tarif du 03/09.
Ce comportement est epingle par un scenario pour qu'un changement futur soit
delibere. **§26 avait deja designe le bon critere de re-engagement** : « un
budget d'energie restant a couvrir — il appartient au bilan energetique, pas a
une constante de plus ici ». Le bilan est desormais cable ; la suite naturelle
est une **session reseau unique et dimensionnee** — ne pas relacher tant qu'on
est sous la ligne ET dans la fenetre HC. C'est un chantier a part : il touche la
machine a etats de la nuit (§18/§19/§26), qui a deja produit quatre
oscillateurs, et merite ses propres scenarios.
### Etat du cablage du bilan
| consommateur | statut |
|---|---|
| plancher de demarrage du soir | ✅ §38 |
| cible du matin | ✅ §39 |
| re-engagement du reseau la nuit | ❌ passe unique (ci-dessus) |
| hysteresis `grid_soc_on`/`grid_soc_off` (20/30) | ❌ toujours des niveaux fixes (§11.8.A) |
---
*Document mis a jour le : 03/09/2026 (~22:55) — cible du matin issue du bilan energetique, golden 75/75, deploye*