Le rang du module dans sa chaine accompagne desormais chaque releve de cellules
Le proprietaire demandait si le rang dans le pack etait accessible ou si seul le code-barres l'etait. Il l'etait depuis le debut : l'outil de releve resout adresse <-> code-barres au demarrage mais ne l'ecrivait pas. Desormais : - pylontech-console.mjs --suivi ecrit une colonne 'adresse' (vide en mono-module, jamais devinee) ; - historise-evcs.mjs l'ingere par son NOM dans cellule.rang, enregistre PAR RELEVE et non dans une table figee — un recablage du LVHUB renumerote, et l'historique de chaque ligne doit garder le rang vrai a son instant ; - Grafana : colonne 'Rang' dans le tableau de sante, et la liste deroulante des modules affiche 'rang - code-barres' quand le rang est connu. 75/75 requetes valides. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
This commit is contained in:
@@ -656,6 +656,11 @@ async function migrer(client) {
|
||||
)`);
|
||||
await client.query(
|
||||
'CREATE INDEX IF NOT EXISTS cellule_module_ts_idx ON cellule (module, ts DESC)');
|
||||
// Rang du module dans SA chaine AU MOMENT du releve. Enregistre par ligne et
|
||||
// non dans une table de correspondance : chaque chaine renumerote a partir
|
||||
// de 1, et un recablage du LVHUB peut tout renumeroter — la valeur figee
|
||||
// mentirait sur l'historique. Absent des anciens releves => NULL.
|
||||
await client.query('ALTER TABLE cellule ADD COLUMN IF NOT EXISTS rang smallint');
|
||||
|
||||
// Ce que le CONSEILLER a observe. Ses helpers sont ecrases toutes les
|
||||
// quinze minutes : sans cette table, un signalement grave emis a 3 h du
|
||||
@@ -1018,6 +1023,9 @@ async function ingererCellules(client) {
|
||||
// cable d'un pack a l'autre. Absent des anciens fichiers => null, donc les
|
||||
// lignes deja versees gardent leur courant inconnu.
|
||||
const iI = cols.indexOf('courant_mA');
|
||||
// Le rang dans la chaine, ajoute au releve le 18/09/2026 — par son NOM,
|
||||
// comme le courant : la position en fin de ligne n'est pas un contrat.
|
||||
const iA = cols.indexOf('adresse');
|
||||
const val = [];
|
||||
for (const ligne of l.slice(1)) {
|
||||
const c = ligne.split(',');
|
||||
@@ -1027,17 +1035,19 @@ async function ingererCellules(client) {
|
||||
// filtrer « pendant la charge » sans deviner.
|
||||
const ma = iI >= 0 ? Number(c[iI]) : NaN;
|
||||
const courant = Number.isFinite(ma) ? Math.round(ma) : null;
|
||||
const ra = iA >= 0 ? parseInt(c[iA], 10) : NaN;
|
||||
const rang = Number.isFinite(ra) && ra >= 1 && ra <= 16 ? ra : null;
|
||||
for (let k = 0; k < 15; k++) {
|
||||
const mv = Number(c[iC + k]);
|
||||
if (!(mv > 1000)) continue;
|
||||
val.push([c[0], c[1], k + 1, mv, null, courant, null, 'suivi']);
|
||||
val.push([c[0], c[1], k + 1, mv, null, courant, null, 'suivi', rang]);
|
||||
}
|
||||
}
|
||||
for (let i = 0; i < val.length; i += 500) {
|
||||
const lot = val.slice(i, i + 500);
|
||||
const ph = lot.map((_, k) => `($${k * 8 + 1},$${k * 8 + 2},$${k * 8 + 3},$${k * 8 + 4},$${k * 8 + 5},$${k * 8 + 6},$${k * 8 + 7},$${k * 8 + 8})`).join(',');
|
||||
const ph = lot.map((_, k) => `($${k * 9 + 1},$${k * 9 + 2},$${k * 9 + 3},$${k * 9 + 4},$${k * 9 + 5},$${k * 9 + 6},$${k * 9 + 7},$${k * 9 + 8},$${k * 9 + 9})`).join(',');
|
||||
const r = await client.query(
|
||||
`INSERT INTO cellule (ts, module, cellule, mv, soc, courant_ma, etat, source)
|
||||
`INSERT INTO cellule (ts, module, cellule, mv, soc, courant_ma, etat, source, rang)
|
||||
VALUES ${ph} ON CONFLICT (ts, module, cellule) DO NOTHING`, lot.flat());
|
||||
lignes += r.rowCount;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user