Авторизация
Регистрация

Напомнить пароль

Инвертор солнечный ANENJI 4200 Вт 24 В (ИБП + BMS + HA + AZE0)

  1. Цена: 16 708  ₽
  2. Перейти в магазин
Этот инвертор уже обозревался тут раньше. В рамках обзора мы сделаем из него почти полноценный ИБП, подключим к Home Assistant и NUT, пустим в дело ячейки от Nissan Leaf, и внедрим в него soft start, исправив тем самым закладку изготовителя, которая похоже часто приводит к выгоранию силовых ключей. Солнечные панели к нему подключаться не будут.

Преамбула:

Обзор посвящен именно инвертору, его применению и использованию для решения реальной инженерной задачи, остальные элементы системы не планировалось обозревать, но без них он теряет смысл, поэтому намеренно не разделил на несколько обзоров.

До его покупки для питания ответственных потребителей на даче (котел, насосы, интернет, автоматика, пара серверов) использовался APC smart-UPS 2200XL с 4-мя 12V 75Ач Ca/Ca, с внешним балансировщиком. Один АКБ умер, второй был поменян по гарантии год назад и существенно отличается от двух оставшихся, остаточная емкость которых была уже 12Ач. Было решено перейти с 48В с на 24В, заодно перейти на Li-ion б/у ячеек от Nissan Leaf. КПД старой схемы по ощущениям не поднималось выше 50%, даже с новыми АКБ больше 3:30 добиться не удавалось. На 48В не свинцовые АКБ — это очень дорого + старый ИБП не умеет ничего кроме свинца, доработать его в лоб вряд ли бы удалось, можно сместить калибровку, но профиль заряда не изменить.
Этот инвертор посовременнее, изначально умеет в разные АКБ и КПД за счет современной элементной базы должно быть существенно выше. По итогам тестирования конструкция проработала более 7ч, но в тот момент SOC был не откалиброван и котел включался редко, тем не менее этот результат меня устраивает полностью, цена за все вместе около 45 000р.
Перед инвертором у меня стоит реле выбора фаз с ограничением по напряжению сверху и снизу, т.е. в этой части замена скомпенсирована.
Эта статья — попытка зафиксировать весь процесс в одном месте. Замечания и комментарии приветствуются.

Soft start

На озоне был найден вот такой интересный отзыв, который сразу же был проверен, для истории сохраним его тут и поблагодарим уважаемого Алексея за столь ценную информацию:

Далее схема будет использована из этого отзыва.
Мы никому не верим, поэтому сначала проверим, что инвертор действительно ведет себя именно так (тестер подключен к высоковольтному конденсатору на плате, их там два, но они запаралелены, в нагрузке — строительный фен). В видео оговорился, не 48В, а 24В конечно же.

После того, как убедились — пришли к выводу, что явно нужно дорабатывать.
Для этого так же будем использовать схему Алексея с озона:

Собрали «как смогли», подпаяли по инструкции выше, получили +- то, что ожидали )
После проверки — в два слоя термоусадки и приклеить к корпусу или плате.


После этого инвертор при старте ведет себя уже приличнее и предварительно заряжает конденсаторы до 240В, выходные ключи должны нам сказать спасибо за это.


Часть вторая, сборка батареи и BMS


Изначально я ориентировался на готовые аккумуляторные сборки LiFePO4 24В 105Ач на озоне, но пока думал они подорожали с 24к до 36к. Выбор стал очевиден, будем брать Li-ion от бу ячеек Nissan Leaf. Было заказано 12 ячеек с остаточной емкостью около 35Ач на авито у уважаемого Алексея из Астрахани (искать по словам: AZE0, консервы, Nissan Leaf ввб). Аккумуляторы были отлично упакованы и доставлены транспортной компанией.
Будем собирать 7s3p схему. В каждой банке 2 соединенных последовательно аккумулятора. Для 24В нам нужно 7 аккумуляторов, а купили мы по факту чуть больше, 3 аккумулятора останутся не востребованными. Можно было купить 11 банок, одну вскрыть, распилить шины и соединить в ней аккумуляторы параллельно, тогда бы лишним был один элемент. Я решил таким не заниматься и у меня не использованы 3 элемента, возможно потом они нам пригодятся для замены уставших.

