Deux modules atteints sur trois, et la jauge suit la cellule la plus faible

La console repond depuis Linux. L'adressage a distance fonctionne : un
branchement par pack suffit, et `soh <adresse>` donne le compteur de
sante par cellule en une seconde.

Le module 3 designe exactement les cinq cellules deduites ce matin de
son historique. Le module 1, sain en juillet, est passe de 7 a 498
evenements de surtension en six semaines ; sa cellule 12 oscille sur
691 mV quand ses douze cellules saines font 178 mV.

Ses pires ecarts sont en bas, pas en haut : 317 mV a un pretendu
2 % de charge alors que le parc etait a 3,236 V par cellule. Le BMS
croit la batterie vide parce qu'une cellule l'est. C'est tres
probablement le genou a 33 % mesure dans la courbe energie/SOC.

Correction : le champ SOH de stat n'est pas une note sur 100, le
module irreprochable affiche 0 comme le module abime.

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 12:05:39 +02:00
parent 021aa9f127
commit 55f981a730
6 changed files with 2406 additions and 14 deletions

View File

@@ -3806,12 +3806,19 @@ Compteurs `stat`, deux modules du meme parc :
| Bat HV Times | **7** | **416** |
| Bat OV Times | 8 | 179 |
| CYCLE Times | 0 | 24 |
| **SOH** | **100** | **0** |
| SOH | 100 | 0 |
⚠️ **Le BMS note lui-meme ce module 0 sur 100.** Et c'est celui que le
proprietaire croyait « le moins merdique » (sa BAT4). Le module qu'il juge le
plus abime, sa BAT3, est deja hors du parc — il n'est pour rien dans le bridage
quotidien. **Le bridage vient d'un module encore en service.**
Et c'est le module que le proprietaire croyait « le moins merdique ». Le module
qu'il juge le plus abime, sa BAT3, est deja hors du parc — il n'est pour rien
dans le bridage quotidien. **Le bridage vient d'un module encore en service.**
⚠️ **CORRECTION du 05/09 12:05 — le champ `SOH` de `stat` n'est PAS une note de
sante sur 100.** J'avais ecrit « le BMS note lui-meme ce module 0 sur 100 ».
C'est faux : la lecture en direct de la chaine montre un module 2 irreprochable
par toutes les autres mesures (0 evenement de surtension, 0 `SOHCount` sur ses
quinze cellules, 2 mV d'ecart) et qui affiche pourtant `SOH 0`. Les grandeurs
reellement discriminantes sont `Bat HV Times`, `Bat OV Times`, `SOH Times`, et
surtout le `SOHCount` par cellule que renvoie la commande `soh [adresse]`.
### C'est chronique, pas en fuite
Depassements de 3550 mV : 1 a 4 releves par jour, **tous les jours depuis le
@@ -3852,3 +3859,97 @@ adaptateurs CH340 — y est desactive.
---
*Document mis a jour le : 05/09/2026 (~11:40) — cellules 2, 6, 10, 12, 15 du module adresse 3 identifiees comme cause du bridage ; SOH 0 contre 100 sur un module sain*
## 50. Session du 05/09/2026 (midi) — Lecture en direct de la chaine BMS depuis Linux
Cable FTDI FT232R branche sur le poste Ubuntu, `tools/pylontech-console.mjs`
en service. **Le diagnostic du matin est confirme, elargi, et une de ses
affirmations est fausse.**
### La console voit toute la chaine : un branchement par PACK, pas par module
`stat 3` et `soh 3` repondent depuis le module 1 : l'adressage a distance
fonctionne, bien que `help` ne documente pas l'argument. Mais `pwr` ne liste
que **trois modules presents** (1, 2, 3) et « Absent » de 4 a 16.
⚠️ **Les deux packs de quatre ont chacun leur chaine BMS.** Celle-ci porte
trois modules vivants (le quatrieme, BAT3, est eteint). Les quatre autres sont
sur une chaine distincte, invisible d'ici : il faut **deux positions de cable
en tout**, pas huit.
### Jeu de commandes (releve par `help`, plus jamais a redecouvrir)
`bat [pwr][index]` · `data [event/history][item]` ·
`datalist [event/history][item/bat][batnun][volt/curr/temp/coul][item]` ·
`disp` (affichage periodique) · `getpwr` · `info` · `log` · `pwr [index]` ·
**`soh [adresse]`** · `stat` · `time [a] [m] [j] [h] [mn] [s]`.
Section « Remote command » : `data`, `info`, `login`, `logout`, `soh`, `stat`.
⚠️ A NE JAMAIS ENVOYER : `shut` (arret du module), `trst` (reset),
`updata` (mise a jour firmware), `login` (mode admin).
### `soh <adresse>` : le compteur de sante par cellule, en une seconde
C'est LA commande a retenir. Elle donne les quinze `SOHCount` d'un module sans
extraire son historique. Verdict de la chaine :
| module | code-barres | cellules marquees (`SOHCount`) | total |
|---|---|---|---:|
| 1 | K220803C30160322 | 6 (334) · 7 (50) · 12 (158) · 14 (8) | **550** |
| 2 | — | aucune | **0** |
| 3 | K220803C30160319 | 2 (132) · 6 (181) · 10 (146) · 12 (254) · 15 (400) | **1113** |
Le module 3 designe **exactement les cinq cellules** deduites le matin meme de
ses 37 jours d'historique. Deux methodes sans rapport, meme resultat.
### Le module 2 donne enfin un etalon
Quinze cellules entre 3363 et 3365 mV — **2 mV d'ecart**, zero surtension, zero
compteur. Voila a quoi ressemble un US2000C sain sur cette installation.
### CORRECTION — `SOH` dans `stat` n'est pas une note sur 100
J'ai ecrit le matin « le BMS note ce module 0 sur 100 ». **C'est faux** : le
module 2, irreprochable par toute autre mesure, affiche lui aussi `SOH 0`.
Les grandeurs discriminantes sont `Bat HV Times`, `Bat OV Times`, `SOH Times`
et le `SOHCount` par cellule. Le diagnostic tient ; c'est cet argument-la qui
tombe.
### Le module 1 s'est effondre depuis juillet
Memes compteurs, meme module, six semaines d'ecart :
| | 24/07 | 05/09 |
|---|---:|---:|
| Bat HV Times | 7 | **498** |
| Bat OV Times | 8 | **86** |
| Shut Times | 4 | **751** |
Il a desormais **plus** d'evenements de surtension que le module 3. Son
historique (1681 enregistrements, 14/08 au 05/09) designe les cellules
**6, 7 et 12** — les memes que son `SOHCount`, quatrieme concordance.
**La cellule 12 oscille entre 2953 et 3644 mV**, soit 691 mV d'amplitude,
quand les douze cellules saines de ce module font 178 mV. Elle est au bord de
la coupure basse.
### Consequence pour le bilan energetique : la jauge de SOC est fausse par le bas
Les pires ecarts du module 1 ne sont pas en haut mais **en bas** : 317 mV a
« SOC 2-3 % » le 26/08, alors que le parc etait a 48,55 V, soit 3,236 V par
cellule en moyenne — un etat de charge reel de l'ordre de 25 %, pas 2 %. Le
BMS voit sa cellule 12 a 2953 mV, la croit vide, et annonce 2 %.
⚠️ **C'est tres probablement l'explication de l'effondrement de la jauge en bas
d'echelle** documente en §28 et mesure en §41 (0,097 kWh par point sous 33 %
contre 0,169 au-dessus). La jauge ne mesure pas le parc : elle suit la cellule
la plus faible du module le plus faible. Le « genou » a 32-33 % n'est pas une
propriete du LiFePO4, c'est la signature de la cellule 12 du module 1.
A reverifier apres reequilibrage — la courbe devrait se redresser.
### Horloge
`pwr` horodate les trois modules a `2026-09-05 18:07:5x` alors qu'il etait
11:58 : **environ 6 h 10 d'avance**, mesure directement. L'estimation de 8 h
obtenue le matin par correlation est superseded par cette lecture directe.
La commande `time` permet de corriger — ecriture, donc en attente de
validation du proprietaire.
### Correction d'outil
`--historique` bouclait sur des index croissants alors que **une seule commande
`datalist history dtls 1` pagine deja jusqu'au dernier enregistrement** : les
119 commandes suivantes relancaient le meme vidage complet. Corrige.
---
*Document mis a jour le : 05/09/2026 (~12:15) — chaine BMS lue en direct depuis Linux ; deux modules atteints sur trois ; la jauge de SOC suit la cellule la plus faible*

