Releve des cellules sur le Synology .17 + garde anti-blocage
Le releve tournait sur le PC portable (deploy/releve-cellules/lancer.sh) : ferme, il ne releve plus, et le 20/09 son @reboot a refuse de relancer sur un faux positif du garde anti-doublon -> 4 jours de trou dans la table cellule, Grafana "No data". Le portable n'a pas vocation a rester allume. Deplacement vers le Synology .17 (ARCHIVE3, DS920+), toujours allume : - compose.yaml : conteneur node:20 en uid 1026:100 (le montage NFS peut ecraser root ; le dossier CSV est g+w pour users), device /dev/ttyUSB0 mappe, depot monte en /depot. Ecrit les CSV comme avant ; le service d'historisation du .22 les ingere sans changement. restart:unless-stopped remplace la boucle lancer.sh. - charger-pilotes.sh : DSM embarque usbserial.ko + ftdi_sio.ko mais ne les charge pas d'office. Script root (Planificateur DSM au boot) qui insmod les deux et ouvre les droits de /dev/ttyUSB0. - README.md : deploiement, bascule depuis le portable, verification. Garde anti-blocage dans pylontech-console.mjs (--suivi) : lireJusqua resout au timeout au lieu de rejeter, donc un port fige renvoie du vide en boucle sans jamais crasher -- exactement le hang du 20/09. Un controle du mtime du CSV force process.exit(1) apres 3x le pas sans ecriture, pour que le superviseur (conteneur ou lancer.sh) rouvre le port. Menage : modified/*.bak-* (rollbacks locaux) ignores comme prepush-* ; ajout des relevés de mesure batterie des sessions 16-20/09. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
This commit is contained in:
76
deploy/releve-cellules/README.md
Normal file
76
deploy/releve-cellules/README.md
Normal file
@@ -0,0 +1,76 @@
|
||||
# Releve continu des cellules Pylontech
|
||||
|
||||
Lit le cable console Pylontech (adaptateur FTDI USB-serie) et depose un CSV par
|
||||
tour dans `docs/mesures/batteries/`. Le service d'historisation sur le **.22**
|
||||
ingere ces CSV (`ingererCellules`, `tools/historise-evcs.mjs`) et remplit la
|
||||
table `cellule`, que Grafana lit. **Le lecteur serie ne touche jamais la base.**
|
||||
|
||||
## Deux hotes possibles
|
||||
|
||||
| hote | supervision | fichier |
|
||||
|---|---|---|
|
||||
| **Synology .17** (recommande, toujours allume) | `restart: unless-stopped` du conteneur | `compose.yaml` |
|
||||
| PC portable | boucle `while` | `lancer.sh` (@reboot crontab) |
|
||||
|
||||
Le portable a montre sa limite le 20/09 : ferme, il ne releve plus, et son
|
||||
`@reboot` a refuse de relancer sur un faux positif du garde anti-doublon — 4
|
||||
jours de trou. Le NAS supprime ce mode de panne.
|
||||
|
||||
Dans les deux cas, un **garde anti-blocage** integre a `pylontech-console.mjs`
|
||||
(`--suivi`) force la sortie du processus si le CSV cesse de grossir pendant plus
|
||||
de 3x le pas (mini 180 s) : le port serie peut se figer en renvoyant du vide
|
||||
sans jamais lever d'erreur, et sans ce garde le releve reste muet sans crasher.
|
||||
La sortie fait rouvrir le port par le superviseur.
|
||||
|
||||
## Deploiement sur le Synology .17
|
||||
|
||||
### 1. Pilote USB-serie (root, une fois + a chaque reboot)
|
||||
|
||||
DSM embarque `usbserial.ko` et `ftdi_sio.ko` mais ne les charge pas d'office.
|
||||
`charger-pilotes.sh` les charge et ouvre les droits de `/dev/ttyUSB0`.
|
||||
|
||||
Automatiser via **Planificateur de taches DSM** -> tache declenchee
|
||||
« Au demarrage », utilisateur **root**, commande :
|
||||
|
||||
/volume1/homes/TMZF5455/projects/EVCS/EVCS/deploy/releve-cellules/charger-pilotes.sh
|
||||
|
||||
A relancer aussi manuellement (meme chemin, en root) apres avoir rebranche le
|
||||
cable, sinon le device n'existe pas.
|
||||
|
||||
### 2. Le conteneur (TMZF5455, membre du groupe docker -> sans sudo)
|
||||
|
||||
cd /volume1/homes/TMZF5455/projects/EVCS/EVCS/deploy/releve-cellules
|
||||
/usr/local/bin/docker compose up -d
|
||||
/usr/local/bin/docker compose logs -f
|
||||
|
||||
Le conteneur tourne en `uid 1026:gid 100` (ni root, a cause du root_squash NFS,
|
||||
ni un compte sans droit d'ecriture sur le depot). Il redemarre seul apres un
|
||||
crash, un reboot du NAS, ou une sortie du garde anti-blocage.
|
||||
|
||||
### 3. Basculer depuis le portable
|
||||
|
||||
Sur le portable, arreter la boucle et desactiver le `@reboot` pour eviter deux
|
||||
lecteurs sur deux cables (ou un cable deplace) :
|
||||
|
||||
pkill -f 'pylontech-console.mjs --port'
|
||||
crontab -e # commenter la ligne @reboot .../lancer.sh
|
||||
|
||||
Ne JAMAIS avoir deux relevés actifs sur la meme chaine : leurs lectures
|
||||
s'entrelacent et produisent des valeurs fausses sans que rien ne le signale.
|
||||
|
||||
## Verifier que ca tourne
|
||||
|
||||
# cote NAS
|
||||
/usr/local/bin/docker logs --tail 20 evcs-releve-cellules
|
||||
# cote base (.22)
|
||||
ssh tmzf5455@10.10.10.22 "sudo /usr/local/bin/docker exec -i evcs-postgres \
|
||||
psql -U evcs -d evcs -c \"SELECT module, max(ts) FROM cellule GROUP BY module ORDER BY 2 DESC LIMIT 6;\""
|
||||
|
||||
Le panneau Grafana « Sante des modules » ne montre que les modules vus dans les
|
||||
2 dernieres heures : s'il est vide, le releve est arrete.
|
||||
|
||||
## Limite connue
|
||||
|
||||
Le cable est sur le **pack 2** (5x US2000C). Le **pack 1** (4x US5000) reste
|
||||
hors surveillance cellule jusqu'a un 2e cable. La courbe de capacite et le SOC,
|
||||
eux, couvrent tout le parc (agregat du Cerbo).
|
||||
37
deploy/releve-cellules/charger-pilotes.sh
Executable file
37
deploy/releve-cellules/charger-pilotes.sh
Executable file
@@ -0,0 +1,37 @@
|
||||
#!/bin/sh
|
||||
# Charge le pilote USB-serie sur le Synology .17 (ARCHIVE3, DS920+) et rend le
|
||||
# port accessible au conteneur du releve. A LANCER EN ROOT.
|
||||
#
|
||||
# Pourquoi : DSM 7.3.2 embarque les modules (/lib/modules/usbserial.ko et
|
||||
# ftdi_sio.ko) mais ne les charge pas d'office, et un cable branche ne cree donc
|
||||
# aucun /dev/ttyUSB*. Ce script charge les deux modules puis ouvre les droits du
|
||||
# device (le conteneur tourne en uid 1026, pas en root).
|
||||
#
|
||||
# QUAND : au demarrage du NAS, ET a chaque fois qu'on rebranche le cable apres
|
||||
# coup. A automatiser via Planificateur de taches DSM -> tache declenchee
|
||||
# « Au demarrage », utilisateur root, commande :
|
||||
# /volume1/homes/TMZF5455/projects/EVCS/EVCS/deploy/releve-cellules/charger-pilotes.sh
|
||||
#
|
||||
# Idempotent : relançable sans risque.
|
||||
|
||||
for ko in usbserial ftdi_sio; do
|
||||
if ! /sbin/lsmod | grep -q "^$ko "; then
|
||||
/sbin/insmod "/lib/modules/$ko.ko" 2>/dev/null \
|
||||
&& echo "$ko charge" \
|
||||
|| echo "$ko : insmod en echec (deja charge ? autre pilote ?)"
|
||||
else
|
||||
echo "$ko deja charge"
|
||||
fi
|
||||
done
|
||||
|
||||
# Laisse le temps a udev de creer le device si le cable est deja branche.
|
||||
sleep 2
|
||||
|
||||
if [ -e /dev/ttyUSB0 ]; then
|
||||
chmod 666 /dev/ttyUSB0
|
||||
echo "/dev/ttyUSB0 present, droits ouverts :"
|
||||
ls -l /dev/ttyUSB0
|
||||
else
|
||||
echo "/dev/ttyUSB0 absent : cable non branche, ou adaptateur non reconnu."
|
||||
echo "Rebrancher le cable puis relancer ce script."
|
||||
fi
|
||||
46
deploy/releve-cellules/compose.yaml
Normal file
46
deploy/releve-cellules/compose.yaml
Normal file
@@ -0,0 +1,46 @@
|
||||
# Releve continu des cellules Pylontech, hote = Synology .17 (ARCHIVE3, DS920+),
|
||||
# allume en permanence. Remplace la boucle lancer.sh du PC portable, qui mourait
|
||||
# a chaque fermeture du portable et n'a pas survecu au reboot du 20/09.
|
||||
#
|
||||
# CE QUE FAIT CE CONTENEUR : il lit le cable console Pylontech branche en USB sur
|
||||
# le NAS et ecrit un CSV dans docs/mesures/batteries/ du depot partage. Il NE
|
||||
# touche PAS a la base : le service d'historisation sur le .22 ingere ces CSV
|
||||
# comme avant (ingererCellules, tools/historise-evcs.mjs). Chaine inchangee en
|
||||
# aval, seul le LECTEUR serie change d'hote.
|
||||
#
|
||||
# PREALABLE HOTE (root, au boot) : le pilote USB-serie existe sur DSM mais n'est
|
||||
# pas charge d'office. Voir charger-pilotes.sh + le README. Sans /dev/ttyUSB0,
|
||||
# ce conteneur ne demarre pas.
|
||||
#
|
||||
# LANCEMENT (TMZF5455 est dans le groupe docker -> pas de sudo) :
|
||||
# cd /volume1/homes/TMZF5455/projects/EVCS/EVCS/deploy/releve-cellules
|
||||
# /usr/local/bin/docker compose up -d
|
||||
# /usr/local/bin/docker compose logs -f
|
||||
services:
|
||||
releve-cellules:
|
||||
image: node:20-bookworm-slim
|
||||
container_name: evcs-releve-cellules
|
||||
restart: unless-stopped
|
||||
# uid 1026 = TMZF5455, gid 100 = users. Le dossier docs/mesures/batteries
|
||||
# est en g+w pour users ; le device est rendu accessible (chmod 666) par
|
||||
# charger-pilotes.sh. On NE tourne PAS en root : le montage NFS du depot
|
||||
# (depuis le .22) peut ecraser root (root_squash) et refuser l'ecriture.
|
||||
user: "1026:100"
|
||||
working_dir: /depot
|
||||
volumes:
|
||||
# Le depot est monte sur le .17 depuis le .22 :
|
||||
# 10.10.10.22:/volume2/projects -> /volume1/homes/TMZF5455/projects
|
||||
- /volume1/homes/TMZF5455/projects/EVCS/EVCS:/depot
|
||||
devices:
|
||||
- /dev/ttyUSB0:/dev/ttyUSB0
|
||||
# ⚠️ Le pack 2 compte CINQ US2000 (adresses 1..5). Verifier cette liste
|
||||
# apres toute intervention physique sur la chaine.
|
||||
command:
|
||||
- node
|
||||
- tools/pylontech-console.mjs
|
||||
- --port
|
||||
- /dev/ttyUSB0
|
||||
- --suivi
|
||||
- "600"
|
||||
- --modules
|
||||
- "1,2,3,4,5"
|
||||
Reference in New Issue
Block a user