Так же отдельно был приобретен BMS с активной балансировкой — JIKONG JK-B2A8S20P BMS 4S-8S 200A 2A. Он был выбран из-за достойного тока балансировки в 2А. 200А мы конечно через него прокачивать не будем, но запас карман не тянет. И к нему же был куплен экранчик, просто для красоты — 3,2' LCD JIKONG Smart, подключается вместо штатной кнопки BMS.
Для датчиков температуры от BMS в задней части банок есть отверстие, датчики были установлены в середину каждой из стопок.
Подключение к АКБ, т.к. сборка 7S, а BMS на 8s, то контакт B8 не подключаем:
Для сборки батареи нам понадобится:
НаименованиеКоличествоНазначение
Наконечник кольцевой неизолированный 6,0мм, DJ431-6A.B.C.D8шт.Подключение BMS
Кабельный наконечник медный луженый JG-10 (10-6-5), ТМЛ8штПодключение силовых цепей
Наконечник 10 мм2 двойной НШВИ-24штПодключение силовых цепей к инвертору
Автомат С80А EKF PROxima ВА 47-1001штДоп защита от КЗ
Провод ПуВ нг(А)-LS, 1х10мм2Подключение силовых цепей, учитывать, что в двое.
Шайба М6 кузовная усиленная24штПодключение крайних клемм ячейки
Винт М6х1224штПодключение крайних клемм ячейки
Шайба М4 кузовная усиленная12штПодключение центральных клемм ячейки
Винт М4х1212штПодключение центральных клемм ячейки
Медная шина М1 3х15мм1.5мсоединение ячеек
Шпилька М8стягивание ячеек между собой
Шайба М816штстягивание ячеек между собой
Гайка М816штстягивание ячеек между собой

Немного сверления, матов, болгарки, кривых рук и мы собрали нашего франкенштейна:

При сборке учитывать, что банки могут иметь + как слева, так и справа. Либо уточнять при заказе, либо переворачивать. При переворачивании учесть, что длина шин может измениться.
К корпусу BMS приклеены пластиковые проставки, что бы исключить касание клеммами корпуса банок.

Часть третья, ESP-home всему голова


Цели:
  • Поддержка Network UPS Tools (NUT) или APC UPS Daemon (apcupsd) для штатной работы с серверами;
  • Сухие контакты, для отдачи в контроллер котла сигнала о переходе на батареи. Для дублирования этого сигнала через смс и звонок (ранее AP9619 отдавала этот сигнал);
  • Ethernet (он уже там есть, т.к. AP9619 ее использовала);
  • Интеграция метрик BMS и инвертора в home-assistant.

Теоретически возможно подключение BMS напрямую к инвертору через RS485, но по факту нам это ничего не даст, это дает возможность получать настройки граничных напряжений и реальный SOC из BMS в инвертор и ВСЁ, а свободный порт займет. Управлять настройками и снимать телеметрию с BMS это нам не поможет.
Поэтому к инвертору мы подключимся по RS485, а к BMS по Bluetooth (на самом деле можно и через uart, но лишний изолятор в виде воздуха никогда не помещает).

Уже есть некоторое количество проектов, в которые занимались похожим и откуда мы почерпнули информацию:
github.com/jul-ienfr/esphome-anenji-4.2kw-wifi
github.com/janas-karol/esphome-anenji-6.2kw/
github.com/psalkiewicz/esphome-2026-anenji4200/
github.com/syssi/esphome-jk-bms

Так же магазин нам подкинул некоторое количество документации:
1. Modbus-регистры.
2. Инструкция.

Использовать будем готовую плату KC868-A2 В ней из коробки есть все, что нам нужно: RS485, реле, LAN. Кстати платка сама весьма интересная, в нее можно еще и SIM800 воткнуть.
В перечисленных выше проектах выбрасывали штатную плату управления по wifi из инвертора, либо выпаивали ESP из нее. Мы оставим ее на месте, инвертор отлично отвечает по ModBUS с внешнего разъема, но изменим адрес в настройках, что бы штатная управлялка не смогла ничего сделать.

