#!/usr/bin/env node // Le parc butait sur NOTRE plafond, pas sur le sien. // // Mesure du 13/09, de 10:39 a 12:50 : // DVCC appliquee par l'ACM : 130 A (profil pv_boost, SOC < 80) // courant reellement pris : 114 a 127 A, soit 88 a 98 % du plafond // tension du parc : 50,6-50,7 V, plate, a 0,5 V sous notre // propre consigne — donc AUCUNE phase // d'absorption : le courant ne retombait // pas de lui-meme, il butait. // ce que le BMS declare autoriser : 250 A de charge, 53,2 V // ecart entre les 135 cellules : 2 mV (3,327 a 3,329 V) // modules bloquant la charge : 0, aucune alarme // Pendant ce temps six chargeurs sur sept se declaraient // `voltage_current_limited` : la ressource etait refusee faute de preneur, et // sans injection elle est simplement perdue. // // Origine du 130 A : la table a ete calibree pour l'ANCIEN parc, dont une // cellule montait a 3 649 mV et faisait effondrer le courant de tout le monde // (HANDOFF §48-§53). Ces modules sont sortis le 12/09. Le parc actuel — quatre // US5000 et cinq US2000C — tient ses cellules dans 2 mV. // // DEUX CHANGEMENTS, ET DEUX SEULEMENT : // // 1. `pv_boost` : 130 -> 150 A. C'est le profil de la tranche SOC < 80, celle // ou se fait l'essentiel de la charge du matin et celle ou la mesure montre // la batterie collee au plafond. 150 A reste a 60 % de ce que le BMS // declare : c'est un palier, pas une cible. On regarde ce qu'il libere et // l'ecart entre cellules avant d'aller plus loin. // // 2. `pv_mid` : 51,2 -> 51,5 V. La colonne des tensions descendait entre 80 et // 90 % avant de remonter — 51,5 puis 51,2 puis 52,4 — reste du 06/09 ou // seul `pv_topoff` avait ete releve parce que c'etait lui qui plafonnait le // parc a 93 %. 51,5 V l'aligne sur `pv_boost` et rend la colonne monotone. // // NE SONT PAS TOUCHES : // `pv_mid.current_a` (110 A) — voir la note ci-dessous ; // `pv_topoff` (80 A / 52,4 V) — regle le 06/09, mesure a l'appui ; // `pv_hold` (30 A / 50,6 V) — deliberé : on atteint le haut, on n'y sejourne // pas, c'est le bon comportement pour du LiFePO4. // // ⚠️ CONSEQUENCE A CONNAITRE : au-dessus de 80 % de SOC c'est `pv_mid` qui // s'applique, donc son plafond de 110 A reste le plus bas des deux. L'effet du // 150 A se verra sur la charge du MATIN, sous 80 %. Si l'on veut aussi le voir // dans la tranche 80-90, c'est `pv_mid.current_a` qu'il faut relever, et c'est // une decision distincte. // // node tools/patch-20260913-plafond-150a-et-pvmid-51v5.mjs import fs from 'fs'; const F = 'workflows/victron-auto-charge-manager-v1.2.json'; const w = JSON.parse(fs.readFileSync(F, 'utf8')); const n = w.nodes.find((x) => x.name === 'Compute Charge Targets'); if (!n) { console.error('noeud "Compute Charge Targets" introuvable'); process.exit(1); } const remplacements = [ [' pv_boost: { current_a: 130, voltage_v: 51.5 },', ' pv_boost: { current_a: 150, voltage_v: 51.5 },'], [' pv_mid: { current_a: 110, voltage_v: 51.2 },', ' pv_mid: { current_a: 110, voltage_v: 51.5 },'], ]; let code = n.parameters.jsCode; for (const [avant, apres] of remplacements) { if (code.includes(apres)) { console.log('deja applique : ' + apres.trim()); continue; } if (!code.includes(avant)) { console.error('ancre introuvable : ' + avant.trim()); process.exit(1); } code = code.replace(avant, apres); console.log(apres.trim()); } n.parameters.jsCode = code; fs.writeFileSync(F, JSON.stringify(w, null, 2) + '\n'); console.log('\n' + F + ' patche. Pousser avec :'); console.log(' node tools/n8n-push.mjs ' + F);