#!/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