Но все таки, раз мы залезли в инвертор, то грех не вывести 5в на существующий разъем RJ45, что бы наш внешний контроллер питался изнутри инвертора.
Питание возьмем с 5-ти контактного разъема платы управления (RS-232):
PinDescription
1TX (3.3V TTL level)
2RX (3.3V TTL level)
3+5V VCC
4GND
5Unknown (3.3V TTL level)

и приведем его на RJ45 c RS485:
PinDescription
1B (+)
2A (-)
3Пусто
4+5V
5GND
6Пусто
7A (-)
8B (+)

Выводы 4 и 5 никуда не были подключены. Теперь у нас инвертор подключается одним шнурком.

Сборка и прошивка ESP для ESP-home описано многократно и повторяться не будем. Я это делал в Addon ESPHome Device Builder внутри Home Assistant.
в конфиге ESP для работы нужно изменить (если использовать эту плату):
  • MAC-адрес BT BMS;
  • IP-адрес NTP сервера;
  • пароль для OTA обновлений;
  • name — с него будут начинаться названия параметров инвертора;
  • nameBT — с него будут начинаться названия параметров BT BMS;
  • ModBUS адрес инвертора (у меня 2);
В самом инверторе через меню изменить Modbus-адрес, это пункт 25.

По факту конфиг собирает все из нужных репозиториев в одном месте и реализует две доработки:
  • Второе реле включено (UPS Grid Power Relay), когда питание от сети;
  • Расчет остатка времени работы (UPS estimated runtime) исходя из нагрузки и BMS capacity remaining, вне разряда выдается — «Charging»

Часть четвертая, настройка


Первичный запуск и настройку выполняют с выключенным автоматом. Только после выставления уровней напряжений в обоих устройствах автомат включают.
Мы будем использовать нашу батарею в щадящем режиме, от 3.2 до 4.0В, с током зарядки — 30А Это всего 60% от общей емкости батареи, но есть надежда, что при таких значения мы значительно продлим ее срок службы в буферном режиме (фактически по Кулонометру BMS зарядили на 60Ач из 105Ач при текущих настройках).
Для корректного расчета емкости и остатков нужно прогнать полный разряд и заряд после настройки.
Некоторые настроечные значения BMS взаимосвязаны и могут меняться только парами. ESP не видит ошибки при их установке, я первичную настройку делал через родное приложение — JK BMS, рекомендую поступить так же.
Ниже приведенные значения, это мой взгляд и опыт, в них могут быть ошибки или нестыковки. С удовольствием пройдусь по замечаниям, если они будут.
Привожу только фактически измененные значения, а не все (их очень много).
ПараметрТекущееЕд. изм.
UPS battery discharge recovery point24.0V
UPS battery equalization time0min
UPS battery low voltage protection22.4V
UPS battery low voltage protection (rec)22.3V
UPS battery overvoltage protection29.0V
UPS floating charging voltage28.0V
UPS Low DC cut-off SOC3%
UPS max charging voltage28.0V
UPS maximum charging current30.0A
UPS maximum mains charging current30.0A
UPS output frequency setting50.00Hz
UPS output voltage230.0V
BMS balance trigger voltage0.010V
BMS balancing start voltage3.90V
BMS cell count7шт
BMS cell request charge voltage4.110V
BMS cell request charge voltage time0.5h
BMS cell request float voltage4.100V
BMS cell request float voltage time5.0h
BMS cell soc0 voltage3.200V
BMS cell soc100 voltage4.001V
BMS cell voltage overvoltage protection4.200V
BMS cell voltage overvoltage recovery4.000V
BMS cell voltage undervoltage protection3.000V
BMS cell voltage undervoltage recovery3.210V
BMS charge overcurrent protection60A / s
BMS charge overtemperature protection50.0°C
BMS charge overtemperature recovery40.0°C
BMS max balance current2.0A
BMS max charge current50.0A
BMS max discharge current100.0A
BMS power off voltage2.80V
BMS total battery capacity95Ah

