La consigne de repos absorbe les a-coups de la plaque

Valeurs negatives au point de raccordement, contacteur ferme. La mesure separe
deux phenomenes que rien ne reliait.

Le premier est bien la plaque qui cycle : sur la fenetre de midi, 9 % des
echantillons negatifs, minimum -477 W, mediane -146. Le regulateur ne rattrape
pas un delestage brutal d un kilowatt avec une consigne de repos a 200 W. Elle
passe a 700 : la courbe monte de 500 W et le minimum devient +23 W. Le surcout
va dans le bon sens, cette consigne ne s appliquant que contacteur ferme sans
session reseau — c est-a-dire apres une coupure sur SOC bas ou une fermeture
par la regle de protection, deux cas ou l on veut justement que le reseau
contribue davantage.

Le second, -2819 W pendant deux minutes, n a rien a voir : le debranchement du
vehicule a supprime 2,2 kW d un coup alors que la batterie a 93 % n absorbait
rien et que le MPPT produisait 4 kW. Aucune consigne n absorbe cela. Ce qui l
evite est le correctif du matin sur la regle de protection : la demande sur le
parc valait 741 W, le contacteur n aurait pas ete ferme, et sans reseau il n y
a rien ou injecter.

Golden 80/80, trois attendus mis a jour avec la mesure en commentaire.

Et docker n est pas dans le PATH d une session SSH sur DSM : les commandes de
deploiement appellent desormais /usr/local/bin/docker.

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-06 14:50:29 +02:00
parent a71d533026
commit a7d321f720
7 changed files with 129 additions and 18 deletions

View File

@@ -4733,6 +4733,67 @@ redemarrage (verifie : 5 a 6 points chacun en quinze minutes), dont
— c'est leur absence qui avait empeche d'etablir la semantique de ce dernier
quand il a fausse une cloture de session.
### Injection furtive : deux phenomenes distincts, un seul se corrige ici
Le proprietaire a observe des valeurs negatives au point de raccordement
contacteur ferme — « -580 W furtivement, et aussi du -80, -320 » — voiture
debranchee, batterie au-dessus de 80 %, et il l'attribue aux a-coups de la
plaque chauffante. Mesure des deux fenetres fermees du 06/09 :
| fenetre | echantillons negatifs | minimum | mediane des negatifs | energie |
|---|---:|---:|---:|---:|
| 12:07-12:22 | 9 % | **-477 W** | -146 W | 3,5 Wh |
| 13:34-13:42 | 17 % | **-2 819 W** | -1 655 W | 29,2 Wh |
**Ce sont deux choses differentes.**
La premiere est bien la plaque : le regulateur ne rattrape pas assez vite un
delestage brutal de ~1 kW, et avec une consigne de repos a 200 W le point de
fonctionnement passe sous zero. Correctif : **consigne de repos 200 -> 700 W**
(`INPUT_PARSE`, borne elargie de [0,500] a [0,1500]). Toute la courbe monte de
500 W : sur cette fenetre le minimum passe de -477 a **+23 W**, plus aucune
excursion negative.
Le surcout est faible et va dans le bon sens : la consigne de repos ne
s'applique que contacteur FERME sans session reseau EVCS — donc apres une
coupure sur SOC bas, ou apres une fermeture par la regle de protection du parc.
**Dans les deux cas on VEUT que le reseau contribue plus que 200 W.** Contacteur
ouvert, elle n'a aucun effet.
La seconde n'a rien a voir avec la plaque, et **aucune consigne ne l'absorbe** :
| heure | reseau | maison | PV | EVCS | batterie |
|---|---:|---:|---:|---:|---:|
| 13:41:35 | 393 | 4 717 | 3 976 | 2 182 | -568 |
| **13:41:40** | **-2 534** | 1 589 | 3 808 | **18** | -655 |
| 13:42:30 | -1 594 | 2 013 | 4 024 | — | 25 |
| 13:43:30 | -1 145 | 1 510 | 4 060 | — | 1 060 |
Le debranchement du vehicule supprime 2,2 kW d'un coup. La batterie, a 93 % de
SOC, n'absorbe rien (elle DECHARGE encore a -655 W, plafond de charge abaisse
par le BMS) et le MPPT produit toujours 4 kW : l'excedent part au reseau pendant
**plus de deux minutes**, le temps que le systeme bride la production — la
remontee du courant batterie de -655 a +1 060 W montre le rattrapage.
Ce qui l'evite est le correctif du meme jour sur la regle de protection : la
demande sur le parc valait alors **741 W**, donc avec la regle corrigee le
contacteur n'aurait jamais ete ferme — et sans reseau, il n'y a rien ou
injecter. Le probleme se resout en amont, pas par la consigne.
Golden 80/80, trois attendus mis a jour dans le meme commit (200 -> 700) avec la
mesure en commentaire. Mutation : retour a 200 -> les 3 memes echouent.
### Le binaire docker n'est pas dans le PATH en SSH sur DSM
`sudo docker compose restart historisation` echoue sur
`sudo: docker: command not found` : Synology ne met `/usr/local/bin` dans le
chemin que pour les sessions interactives de son interface. Toute commande
lancee a distance doit appeler `/usr/local/bin/docker`. Corrige dans
`deploy/historisation/README.md` (note en tete + 9 occurrences) et
`deploy/watchdog/compose.yaml`.
Pour memoire : l'acces SSH par cle a 10.10.10.22 fonctionne et `sudo` y est sans
mot de passe — la demande de validation avant un `sudo` releve de la regle posee
par le proprietaire, pas d'une incapacite.
### Reste ouvert
- Detecteur de gel dans le service d'historisation : une grandeur qui ne bouge
pas alors qu'une autre du meme bilan bouge = alerte. Non fait.

