Session reseau unique de la nuit : engagement sur le bilan, sortie sur la fenetre
§26 avait pose l objectif et designe le critere. Avant d ecrire quoi que ce soit, j ai mesure les kWh reellement sortis de la batterie par point de SOC sur cinq fenetres et trois nuits : 0,164 a 0,171 kWh/point au-dessus de 42 %, soit environ 17 kWh, mais 0,121 entre 45 et 22 % et 0,082 entre 33 et 20 %. En bas d echelle un point de SOC vaut moitie moins, alors que BALANCE.js convertit avec une constante unique de 15 kWh. required_soc y est donc systematiquement trop bas — c est le facteur 1,75 mesure la nuit du 02-03/09, ou le SOC descendait bien plus vite que la ligne. Cette mesure a dicte la conception : le relachement de la session ne peut pas etre un seuil de SOC, puisqu il porterait sur une grandeur fausse et que tout seuil que le SOC repasse ensuite rouvre l oscillateur du 27/08. Les deux variantes evidentes — relacher sur required_soc, ou sur required_soc_prudent avec la bande p50/p80 — ont ete ecartees pour cette raison. Retenu : engagement sur le bilan (batterie sous la cible), relachement a la fin de la fenetre. L oscillation devient structurellement impossible, la condition de sortie etant monotone : une fenetre ne se ferme qu une fois. Un nouveau helper input_boolean.victron_evcs_night_grid_session_committed porte l engagement, cree par input_boolean.reload sans redemarrage HA et ecrit seulement sur changement reel ; sans cette persistance la garde redeviendrait une bande, donc un oscillateur. Effet : l ACM recharge jusqu a la cible puis tient la batterie a 2 A, la maison finit la nuit sur le reseau en heures creuses au lieu de vider la reserve, et la batterie arrive a l aube pres de sa cible avec de la place pour le solaire. La coupure immediate E2 de l hysteresis exige l absence d override et le helper takeover reste ON : aucune modification du workflow d hysteresis. Golden 75 -> 78. Le scenario epingle quelques heures plus tot comme limite connue devient celui du correctif, attendu mis a jour dans le meme commit. Quatre mutations ; la plus parlante retire la garde bilan et fait tomber les trois scenarios anti-oscillateur du 27/08 — les tests de l ancien correctif protegent le nouveau code. Prerequis identifie et non traite : la conversion kWh vers points de SOC est une constante la ou la realite est une courbe. Consequence, un sous-declenchement possible en bas d echelle, jamais une oscillation. Prochain chantier du bilan. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ
This commit is contained in:
119
HANDOFF.md
119
HANDOFF.md
@@ -2923,3 +2923,122 @@ oscillateurs, et merite ses propres scenarios.
|
||||
|
||||
---
|
||||
*Document mis a jour le : 03/09/2026 (~22:55) — cible du matin issue du bilan energetique, golden 75/75, deploye*
|
||||
|
||||
## 40. Session du 03/09/2026 (suite) — Session reseau UNIQUE de la nuit
|
||||
|
||||
### La mesure qui a dicte la conception (a lire avant tout le reste)
|
||||
Avant d'ecrire une ligne, j'ai mesure les kWh reellement sortis de la batterie
|
||||
par point de SOC, sur cinq fenetres et trois nuits :
|
||||
|
||||
| fenetre | bande SOC | kWh/point | capacite implicite |
|
||||
|---|---|---:|---:|
|
||||
| 03/09 21:30-22:50 | 74 → 57 | 0,171 | **17,1 kWh** |
|
||||
| 31/08 03:00-05:00 | 49 → 42 | 0,170 | **17,0 kWh** |
|
||||
| 03/09 19:44-20:17 | 94 → 85 | 0,164 | **16,4 kWh** |
|
||||
| 02-03/09 03:00-06:00 (zero reseau) | 45 → 22 | 0,121 | **12,1 kWh** |
|
||||
| 01-02/09 03:00-06:00 | 33 → 20 | 0,082 | **8,2 kWh** |
|
||||
|
||||
Au-dessus de ~42 % la jauge est lineaire et coherente (~17 kWh, ce qui valide
|
||||
le `batteryUsableCapacityKwh: 17.5` code en dur). **En dessous elle s'effondre :
|
||||
un point de SOC y vaut moitie moins.** Or `BALANCE.js` convertit avec une
|
||||
constante unique : `socNeeded = energyToCover / usable_capacity_kwh * 100`, avec
|
||||
le helper a 15 kWh. `required_soc` est donc systematiquement TROP BAS dans la
|
||||
bande ou la nuit se termine — c'est le facteur 1,75 mesure la nuit du 02-03/09,
|
||||
ou le SOC descendait bien plus vite que la ligne.
|
||||
|
||||
**Conclusion de conception, et elle est structurante : le relachement de la
|
||||
session reseau ne peut PAS etre un seuil de SOC.** Il porterait sur une grandeur
|
||||
fausse, et tout seuil que le SOC repasse ensuite rouvre l'oscillateur eteint le
|
||||
27/08. C'est ce raisonnement qui a ecarte les deux variantes evidentes
|
||||
(relacher sur `required_soc`, ou sur `required_soc_prudent` avec la bande p50/p80).
|
||||
|
||||
### Le correctif (deploye 03/09 23:13, golden 78/78)
|
||||
**ENGAGEMENT sur le bilan, RELACHEMENT a la FIN DE LA FENETRE.**
|
||||
|
||||
```js
|
||||
nightGridSessionUncovered = balanceMorningTargetApplied && batteryBelowMorningTarget;
|
||||
nightGridSessionCommitted = nightSessionActive && (uncovered || committedPrev);
|
||||
nightGridTakeoverNeeded = nightSessionActive && (nightGridSessionCommitted || ...);
|
||||
```
|
||||
|
||||
L'oscillation devient **structurellement impossible** : la condition de sortie
|
||||
est monotone — une fenetre ne se ferme qu'une fois. Aucun seuil de
|
||||
re-engagement n'existe, donc aucun cycle limite ne peut s'installer.
|
||||
|
||||
Nouveau helper **`input_boolean.victron_evcs_night_grid_session_committed`**
|
||||
(paquet `victron_evcs_night_helpers.yaml`, sauvegarde dans `packages/SAVE/`,
|
||||
cree par `input_boolean.reload` — **aucun redemarrage HA**, meme procede que le
|
||||
01/09). Ecrit uniquement sur changement reel. **C'est ce bit qui rend la session
|
||||
unique** : sans persistance, l'engagement serait reevalue a chaque cycle et le
|
||||
systeme retomberait dans une bande, donc dans un oscillateur.
|
||||
|
||||
### Ce que ca fait concretement
|
||||
L'ACM recharge jusqu'a la cible puis tient la batterie a 2 A
|
||||
(`evcs_takeover_hold`) : la maison finit la nuit **sur le reseau en heures
|
||||
creuses** au lieu de vider la reserve, et la batterie arrive a l'aube pres de sa
|
||||
cible — donc avec de la place pour le solaire du matin. A comparer au 03/09 :
|
||||
batterie a 20 %, reseau encore ouvert a 10:33, et 1,49 kWh achetes au plein
|
||||
tarif entre 07:24 et 10:33 (pendant lesquels le reseau evincait en plus la
|
||||
production naissante).
|
||||
|
||||
### Composition avec l'hysteresis — verifiee
|
||||
La coupure immediate E2 (`turn_off_recovery_done`) exige `!evcsGridOverride`, et
|
||||
`evcsExplicitGridRequest` inclut `evcsNightGridTakeoverNeeded`. Tant que la
|
||||
session est engagee, le helper takeover est ON, donc E2 ne s'applique pas et la
|
||||
boucle generique maintient le reseau. **Aucune modification du workflow
|
||||
d'hysteresis n'a ete necessaire.**
|
||||
|
||||
### Golden 75 → 78 (et un scenario promu)
|
||||
`cible-bilan-limite-passe-unique`, epingle quelques heures plus tot comme LIMITE
|
||||
CONNUE, est devenu `session-unique-tient-sous-la-ligne` : c'est exactement ce
|
||||
que ce correctif change. Attendu mis a jour dans le meme commit, conformement a
|
||||
la regle du depot.
|
||||
|
||||
| scenario | role |
|
||||
|---|---|
|
||||
| `session-unique-tient-sous-la-ligne` | SOC 30 sous le requis 37,1 → engagement |
|
||||
| `session-unique-ne-relache-pas-sur-le-soc` | **preuve anti-oscillateur** : SOC 45 repasse AU-DESSUS, la session tient et rien n'est reecrit |
|
||||
| `session-unique-fin-de-fenetre` | la seule sortie : 08:00, hors fenetre → relache + bit nettoye |
|
||||
| `session-unique-bilan-indisponible` | bilan perime → aucun engagement, comportement historique |
|
||||
|
||||
Mutation, quatre directions. La plus instructive est la quatrieme : **retirer la
|
||||
garde bilan fait tomber les TROIS scenarios anti-oscillateur du 27/08**
|
||||
(`night-oscillateur-nuit-2627`, `night-recovery-done-pas-de-reengagement`,
|
||||
`night-recovery-done-bande-collante`). Les tests de l'ancien correctif protegent
|
||||
activement le nouveau code — c'est exactement ce qu'on attend d'une suite golden
|
||||
apres cinq semaines d'accumulation.
|
||||
|
||||
### ⚠️ PREREQUIS IDENTIFIE, NON TRAITE — la conversion kWh ↔ SOC
|
||||
Le tableau en tete de cette section est un resultat a part entiere, et il
|
||||
depasse ce correctif : **`evcs_balance_usable_capacity_kwh` = 15 est une
|
||||
constante la ou la realite est une courbe** (17 kWh au-dessus de 42 %, 8 a
|
||||
12 kWh en dessous), et `INPUT_PARSE` code 17,5 en dur de son cote. Tant que
|
||||
cette conversion est lineaire :
|
||||
- `required_soc` sous-estime le SOC necessaire en bas d'echelle ;
|
||||
- donc l'engagement de la session peut manquer des nuits ou il aurait fallu
|
||||
s'engager (sous-declenchement — jamais d'oscillation, la conception y est
|
||||
immune) ;
|
||||
- et la reserve d'orage (§26) est optimiste dans la meme bande.
|
||||
|
||||
C'est le prochain chantier du bilan energetique. §28 avait deja signale
|
||||
l'effondrement de la jauge en bas d'echelle et conclu « a verser au chantier du
|
||||
bilan energetique ; ne pas corriger par un seuil de plus » — les mesures
|
||||
ci-dessus lui donnent maintenant sa courbe.
|
||||
|
||||
### Limite de perimetre
|
||||
La session ne s'engage que pendant une **session nuit** (fenetre HC ET vehicule
|
||||
branche) : c'est la portee du contrôleur EVCS. Une nuit sans vehicule reste
|
||||
geree par l'hysteresis seule, avec ses seuils fixes 20/30 (§11.8.A) — chantier
|
||||
distinct.
|
||||
|
||||
### Etat du cablage du bilan
|
||||
| consommateur | statut |
|
||||
|---|---|
|
||||
| plancher de demarrage du soir | ✅ §38 |
|
||||
| cible du matin | ✅ §39 |
|
||||
| session reseau unique de la nuit | ✅ §40 |
|
||||
| conversion kWh ↔ SOC (prerequis) | ❌ constante 15 kWh vs courbe mesuree |
|
||||
| hysteresis `grid_soc_on`/`off` (20/30) | ❌ niveaux fixes |
|
||||
|
||||
---
|
||||
*Document mis a jour le : 03/09/2026 (~23:20) — session reseau unique de la nuit, golden 78/78, deploye*
|
||||
|
||||
Reference in New Issue
Block a user