Daly BMS: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) |
||
| Строка 104: | Строка 104: | ||
| − | =<code> |
+ | =<code>collect_batt_status.sh</code>= |
| + | Запускаю из крона (<code>/etc/cron.d/batt_dale_status</code>): |
||
| + | <PRE> |
||
| + | */3 * * * * root /etc/nut/collect_batt_status.sh |
||
| + | </PRE> |
||
| + | Конечный результат в файле <code>/var/lib/snmp/daly.json</code> (который разбираем для SNMP) |
||
| + | <PRE> |
||
| + | #!/usr/bin/env bash |
||
| + | |||
| + | |||
| + | DEV="/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A5XK3RJT-if00-port0" |
||
| + | |||
| + | sudo -u nut \ |
||
| + | /usr/local/virtualenvs/daly-bms-cli/bin/python3 \ |
||
| + | /usr/local/virtualenvs/daly-bms-cli/bin/daly-bms-cli -d ${DEV} --all > /tmp/daly.json 2>>/var/lib/snmp/daly.err && \ |
||
| + | mv /tmp/daly.json /var/lib/snmp/daly.json |
||
| + | |||
| + | </PRE> |
||
| + | Пример результата |
||
| + | <PRE> |
||
| + | { |
||
| + | "soc": { |
||
| + | "total_voltage": 56.1, |
||
| + | "current": 0.6, |
||
| + | "soc_percent": 94.1 |
||
| + | }, |
||
| + | "cell_voltage_range": { |
||
| + | "highest_voltage": 3.592, |
||
| + | "highest_cell": 9, |
||
| + | "lowest_voltage": 3.409, |
||
| + | "lowest_cell": 15 |
||
| + | }, |
||
| + | "temperature_range": { |
||
| + | "highest_temperature": 24, |
||
| + | "highest_sensor": 1, |
||
| + | "lowest_temperature": 24, |
||
| + | "lowest_sensor": 1 |
||
| + | }, |
||
| + | "mosfet_status": { |
||
| + | "mode": "stationary", |
||
| + | "charging_mosfet": true, |
||
| + | "discharging_mosfet": true, |
||
| + | "capacity_ah": 263.48 |
||
| + | }, |
||
| + | "status": { |
||
| + | "cells": 16, |
||
| + | "temperature_sensors": 2, |
||
| + | "charger_running": false, |
||
| + | "load_running": false, |
||
| + | "states": { |
||
| + | "DI1": false |
||
| + | }, |
||
| + | "cycles": 3 |
||
| + | }, |
||
| + | "cell_voltages": { |
||
| + | "1": 3.487, |
||
| + | "2": 3.525, |
||
| + | "3": 3.475, |
||
| + | "4": 3.482, |
||
| + | "5": 3.539, |
||
| + | "6": 3.363, |
||
| + | "7": 3.526, |
||
| + | "8": 3.559, |
||
| + | "9": 3.592, |
||
| + | "10": 3.498, |
||
| + | "11": 3.512, |
||
| + | "12": 3.516, |
||
| + | "13": 3.46, |
||
| + | "14": 3.478, |
||
| + | "15": 3.409, |
||
| + | "16": 3.531 |
||
| + | }, |
||
| + | "temperatures": { |
||
| + | "1": 24, |
||
| + | "2": 24 |
||
| + | }, |
||
| + | "balancing_status": { |
||
| + | "error": "not implemented" |
||
| + | }, |
||
| + | "errors": [ |
||
| + | "one stage warning of unit over voltage" |
||
| + | ] |
||
| + | } |
||
| + | </PRE> |
||
| + | =<code>batt-dale-snmp.py</code>= |
||
{{#spoiler:show=batt-dale-snmp.py| |
{{#spoiler:show=batt-dale-snmp.py| |
||
Версия 17:48, 15 января 2026
Daly BMS
Идея а том что бы снимать данные и складывать в заббикс
- дернуть скрипт кроном раз в минуту
batt-dale-snmp.py, результат работы сохранить в файл (/var/lib/snmp/daly.json) - отдать результат через
SNMP pass
Прежде чем начать
У меня сгорел "родной" переходник на котором был распаян разъем (фото нет, и я не знаю как он называется - и нигде не смог найти такой!)
Для замены использовал такой переходник:
|
У меня напряжение было 3.3В на пинах RX/TX со стороны BMC - отсюда я сделал вывод что надо переключить UART-конвертер в 3.3V (джампер) |
Dalybms на python.
В консоли устанавливаем python-pip
sudo apt install python3-pip
Далее создать virtualenv и устанавливаем dalybms
pip3 install dalybms
для работы с uat портом и mqtt сервером ставим соответствующие пакеты
pip3 install pyserial
Модуль для MQTT по желанию (мне не был нужен)
pip3 install paho-mqtt
необходимо так же установить mqtt сервер если он ещё не установлен и нужен <ЗКУ> sudo apt install mosquitto
на этом установка завершена подключаем нашу BMS к uart порту либо через usb-uart адаптер либо через uart разъем на одноплатнике (необходимо включить порт в настройках), далее будет рассмотрено подключение через usb-uart Подключаем следующим образом:
BMS — UART GND — GND RX — TX TX — RX
После подключения usb-uart адаптера смотрим имя адаптера введя команду
ls -n /dev/ttyU*
должен показать устройства
crw-rw—- 1 0 20 188, 0 Feb 24 21:12 /dev/ttyUSB0 crw-rw—-+ 1 0 20 188, 0 Feb 24 19:57 /dev/ttyUSB1
где /dev/ttyUSB0 и /dev/ttyUSB1 это наши USB устройства, у меня их 2 и с этим могут быть проблемы поскольку при перезагрузки они могут иметь имена наоборот и после перезагрузки устройства не будут работать. Для того чтобы это исключить мы будем обращаться к устройства по ID, получаем id наших устройств, вводим команду:
ls -n /dev/serial/by-id/*
получаем список
lrwxrwxrwx 1 0 0 13 Sep 8 09:58 /dev/serial/by-id/usb-ITead_Sonoff_Zigbee_3.0_USB_Dongle_Plus_12967c31b312ec11b6da21c7bd930c07-if00-port0 -> ../../ttyUSB0 lrwxrwxrwx 1 0 0 13 Feb 24 22:18 /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0 -> ../../ttyUSB1
ls -n /dev/serial/by-id/* lrwxrwxrwx 1 0 0 13 Jan 12 15:29 /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A5XK3RJT-if00-port0 -> ../../ttyUSB0
синим это наши устройства, в дальнейшем в конфигах и командах можно использовать как /dev/ttyUSB0 так и полный путь к id устройству. У меня как видно Sonoff Zigbee USB стик и USB-UART адаптер на чипе CP2102 (USB-UART адаптеры бывают на разных чипах) Теперь проверим соединение с нашей BMS.
daly-bms-cli -d /dev/ttyUSB0 --all
или можно по id,
daly-bms-cli -d /dev/serial/by-id/usb-Silicon_Labs_CP2102_USB_to_UART_Bridge_Controller_0001-if00-port0 --all
мы получим все параметры. Если данные не получены то возможно Ваша BMS сделана на другом чипе, для этого надо добавить флаг —sinowealth
daly-bms-cli -d /dev/ttyUSB0 --all --sinowealth
Теперь есть несколько вариантов просмотра данных, не зависимо от того какую систему домашней автоматизации Вы используете мы будем передавать данные в систему домашней автоматизации по популярному протоколу mqtt, команда которую мы написали выше будет иметь вид:
daly-bms-cli -d /dev/ttyUSB0 --all --mqtt
collect_batt_status.sh
Запускаю из крона (/etc/cron.d/batt_dale_status):
*/3 * * * * root /etc/nut/collect_batt_status.sh
Конечный результат в файле /var/lib/snmp/daly.json (который разбираем для SNMP)
#!/usr/bin/env bash
DEV="/dev/serial/by-id/usb-FTDI_FT232R_USB_UART_A5XK3RJT-if00-port0"
sudo -u nut \
/usr/local/virtualenvs/daly-bms-cli/bin/python3 \
/usr/local/virtualenvs/daly-bms-cli/bin/daly-bms-cli -d ${DEV} --all > /tmp/daly.json 2>>/var/lib/snmp/daly.err && \
mv /tmp/daly.json /var/lib/snmp/daly.json
Пример результата
{
"soc": {
"total_voltage": 56.1,
"current": 0.6,
"soc_percent": 94.1
},
"cell_voltage_range": {
"highest_voltage": 3.592,
"highest_cell": 9,
"lowest_voltage": 3.409,
"lowest_cell": 15
},
"temperature_range": {
"highest_temperature": 24,
"highest_sensor": 1,
"lowest_temperature": 24,
"lowest_sensor": 1
},
"mosfet_status": {
"mode": "stationary",
"charging_mosfet": true,
"discharging_mosfet": true,
"capacity_ah": 263.48
},
"status": {
"cells": 16,
"temperature_sensors": 2,
"charger_running": false,
"load_running": false,
"states": {
"DI1": false
},
"cycles": 3
},
"cell_voltages": {
"1": 3.487,
"2": 3.525,
"3": 3.475,
"4": 3.482,
"5": 3.539,
"6": 3.363,
"7": 3.526,
"8": 3.559,
"9": 3.592,
"10": 3.498,
"11": 3.512,
"12": 3.516,
"13": 3.46,
"14": 3.478,
"15": 3.409,
"16": 3.531
},
"temperatures": {
"1": 24,
"2": 24
},
"balancing_status": {
"error": "not implemented"
},
"errors": [
"one stage warning of unit over voltage"
]
}