Network UPS Tools. Мониторинг и управление ИБП
Network UPS Tools — это комплекс программ мониторинга и управления различными блоками бесперебойного питания.
Для мониторинга или управления ИБП необходимо ИБП подключить к ПК или к серверу, т.е подключить к чему либо, что будет выступать сервером для ИБП. У меня ИБП подключен к NAS Synology, а шлюз является клиентом. Шлюз благодаря интеграции Network UPS Tools получает данные от сервера сетевого ИБП, а благодаря пакету NUT
посылает команды для управления ИБП.
Важно! Ваш ИБП должен поддерживать Network UPS Tools. Список доступных ИБП можно посмотреть здесь или на портале Synology
NAS Synology
Включим сервер сетевого ИБП
Указываем IP адреса, которым будет разрешен доступ к ИБП
Добавим учетную запись в upsd.users для доступа к серверу сетевого ИБП
Подключаемся к NAS Synology через консоль и открываем upsd.users
расположенный /usr/syno/etc/ups/upsd.users
Добавим в самый низ строки c полным доступом и управлением(админские права) и укажем upsmon slave
как дополнительное подключение, так как основное(master) подключение уже наcтроено по умолчанию.
[hassmon]
password = 12345678 # Указываем любой пароль
actions = set # Разрешаем менять параметры ИБП
actions = fsd # Разрешаем включать Forced Shotdown
instcmds = all # Разрешаем отправлять команды для управления ИБП
upsmon slave # Включаем дополнительное подключение
Перезапустим службу сервера сетевого ИБП
- Вариант 1: Запускаем команду через консоль для перезапуска службы Network UPS Tools
synoservice --restart ups-usb
- Вариант 2: Просто снимите галочку и нажмите применить, а после поставьте галочку и еще раз применить. На этом все. Осталось проверить доступ с консоли на шлюзе.
На шлюзе ставим пакеты через LuCI
- nut
- nut-upsc
- nut-upscmd
Команды для управления ИБП
Важно! На вашем ИБП список команд может отличаться от предоставленного списка
load.off
- Turn off the load immediatelyload.on
- Turn on the load immediatelyload.off.delay
- Turn off the load possibly after a delayload.on.delay
- Turn on the load possibly after a delayshutdown.return
- Turn off the load possibly after a delay and return when power is backshutdown.stayoff
- Turn off the load possibly after a delay and remain off even if power returnsshutdown.stop
- Stop a shutdown in progressshutdown.reboot
- Shut down the load briefly while rebooting the UPSshutdown.reboot.graceful
- After a delay, shut down the load briefly while rebooting the UPStest.panel.start
- Start testing the UPS paneltest.panel.stop
- Stop a UPS panel testtest.failure.start
- Start a simulated power failuretest.failure.stop
- Stop simulating a power failuretest.battery.start
- Start a battery testtest.battery.start.quick
- Start a “quick” battery testtest.battery.start.deep
- Start a “deep” battery testtest.battery.stop
- Stop the battery testcalibrate.start
- Start runtime calibrationcalibrate.stop
- Stop runtime calibrationbeeper.disable
- Disable UPS beeper/buzzerbeeper.enable
- Enable UPS beeper/buzzerbeeper.mute
- Temporarily mute UPS beeper/buzzerbeeper.off
- Turn off UPS beeper/buzzerbeeper.on
- Turn on UPS beeper/buzzerbypass.start
- Put the UPS in bypass modebypass.stop
- Take the UPS out of bypass mode
Примеры для управления ИБП
Вывести список сенсоров ИБП
upsc ups@192.168.1.200
Вывести список поддерживаемых команд ИБП
upscmd -l ups@192.168.1.200:3493
Включить звуковое оповещение. Если успех, то получим статус OK
upscmd -u hassmon -p 12345678 ups@192.168.1.200:3493 beeper.enable
Выключить звуковое оповещение. Если успех, то получим статус OK
upscmd -u hassmon -p 12345678 ups@192.168.1.200:3493 beeper.disable
Проверить статус звукового сигнала
upsc ups@192.168.1.200 ups.beeper.status
Выключить ИБП. Выключенный ИБП не включится после подачи питания
upscmd -u hassmon -p 12345678 ups@192.168.1.200:3493 load.off
Выключить ИБП. Выключенный ИБП не включится после подачи питания
upscmd -u hassmon -p 12345678 ups@192.168.1.200:3493 shutdown.stayoff
Выключить ИБП. Выключенный ИБП включится после подачи питания
upscmd -u hassmon -p 12345678 ups@192.168.1.200:3493 shutdown.return
Установим интеграцию Network UPS Tools в Home Assistant
Важно!
- В OS Home Assistant отсутствует пакет NUT. Как его установить, читайте в самом низу
- Более подробно про установку недостающего компонента читаем здесь
1) Раскомментируем строку NUT в config_flows.py
, который находится по пути
/usr/lib/python3.9/site-packages/homeassistant-XXXX.XX.X-py3.9.egg/homeassistant/generated
2) Скопируем папку c интеграцией nut из архива в components
, которая находится по пути
/usr/lib/python3.9/site-packages/homeassistant-XXXX.XX.X-py3.9.egg/homeassistant/components
3) Установим требуемый пакет согласно файлу manifest.json
pip install pynut2==2.1.2
4) Перезагружаем шлюз, можно конечно перезагрузить Home Assistant, но я все же перезагружаю шлюз целиком, так точно интеграция прогружается в Home Assistant
reboot
5) Ставим интеграцию Network UPS Tools и указываем IP адрес к серверу ИБП. Логин и пароль можно не указывать и без него пускает, если не пустит, то указывайте ту УЗ, которую прописали в upsd.users
Создадим выключатели
Для выключателей будем использовать платформу Command line Switch.
Важно! Ниже полностью рабочий пример + я использовал условие последнее состояние второго выключателя, они как бы в перекрестных линиях находятся, т.е условие для выключателя Полный тест батареи смотрит на выключатель Быстрый тест батареи, а условие для выключателя Быстрый тест батареи смотрит на выключатель Полный тест батареи. Зачем я так сделал? Все дело в том, что статус ups.status один и он применим как для быстрого теста, так и для полного теста батареи, и когда включаем тест батареи, и не важно какой вариант, то оба выключателя будут включены, а с условием последнего состояния будет включен только тот выключатель, который мы включили первым. Также, строка command_timeout будет опрашивать статус у сервера сетевого ИБП и выставлять выключателю реальный статус
switch:
- platform: command_line
switches:
ups_beeper:
command_on: upscmd -u hassmon -p 12345678 ups@192.168.1.200:3493 beeper.enable
command_off: upscmd -u hassmon -p 12345678 ups@192.168.1.200:3493 beeper.disable
command_state: upsc ups@192.168.1.200 ups.beeper.status
command_timeout: 15
value_template: '{{ is_state("sensor.ups_beeper_status","enabled") }}'
friendly_name: 'Звуковое оповещение'
ups_test_battery_deep:
command_on: upscmd -u hassmon -p 12345678 ups@192.168.1.200:3493 test.battery.start.deep
command_off: upscmd -u hassmon -p 12345678 ups@192.168.1.200:3493 test.battery.stop
command_state: upsc ups@192.168.1.200 ups.status
command_timeout: 15
friendly_name: 'Полный тест батареи'
value_template: >
{% set test_result = is_state("sensor.ups_self_test_result","In progress") %}
{% set test_battery_quick = is_state("switch.ups_test_battery_quick", "off") and (now() - states.switch.ups_test_battery_quick.last_changed).seconds > 120 %}
{% if test_result and test_battery_quick %} True
{% else %} False
{% endif %}
ups_test_battery_quick:
command_on: upscmd -u hassmon -p 12345678 ups@192.168.1.200:3493 test.battery.start.quick
command_off: upscmd -u hassmon -p 12345678 ups@192.168.1.200:3493 test.battery.stop
command_state: upsc ups@192.168.1.200 ups.status
friendly_name: 'Быстрый тест батареи'
command_timeout: 15
value_template: >
{% set test_result = is_state("sensor.ups_self_test_result","In progress") %}
{% set test_battery_deep = is_state("switch.ups_test_battery_deep", "off") and (now() - states.switch.ups_test_battery_deep.last_changed).seconds > 120 %}
{% if test_result and test_battery_deep %} True
{% else %} False
{% endif %}
Создадим сенсоры
Важно! Данные сенсоры как дополнение и не являются обязательными, делаем на свое усмотрение
- Первый сенсор UPS Load Watts показывает нагрузку в ваттах, вместо %
- Второй сенсор создал с аттрибутом уровня заряда батареи, чтобы вывести в карточке как аттрибут, используя пользовательскую интеграцию Home Assistant. Multiple Entity Row
Для понимания о каком аттрибуте идет речь
- type: custom:fold-entity-row
head:
entity: sensor.ups_cyberpower_livingroom
name: ИБП
type: custom:multiple-entity-row
secondary_info:
attribute: Уровень заряда
name: Батарея
unit: '%'
Сами сенсоры
Важно! В строке
value_template: "{{ states('sensor.ups_load') | float(default=0) / 100 * 720 | round(0) }}"
есть цифра720
. Это цифра означает мощность вашего ИБП. Смотрите строкуups.realpower.nominal: 720
Узнать мощность ИБП можно командой
upsc ups@192.168.1.200 ups.realpower.nominal
Сверяйте показания сенсора нагрузки, например с программой WinNUT-Client. Скачать WinNUT-Client можно здесь
sensor:
- platform: template
sensors:
ups_load_watts:
friendly_name: UPS Load Watts
unit_of_measurement: "W"
value_template: "{{ states('sensor.ups_load') | float(default=0) / 100 * 720 | round(0) }}"
- platform: template
sensors:
ups_cyberpower_livingroom:
friendly_name: 'Гостиная: ИБП'
icon_template: mdi:battery
value_template: "{{ states('sensor.ups_status') }}"
attribute_templates:
Уровень заряда: "{{ states('sensor.ups_battery_charge') }}"
Создадим группу сенсоров
Это группа сенсоров будет применяться в карточке для ИБП, где достаточно тапнуть на иконку сенсоры и будет отображаться список сеноров ИБП, что очень удобно.
livingroom_ups:
name: "Гостиная: ИБП. Сенсоры"
icon: mdi:battery
all: false
entities:
- sensor.ups_battery_charge
- sensor.ups_status
- sensor.ups_beeper_status
- sensor.ups_load
- sensor.ups_load_watts
- sensor.ups_nominal_real_power
- sensor.ups_low_battery_setpoint
- sensor.ups_warning_battery_setpoint
- sensor.ups_input_voltage
- sensor.ups_output_voltage
- sensor.ups_low_voltage_transfer
- sensor.ups_high_voltage_transfer
- sensor.ups_battery_voltage
- sensor.ups_nominal_battery_voltage
- sensor.ups_nominal_input_voltage
- sensor.ups_ups_shutdown_delay
- sensor.ups_load_restart_delay
- sensor.ups_battery_runtime
- sensor.ups_self_test_result
- sensor.ups_low_battery_runtime
- sensor.ups_load_start_timer
- sensor.ups_load_shutdown_timer
- sensor.ups_battery_chemistry
- sensor.ups_status_data
- sensor.ups_battery_manuf_date
После создания выключателей и сенсоров, запускаем в Home Assistant проверку конфигурации и если все верно, перезагружаем Home Assistant
Добавим карточку в Lovelace
Данную карточку для ИБП я создал с использованием нескольких пользовательских интеграции
type: entities
entities:
- type: custom:fold-entity-row
head:
entity: sensor.ups_cyberpower_livingroom
name: ИБП
type: custom:multiple-entity-row
secondary_info:
attribute: Уровень заряда
name: Батарея
unit: '%'
state_header: Статус
entities:
- entity: group.livingroom_ups
name: Сенсоры
icon: mdi:information-outline
- entity: sensor.ups_load
name: Нагрузка
- entity: sensor.ups_load_watts
name: Нагрузка
entities:
- entity: switch.ups_beeper
secondary_info: last-changed
icon: mdi:volume-high
- entity: switch.ups_test_battery_quick
secondary_info: last-changed
icon: mdi:battery
- entity: switch.ups_test_battery_deep
secondary_info: last-changed
icon: mdi:battery
Как запустить в OS Home Assistant клиент NUT
Суть проблемы и зачем это нужно?
На Synology upsc и upscmd взаимодействуют с upsd, используя модель клиент/сервер. К сожалению, upsmcd недоступен в операционной системе Synology DiskStation Manager (DSM). Читаем Synology NAS beeper или Problems with UPS Server after DSM 6.2.4-25556 update.
Использовать такую команду, подключившись с OS Home Assistant к NAS Synology, у нас не получится вызвать команду. Нам сообщат об ошибке.
ssh user@192.168.1.200 -p 330 upscmd -u hassmon -p 12345678 ups@localhost:3493 beeper.enable
Можно получить только статус сенсора
ssh localshare@192.168.1.200 -p 330 upsc ups@localhost
Если попытаетесь в OS Home Assistant, через SSH запустить upsc ups@192.168.1.200
, то получите подобное сообщение, что такой команды нет
При попытке установить пакет nut apk add nut
получите сообщение, что такого пакета нет
Вариант решения проблемы
Для того, чтобы установить клиента nut, необходимо открыть repositories
по пути /etc/apk/repositories
и добавить ссылки на тестовые и крайние репозитории
http://nl.alpinelinux.org/alpine/edge/main
http://nl.alpinelinux.org/alpine/edge/community
http://nl.alpinelinux.org/alpine/edge/testing
После того как добавили ссылки, можно теперь установить пакет NUT командой apk add nut
Важно! После того, как вы добавите ссылки в
/etc/apk/repositories
и установите пакетnut
, то это будет работать до тех пор, пока вы полностью не перезагрузите OS Home Assistant. Для понимания: когда мы полностью перезагружаем OS Home Assistant, то OS Home Assistant восстанавливает все к исходному и все наши настройки и пакеты будут стерты и удалены, и придется по новой выполнять процедуру. Проблему можно решить запуском скрипта, но, скрипт будем запускать не с помощью shell_command, а с помощью самого аддона SSH & Web Terminal.
Создадим скрипт который будет проверять файлик repositories
по пути /etc/apk/repositories
и если там не будут ссылки с крайней версии, то добавит добавит 3 ссылки на крайние и тестовые версии для скачивания и установки пакета nut
, а также проверит установлен ли пакет nut
, если пакет nut
установлен, то скрипт пропустит этот шаг и не будет ставить пакет nut
. Этот скрипт нужно поместить в автоматизацию при загрузке Home Assistant. Он будет каждый раз сверять и если Home Assistant все затрет, то скрипт все установит.
1) Создадим папку scripts
в папке config
mkdir /config/scripts
2) Создадим файлик и именуем install_nut.sh
touch /config/scripts/install_nut.sh
3) Откроем файлик install_nut.sh
nano /config/scripts/install_nut.sh
4) Добавим в файлик следующее
#!/bin/bash
FILENAME=/etc/apk/repositories
if [ `grep -l "nl.alpinelinux.org" $FILENAME` ]; then
echo "Все отлично. Ссылки в репозитории добавлять не нужно"
else
echo "Упс. Home Assistant все удалил. Сейчас добавим ссылки в репозитории"
sleep 2
cat <<_EOF_ >> /etc/apk/repositories
http://nl.alpinelinux.org/alpine/edge/main
http://nl.alpinelinux.org/alpine/edge/community
http://nl.alpinelinux.org/alpine/edge/testing
_EOF_
echo "Готово"
fi
apk -e info nut > /etc/apk/packages.txt
FILENAME=/etc/apk/packages.txt
if [ `grep -w "nut" $FILENAME` ]; then
echo "Все отлично. Cтавить пакет NUT не требуется"
else
echo "Упс. Home Assistant все удалил. Сейчас установим пакет NUT"
apk add nut
echo "Готово"
fi
5) Создадим скрипт на запуск скрипта install_nut.sh
используя аддон SSH & Web Terminal
alias: Установка NUT
sequence:
- service: hassio.addon_stdin
data:
addon: a0d7b954_ssh
input: /config/scripts/install_nut.sh
mode: single
Перед созданием скрипта, можно проверить запуск скрипта install_nut.sh
через службу, используя аддон SSH & Web Terminal
Выключатель звукового оповещения
Примеры как использовать данные службы для включения или выключения звука
Включаем звук
service: hassio.addon_stdin
data:
addon: a0d7b954_ssh
input: upscmd -u hassmon -p 12345678 ups@192.168.1.200:3493 beeper.enable
Выключаем звук
service: hassio.addon_stdin
data:
addon: a0d7b954_ssh
input: upscmd -u hassmon -p 12345678 ups@192.168.1.200:3493 beeper.disable
Пример выключателя с помощью интеграции Template Switch
switch:
- platform: template
switches:
ups_beeper:
friendly_name: 'Звуковое оповещение'
value_template: '{{ is_state("sensor.ups_beeper_status","enabled") }}'
turn_on:
service: hassio.addon_stdin
data:
addon: a0d7b954_ssh
input: upscmd -u hassmon -p 12345678 ups@192.168.1.200:3493 beeper.enable
turn_off:
service: hassio.addon_stdin
data:
addon: a0d7b954_ssh
input: upscmd -u hassmon -p 12345678 ups@192.168.1.200:3493 beeper.disable
icon_template: >-
{% if is_state("sensor.ups_beeper_status","enabled") %}
mdi:volume-high
{% else %}
mdi:volume-off
{% endif %}