docs(maquette): la recharge accélérée n'est pas un vidage — et le brief moteur qui va avec

Trois corrections de Patrick sur la section batterie, plus le brief séparé.

1. LE BOOST CHANGE DE NATURE, et ce n'est pas un détail de libellé. Ce n'est pas « vider la
   batterie dans la voiture » : c'est charger la voiture plus vite que l'abonnement ne le
   permet. Un client en 6 kVA veut 7,5 ; le réseau donne 6, la batterie comble l'écart, le
   disjoncteur ne saute pas.

   Le réglage devient donc une PUISSANCE DE CHARGE VISÉE, pas une cible de SOC batterie, et
   la première des trois fins devient « la voiture a atteint sa cible » — le plancher
   batterie reste, mais comme garde-fou et non comme objectif. On ne cherche pas à vider la
   batterie, on cherche à finir la charge plus tôt.

   Ma réserve « le boost pourrait acheter en cachette » tombe, et elle tombe à l'envers : ce
   mécanisme existe précisément pour NE PAS dépasser ce qu'on a le droit de soutirer.

   Écrit dans la note : ce bloc appartient au délestage de LM-1006-1 vu par l'autre bout —
   au lieu de réduire les charges pour tenir sous le plafond, on complète par la batterie.
   Même objet, pas un mécanisme parallèle. Et c'est un argument de vente réel, donc il est
   dit à l'écran : recharger plus vite sans passer de 6 à 9 kVA.

2. L'INTERRUPTEUR DE DÉCHARGE PROMETTAIT CE QUE LE MÉCANISME NE TIENT PAS. Il disait « la
   maison continue d'être servie ; seule la voiture ne l'est pas ». enableDischarging est
   binaire et l'onduleur ne voit qu'une consommation nette : coupé, le réfrigérateur passe au
   réseau comme la voiture. Reformulé en « geler la batterie », avec le mécanisme expliqué.
   La version modulée — plafonner dischargingRate sur la consommation hors borne, recalculé
   à chaque cycle — part au brief comme question, pas à l'écran comme réglage.

   C'est exactement la classe de défaut traquée depuis trois jours, et je l'avais écrite
   moi-même.

3. LA RÉSERVE ADAPTATIVE DEVIENT UN PLANCHER DE SECOURS. Mon avertissement sur Battery Life
   était juste mais incomplet : il disait ce que le bloc n'est pas sans dire ce qu'il est.
   Combien d'autonomie garder pour une coupure est une préférence de RISQUE — elle dépend du
   congélateur, du télétravail, de la fiabilité du réseau local. Héos ne pourra jamais la
   décider à la place du client, ce qui la qualifie exactement selon le critère qui a fait
   sortir les quatre autres blocs.

Deux détails de cohérence : la batterie est la seule charge sans compteur dédié possible —
elle publie currentPower elle-même — et c'est DIT plutôt qu'omis en silence comme dans les
cinq autres écrans. Et chargingRate trouve sa place : plafond de soutirage sur la charge
réseau, même motif que la recharge accélérée à l'envers.

Le brief moteur est à part, dans BRIEF_plugin_depuis_maquettes.md : les trois questions de
mécanisme (interdit actif, bail qui expire, controlHealthy), plus quatre que la recharge
accélérée soulève — la boucle à la minute contre un disjoncteur en secondes, la marge
dimensionnée contre le pire démarrage non piloté, le filet qui est la BORNE et non la
batterie, et la latence du Fronius à mesurer sur le banc. Avec la conséquence honnête écrite
noir sur blanc : en 6 kVA le gain réel est d'un à deux kilowatts, pas de 1,5 garanti.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016vrTVifar2GN5rtUh89Wkq
This commit is contained in:
Patrick Schurig 2026-08-27 21:46:03 +02:00
parent b298c366d8
commit 74b7a84913
2 changed files with 189 additions and 37 deletions

View File

