Le releve continu, et le code-barres dans le CSV plutot que l'adresse

Le suivi n'ecrivait que l'adresse du module, traduite a l'import par
une table figee sur le pack ancien. Le cable ayant change de pack,
tout releve fait maintenant aurait ete attribue aux mauvais modules.
Le code-barres est desormais resolu au demarrage et ecrit dans le CSV ;
la table ne sert plus qu'aux anciens fichiers.

Le releve tourne sur le poste qui porte le cable serie - le port USB
est la, pas sur le Synology - et n'ecrit qu'un CSV dans le depot
partage. C'est le service d'historisation, cote Synology, qui le verse
en base : le poste n'a donc aucun mot de passe a connaitre.

Archive pour le constructeur : un dossier par code-barres, plus un
manifeste en francais, anglais et chinois qui dit ou regarder en
premier et signale que les CSV sont deja corriges de la derive
d'horloge des BMS.

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:12:40 +02:00
parent 425c019362
commit a4de466ae1
68 changed files with 18472 additions and 8 deletions

View File

@@ -346,8 +346,25 @@ async function main() {
// 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);
// ⚠️ On resout le CODE-BARRES de chaque adresse AVANT de commencer, et on
// l'ecrit dans le CSV. Chaque chaine renumerote ses modules a partir de 1 :
// une adresse seule est ambigue, et une table de correspondance figee
// attribuerait les relevés d'une chaine aux modules de l'autre. C'est
// exactement le piege ouvert quand le cable a change de pack le 05/09.
const codes = new Map();
for (const ad of adresses) {
const info = await commande(l, `info ${ad}`, 8000);
const bc = (info.match(/Barcode\s*:\s*(\S+)/) || [])[1];
if (!bc) {
console.log(`Code-barres illisible pour l'adresse ${ad} : on n'enregistre pas a l'aveugle.`);
console.log('Relancer la commande — la ligne aura eu le temps de se vider.');
process.exit(1);
}
codes.set(ad, bc);
}
console.log(`Suivi toutes les ${pas} s, cellule par cellule -> ${f}`);
if (adresses.length) console.log(`Adresses interrogees : ${adresses.join(', ')}`);
for (const [ad, bc] of codes) console.log(` adresse ${ad} = ${bc}`);
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');
@@ -364,8 +381,8 @@ async function main() {
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})` +
fs.appendFileSync(f, [new Date().toISOString(), codes.get(ad), '', ...v, hi - lo].join(',') + '\n');
console.log(`${horodate()} ${codes.get(ad).slice(-4)} 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' : ''));
}