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) {