View File

@@ -1,5 +1,13 @@
# Mémoire de mesures EVCS
> ⚠️ **Sur le Synology, `docker` n'est PAS dans le `PATH` d'une session SSH.**
> Il vit dans `/usr/local/bin/docker`, et DSM ne le met dans le chemin que pour
> les sessions interactives de l'interface. Toute commande lancee a distance
> doit donc l'appeler par son chemin complet, sinon elle echoue sur
> `sudo: docker: command not found` — constate le 06/09/2026.
> Depuis un terminal DSM ouvert a la main, `docker compose ...` suffit.
Deux bases sur **10.10.10.22**, décidées le 04/09/2026 : on met les deux en
service et on décide à l'usage s'il faut garder les deux.
@@ -24,8 +32,8 @@ libres.
```sh
cd /volume2/projects/EVCS/EVCS/deploy/historisation
bash preparer-env.sh # génère .env avec des secrets aléatoires
docker compose up -d
docker compose logs -f
/usr/local/bin/docker compose up -d
/usr/local/bin/docker compose logs -f
```
### D'où viennent les secrets
@@ -49,9 +57,9 @@ d'attendre les anciens.
Vérifications :
```sh
docker compose exec postgres psql -U evcs -d evcs -c '\dt'
/usr/local/bin/docker compose exec postgres psql -U evcs -d evcs -c '\dt'
curl -s http://10.10.10.22:8086/health
docker compose logs historisation --tail 5
/usr/local/bin/docker compose logs historisation --tail 5
```
### Ports : 5433, et pas 5432
@@ -129,7 +137,7 @@ se corrige d'elle-même.
besoin d'un `INSERT` sur cette seule table :
```sh
sudo docker compose exec -T postgres psql -U evcs -d evcs -c \
sudo /usr/local/bin/docker compose exec -T postgres psql -U evcs -d evcs -c \
"GRANT INSERT ON evenement TO evcs_lecture;
GRANT USAGE, SELECT ON SEQUENCE evenement_id_seq TO evcs_lecture;"
```
@@ -197,8 +205,8 @@ bien meilleure.
```bash
cd /volume2/projects/EVCS/EVCS/deploy/historisation
bash preparer-grafana.sh # génère le mot de passe admin, l'affiche une fois
sudo docker compose up -d grafana
sudo docker compose logs -f grafana
sudo /usr/local/bin/docker compose up -d grafana
sudo /usr/local/bin/docker compose logs -f grafana
```
⚠️ **`sudo` est obligatoire sur DSM** : l'utilisateur ordinaire n'a pas accès
@@ -296,8 +304,8 @@ s'est vu qu'au journal du conteneur.
**Et après tout déploiement du service :**
```bash
sudo docker compose restart historisation
sudo docker compose logs --since 2m historisation
sudo /usr/local/bin/docker compose restart historisation
sudo /usr/local/bin/docker compose logs --since 2m historisation
```
⚠️ **`--since`, pas `--tail`.** Le service ne journalise que lorsqu'il a écrit

View File

@@ -11,12 +11,12 @@
# Mise en service :
# cd /volume2/projects/EVCS/EVCS/deploy/watchdog
# cp watchdog.env.exemple watchdog.env puis y coller la clé API n8n
# docker compose up -d
# docker compose logs -f
# /usr/local/bin/docker compose up -d
# /usr/local/bin/docker compose logs -f
#
# Vérification sans risque, avant de le laisser en service :
# docker compose run --rm evcs-watchdog node tools/watchdog-evcs.mjs --once
# docker compose run --rm evcs-watchdog node tools/watchdog-evcs.mjs --once --dry-run --simulate-dead
# /usr/local/bin/docker compose run --rm evcs-watchdog node tools/watchdog-evcs.mjs --once
# /usr/local/bin/docker compose run --rm evcs-watchdog node tools/watchdog-evcs.mjs --once --dry-run --simulate-dead
services:
evcs-watchdog:

