Le tampon d'evenements, celui que lit un fabricant

Le BMS tient deux tampons distincts et je n'avais extrait que l'un
des deux. history echantillonne toutes les trente minutes sur cinq
semaines ; event n'enregistre que les declenchements, a la seconde,
et remonte jusqu'a mai 2025.

C'est le second qui porte la preuve : le 27/07 sur le module ...0319,
quatre declenchements en trois minutes, cellule haute a 3650 mV. Et
il couvre seize mois, donc il contient le moment ou ces cellules ont
ete abimees.

Premier ecart, sans aucune interpretation : les quatre modules du
pack recent totalisent 38 evenements depuis mai 2025 - 19, 12, 6 et
1. Le module abime en compte 805 a lui seul.

--tampon event ajoute au mode d'extraction distante. Le garde pose
plus tot a d'ailleurs fonctionne : un module a refuse de partir sans
code-barres plutot que de rendre un fichier anonyme.

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 18:09:37 +02:00
parent e6405d6b49
commit 8aa8572ceb
6 changed files with 103 additions and 9 deletions

View File

@@ -147,7 +147,7 @@ function journal(nom, texte) {
return f;
}
const horodate = () => new Date().toLocaleString('fr-FR', { timeZone: 'Europe/Paris' });
const tampon = () => new Date().toLocaleString('sv-SE', { timeZone: 'Europe/Paris' }).replace(/[-: ]/g, '').slice(0, 12);
const horodateFichier = () => new Date().toLocaleString('sv-SE', { timeZone: 'Europe/Paris' }).replace(/[-: ]/g, '').slice(0, 12);
// -------------------------------------------------------------------- main
async function main() {
@@ -205,14 +205,14 @@ async function main() {
const cmd = arg('commande');
const txt = await commande(l, String(cmd));
console.log(txt);
console.log('--- journalise dans ' + journal(`${tampon()}-console.txt`,
console.log('--- journalise dans ' + journal(`${horodateFichier()}-console.txt`,
`\n===== ${horodate()} =====\n${cmd}\n${txt}\n`));
return;
}
if (arg('historique')) {
const depuis = +(arg('depuis', '1')) || 1;
const nom = `${tampon()}-historique.txt`;
const nom = `${horodateFichier()}-historique.txt`;
console.log(`Extraction de l'historique a partir de l'enregistrement ${depuis}.`);
console.log('Le module en garde 1798, un toutes les 30 minutes : comptez plusieurs minutes.');
const f = journal(nom, `# releve du ${horodate()} sur ${dev}\n`);
@@ -252,6 +252,12 @@ async function main() {
// Un seul branchement par chaine suffit donc pour tout son historique.
if (arg('historique-distant')) {
const ad = parseInt(String(arg('historique-distant')), 10);
// Deux tampons distincts vivent dans le BMS. `history` echantillonne
// toutes les 30 minutes sur cinq semaines ; `event` n'enregistre QUE les
// declenchements, a la seconde, et remonte bien plus loin — jusqu'a mai
// 2025 sur ces modules. C'est le second que lit un fabricant.
const tampon = arg('tampon', 'history') === 'event' ? 'event' : 'history';
const MAX = tampon === 'event' ? 900 : 1800;
if (!(ad >= 1 && ad <= 16)) { console.log('Adresse invalide.'); process.exit(1); }
// Le decalage se mesure AVANT, car les enregistrements stockes portent
@@ -278,15 +284,16 @@ async function main() {
console.log('Relancer la commande — la ligne aura eu le temps de se vider.');
process.exit(1);
}
const f = path.join(DOSSIER, `${tampon()}-histo-distant-${bc}.csv`);
const f = path.join(DOSSIER,
`${horodateFichier()}-${tampon === 'event' ? 'evenements' : 'histo'}-distant-${bc}.csv`);
fs.mkdirSync(DOSSIER, { recursive: true });
fs.writeFileSync(f, 'heure_reelle,module,etat,courant_mA,soc,' +
Array.from({ length: 15 }, (_, i) => `c${i + 1}_mV`).join(',') + ',ecart_mV\n');
console.log(`Module ${bc} (adresse ${ad}) -> ${f}`);
console.log(`Module ${bc} (adresse ${ad}), tampon ${tampon} -> ${f}`);
let ecrits = 0, vides = 0;
for (let n = 1; n <= 1800; n++) {
const t = await commande(l, `data ${ad} history ${n}`, 8000);
for (let n = 1; n <= MAX; n++) {
const t = await commande(l, `data ${ad} ${tampon} ${n}`, 8000);
const mt = t.match(/Time\s*:\s*(\d\d-\d\d-\d\d \d\d:\d\d:\d\d)/);
const cel = cellules(t);
if (!mt || !cel || cel.length < 15) {
@@ -310,7 +317,7 @@ async function main() {
if (arg('suivi')) {
const pas = Math.max(10, +(arg('suivi', '30')) || 30);
const nom = `${tampon()}-suivi.csv`;
const nom = `${horodateFichier()}-suivi.csv`;
const f = path.join(DOSSIER, nom);
fs.mkdirSync(DOSSIER, { recursive: true });
if (!fs.existsSync(f)) {
@@ -369,7 +376,7 @@ async function main() {
}
// Par defaut : un instantane complet.
const nom = `${tampon()}-instantane.txt`;
const nom = `${horodateFichier()}-instantane.txt`;
let tout = `# releve du ${horodate()} sur ${dev} a ${VITESSE} bauds\n`;
for (const c of ['info', 'stat', 'data']) {
const txt = await commande(l, c, 12000);