#!/usr/bin/env node // Le parc plafonnait a 93 % de SOC, et ce n'etait pas une protection. // // Mesure du 06/09 a 15:01, quatre modules du pack recent : // ce que le BMS AUTORISE : 53,2 V (`maximum_allowed_charging_voltage`) // ce que nous IMPOSIONS : 51,3 V, soit 3,42 V par cellule // cellules : 3 386 a 3 423 mV, ecart 25-30 mV par module // premiere alarme haute : 3 480 mV — la cellule la plus haute est 57 mV en dessous // Aucune alarme, le BMS autorisait encore 40 A de charge : c'est la consigne de // tension qui plafonnait le SOC, pas la batterie. // // Origine : la gestion « tension de cellule elevee » posee pour proteger les // cellules faibles du pack ANCIEN (cellule 12 du module ...0322 a 3 649 mV, // cellule 15 du ...0324). Ces modules sont hors service depuis le 05/09. Le // garde-fou protegeait un parc qui n'est plus la, au prix du haut de la // reserve : de 93 a ~100 % sur quatre modules, environ 0,68 kWh, soit 12 % de // l'energie utile — precisement ce qui manque en fin de nuit. // // ⚠️ LE HELPER `input_number.victron_battery_charge_voltage_normal_v` (51,3) ET // SES PALIERS hcv_step1/step2 NE SONT LUS PAR PERSONNE. Verifie : le nom // n'apparait nulle part dans l'Auto Charge Manager. Les tensions sont une table // codee en dur dans le node « Compute Charge Targets ». Meme famille que le // toggle `allow_grid_hc_night`, parse mais cable nulle part jusqu'a P7. // La VRAIE protection est le BMS lui-meme, qui a demontre le 05/09 une reaction // en CINQ SECONDES : cellule au-dessus de 3 550 mV -> plafond de courant // effondre. Elle reste entiere. // // 52,4 V = 3,493 V par cellule, SOUS la tension de charge nominale que // Pylontech annonce pour l'US2000C (52,5 V) et bien sous les 53,2 V que ce BMS // autorise. Avec 30 mV d'ecart entre cellules, la plus haute atteindra ~3,51 V, // encore 40 mV sous le seuil qui declenche la reduction de courant. // // Seul `pv_topoff` est touche : c'est le profil de la tranche 90-95 % de SOC, // exactement la ou ca plafonnait. `pv_boost` (SOC < 80) et `pv_mid` (80-90) // sont limites par le courant, pas par la tension. `pv_hold` (SOC >= 95, 50,6 V) // n'est PAS touche : redescendre une fois le haut atteint est le bon // comportement pour du LiFePO4, on ne veut pas y sejourner. // // node tools/patch-20260906c-tension-de-charge-52v4.mjs import fs from 'node:fs'; const F = 'workflows/victron-auto-charge-manager-v1.2.json'; const wf = JSON.parse(fs.readFileSync(F, 'utf8')); const calc = wf.nodes.find((n) => n.name === 'Compute Charge Targets'); if (!calc) throw new Error('noeud "Compute Charge Targets" introuvable'); let c = calc.parameters.jsCode; const avant = ' pv_topoff: { current_a: 80, voltage_v: 51.3 },'; const apres = ' pv_topoff: { current_a: 80, voltage_v: 52.4 },'; if (c.includes(apres)) { console.log(' deja fait'); } else { if (!c.includes(avant)) throw new Error('ancre pv_topoff introuvable'); c = c.replace(avant, apres); calc.parameters.jsCode = c; fs.writeFileSync(F, JSON.stringify(wf, null, 2) + '\n'); console.log(' pv_topoff : 51.3 -> 52.4 V (3,493 V/cellule)'); }