У нас меня есть старенький UPS APS ES-525. Цель - подключить этот ИБП к шлюзу МТС* и получать уведомления о статусе - отключение сети, напряжении сети, оценки времени работы UPS от аккумулятора и др.
На МТС установлен OpenWrt 24.10 / LuCI openwrt-24.10 и HOMEd.
UPS APS ES-525 имеет USB и шлюз МТС имеет USB, значит будем их дружить.
Надеюсь читатели имеют представление о том что такое шлюз МТС
Данное руководство не претендует на полноту описания и отсутствие досадных неточностей и ошибок. Автор категорически не предполагает введение в заблуждение читателей, если какие-либо неточности или очепятки присутствуют в тексте, то отнюдь не по злому мыслу. Прошу понять и простить, а по возможности, в корректной форме, указать на ошибки и/или дополнить материал
В OpenWrt устанавливаем NUT (Network UPS Tools). Для этого (через LuCI) устанавливаем nut, luci-app-nut, nut-web-cgi, nut-upsmon, nut-upscmd, nut-upsc, nut-server, nut-common и драйвер nut-driver-usbhid-ups (для других ИБП возможно понадобятся другие драйвера).
Устанавливаем usbutils.
Подключаем ИБП к USB разъему МТС.
Запускаем команду dmesg
Среди прочего, должны увидеть подобную строку, означающую что есть устройство на USB
usb 1-1: new low-speed USB device number 2 using ci_hdrc
Запускаем команду lsusb
, должны увидеть подобное:
Bus 001 Device 001: ID 1d6b:0002 Linux 6.6.73 ehci_hcd EHCI Host Controller
Bus 001 Device 002: ID 051d:0002 American Power Conversion Back-UPS ES 525 FW:851.t2.I USB FW:t2
Bus 002 Device 001: ID 1d6b:0002 Linux 6.6.73 ehci_hcd EHCI Host Controller
Сейчас нам важна 2-я строка и тут нам понадобятся Vendor ID (VID 051d) и Product ID (PID 0002).
Настраиваем NUT, для этого идем в LuCI

Вкладка NUT Server:

Тут создаем:
NUT Users
Username: homed
Password:
Allowed actions: Set variables
Role: Primary
Addresses on which to listen
IP Address: 127.0.0.1
Port: 3493
UPS Server Global Settings
RunAs User: nut
Driver Configuration
Description (Display): UPS APC 525
Driver: usbhid-ups
Port: auto
USB Product Id: 0002
USB Vendor Id: 051d
Сохраняем.
Для проверки смотрим файлы:
/etc/nut/ups.conf
# Config file automatically generated from UCI config
[ups]
desc = UPS APC 525
driver = usbhid-ups
port = auto
productid = 0002
vendorid = 051d
/etc/nut/upsd.conf
# Config file automatically generated from UCI config
LISTEN 127.0.0.1 3493
STATEPATH /var/run/nut
/etc/nut/upsd.users
# Config file automatically generated from UCI config
[homed]
password =
actions = set
actions = fsd
upsmon master
Далее идем во вкладку NUT Monitor
Global Settings
RunAs User: nut
Если будем отсылать данные в mqtt (см.ниже), то устанавливаем следующее:
Notify command: /etc/nut/ups_mqtt.sh
Notification defaults: Execute notify command
Notify when back online: Execute notify command
Notify when on battery: Execute notify command
UPS Primary
Name of UPS: ups
Hostname or address of UPS: 127.0.0.1
Port: 3493
Username: homed
Password:
Далее идем во вкладку NUT CGI
Host
UPS name: ups
Hostname or address of UPS: 127.0.0.1
Port: 3493
Display name: UPS
Control UPS via CGI
Enable
Проверим файл upsmon.conf
Должны присутствовать строки:
RUN_AS_USER nut
SHUTDOWNCMD "/usr/sbin/nutshutdown"
NOTIFYCMD "/etc/nut/ups_mqtt.sh"
NOTIFYFLAG ONLINE EXEC
NOTIFYFLAG ONBATT EXEC
NOTIFYFLAG LOWBATT EXEC
MONITOR ups@127.0.0.1:3493 1 homed homed master
На всякий случай перезапускаем службы:
nut-server, nut-monitor, nut-cgi
Проверяем
В терминале
upscmd -l ups
Должно вывести список поддерживаемых команд
upsc ups
выведет известные параметры ИБП с именем ups
В NUT CGI идем по ссылке Go to NUT CGI



Если видим подобное, значит МТС подключилась к ИБП и мы можем двигаться дальше.
Итак, мы хотим передавать статусы ИБП и их изменения в HOMEd
Создаем файл (помните мы указывали его в NUT Monitor?) и задаем права на исполнение.
/etc/nut/ups_mqtt.sh
#!/bin/sh
# Параметры MQTT
# MQTT_HOST="192.168.1.100" # Адрес MQTT-брокера
MQTT_TOPIC="ups" # Топик для публикации
MQTT_USER="" # Логин (если требуется)
MQTT_PASS="" # Пароль (если требуется)
# Получаем статусы UPS
UPS_STATUS=$(upsc ups ups.status)
CHARGE=$(upsc ups battery.charge)
RUNTIME=$(upsc ups battery.runtime)
LOAD=$(upsc ups ups.load)
INVOLTAGE=$(upsc ups input.voltage)
# Формируем JSON-сообщение
PAYLOAD="{\"status\": \"$UPS_STATUS\", \"charge\": \"$CHARGE\", \"runtime\": \"$((RUNTIME / 60))\", \"load\": \"$LOAD\", \"involtage\": \"$INVOLTAGE\" }"
# Отправляем в MQTT
mosquitto_pub -t "$MQTT_TOPIC" -m "$PAYLOAD" -r -u "homed" -P "homed" &
Тут мы получаем и передаем статус ИБП, процент заряда батареи ИБП, ожидаемое время работы от аккумулятора, входное (сетевое) АС напряжение, нагрузка на ИБП (в % от максимальной мощности ИБП). Так же можно получать/передавать напряжение на АКБ, номинальное напряжение АКБ, выходное АС напряжение, минимальный заряд АКБ и пр.
Статусы ИБП могут быть:
OL - OnLine (Питание от сети АС, АКБ заряжена)
OB DSCHRG - OnBattery Discharge (Нет АС питания, разряд АКБ)
OL CHRG - OnLine Charge (Питание от сети АС, заряд АКБ)
В HOMEd создаем Custom устройство ups
Name: ups
ID: ups
EXPOSES: upsstatus, charge, runtime, load, involtage
Bindings (JSON object):
{
"charge": {
"inPattern": "{{ json.charge }}",
"inTopic": "ups"
},
"involtage": {
"inPattern": "{{ json.involtage }}",
"inTopic": "ups"
},
"load": {
"inPattern": "{{ json.load }}",
"inTopic": "ups"
},
"runtime": {
"inPattern": "{{ json.runtime }}",
"inTopic": "ups"
},
"upsstatus": {
"inPattern": "{{ json.status }}",
"inTopic": "ups"
}
}
Галочки: Real, Active
Теперь, если изменился статус ИБП, то NUT передаст оповещение и поменяются свойства у кастомного устройства ups.
Чтобы увидеть эти изменения свойств - создадим Автоматизацию, в которой по изменению статусов будут отправляться сообщения в Телеграм.
Сообщения в Телеграм:

Чтобы не только видеть изменения статуса, но и логгировать параметры - добавим в автоматизацию периодический запуск скрипта ups_mqtt.sh
Графики рекродера