ПараметрЗначение
UPS battery charging priorityPV is at the same level as the Utility
UPS battery typeLib (Литиевый без связи)
UPS buzzer modeBeep on warnings and faults
UPS input voltage rangeNarrow range (Узкий диапазон)
UPS lcd backlightTimed off (Автоотключение)
UPS output modeSingle (Однофазный)
UPS output priorityUtility-PV-Battery(UTI)
UPS turn on modeLocal and remotely turn-on allowed


Часть пятая, NUT


У меня еще есть proxmox на даче с несколькими ВМ и неплохо бы его выключать до того, как батарейка сядет полностью. Будем это делать через NUT используя скрипт, который опрашивает ESP.
Для определения низкого уровня заряда будем использовать предупреждение самого инвертора в переменной UPS warning, оно появляется где-то на уровне 23,4В при напряжении отключения инвертора 22,4В, это с запасом. В NUT еще будем отдавать SOC BMS и уже настроенную логику для UPS Grid Power Relay будем использовать как фактор перехода на батарею.

Все действия выполняются под root на сервере proxmox.
Сначала нужные пакеты
apt install nut jq
Скрипт опроса ESP
vi /usr/local/bin/esp-ups-monitor.sh
#!/bin/bash
ESP_IP="192.168.35.169" ###ИСПРАВИТЬ АДРЕС на СВОЙ

# Функция: получение поля "state" через jq
get_state() {
  curl -s --max-time 2 "$1" | jq -r '.state'
}

# 1. Состояние реле: "ON" или "OFF"
RELAY_STATE=$(get_state "http://${ESP_IP}/switch/UPS%20Grid%20Power%20Relay")

# 2. Строка предупреждений (например, "Reserve;PV low voltage;Battery low voltage")
WARNING_STATE=$(get_state "http://${ESP_IP}/text_sensor/UPS%20warning")

# 3. Заряд батареи: приходит как "100 %", извлекаем только цифры
SOC_RAW=$(get_state "http://${ESP_IP}/sensor/BMS%20state%20of%20charge")
SOC=$(echo "$SOC_RAW" | grep -o '[0-9]\+')

# Защита от сбоя сети: если реле не ответило, выходим без изменения статуса
if [[ -z "$RELAY_STATE" || "$RELAY_STATE" == "null" || "$RELAY_STATE" == "unknown" ]]; then
  exit 0
fi

# Базовый статус: ON = OL (сеть), OFF = OB (батарея)
if [[ "$RELAY_STATE" == "ON" ]]; then
  STATUS="OL"
else
  STATUS="OB"
fi

# Добавляем флаг LB, если в предупреждениях есть "Battery low voltage"
if [[ "$WARNING_STATE" == *"Battery low voltage"* ]]; then
  STATUS="$STATUS LB"
fi

# Если заряд не распарсился, ставим безопасное значение
if [[ -z "$SOC" ]]; then
  SOC="50"
fi

# Обновляем файл драйвера dummy-ups
cat << EOF > /etc/nut/esp-ups.def
ups.status: ${STATUS}
battery.charge: ${SOC}
EOF

# ВАЖНО: Восстанавливаем права, чтобы драйвер nut мог читать файл
chown root:nut /etc/nut/esp-ups.def
chmod 640 /etc/nut/esp-ups.def

# Если статус OB LB — инициируем завершение работы
if [[ "$STATUS" == *"OB"* && "$STATUS" == *"LB"* ]]; then
  logger "NUT-MONITOR: Обнаружен статус OB LB (Battery low voltage). Инициация завершения работы (fsd)."
  /usr/sbin/upsmon -c fsd
fi

Скрипт завершения работы всех ВМ
vi /usr/local/bin/proxmox-safe-shutdown.sh
#!/bin/bash
logger "NUT: Инициировано безопасное завершение работы (Low Battery)"

# 1. Отправляем команду штатного завершения работы всем запущенным ВМ
for vmid in $(qm list | awk 'NR>1 {print $1}'); do
    if qm status $vmid | grep -q "running"; then
        logger "NUT: Отправка shutdown для ВМ $vmid"
        qm shutdown $vmid
    fi
done