View File

@@ -0,0 +1,110 @@
===== 05/09/2026 11:58:11 =====
help
help
@
Local command:
bat Battery data show - bat [pwr][index]
data History data load - data [event/history][item]
datalist Show recorded data - datalist [event/history][item/bat][batnun][volt/curr/temp/coul][item]
disp Display Info at regular intervals - disp [(pwrs pwrNo)/val]/[(bats batNo)/volt/curr/temp]
getpwr Get power Info - getpwr
help Help [cmd]
info Device infomation - info
log Log information show - log
login Login Admin mode - login [password]
logout user mode - logout
pwr Power data show - pwr [index]
shut Shut down - shut
soh State of health - soh [addr]
stat Statistic data show - stat
time Time - time [year] [month] [day] [hour] [minute] [second]
trst Test Soft Reset - trst
updata updata system - updata
**********************************************************
Remote command:
Press [Enter] to be continued,other key to exit
data History data load - data [event/history][item]
info Device infomation - info
login Login Admin mode - login [password]
logout user mode - logout
soh State of health - soh [addr]
stat Statistic data show - stat
Command completed successfully
$$
===== 05/09/2026 11:58:27 =====
pwr
pwr
@
Power Volt Curr Tempr Tlow Thigh Vlow Vhigh Base.St Volt.St Curr.St Temp.St Coulomb Time B.V.St B.T.St MosTempr M.T.St
1 50572 6374 25000 23900 24000 3361 3378 Charge Normal Normal Normal 71% 2026-09-05 18:07:52 Normal Normal 23900 Normal
2 50483 6001 25200 24200 24800 3364 3367 Charge Normal Normal Normal 69% 2026-09-05 18:07:50 Normal Normal 23800 Normal
3 50598 6142 24900 23500 24100 3364 3383 Charge Normal Normal Normal 75% 2026-09-05 18:07:50 Normal Normal 24100 Normal
4 - - - - - - - Absent - - - - - - -
5 - - - - - - - Absent - - - - - - -
6 - - - - - - - Absent - - - - - - -
7 - - - - - - - Absent - - - - - - -
8 - - - - - - - Absent - - - - - - -
9 - - - - - - - Absent - - - - - - -
10 - - - - - - - Absent - - - - - - -
11 - - - - - - - Absent - - - - - - -
12 - - - - - - - Absent - - - - - - -
13 - - - - - - - Absent - - - - - - -
14 - - - - - - - Absent - - - - - - -
15 - - - - - - - Absent - - - - - - -
16 - - - - - - - Absent - - - - - - -
Command completed successfully

