Для початку треба було зїясувати, які данні взагалі-то може віддати Dyness b4850 по RS-485 і протоколу PYLON. Після невеликого гугління натрапив на цікавий проєкт:
https://github.com/Frankkkkk/python-pylontech. Автор стверджував, що йому вдалося витягнути багато цікавої інфи з акумів Pylontech, зокрема напруги по коміркам і SOC. Напруги по коміркам захотілося побачити і мені, особливо, щоб зрозуміти стан акума 2023 року випуску і розбаланс по коміркам.
До своєї батареї Dyness B3 підключив USB-RS485 адаптер на PIN1 та PIN3. Підняв лише DIP2, вимкнув BMS кнопкою SW, потім вимкнув-увімкнув батарею тумблером O/I.
Втикнув USB у Linux-хост, склонував
Frankkkkk/python-pylontech , додав найпростіший друк на stderr байтів, що передаються на порт та з порта - і майже досяг бажаних результатів:
>>> from pylontech import *
>>> pt=pylontech.Pylontech(serial_port='/dev/ttyUSB1', baudrate=9600)
>>> pt.get_values_single(2)
['write', b'~20024642E00202FD33\r']
['read', b'~20024600C06E00020F0D9F0D8A0D240D190D9E0D9E0D9F0D9E0D9E0D9D0D9D0D9E0D9D0D440D72050BA90BAB0BA90BA90BA90000CAA884D00284D00007E4CB\r']
Container(NumberOfModule=2, NumberOfCells=15,
CellVoltages=ListContainer([3.487, 3.466, 3.364, 3.353, 3.486, 3.486, 3.487, 3.486, 3.486, 3.485, 3.485, 3.486, 3.485, 3.396, 3.442]),
NumberOfTemperatures=5, AverageBMSTemperature=25.4, GroupedCellsTemperatures=ListContainer([25.6, 25.4, 25.4, 25.4]),
Current=0.0, Voltage=51.88, Power=0.0, CycleNumber=7, RemainingCapacity=34.0, TotalCapacity=34.0, TotalPower=0.0, StateOfCharge=1.0)
а оце команда з інвертора: '~20024661E00201FD33\r' (порт /dev/ttyUSB0 в моєму сценарії)
по-перше, трохи не ясно, чому інвертор виставляє номер модуля 01 (остання цифра перед контрольною сумою FD33)
по-друге, пітонівська бібліотека не розуміє відповідь Dyness B3 на запит get_values(), де номер модуля FF :
>>> pt.get_values()
['write', b'~20024642E002FFFD09\r']
['read', b'~20024600C06E00020F0D930D800D210D160D920D920D920D920D930D930D920D920D910D400D6B050BA90BAA0BA80BA80BA8FFFECA1284D00284D00007E555\r']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/home/mwg/python-pylontech/pylontech/pylontech.py", line 291, in get_values
d = self.get_values_fmt.parse(f.info[1:])
<<довгий стек в нетрях модуля construct >>>
File "/usr/lib/python3/dist-packages/construct/core.py", line 91, in stream_read
raise StreamError("stream read less than specified amount, expected %d, found %d" % (length, len(data)), path=path)
construct.core.StreamError: Error in path (parsing) -> Module -> NumberOfCells
stream read less than specified amount, expected 1, found 0
здається, це через NumberOfModule=2 у відповіді на .get_values_single(2)
як це чинити ? що батарея криво відповідає, що інвертор криво команди формує...