View File

@@ -420,3 +420,11 @@ heure_reelle,etat,courant_mA,c1_mV,c2_mV,c3_mV,c4_mV,c5_mV,c6_mV,c7_mV,c8_mV,c9_
2026-09-06T12:21:07.824Z,Y230202C30371425,,3414,3415,3411,3418,3413,3410,3414,3411,3415,3415,3415,3415,3401,3414,3407,17
2026-09-06T12:21:07.919Z,Y230202C30371431,,3417,3416,3416,3416,3419,3416,3415,3415,3416,3395,3417,3416,3416,3415,3416,24
2026-09-06T12:21:08.045Z,Y230202C30371427,,3418,3412,3417,3414,3401,3417,3413,3407,3417,3417,3415,3416,3420,3421,3406,20
2026-09-06T12:31:08.092Z,Y230202C30371426,,3413,3414,3414,3415,3415,3414,3414,3414,3390,3414,3414,3414,3414,3414,3414,25
2026-09-06T12:31:08.219Z,Y230202C30371425,,3417,3418,3413,3422,3416,3413,3417,3414,3418,3418,3418,3418,3401,3417,3409,21
2026-09-06T12:31:08.315Z,Y230202C30371431,,3414,3414,3414,3414,3415,3414,3414,3413,3414,3389,3414,3414,3414,3414,3414,26
2026-09-06T12:31:08.440Z,Y230202C30371427,,3418,3412,3417,3414,3398,3417,3413,3406,3417,3417,3415,3416,3421,3421,3403,23
2026-09-06T12:41:08.479Z,Y230202C30371426,,3417,3416,3417,3417,3416,3417,3416,3417,3389,3416,3417,3416,3417,3417,3416,28
2026-09-06T12:41:08.607Z,Y230202C30371425,,3413,3415,3410,3419,3413,3409,3414,3410,3415,3415,3415,3415,3397,3414,3405,22
2026-09-06T12:41:08.702Z,Y230202C30371431,,3421,3419,3419,3419,3420,3420,3419,3419,3420,3393,3421,3419,3419,3419,3420,28
2026-09-06T12:41:08.828Z,Y230202C30371427,,3423,3416,3421,3418,3402,3422,3417,3409,3422,3422,3420,3420,3425,3426,3407,24
1 heure_reelle etat courant_mA c1_mV c2_mV c3_mV c4_mV c5_mV c6_mV c7_mV c8_mV c9_mV c10_mV c11_mV c12_mV c13_mV c14_mV c15_mV ecart_mV
420 2026-09-06T12:21:07.824Z Y230202C30371425 3414 3415 3411 3418 3413 3410 3414 3411 3415 3415 3415 3415 3401 3414 3407 17
421 2026-09-06T12:21:07.919Z Y230202C30371431 3417 3416 3416 3416 3419 3416 3415 3415 3416 3395 3417 3416 3416 3415 3416 24
422 2026-09-06T12:21:08.045Z Y230202C30371427 3418 3412 3417 3414 3401 3417 3413 3407 3417 3417 3415 3416 3420 3421 3406 20
423 2026-09-06T12:31:08.092Z Y230202C30371426 3413 3414 3414 3415 3415 3414 3414 3414 3390 3414 3414 3414 3414 3414 3414 25
424 2026-09-06T12:31:08.219Z Y230202C30371425 3417 3418 3413 3422 3416 3413 3417 3414 3418 3418 3418 3418 3401 3417 3409 21
425 2026-09-06T12:31:08.315Z Y230202C30371431 3414 3414 3414 3414 3415 3414 3414 3413 3414 3389 3414 3414 3414 3414 3414 26
426 2026-09-06T12:31:08.440Z Y230202C30371427 3418 3412 3417 3414 3398 3417 3413 3406 3417 3417 3415 3416 3421 3421 3403 23
427 2026-09-06T12:41:08.479Z Y230202C30371426 3417 3416 3417 3417 3416 3417 3416 3417 3389 3416 3417 3416 3417 3417 3416 28
428 2026-09-06T12:41:08.607Z Y230202C30371425 3413 3415 3410 3419 3413 3409 3414 3410 3415 3415 3415 3415 3397 3414 3405 22
429 2026-09-06T12:41:08.702Z Y230202C30371431 3421 3419 3419 3419 3420 3420 3419 3419 3420 3393 3421 3419 3419 3419 3420 28
430 2026-09-06T12:41:08.828Z Y230202C30371427 3423 3416 3421 3418 3402 3422 3417 3409 3422 3422 3420 3420 3425 3426 3407 24

