docs : heures creuses et batterie — décision D8, la consigne se pose près de la limite de phase
- §8 : D8 (2026-10-25) — en heures creuses, le plafond de la borne lui rend son courant mesuré, moins 1 A par phase ; la tenue au plancher en surcharge (L4 décide) est confirmée. - §8.1 : écarts ouverts 3 (double écrêtage hors heures creuses, lot à part) et 4 (partage achat/surplus à l'aube, avec la dérogation) ; l'oscillation renvoie à §8.2. - §8.2 : la règle, la marge, la sécurité en dépassement, les hypothèses, les mesures avant/après et les preuves. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
679e64b5b3
commit
1302e9a04e
@ -50,8 +50,9 @@ verrous gardent la tête : ils diraient la même chose en heures creuses.
|
|||||||
**En heures creuses**, le plancher est servi au réseau par la passe éco (`ECO_FLOOR_GRID`),
|
**En heures creuses**, le plancher est servi au réseau par la passe éco (`ECO_FLOOR_GRID`),
|
||||||
bornée par l'autorisation de soutirage ; le confort ajoute le surplus s'il y en a. *Lot e2 :
|
bornée par l'autorisation de soutirage ; le confort ajoute le surplus s'il y en a. *Lot e2 :
|
||||||
c'est désormais le plafond, sous `EV_OFF_PEAK_FULL_POWER` — §8, D7.* La borne
|
c'est désormais le plafond, sous `EV_OFF_PEAK_FULL_POWER` — §8, D7.* La borne
|
||||||
déclare un plafond écrêté par `evPhaseAllowanceW()`, `verifyOverloadProtection()` garde le dernier
|
déclare un plafond écrêté par `evPhaseAllowanceW()` — en heures creuses par
|
||||||
mot : l'invariant 2 tient sans rien ajouter.
|
`evOffPeakAllowanceW()`, qui lui rend son courant mesuré moins 1 A (§8.2, D8) —, et
|
||||||
|
`verifyOverloadProtection()` garde le dernier mot : l'invariant 2 tient sans rien ajouter.
|
||||||
|
|
||||||
**L'échéance** : la puissance nécessaire pour tenir une échéance reste celle du proxy amont, qui
|
**L'échéance** : la puissance nécessaire pour tenir une échéance reste celle du proxy amont, qui
|
||||||
force la charge à pleine puissance au point de non-retour. Ce point est calculé sur l'échéance,
|
force la charge à pleine puissance au point de non-retour. Ce point est calculé sur l'échéance,
|
||||||
@ -280,6 +281,7 @@ aucune ne change le code.
|
|||||||
| D5 | Seuil de « la voiture charge réellement » : 230 W sur la somme des bornes (§3.2) ? | **Accepté.** |
|
| D5 | Seuil de « la voiture charge réellement » : 230 W sur la somme des bornes (§3.2) ? | **Accepté.** |
|
||||||
| D6 | Plugin SunSpec : une action « limite de décharge » en une séquence (`planBatteryMode(NO_DISCHARGE)`), et `enableDischarging` renommé ou redécrit (§3.1, §7) ? | **Oui aux deux**, dans le dépôt du plugin, à la charge de l'orchestrateur. Le garde ne change pas : il reste compatible avec les deux actions actuelles (`dischargingRate` puis `enableDischarging`). |
|
| D6 | Plugin SunSpec : une action « limite de décharge » en une séquence (`planBatteryMode(NO_DISCHARGE)`), et `enableDischarging` renommé ou redécrit (§3.1, §7) ? | **Oui aux deux**, dans le dépôt du plugin, à la charge de l'orchestrateur. Le garde ne change pas : il reste compatible avec les deux actions actuelles (`dischargingRate` puis `enableDischarging`). |
|
||||||
| D7 | À quelle puissance la borne charge-t-elle en heures creuses (lot e2) ? | **À la pleine puissance permise**, et non plus au plancher. La session finit plus tôt, et la décharge de la batterie n'est bloquée que pendant ce temps-là : ensuite, elle couvre la maison pour le reste de la nuit. Détail en §8.1. |
|
| D7 | À quelle puissance la borne charge-t-elle en heures creuses (lot e2) ? | **À la pleine puissance permise**, et non plus au plancher. La session finit plus tôt, et la décharge de la batterie n'est bloquée que pendant ce temps-là : ensuite, elle couvre la maison pour le reste de la nuit. Détail en §8.1. |
|
||||||
|
| D8 | *(2026-10-25)* Près de la limite de phase, la consigne de la borne alterne à chaque cycle (16, 7, 16, 7 A sous 25 A). Corriger avant la vitrine ? | **Oui, maintenant.** En heures creuses, le plafond de la borne lui rend ce qu'elle tire, **mesuré**, moins 1 A par phase. Détail en §8.2. Le même jour : la borne **tenue au plancher** en surcharge (L4 décide de couper) est **confirmée** ; les écarts 3 et 4 de §8.1 sont reportés. |
|
||||||
|
|
||||||
La mesure du minuteur de retour sur un vrai GEN24 (hypothèse AC-10 du plugin, §3.4) reste
|
La mesure du minuteur de retour sur un vrai GEN24 (hypothèse AC-10 du plugin, §3.4) reste
|
||||||
ouverte : elle relève du plugin et d'un essai sur matériel réel.
|
ouverte : elle relève du plugin et d'un essai sur matériel réel.
|
||||||
@ -295,7 +297,8 @@ pleine le matin, et le surplus solaire part au réseau.
|
|||||||
réseau en heures creuses est le **plafond de cycle** de la borne (`declared.maxPowerW`) :
|
réseau en heures creuses est le **plafond de cycle** de la borne (`declared.maxPowerW`) :
|
||||||
|
|
||||||
- il porte le courant maximal de la borne, ses phases, et la limite de phase
|
- il porte le courant maximal de la borne, ses phases, et la limite de phase
|
||||||
(`evPhaseAllowanceW()`) — rien n'est retiré de ces écrêtages ;
|
(`evPhaseAllowanceW()` ; depuis D8, `evOffPeakAllowanceW()`, §8.2) — rien n'est retiré de ces
|
||||||
|
écrêtages ;
|
||||||
- il ne descend jamais sous le plancher : la limite de phase **rabaisse** la borne, elle ne la
|
- il ne descend jamais sous le plancher : la limite de phase **rabaisse** la borne, elle ne la
|
||||||
coupe pas ; couper reste le geste de `verifyOverloadProtection()` (L4), qui garde le dernier
|
coupe pas ; couper reste le geste de `verifyOverloadProtection()` (L4), qui garde le dernier
|
||||||
mot ;
|
mot ;
|
||||||
@ -321,20 +324,26 @@ la nuit réduit le plafond au cycle suivant ; sous le plancher, la borne est ten
|
|||||||
L4 coupe au dépassement. Cette exemption ne vaut **qu'en heures creuses** : sans heure creuse, le
|
L4 coupe au dépassement. Cette exemption ne vaut **qu'en heures creuses** : sans heure creuse, le
|
||||||
plancher éco d'une borne reste écrêté par la marge de la maison, comme avant.
|
plancher éco d'une borne reste écrêté par la marge de la maison, comme avant.
|
||||||
|
|
||||||
**Reste à trancher** (rien n'est changé par ce lot) :
|
**Surcharge au plancher — confirmé le 2026-10-25.** En heures creuses, quand la limite de phase
|
||||||
|
ne laisse plus le plancher, la stratégie tient la borne à son plancher (`boundBy: floor`) et L4
|
||||||
|
décide de la couper, comme pour la dérogation. On n'est pas revenu au « rien acheté » du lot e1.
|
||||||
|
|
||||||
- *Le double écrêtage hors heures creuses.* Le plancher éco d'une borne triphasée, sans heure
|
**Écarts ouverts** (rien n'est changé ; décision du 2026-10-25 : plus tard, chacun dans son lot) :
|
||||||
creuse, est encore comparé à la marge d'une phase. L'étendre à `LM-1500-h` changerait des
|
|
||||||
décisions sans tarif : c'est un choix à faire à part.
|
- *Écart 3 — le double écrêtage hors heures creuses.* Sans heure creuse, le plancher éco d'une
|
||||||
- *L'oscillation près de la limite de phase.* Le plafond d'une borne est la place libre **sans
|
borne triphasée est encore comparé à la marge d'**une** phase de la maison (le double
|
||||||
lui rendre ce qu'elle tire** (`evPhaseAllowanceW()`, choix de sécurité documenté). À pleine
|
écrêtage que `LM-1500-h` refuse ailleurs). L'étendre changerait des décisions sans tarif :
|
||||||
puissance, la borne voit donc sa propre consommation lui réduire le plafond au cycle suivant,
|
**lot à part**.
|
||||||
puis le lui rendre au cycle d'après. En simulation, avec un compteur qui voit la borne (maison
|
- *Écart 4 — le partage achat/surplus en heures creuses.* À l'aube, le surplus s'ajoute au
|
||||||
à 2 A par phase, borne triphasée 16 A), la consigne alterne à chaque cycle entre 16 et 7 A
|
niveau éco : la consigne (`estimatedPowerW`) peut dépasser le plafond de cycle, par exemple
|
||||||
sous une limite de 25 A, et entre 16 et 14 A sous 32 A. Au plancher (lot e1), le phénomène ne
|
3 680 + 2 000 W. L'adaptateur écrête au courant maximal de la borne, et le partage publié entre
|
||||||
se voyait pas. Une piste : rendre à la borne, en heures creuses, son propre courant moins une
|
achat et surplus surestime l'achat. Le même cumul existe pour la dérogation. Ce cumul n'est
|
||||||
marge (la règle de l'échéance chez l'amont, `adjustEvChargers()` : marge − 1 A + courant de la
|
pas borné par le plafond de phase déjà servi au niveau éco : constaté au lot D8 avec un
|
||||||
borne).
|
compteur qui ne voit pas la borne (le recrédit y fabrique du surplus), plafond 15 A, consigne
|
||||||
|
16 A. Avec un vrai surplus, seul L4 rattraperait un dépassement. **À reprendre avec la
|
||||||
|
dérogation.**
|
||||||
|
- *L'oscillation près de la limite de phase* était le troisième point de cette liste. Elle est
|
||||||
|
corrigée : §8.2.
|
||||||
|
|
||||||
**Fin de session.** Le blocage de la décharge se lève sur la puissance **mesurée** des bornes,
|
**Fin de session.** Le blocage de la décharge se lève sur la puissance **mesurée** des bornes,
|
||||||
au seuil de 230 W (D5). Une borne commandée à 16 A dont la voiture ne prend plus rien (pleine,
|
au seuil de 230 W (D5). Une borne commandée à 16 A dont la voiture ne prend plus rien (pleine,
|
||||||
@ -358,3 +367,65 @@ la maison consommera d'ici le retour du soleil — consommation de base prévue
|
|||||||
heure de la première production utile (prévision PV). Elle demande une prévision fiable des deux,
|
heure de la première production utile (prévision PV). Elle demande une prévision fiable des deux,
|
||||||
et un pilotage de `OutWRte` plus fin qu'un tout-ou-rien : c'est un lot à part.
|
et un pilotage de `OutWRte` plus fin qu'un tout-ou-rien : c'est un lot à part.
|
||||||
|
|
||||||
|
### 8.2 D8 — près de la limite de phase, la consigne se pose (2026-10-25)
|
||||||
|
|
||||||
|
**Le défaut.** Le plafond d'une borne était la place libre au compteur, **sans lui rendre ce
|
||||||
|
qu'elle tire** (`evPhaseAllowanceW()`). Avec un compteur qui voit la borne, sa propre
|
||||||
|
consommation lui retirait la place au cycle suivant, puis la lui rendait au cycle d'après. Mesuré
|
||||||
|
en simulation, maison à 2 A par phase, borne 16 A, mono comme tri :
|
||||||
|
|
||||||
|
| Limite | Avant (consigne cycle par cycle) | Après |
|
||||||
|
|---|---|---|
|
||||||
|
| 25 A | 16, 7, 16, 7… (11,5 A en moyenne) | 16 A tenus |
|
||||||
|
| 32 A | 16, 14, 16, 14… | 16 A tenus |
|
||||||
|
| 16 A | 14, 6, 8, 6, 8… (7 A en moyenne) | 13 A tenus, 15 A au compteur |
|
||||||
|
|
||||||
|
**La règle.** En heures creuses, et pour la pleine puissance du lot e2 seulement, le plafond est
|
||||||
|
lu par `EnergyArbitrator::evOffPeakAllowanceW()` :
|
||||||
|
|
||||||
|
> plafond par phase = limite − (tirage de la phase − courant **mesuré** de la borne) − **1 A**,
|
||||||
|
> arrondi à l'ampère inférieur, × phases.
|
||||||
|
|
||||||
|
C'est la règle de l'échéance chez l'amont (`adjustEvChargers()`). Elle converge en **un** cycle :
|
||||||
|
le résultat ne dépend plus de ce que la borne tirait, seulement de ce que tire le reste de la
|
||||||
|
maison.
|
||||||
|
|
||||||
|
- *Mesure, pas consigne.* Le courant rendu est l'état `currentPower` de la borne, sur les phases
|
||||||
|
où elle le mesure. Une voiture qui prend 10 A d'une borne commandée à 16 n'occupe que 10 A :
|
||||||
|
lui rendre 16 lui ouvrirait 6 A de trop. Une borne sans mesure, à l'arrêt, ou qui bascule de
|
||||||
|
phases (mesurées ≠ visées) ne rend rien, et la marge s'applique quand même.
|
||||||
|
- *La marge : 1 A par phase.* C'est celle de l'amont, pour la même raison : laisser à un appareil
|
||||||
|
moyen allumé entre deux cycles la place de démarrer avant que L4 ait à couper. Elle couvre aussi
|
||||||
|
l'écart entre la puissance annoncée par la borne et le courant lu au compteur (tension ≠ 230 V,
|
||||||
|
±3 % à 16 A, soit 0,5 A). L'arrondi à l'ampère **inférieur** garantit qu'elle n'est pas mangée
|
||||||
|
par l'adaptateur, qui arrondit la consigne au plus proche. Plus grande, elle coûterait 230 W
|
||||||
|
par phase toute la nuit, sans raison mesurée ; plus petite, elle ne couvrirait plus l'écart de
|
||||||
|
mesure.
|
||||||
|
- *La sécurité en dépassement tient.* C'était la raison de ne rien rendre. Si une phase tire
|
||||||
|
`I > limite`, dont `E` pour la borne, la place rendue vaut `limite − (I − E) − 1 < E − 1` : la
|
||||||
|
consigne baisse d'au moins 1 A par cycle, jusqu'à sortir du dépassement ou jusqu'au plancher, où
|
||||||
|
la stratégie tient la borne et où L4 décide. Cela suppose que le compteur voie la borne — ce
|
||||||
|
que L4 suppose déjà.
|
||||||
|
- *Un compteur qui ne voit pas la borne* ne la mène pas seule à la limite : le tirage de la maison
|
||||||
|
sans la borne est écrêté à zéro, donc une phase vaut au plus sa limite moins la marge.
|
||||||
|
- *Où.* Seulement là où `EvAdapter` vise la pleine puissance d'heures creuses (trois modes, heure
|
||||||
|
creuse en cours). Hors heures creuses et sans tarif, `evPhaseAllowanceW()` reste la règle, et
|
||||||
|
les décisions sans tarif ne changent pas. En heures creuses, une dérogation sur la borne lit le
|
||||||
|
même plafond (c'est le même `declared.maxPowerW`). Sans heure creuse, la dérogation garde
|
||||||
|
l'ancienne règle : la faire passer par la même voie changerait son comportement sans tarif, et
|
||||||
|
ce n'est pas décidé.
|
||||||
|
|
||||||
|
**Hypothèses.** Les phases de la borne sont celles du compteur (même hypothèse que L4 et que
|
||||||
|
l'amont). Une borne qui annonce plus que ce que le compteur voit d'elle reçoit au plus 1 A sous la
|
||||||
|
limite. Un compteur rafraîchi après la borne (borne qui monte, compteur pas encore) peut
|
||||||
|
surestimer la place d'un cycle, dans la même limite ; L4, lui, lit le compteur en temps réel.
|
||||||
|
|
||||||
|
**Preuves.** `testOffPeakFullPowerSettlesUnderThePhaseLimit` (sept cas, douze cycles : la consigne
|
||||||
|
se pose dès le premier cycle, la phase la plus chargée reste à 1 A au moins sous la limite ; un
|
||||||
|
cas à 2,4 A de maison prouve l'arrondi) ; `testOffPeakFullPowerYieldsToThePhaseLimit`, réécrit
|
||||||
|
avec un compteur qui voit la borne (mesure et non consigne, dépassement, plancher, coupure par
|
||||||
|
L4) ; `testOffPeakFullPowerStaysUnderTheLimitOnABlindMeter` (écrêtage à zéro) ;
|
||||||
|
`testOverloadProtectionEcoMode`, hors heures creuses, inchangé. Dans
|
||||||
|
`testBlockedDischargeShowsAtTheMeterAndL4Decides`, la borne en dépassement finit à son plancher
|
||||||
|
(L4 la ramène de 16 à 13 A, la stratégie laisse 9 A, L4 la ramène à 6 A) au lieu d'être coupée :
|
||||||
|
l'assertion attend désormais « plancher ou coupée ».
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user