La cellule 12 est detruite en ce moment, dix nuits sur treize

Le tampon d'evenements du BMS - distinct de l'historique, et que je
n'avais pas vu - montre 52 passages sous l'alarme basse repartis sur
19 nuits, avec une tension qui descend de 3072 a 2999 mV. Le temoin de
la meme chaine a un tampon VIDE.

Le SOC du parc a ces moments-la vaut 34 a 41 %. Le plancher dur du
controleur est a 22 % : il n'est jamais atteint, la cellule est
detruite bien avant. Le plancher est exprime dans un SOC que la
cellule endommagee fausse elle-meme.

Cela revise ma recommandation de cet apres-midi. Les 3 kWh que je
disais perdus en retirant les trois modules etaient mesures sur une
plage ou une cellule se detruit ; a plancher reellement sur, cinq
modules sains rendent 9,42 kWh contre 9,29 pour les sept. Le retrait
ne coute rien, et supprime le bridage en prime.

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:28:23 +02:00
parent 8aa8572ceb
commit d8e3cc7920
5 changed files with 1656 additions and 2 deletions

View File

@@ -265,7 +265,16 @@ async function main() {
const rtc = await commande(l, 'time', 8000);
const mr = rtc.match(/RTC\s+(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})/);
let decMs = 0;
if (mr) {
// ⚠️ Si l'horloge du module a ete remise a l'heure APRES l'ecriture des
// enregistrements, la lire maintenant donne zero alors que les donnees
// stockees portent l'ancien decalage. --decalage-minutes impose la valeur
// qui avait cours quand ces enregistrements ont ete ecrits.
const impose = arg('decalage-minutes');
if (impose !== null && impose !== true) {
decMs = parseInt(String(impose), 10) * 60000;
console.log(`Decalage impose : ${impose} min (l'horloge lue vaut ` +
`${mr ? mr[1] : 'inconnue'}).`);
} else if (mr) {
const [d, h] = mr[1].split(' ');
const [A, M, J] = d.split('-').map(Number); const [H, N, S] = h.split(':').map(Number);
decMs = new Date(A, M - 1, J, H, N, S).getTime() - Date.now();
@@ -273,6 +282,7 @@ async function main() {
} else {
console.log('Horloge non lue : les horodatages seront ceux du module, non corriges.');
}
const bascule = arg('decalage-minutes') ? Date.now() : null;
const info = await commande(l, `info ${ad}`, 8000);
const bc = (info.match(/Barcode\s*:\s*(\S+)/) || [])[1];
@@ -291,7 +301,7 @@ async function main() {
Array.from({ length: 15 }, (_, i) => `c${i + 1}_mV`).join(',') + ',ecart_mV\n');
console.log(`Module ${bc} (adresse ${ad}), tampon ${tampon} -> ${f}`);
let ecrits = 0, vides = 0;
let ecrits = 0, vides = 0, apresBascule = 0;
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)/);
@@ -308,10 +318,17 @@ async function main() {
const soc = (t.match(/Percent\s*:\s*(\d+)/) || [])[1] || '';
fs.appendFileSync(f, [quand.toISOString(), bc, cel[0].etat, cel[0].mA, soc,
...v, Math.max(...v) - Math.min(...v)].join(',') + '\n');
// Les enregistrements posterieurs a la remise a l'heure ne doivent PAS
// recevoir la correction : on les signale plutot que de les fausser.
if (bascule && quand.getTime() > bascule) apresBascule++;
ecrits++;
if (n % 25 === 0) process.stdout.write(`\r ${n} interroges, ${ecrits} ecrits `);
}
console.log(`\n${ecrits} enregistrements ecrits dans ${f}`);
if (apresBascule) {
console.log(`⚠️ ${apresBascule} enregistrement(s) tombent apres l'instant present : `
+ `ils ont ete ecrits APRES la remise a l'heure et ne devaient pas etre corriges.`);
}
return;
}