View File

@@ -0,0 +1,135 @@
===== 05/09/2026 11:59:07 =====
info
info
@
Device address : 1
Manufacturer : Pylon
Device name : US2000C
Board version : V10R04
Board : NF4.E2
Main Soft version : B69.13.0.0
Soft version : V1.4
Boot version : V1.0
Comm version : V2.0
Release Date : 22-01-24
Barcode : K220803C30160322
Specification : 48V/50AH
Cell Number : 15
Max Dischg Curr : -90000mA
Max Charge Curr : 90000mA
EPONPort rate : 1200
Console Port rate : 115200
Command completed successfully
$$
===== 05/09/2026 11:59:09 =====
soh 2
soh 2
@
Power 2
Battery Voltage SOHCount SOHStatus
0 3364 0 Normal
1 3364 0 Normal
2 3363 0 Normal
3 3364 0 Normal
4 3364 0 Normal
5 3363 0 Normal
6 3364 0 Normal
7 3363 0 Normal
8 3364 0 Normal
9 3365 0 Normal
10 3364 0 Normal
11 3364 0 Normal
12 3364 0 Normal
13 3364 0 Normal
14 3364 0 Normal
Command completed successfully
$$
pylon>
===== 05/09/2026 11:59:10 =====
soh 3
soh 3
@
Power 3
Battery Voltage SOHCount SOHStatus
0 3372 0 Normal
1 3358 132 Normal
2 3370 0 Normal
3 3370 0 Normal
4 3369 0 Normal
5 3377 181 Normal
6 3370 0 Normal
7 3369 0 Normal
8 3370 0 Normal
9 3364 146 Normal
10 3373 0 Normal
11 3363 254 Normal
12 3371 0 Normal
13 3371 0 Normal
14 3362 400 Normal
Command completed successfully

View File