@ -2,6 +2,111 @@
---
## 2026-08-27 (soir) — la batterie comme charge : sept questions
**Origine** : la maquette « Configurer · Batterie », septième colonne de
`docs/mockups/configurer_mecanismes_mockup.html`. Elle a été écrite en supposant la réponse
« oui » à la question du billet précédent — *le stockage est-il une charge arbitrable ?* —
puis rétrécie quatre fois. Ce qui reste à l'écran est ce qu'aucun calcul ne peut décider à la
place de l'installateur ; **tout le reste est ci-dessous, et c'est chez vous.**
Rien de ce qui suit n'est dessiné dans l'interface. Ce sont des détails techniques.
---
### A. Les trois questions de mécanisme
**A1 — Bloquer demande un INTERDIT ACTIF, pas une allocation à zéro.** La batterie agit
d'elle-même : l'onduleur charge sans qu'on le lui demande. Ne rien lui allouer ne l'empêche
donc de rien — il faut lui dire `enableCharging = false`. C'est une différence de nature avec
toutes les autres charges du waterfall, où « 0 W alloué » suffit à ce qu'il ne se passe rien.
**A2 — Cet interdit doit EXPIRER.** Un HEMS qui tombe après avoir posé
`enableCharging = false` laisse une batterie inerte, sans que rien ne le signale et sans que
personne ne sache pourquoi. Il faut un **bail à durée limitée**, renouvelé tant que l'arbitre
vit. **L'état sûr d'un stockage, c'est « il fait ce qu'il ferait sans nous », pas « il reste
sur le dernier ordre reçu ».**
**A3 — `controlHealthy == false` doit SORTIR la batterie de l'arbitrage**, comme
`available == false` sort une charge en défaut. L'état existe déjà sur la classe. Une
batterie qu'on croit piloter et qui ne répond plus fausse le budget en silence — exactement
ce que faisait le double commandeur des bornes avant 3g-2.
---
### B. Ce que la recharge accélérée soulève, et qui est entièrement de votre ressort
Le « boost » a changé de nature en cours de maquette, et c'est ce changement qui rend ces
questions nécessaires. **Ce n'est pas « vider la batterie dans la voiture »** : c'est
*charger la voiture plus vite que l'abonnement ne le permet*. Un client en 6 kVA veut charger
à 7,5 ; le réseau fournit 6, la batterie comble l'écart, le disjoncteur ne saute pas.
> **C'est le délestage de LM-1006-1 vu par l'autre bout.** Le délestage applique un plafond
> de soutirage en **réduisant les charges** pour tenir dessous ; ici on tient sous le même
> plafond en **complétant par la batterie**. Même objet, même plafond, même arbitre — à
> écrire comme un cas du mécanisme existant, **pas comme un mécanisme parallèle**.
**B1 — La boucle est trop lente pour le transitoire, et il faut l'assumer.** L'arbitre tourne
à la minute ; un disjoncteur saute en secondes. Raser le plafond est donc exclu : il faut une
**marge assumée**, et elle doit se dimensionner **contre le pire démarrage de charge non
pilotée entre deux cycles** — un four ou une plaque, soit 2 à 3 kW qui apparaissent sans
prévenir.
**Conséquence honnête, à écrire quelque part plutôt qu'à découvrir sur le terrain** : avec un
abonnement 6 kVA, le gain réel de la recharge accélérée est de **un à deux kilowatts, pas de
1,5 garanti**. L'écran affiche « 6,0 + 1,5 » comme une illustration ; le moteur devra dire ce
qu'il peut vraiment tenir.
**B2 — Le filet de sécurité n'est pas la batterie, c'est la BORNE.** Elle est pilotable et
rapide. Si la consommation grimpe, on **descend le courant de charge** ; la batterie ne fait
que le complément stable. C'est plus sûr que de compter sur l'onduleur pour rattraper, et
**le HEMS sait déjà le faire** — c'est le même geste que l'arbitrage EV ordinaire.
**B3 — À MESURER sur le banc, et ça conditionne tout le reste :** avec quelle latence le
Fronius applique une consigne de décharge ? Si c'est **plusieurs secondes**, la batterie ne
tient qu'un **régime établi** et ne rattrape aucun transitoire — auquel cas la marge de B1
doit couvrir la totalité du pire démarrage, et B2 n'est plus une précaution mais la seule
protection réelle.
**B4 — Corollaire de la même famille : `chargingRate` a le même emploi à l'envers.** Une
charge de batterie depuis le réseau à pleine puissance sur un abonnement 6 kVA fait sauter le
disjoncteur au premier four allumé. Le plafond de soutirage vaut donc dans les deux sens, et
c'est un argument de plus pour que ce soit **un seul mécanisme**.
---
### C. Une question d'interface, et elle vient d'un défaut que nous avons failli livrer
**`enableDischarging` est binaire, et l'onduleur ne sait pas qui tire** — il voit une
consommation nette. Notre maquette portait le libellé *« la maison continue d'être servie ;
seule la voiture ne l'est pas »*. **C'est faux** : coupé, le réfrigérateur passe au réseau
comme la voiture. Le libellé est corrigé en « geler la batterie », qui décrit ce qui se passe.
**La question qui reste** : « servir la maison mais pas la voiture » demanderait de plafonner
`dischargingRate` sur la consommation **hors borne**, recalculée à chaque cycle — de la
modulation continue, pas un interrupteur. **Est-ce que ça a un sens de l'écrire, ou est-ce
que le mécanisme ne le permet pas proprement ?** Nous ne dessinerons pas le réglage tant que
la réponse n'est pas connue : c'est exactement la classe de défaut que nous traquons depuis
trois jours — un écran qui promet ce que la box ne sait pas faire.
---
### Ce que l'écran garde, pour que vous sachiez ce qui vous revient
Après quatre passes de retrait, `Configurer · Batterie` ne porte plus que : le **nom**, le
**rang** (en lecture seule — il se règle par glisser-déposer dans la liste, comme toutes les
autres charges), l'**état réel**, l'**interrupteur de décharge** ci-dessus, un **plancher de
secours** (combien d'autonomie garder pour une coupure — une préférence de risque, pas une
optimisation), et la **charge depuis le réseau** en manuel.
Sont sortis de l'écran, et vous reviennent : le **tableau de permissions par charge**
(arbitrage → Héos ou décision par le prix) et la **charge différée sur prévision** (sans
prévision, elle ne se règle pas — elle se calcule).
---
---
## 2026-08-27 — QUESTION : le stockage est-il une charge arbitrable ?
**Origine** : une demande de Patrick, formulée simplement — *« si je veux que l'énergie aille