# 2. Ожидание 60 секунд для корректного завершения гостевых ОС
sleep 60

# 3. Принудительная остановка ВМ, которые не ответили на ACPI shutdown
for vmid in $(qm list | awk 'NR>1 {print $1}'); do
    if qm status $vmid | grep -q "running"; then
        logger "NUT: Принудительная остановка (qm stop) для ВМ $vmid"
        qm stop $vmid
    fi
done

# 4. Выключение самого хоста Proxmox
logger "NUT: Выключение хоста Proxmox"
/sbin/shutdown -h now
Дать права на запуск
chmod +x /usr/local/bin/esp-ups-monitor.sh
 chmod +x /usr/local/bin/proxmox-safe-shutdown.sh
Создать пользователя для управления (в последствии под ним же подключаться с других машин к этому экземпляру NUT):
/etc/nut/upsd.users
[upsmonitor]
# Пароль пользователя
password = UPSPASS
# Права пользователя на выполение системных действий, то есть выключения и т.д.
actions = SET
# Права на изменение доступных переменных ИБП с помощью команды upscmd
instcmds = ALL
# Использование этого пользователя как управляющего для NUT
upsmon master
Настроить сервис мониторинга (дописать в него):
vi /etc/nut/upsmon.conf
LOWBATT 0 ##по факту не отслеживать SOC
MONITOR esp_solar@localhost 1 upsmonitor UPSPASS master
POWERDOWNFLAG /etc/killpower
SHUTDOWNCMD "/usr/local/bin/proxmox-safe-shutdown.sh"
Настроить сам виртуальный UPS
vi /etc/nut/ups.conf
[esp_solar]
driver = dummy-ups
port = /etc/nut/esp-ups.def
desc = "ESPHome Solar Inverter Anenji"
Включить листенер на внешнем порту, для подключения других серверов:
vi /etc/nut/upsd.conf
LISTEN 0.0.0.0 3493
выполнить скрипт опроса ESP и убедиться, что он работает:
/usr/local/bin/esp-ups-monitor.sh

cat /etc/nut/esp-ups.def
ups.status: OL #вот тут будет OB если скрипт с ошибкой
battery.charge: 100 # вот тут будет 50 если скрипт с ошибкой вместо реального значения
Если скрипт работает, то запускаем службы
systemctl enable nut-server nut-monitor nut-driver@esp_solar
systemctl restart nut-server nut-monitor nut-driver@esp_solar
Проверяем логи служб на отсутствие ошибок
journalctl -u nut-* -f
Добавляем задание на опрос ESP в крон:
echo "* * * * * root /usr/local/bin/esp-ups-monitor.sh >/dev/null 2>&1" > /etc/cron.d/esp-ups-monitor
Проверяем, что файлик раз в минуту обновляется:
ls -l /etc/nut/esp-ups.def
И саму работу NUT
upsc esp_solar@localhost
Init SSL without certificate database
battery.charge: 100
device.mfr: Dummy Manufacturer
device.model: Dummy UPS
device.type: ups
driver.debug: 0
driver.flag.allow_killpower: 0
driver.name: dummy-ups
driver.parameter.mode: dummy
driver.parameter.pollinterval: 2
driver.parameter.port: /etc/nut/esp-ups.def
driver.parameter.synchronous: auto
driver.state: quiet
driver.version: 2.8.1
driver.version.internal: 0.18
ups.mfr: Dummy Manufacturer
ups.model: Dummy UPS
ups.status: OL
По факту настройка выполнена, можно сделать эмуляцию low battery и проверить, что все корректно выключается. Для этого просто записать в наш файлик:
vi /etc/nut/esp-ups.def
ups.status: OB LB
battery.charge: 10

Home Assistant


