Mesure du 13/09, 10:39 a 12:50 : la DVCC etait a 130 A et la batterie prenait 114 a 127 A, soit 88 a 98 % du plafond, avec une tension plate a 50,6 V — a 0,5 V sous notre propre consigne. C'est le point decisif : il n'y avait aucune phase d'absorption, le courant ne retombait pas de lui-meme, il butait. Pendant ce temps six chargeurs sur sept se declaraient `voltage_current_limited`, et sans injection cette ressource est perdue. Le BMS, lui, declare autoriser 250 A et 53,2 V, ses 135 cellules tiennent dans 2 mV et aucun module ne bloque la charge. Le 130 A venait de l'ANCIEN parc, dont une cellule montait a 3 649 mV et faisait effondrer le courant de tous. Ces modules sont sortis le 12/09. - `pv_boost` 130 -> 150 A : un palier, pas une cible. 150 A reste a 60 % de ce que le BMS declare ; on regarde ce que ca libere et l'ecart entre cellules avant d'aller plus loin. - `pv_mid` 51,2 -> 51,5 V : la colonne des tensions REDESCENDAIT entre 80 et 90 % avant de remonter, reste du 06/09 ou seul pv_topoff avait ete releve. pv_topoff et pv_hold ne sont pas touches. L'effet du 150 A ne se verra que sous 80 % de SOC, donc a la charge du matin. Golden ACM : les trois scenarios qui epinglaient ces valeurs sont tombes, attendus mis a jour dans le meme commit, 20/20. Verifie en reel : consigne appliquee, aucune alarme, cellules toujours a 2 mV. Corrige au passage : l'ACM tourne toutes les 5 MINUTES, pas 30 s comme l'annoncaient le manuel et MEMORY.md. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GwpFpy2aQ2rJok6tNQSbVj
74 lines
3.7 KiB
JavaScript
74 lines
3.7 KiB
JavaScript
#!/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);
|