View File

@ -1082,37 +1082,46 @@
<div class="field">
<label>Décharge <span class="newf">à créer · enableDischarging</span></label>
<div class="stepper">
<div class="lab">Bloquer la décharge pendant la recharge du véhicule<small>la maison continue
d'être servie ; seule la voiture ne l'est pas</small></div>
<div class="lab">Geler la batterie pendant la recharge du véhicule<small>plus rien n'est
déchargé, maison comprise</small></div>
<div class="ctl"><span class="sw"></span></div>
</div>
<div class="info"><b>Un seul interrupteur, et c'est le seul cas qu'aucun rang ne peut
exprimer.</b> « Charger l'eau chaude avant la batterie » se règle par le <b>rang</b> — il n'a
pas besoin d'un second réglage qui dirait la même chose autrement. Mais <b>la nuit, il n'y a
pas de surplus à répartir</b> : aucune position dans une file ne dit « ne vide pas la batterie
dans la voiture ».<br><br>
<b>Pas de tableau de permissions charge par charge.</b> Décider en général qui mérite d'être
servi par la batterie n'est pas un réglage d'installateur : c'est un arbitrage, et il
reviendra à <b>Héos</b> (l'optimiseur MILP) ou à une décision par le prix, quand l'un ou
l'autre existera. Offrir la question à la main aujourd'hui figerait dans un écran ce qui doit
se calculer.</div>
<div class="warn"><b>Le libellé dit ce que le mécanisme fait, pas ce qu'on voudrait.</b>
<code>enableDischarging</code> est <b>binaire</b>, et l'onduleur ne sait pas qui tire — il voit
une consommation nette. Coupé, la maison n'est plus servie non plus : le réfrigérateur passe au
réseau comme la voiture.<br><br>
« Servir la maison mais pas la voiture » demanderait de plafonner
<code>dischargingRate</code> sur la consommation <b>hors borne</b>, recalculé à chaque
cycle — de la modulation continue, pas un interrupteur. <b>Posé comme question au
moteur</b>, pas dessiné ici.</div>
<div class="info"><b>Pourquoi c'est le seul réglage de décharge.</b> « Charger l'eau chaude avant
la batterie » se règle par le <b>rang</b>, et n'a pas besoin d'un second réglage qui dirait la
même chose autrement. Décider en général <i>qui</i> mérite d'être servi par la batterie n'est
pas un réglage d'installateur : c'est un arbitrage, et il reviendra à <b>Héos</b> (optimiseur
MILP) ou à une décision par le prix. Offrir la question à la main figerait dans un écran ce qui
doit se calculer.</div>
</div>
<!-- c. RÉSERVE ADAPTATIVE -->
<div class="field">
<label>Réserve adaptative <span class="newf">à créer · à justifier</span></label>
<label>Plancher de secours <span class="newf">à créer · réserve de coupure</span><br>
<small>combien d'autonomie garder pour une coupure de courant</small></label>
<div class="stepper">
<div class="lab">Remonter le plancher après une nuit trop basse<small>façon « Battery Life »</small></div>
<div class="ctl"><span class="sw off"></span></div>
<div class="lab">Ne jamais descendre sous<small>l'arbitrage s'arrête là</small></div>
<div class="ctl"><button class="pm">−</button><b>20 %</b><button class="pm">+</button></div>
</div>
<div class="warn"><b>À reprendre pour la bonne raison, pas par mimétisme.</b>
Victron a conçu <i>Battery Life</i> pour du <b>plomb</b> : une batterie plomb laissée
partiellement déchargée se sulfate, d'où un plancher qui remonte tant qu'une recharge complète
n'a pas eu lieu. <b>Sur du LFP, le problème traité n'existe quasiment pas</b> — pas de
sulfatation, et un séjour à SOC bas n'abîme rien.<br><br>
Si ce mécanisme est repris, ce sera pour un autre motif à nommer explicitement (garder une
réserve de secours, lisser l'autonomie sur plusieurs jours gris). Le copier tel quel
importerait une contrainte de chimie que cette installation n'a pas.</div>
<div class="mode-hint">≈ 2 kWh gardés sur 10 — de quoi tenir l'essentiel quelques heures.
Ce plancher <b>ne bloque pas la charge</b>, il borne la décharge.</div>
<div class="info"><b>Une préférence de risque, pas une optimisation — et c'est pour ça qu'elle
est ici.</b> Combien d'autonomie garder pour une coupure ne se calcule pas : cela dépend de ce
que le client craint, de son congélateur, de son télétravail, de la fiabilité de son réseau
local. <b>Héos ne pourra jamais le décider à sa place</b>, quelle que soit la qualité de sa
prévision.<br><br>
<b>Ce n'est PAS « Battery Life ».</b> Victron a conçu le sien pour du <b>plomb</b> : une
batterie plomb laissée partiellement déchargée se sulfate, d'où un plancher qui remonte tant
qu'une recharge complète n'a pas eu lieu. Sur du <b>LFP, ce problème n'existe quasiment
pas</b> — le copier tel quel importerait une contrainte de chimie que cette installation n'a
pas. Le plancher gardé ici a un autre motif, et il est nommé.</div>
</div>
<!-- d. CHARGE DEPUIS LE RÉSEAU -->
@ -1128,10 +1137,25 @@
<div class="lab">Terminé à<small>heure de fin</small></div>
<div class="ctl"><b>06:00</b></div>
</div>
<div class="stepper">
<div class="lab">Ne pas soutirer plus de<small>chargingRate — plafond de puissance</small></div>
<div class="ctl"><button class="pm">−</button><b>3 kW</b><button class="pm">+</button></div>
</div>
<div class="info"><b>Ni prix, ni Tempo, ni marché de gros ici.</b> Cet écran pose le mécanisme :
soutirer au réseau une quantité donnée avant une heure donnée. <b>Ce qui décide</b> qu'il faut
le faire reste dehors — le jour où une source tarifaire existera, elle remplacera le doigt de
l'utilisateur sans que ce bloc ne change.</div>
l'utilisateur sans que ce bloc ne change.<br><br>
Le plafond de puissance est le seul emploi de <code>chargingRate</code> dans cet écran, et il
a le <b>même motif que le boost, à l'envers</b> : ne pas dépasser ce qu'on a le droit de
soutirer. Charger 6 kWh en pleine nuit à pleine puissance sur un abonnement 6 kVA ferait
sauter le disjoncteur au premier four allumé.</div>
</div>
<div class="field">
<label>Compteur dédié <span class="derived-flag">sans objet</span></label>
<div class="mode-hint"><b>La batterie n'en a pas besoin</b>, et c'est la seule charge dans ce
cas : elle publie <code>currentPower</code> elle-même. Le bloc est dit ici plutôt qu'omis en
silence comme dans les cinq autres écrans — une absence expliquée n'est pas un oubli.</div>
</div>
<div class="save"><div class="btn alt">Annuler</div><div class="btn go">Enregistrer</div></div>
@ -1154,6 +1178,9 @@
que le rang ne sait pas dire ; l'arbitrage fin — qui mérite d'être servi par la batterie, et
quand — reviendra à <b>Héos</b> ou à une décision par le prix. Un écran ne doit pas figer ce qui
doit se calculer.</li>
<li><b>Trois questions au moteur, plus quatre soulevées par la recharge accélérée</b>, sont
écrites dans <code>docs/BRIEF_plugin_depuis_maquettes.md</code> — pas ici : ce sont des détails
techniques, pas de l'interface.</li>
<li><b>La charge différée n'est pas un réglage non plus — c'est une décision d'Héos.</b> Démarrer
assez tard pour arriver à 100 % juste avant la pointe suppose de savoir ce que le soleil va
faire : <b>sans prévision, ça ne marche pas</b>, et une heure saisie à la main serait un pari
@ -1180,38 +1207,58 @@
style="font-size:10.5px;color:var(--muted2)">6,4 / 10 kWh</span></div>
<div class="boost" style="margin-top:12px">
<div class="t"><u>⚡</u><b>Vider dans le véhicule</b><span class="sw off"></span></div>
<div class="t"><u>⚡</u><b>Recharge accélérée</b><span class="sw off"></span></div>
<div style="font-size:11px;color:var(--muted);line-height:1.55">
Pleine puissance, tout de suite. C'est le <b>seul cas où la batterie est une source</b> et
non une charge — d'où sa place ici, sur un geste immédiat, et non dans les réglages.
<b>Charger la voiture plus vite que l'abonnement ne le permet.</b> Le compteur est limité à
6 kVA ; la borne peut monter à 7,5. La <b>batterie comble l'écart</b> — le réseau fournit ce
qu'il a le droit de fournir, la maison prend le reste sur son stock, et le disjoncteur ne
saute pas.
</div>
<div class="stepper" style="margin-top:10px">
<div class="lab">S'arrête à<small>cible sur la batterie maison</small></div>
<div class="lab">Puissance de charge visée<small>ce que la borne délivre à la voiture</small></div>
<div class="ctl"><button class="pm">−</button><b>7,5 kW</b><button class="pm">+</button></div>
</div>
<div class="mode-hint" style="margin-top:8px">Réseau <b>6,0 kW</b> (abonnement)
+ batterie <b>1,5 kW</b> (complément) — la batterie ne fixe pas la cible, elle bouche le
trou.</div>
<div class="stepper" style="margin-top:9px">
<div class="lab">Sans descendre sous<small>garde-fou, pas objectif</small></div>
<div class="ctl"><button class="pm">−</button><b>20 %</b><button class="pm">+</button></div>
</div>
<div class="stepper">
<div class="lab">Ou au bout de<small>durée maximale</small></div>
<div class="ctl"><button class="pm">−</button><b>45 min</b><button class="pm">+</button></div>
</div>
<div class="end"><b>Il doit finir tout seul.</b> Cible atteinte, durée écoulée, ou véhicule
débranché — <b>jamais « jusqu'à annulation »</b>. Un transfert sans fin vide une maison
pendant que personne ne regarde, et l'écran qui l'a lancé n'est plus là pour le dire.</div>
<div class="end"><b>Trois fins, toutes obligatoires :</b> la <b>voiture a atteint sa
cible</b> — c'est la fin normale, celle qu'on vise —, la durée est écoulée, ou le véhicule
est débranché. Le plancher batterie est un <b>garde-fou</b>, pas un objectif : on ne cherche
pas à vider la batterie, on cherche à finir la charge plus tôt.
<b>Jamais « jusqu'à annulation »</b> — un transfert sans fin court pendant que personne ne
regarde.</div>
</div>
</div>
</div>
</div>
<div class="cap"><b>Boost</b> — hors Configurer</div>
<div class="cap"><b>Recharge accélérée</b> — hors Configurer</div>
<div class="note">
<span class="pill ev">geste immédiat, pas un réglage</span><br>
Un réglage décrit une intention durable ; ceci est une action ponctuelle avec un effet immédiat et
Un réglage décrit une intention durable ; ceci est une action ponctuelle, avec un effet immédiat et
visible. La mettre dans « Configurer » la rendrait introuvable au moment où on la veut, et
persistante alors qu'elle ne doit pas l'être.
<ul>
<li><b>Trois fins possibles, toutes obligatoires.</b> Une action qui ne sait pas s'arrêter n'a
pas sa place sur un écran client.</li>
<li>Côté box, il faudrait <code>enableDischarging</code> + <code>dischargingRate</code> — déjà
déclarés par la classe.</li>
<li><b>C'est un argument de vente, et il mérite d'être dit à l'écran :</b> recharger plus vite
<b>sans passer de 6 à 9 kVA</b>. Le surcoût d'abonnement évité est chiffrable ; le confort
gagné se constate au premier départ pressé.</li>
<li><b>Ce bloc appartient au délestage de LM-1006-1, vu par l'autre bout.</b> Le délestage
applique un <i>plafond de soutirage</i> en <b>réduisant les charges</b> pour tenir dessous ; ici
on tient sous le même plafond en <b>complétant par la batterie</b>. Même objet, même plafond,
même arbitre — <b>pas un mécanisme parallèle</b>, et surtout pas un second commandeur.</li>
<li><b>La remarque « le boost pourrait acheter en cachette » tombe.</b> C'est l'inverse : il
existe pour <b>ne pas dépasser</b> ce qu'on a le droit de soutirer.</li>
<li>Côté box, <code>enableDischarging</code> + <code>dischargingRate</code> — déjà déclarés par la
classe. Le dimensionnement de la marge, la latence de l'onduleur et le rôle de filet de la borne
sont des <b>questions moteur</b>, écrites dans le brief, pas dessinées ici.</li>
</ul>
</div>
</div>