Le releve part d'une entree crontab, pas d'un service utilisateur

Le linger systemd aurait fait demarrer une douzaine de services
graphiques sans session ouverte - gnome-remote-desktop et le trousseau
compris. Le proprietaire a tranche pour une entree @reboot qui ne
relance que ce releve.

Consequence technique : on ne peut pas passer par systemctl --user,
qui echouerait faute de gestionnaire de services au demarrage. Le
script fait donc lui-meme le travail d'un superviseur : garde
anti-doublon - deux processus sur le meme port entrelacent leurs
lectures et produisent des relevés faux sans que rien ne le signale -
attente si le port n'est pas encore la, redemarrage apres echec, et
journal tronque au-dela de cinq megaoctets.

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-05 20:40:40 +02:00
parent f205ff2707
commit a9047d1391
3 changed files with 57 additions and 0 deletions

View File

@@ -0,0 +1,47 @@
#!/bin/bash
# Lance et surveille le releve continu des cellules Pylontech.
#
# Appele par une entree @reboot de la crontab utilisateur. On ne passe PAS par
# `systemctl --user` : sans « linger », aucun gestionnaire de services
# utilisateur ne tourne au demarrage, et la commande echouerait faute de
# XDG_RUNTIME_DIR. Le choix a ete fait de ne pas activer le linger, qui aurait
# aussi fait demarrer une douzaine de services graphiques sans session ouverte.
#
# Ce script fait donc lui-meme le travail d'un superviseur : garde
# anti-doublon, redemarrage apres echec, journal borne.
DEPOT=/mnt/projects/EVCS/EVCS
PORT=/dev/ttyUSB0
JOURNAL="$HOME/.local/state/releve-cellules.log"
MODULES=1,2,3,4
PAS=600
mkdir -p "$(dirname "$JOURNAL")"
# Garde anti-doublon : deux processus sur le meme port serie entrelacent leurs
# lectures et produisent des relevés faux, sans que rien ne le signale.
if pgrep -f "pylontech-console.mjs --port $PORT" >/dev/null; then
echo "$(date '+%F %T') deja en cours, on ne relance pas" >> "$JOURNAL"
exit 0
fi
cd "$DEPOT" || { echo "$(date '+%F %T') depot introuvable" >> "$JOURNAL"; exit 1; }
while true; do
# Le journal est tronque au-dela de 5 Mo : une semaine sans surveillance ne
# doit pas remplir la partition.
[ -f "$JOURNAL" ] && [ "$(stat -c%s "$JOURNAL")" -gt 5242880 ] && : > "$JOURNAL"
if [ ! -e "$PORT" ]; then
echo "$(date '+%F %T') $PORT absent, nouvelle tentative dans 60 s" >> "$JOURNAL"
sleep 60
continue
fi
echo "$(date '+%F %T') demarrage du releve" >> "$JOURNAL"
/usr/bin/node tools/pylontech-console.mjs \
--port "$PORT" --suivi "$PAS" --modules "$MODULES" >> "$JOURNAL" 2>&1
echo "$(date '+%F %T') arret (code $?), reprise dans 60 s" >> "$JOURNAL"
sleep 60
done

View File

@@ -0,0 +1,5 @@
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
2026-09-05T18:31:45.233Z,Y230202C30371426,,3290,3291,3292,3292,3292,3290,3291,3292,3292,3291,3290,3291,3292,3292,3292,2
2026-09-05T18:31:45.388Z,Y230202C30371425,,3291,3292,3291,3292,3290,3290,3292,3292,3292,3290,3290,3292,3292,3292,3290,2
2026-09-05T18:31:45.633Z,Y230202C30371431,,3290,3292,3292,3292,3291,3289,3292,3292,3292,3291,3290,3292,3292,3292,3291,3
2026-09-05T18:31:45.788Z,Y230202C30371427,,3289,3291,3291,3291,3291,3289,3291,3291,3291,3291,3289,3291,3292,3292,3291,3
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
2 2026-09-05T18:31:45.233Z Y230202C30371426 3290 3291 3292 3292 3292 3290 3291 3292 3292 3291 3290 3291 3292 3292 3292 2
3 2026-09-05T18:31:45.388Z Y230202C30371425 3291 3292 3291 3292 3290 3290 3292 3292 3292 3290 3290 3292 3292 3292 3290 2
4 2026-09-05T18:31:45.633Z Y230202C30371431 3290 3292 3292 3292 3291 3289 3292 3292 3292 3291 3290 3292 3292 3292 3291 3
5 2026-09-05T18:31:45.788Z Y230202C30371427 3289 3291 3291 3291 3291 3289 3291 3291 3291 3291 3289 3291 3292 3292 3291 3

View File

@@ -0,0 +1,5 @@
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
2026-09-05T18:40:18.873Z,Y230202C30371426,,3304,3304,3304,3304,3303,3303,3304,3303,3304,3303,3304,3303,3304,3304,3303,1
2026-09-05T18:40:19.033Z,Y230202C30371425,,3303,3303,3303,3304,3304,3303,3303,3303,3303,3303,3303,3303,3303,3303,3303,1
2026-09-05T18:40:19.191Z,Y230202C30371431,,3303,3303,3304,3303,3303,3303,3303,3303,3303,3303,3303,3304,3303,3304,3303,1
2026-09-05T18:40:19.348Z,Y230202C30371427,,3303,3303,3303,3303,3303,3303,3303,3303,3303,3303,3303,3303,3303,3303,3303,0
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
2 2026-09-05T18:40:18.873Z Y230202C30371426 3304 3304 3304 3304 3303 3303 3304 3303 3304 3303 3304 3303 3304 3304 3303 1
3 2026-09-05T18:40:19.033Z Y230202C30371425 3303 3303 3303 3304 3304 3303 3303 3303 3303 3303 3303 3303 3303 3303 3303 1
4 2026-09-05T18:40:19.191Z Y230202C30371431 3303 3303 3304 3303 3303 3303 3303 3303 3303 3303 3303 3304 3303 3304 3303 1
5 2026-09-05T18:40:19.348Z Y230202C30371427 3303 3303 3303 3303 3303 3303 3303 3303 3303 3303 3303 3303 3303 3303 3303 0