View File

@@ -478,7 +478,33 @@ const params = {
// point de fonctionnement reste positif sur l'essentiel des excursions.
// ⚠️ Ne supprime pas les pointes les plus fortes : une excursion de -356 W
// passerait encore sous zero. Reduit leur nombre, ne les annule pas.
gridSetpointIdleW: clamp(num(input.grid_setpoint_idle_w, 200), 0, 500),
// CONSIGNE DE REPOS : 50 -> 200 (04/09) -> 700 (06/09).
//
// Elle ne s'applique que contacteur FERME sans session reseau EVCS — donc
// apres une coupure sur SOC bas, ou apres une fermeture par la regle de
// protection du parc. Contacteur ouvert, elle n'a aucun effet.
//
// A 200 W, une plaque chauffante qui cycle fait passer le point de
// fonctionnement sous zero : mesure du 06/09 sur la fenetre 12:07-12:22,
// 9 % des echantillons negatifs, minimum -477 W, mediane des negatifs
// -146 W. Le regulateur ne rattrape pas assez vite un delestage brutal de
// ~1 kW. A 700 W toute la courbe monte de 500 W : minimum +23 W, plus aucune
// excursion negative sur cette fenetre.
//
// Le surcout est faible et va dans le bon sens : les DEUX seules raisons de
// fermer le contacteur sans session EVCS sont « la batterie est a son
// plancher » et « la maison demande plus que le parc ne sait donner ». Dans
// les deux cas on VEUT que le reseau contribue plus que 200 W.
//
// ⚠️ Ne corrige PAS les gros a-coups. Le 06/09 a 13:41:40, le debranchement
// du vehicule a supprime 2,2 kW d'un coup alors que la batterie, a 93 % de
// SOC, n'absorbait rien et que le MPPT produisait 4 kW : -2 819 W pendant
// plus de deux minutes, le temps que le systeme bride la production. Aucune
// consigne n'absorbe cela. Ce qui l'evite est la correction du meme jour sur
// la regle de protection (elle porte desormais sur `maison - PV`) : avec une
// demande sur le parc de 741 W, le contacteur n'aurait pas ete ferme, et
// sans reseau il n'y a rien ou injecter.
gridSetpointIdleW: clamp(num(input.grid_setpoint_idle_w, 700), 0, 1500),
probeEnabled: low(input.probe_enabled || 'off') === 'on',
probeMinutes: Math.max(1, num(input.probe_minutes, 3)),

View File

@@ -1186,6 +1186,14 @@ export const scenarios = [
// testait l'inverse de ce que son libelle annoncait — et il l'a signale en
// renvoyant 5595. Ne jamais construire un contrefactuel en surchargeant une
// clef deja presente.
// ⚠️ ATTENDU MIS A JOUR LE 06/09/2026 : la consigne de repos est passee de
// 200 a 700 W. Elle ne s'applique que contacteur FERME sans session reseau,
// et a 200 W une plaque qui cycle faisait passer le point de fonctionnement
// sous zero (mesure du 06/09, fenetre 12:07-12:22 : 9 % d'echantillons
// negatifs, minimum -477 W, mediane des negatifs -146 W). Les deux seules
// raisons de fermer le contacteur sans session EVCS sont « batterie au
// plancher » et « la maison demande plus que le parc ne sait donner » :
// dans les deux cas on veut que le reseau contribue plus que 200 W.
id: 'consigne-sans-engagement-retombe-au-repos',
label: "Même relevé mais SOC 70 au-dessus de la ligne : aucune session engagée → la consigne retombe à la valeur de repos",
time: '2026-08-08T03:30:00+02:00',
@@ -1204,7 +1212,7 @@ export const scenarios = [
expect: {
profile: 'night_hc',
takeoverNeeded: false,
gridSetpointW: 200,
gridSetpointW: 700,
},
},
@@ -1994,7 +2002,7 @@ export const scenarios = [
grid_setpoint_w: '4000',
},
expect: {
gridSetpointW: 200,
gridSetpointW: 700,
},
},
{
@@ -2041,7 +2049,7 @@ export const scenarios = [
grid_setpoint_w: '4000',
},
expect: {
gridSetpointW: 200,
gridSetpointW: 700,
},
},
];

File diff suppressed because one or more lines are too long