@@ -0,0 +1,222 @@
===== 05/09/2026 12:00:00 =====
stat 1
stat 1
@
Device address 1
Data Items : 849
HisData Items : 1794
Charge Cnt. : 179
Discharge Cnt. : 0
Charge Times : 54832
Status Cnt. : 178
Idle Times : 65187
COC Times : 0
COC2 Times : 73
DOC Times : 0
DOC2 Times : 0
COCA Times : 0
DOCA Times : 0
SC Times : 0
Bat OV Times : 86
Bat HV Times : 498
Bat LV Times : 49
Bat UV Times : 0
Bat SLP Times : 0
Pwr OV Times : 0
Pwr HV Times : 0
Pwr LV Times : 0
Pwr UV Times : 0
Pwr SLP Times : 0
COT Times : 0
CUT Times : 0
DOT Times : 0
DUT Times : 0
CHT Times : 0
CLT Times : 0
DHT Times : 0
DLT Times : 0
Shut Times : 751
Reset Times : 9
RV Times : 0
Input OV Times : 0
SOH Times : 131
BMICERR Times : 0
CYCLE Times : 25
SOH : 100
Pwr Percent : 71
Pwr Coulomb : 128403078
Dsg Cap : 1288446
HT@0.5C Cnt : 0
LT@0.5C Cnt : 0
HT Cnt : 0
LT Cnt : 0
LV Cnt : 0
LifeWarn Times : 0
LifeAlarm Times : 0
Command completed successfully
$$
pylon>
===== 05/09/2026 12:00:02 =====
stat 2
stat 2
@
Device address 2
Data Items : 0
HisData Items : 1795
Charge Cnt. : 179
Discharge Cnt. : 0
Charge Times : 32398
Status Cnt. : 178
Idle Times : 51188
COC Times : 0
COC2 Times : 0
DOC Times : 0
DOC2 Times : 0
COCA Times : 0
DOCA Times : 0
SC Times : 0
Bat OV Times : 0
Bat HV Times : 0
Bat LV Times : 0
Bat UV Times : 0
Bat SLP Times : 0
Pwr OV Times : 0
Pwr HV Times : 0
Pwr LV Times : 0
Pwr UV Times : 0
Pwr SLP Times : 0
COT Times : 0
CUT Times : 0
DOT Times : 0
DUT Times : 0
CHT Times : 0
CLT Times : 0
DHT Times : 0
DLT Times : 0
Shut Times : 7
Reset Times : 13
RV Times : 0
Input OV Times : 0
SOH Times : 0
BMICERR Times : 0
CYCLE Times : 33
SOH : 0
Pwr Percent : 70
Pwr Coulomb : 125172494
Dsg Cap : 1663847
HT@0.5C Cnt : 0
LT@0.5C Cnt : 0
HT Cnt : 0
LT Cnt : 0
LV Cnt : 0
LifeWarn Times : 0
LifeAlarm Times : 0

File diff suppressed because it is too large Load Diff

View File

@@ -207,15 +207,15 @@ async function main() {
const nom = `${tampon()}-historique.txt`;
console.log(`Extraction de l'historique a partir de l'enregistrement ${depuis}.`);
console.log('Le module en garde 1798, un toutes les 30 minutes : comptez plusieurs minutes.');
let f = journal(nom, `# releve du ${horodate()} sur ${dev}\n`);
f = journal(nom, await commande(l, 'info', 8000));
for (let i = depuis; i < 1800; i += 15) {
const txt = await commande(l, `datalist history dtls ${i}`, 20000);
journal(nom, txt);
if (!/\d{2}-\d{2}-\d{2}/.test(txt)) break;
process.stdout.write(`\r enregistrement ${i}... `);
}
console.log(`\nEcrit dans ${f}`);
const f = journal(nom, `# releve du ${horodate()} sur ${dev}\n`);
journal(nom, await commande(l, 'info', 8000));
// UNE seule commande suffit : le module pagine lui-meme jusqu'au dernier
// enregistrement, `commande` tourne les pages. Boucler sur des index
// croissants relancait le meme vidage complet a chaque fois.
const txt = await commande(l, `datalist history dtls ${depuis}`, 30000);
journal(nom, txt);
const n = (txt.match(/^\d+ +\d\d-\d\d-\d\d /gm) || []).length;
console.log(`${n} enregistrements ecrits dans ${f}`);
return;
}