Daly BMS: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
Строка 104: Строка 104:
   
   
=<code>batt-dale-snmp.py</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

Прежде чем начать

У меня сгорел "родной" переходник на котором был распаян разъем (фото нет, и я не знаю как он называется - и нигде не смог найти такой!)
Для замены использовал такой переходник:
Daly BMS 1.JPG

Icon-caution.gif

У меня напряжение было 3.3В на пинах RX/TX со стороны BMC - отсюда я сделал вывод что надо переключить UART-конвертер в 3.3V (джампер)


Daly BMS 2.JPG

Фото BMS в шакальем качестве

Daly BMS 3.JPG

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"
  ]
}

batt-dale-snmp.py