Ну тут все просто до безобразия, т.к. фактически мы все необходимое уже сделали выше.
1. Подключаем ESP через штатную интеграцию ESP-Home;
2. Устанавливаем карточку для отображения параметров работы BMS через HACS или вручную из репозитория — github.com/Pho3niX90/jk-bms-card
и получаем вполне понятный и симпатичный интерфейс:
3. Настраиваем автоматизацию для оповещений. Мой вариант — прислать сообщение в телеграмм и проговорить голосом при переключении сеть/батарея и прислать только в телеграмм статус батареи раз в 15 мин и если она села, тригером для нее является все то же реле, что в случае с NUT.
В реальной жизни это дублируется входящим звонком от контроллера котла, к которому подключен сухой контакт нашего ESP.
alias: UPS.Unified
description: Объединенные оповещения ИБП (Сеть/ИБП/Статус/Низкий заряд)
triggers:
  - trigger: state
    id: grid_relay
    entity_id: switch.kotelnaia_anenji_4200w_ups_grid_power_relay
  - trigger: state
    id: warning_sensor
    entity_id: sensor.kotelnaia_anenji_4200w_ups_warning
  - trigger: time_pattern
    id: periodic_status
    minutes: /15
conditions:
  - condition: template
    value_template: |
      {% if trigger.id in ['periodic_status', 'warning_sensor'] %}
        {{ is_state('switch.kotelnaia_anenji_4200w_ups_grid_power_relay', 'off') }}
      {% else %}
        {{ true }}
      {% endif %}
actions:
  - action: notify.send_message
    target:
      device_id: fff200fc06caf9562323877c3432dedb
    data:
      title: |
        {% if trigger.id == 'grid_relay' %}
          {% if is_state('switch.kotelnaia_anenji_4200w_ups_grid_power_relay', 'on') %}Переход на питание от города.
          {% else %}Переход на питание от ИБП.
          {% endif %}
        {% else %}
          Питание от ИБП.
        {% endif %}
      message: >
        {% if trigger.id == 'warning_sensor' and 'Battery low voltage' in
        states('sensor.kotelnaia_anenji_4200w_ups_warning') %}НИЗКИЙ ЗАРЯД!!! {%
        endif %}Заряд АКБ: {{
        states('sensor.kotelnaia_anenji_4200w_bms_state_of_charge') }} %.
        Нагрузка: {{
        states('sensor.kotelnaia_anenji_4200w_ups_output_active_power') | float
        | round(0) }} Вт. Напряжение АКБ: {{
        states('sensor.kotelnaia_anenji_4200w_bms_total_voltage') | float |
        round(1) }} В. Ток АКБ: {{
        states('sensor.kotelnaia_anenji_4200w_bms_current') | float | round(1)
        }} А. {% set runtime =
        states('sensor.kotelnaia_anenji_4200w_ups_estimated_runtime') %} {% if
        runtime not in ['Charging', 'unknown', 'unavailable', 'none', ''] %}
        Оставшееся время: {{ runtime }}. {% endif %}
  - if:
      - condition: time
        after: '09:00:00'
        before: '23:00:00'
      - condition: trigger
        id:
          - grid_relay
    then:
      - choose:
          - conditions:
              - condition: and
                conditions:
                  - condition: switch.is_on
                    target:
                      entity_id: switch.kotelnaia_anenji_4200w_ups_grid_power_relay
                    options:
                      behavior: any
                      for: '00:00:00'
            sequence:
              - action: tts.google_translate_say
                metadata: {}
                data:
                  cache: false
                  entity_id: media_player.vlc_telnet
                  language: ru
                  message: Внимание! Переход на питание от города!
          - conditions:
              - condition: and
                conditions:
                  - condition: switch.is_off
                    target:
                      entity_id: switch.kotelnaia_anenji_4200w_ups_grid_power_relay
                    options:
                      behavior: any
                      for: '00:00:00'
            sequence:
              - action: tts.google_translate_say
                metadata: {}
                data:
                  cache: false
                  entity_id: media_player.vlc_telnet
                  language: ru
                  message: Внимание! Переход на питание от батарей!
mode: single


Ну вот и все, статья получилась весьма объемной, но я постарался рассказать про всю цепочку. Пока писал — пришла мысли, что в ESP-home нужна кнопка reboot, которая дернет выход на 30 сек. Иначе комп удаленно уже не включить, если он выключился по низкой батареи, а свет включили до полного отключения инвертора. ))
Планирую купить +1 Добавить в избранное
+10 +11
свернутьразвернуть
Комментарии (0)
RSS
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.