From 5ed85a5550e82446e6643b43be3053ecb41b6187 Mon Sep 17 00:00:00 2001 From: Tallagrand Thierry Date: Sat, 5 Sep 2026 13:01:51 +0200 Subject: [PATCH] Suivi en direct de plusieurs modules d'une chaine pendant l'alarme --modules 1,2,3 interroge chaque adresse avec soh, qui donne les quinze tensions et le compteur de sante par cellule. Sans cet argument on ne lisait que le module portant le cable, alors que l'adressage a distance permet de couvrir toute la chaine. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KKzkkVTG6KXnGXFFC7X9XJ --- docs/mesures/batteries/202609051300-suivi.csv | 3 +++ docs/mesures/batteries/202609051301-suivi.csv | 3 +++ tools/pylontech-console.mjs | 26 +++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 docs/mesures/batteries/202609051300-suivi.csv create mode 100644 docs/mesures/batteries/202609051301-suivi.csv diff --git a/docs/mesures/batteries/202609051300-suivi.csv b/docs/mesures/batteries/202609051300-suivi.csv new file mode 100644 index 0000000..4106f6f --- /dev/null +++ b/docs/mesures/batteries/202609051300-suivi.csv @@ -0,0 +1,3 @@ +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-05T11:00:51.875Z,module1,,3328,3328,3330,3328,3330,3328,3329,3328,3327,3328,3328,3326,3327,3329,3272,58 +2026-09-05T11:01:07.018Z,module1,,3328,3328,3330,3328,3330,3328,3329,3328,3327,3328,3328,3326,3327,3329,3272,58 diff --git a/docs/mesures/batteries/202609051301-suivi.csv b/docs/mesures/batteries/202609051301-suivi.csv new file mode 100644 index 0000000..68b9489 --- /dev/null +++ b/docs/mesures/batteries/202609051301-suivi.csv @@ -0,0 +1,3 @@ +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-05T11:01:13.884Z,module1,,3328,3328,3330,3328,3330,3328,3329,3328,3327,3328,3328,3326,3327,3329,3272,58 +2026-09-05T11:01:29.020Z,module1,,3328,3328,3330,3328,3330,3328,3329,3328,3327,3328,3328,3326,3327,3329,3272,58 diff --git a/tools/pylontech-console.mjs b/tools/pylontech-console.mjs index 0e0a20c..a026694 100644 --- a/tools/pylontech-console.mjs +++ b/tools/pylontech-console.mjs @@ -228,11 +228,37 @@ async function main() { fs.writeFileSync(f, 'heure_reelle,etat,courant_mA,' + Array.from({ length: 15 }, (_, i) => `c${i + 1}_mV`).join(',') + ',ecart_mV\n'); } + // --modules 1,2,3 : interroge chaque adresse de la chaine avec `soh `, + // qui donne les quinze tensions ET le compteur de sante par cellule. + // Sans cet argument on ne lit que le module sur lequel le cable est pose. + const adresses = String(arg('modules', '')).split(',') + .map((x) => parseInt(x, 10)).filter((n) => n >= 1 && n <= 16); console.log(`Suivi toutes les ${pas} s, cellule par cellule -> ${f}`); + if (adresses.length) console.log(`Adresses interrogees : ${adresses.join(', ')}`); console.log('L\'heure enregistree est l\'heure REELLE de cette machine, pas celle du module'); console.log('(l\'horloge interne du module derive de plusieurs heures).'); console.log('Ctrl-C pour arreter.\n'); for (;;) { + if (adresses.length) { + for (const ad of adresses) { + const t = await commande(l, `soh ${ad}`, 10000); + // `soh` : " " + const c = []; + for (const ligne of t.split('\n')) { + const m = ligne.trim().match(/^(\d{1,2})\s+(\d{4})\s+(\d+)\s+(\w+)/); + if (m) c.push({ n: +m[1] + 1, mV: +m[2] }); + } + if (c.length < 10) { console.log(`${horodate()} module ${ad} : illisible`); continue; } + const v = c.map((x) => x.mV); + const hi = Math.max(...v), lo = Math.min(...v); + fs.appendFileSync(f, [new Date().toISOString(), `module${ad}`, '', ...v, hi - lo].join(',') + '\n'); + console.log(`${horodate()} module ${ad} haute ${hi} mV (cellule ${c.find((x) => x.mV === hi).n})` + + ` basse ${lo} mV ecart ${String(hi - lo).padStart(3)} mV` + + (hi >= 3600 ? ' NIVEAU 4' : hi >= 3550 ? ' NIVEAU 3, le courant se reduit' : '')); + } + await new Promise((r) => setTimeout(r, pas * 1000)); + continue; + } const txt = await commande(l, 'data', 10000); const cel = cellules(txt); if (cel) {