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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user