Network UPS Tools. Мониторинг и управление ИБП

Network UPS Tools — это комплекс программ мониторинга и управления различными блоками бесперебойного питания.

Для мониторинга или управления ИБП необходимо ИБП подключить к ПК или к серверу, т.е подключить к чему либо, что будет выступать сервером для ИБП. У меня ИБП подключен к NAS Synology, а шлюз является клиентом. Шлюз благодаря интеграции Network UPS Tools получает данные от сервера сетевого ИБП, а благодаря пакету NUT посылает команды для управления ИБП.

Важно! Ваш ИБП должен поддерживать Network UPS Tools. Список доступных ИБП можно посмотреть здесь или на портале Synology

NAS Synology

Включим сервер сетевого ИБП image image

Указываем IP адреса, которым будет разрешен доступ к ИБП image


Добавим учетную запись в upsd.users для доступа к серверу сетевого ИБП

Подключаемся к NAS Synology через консоль и открываем upsd.users расположенный /usr/syno/etc/ups/upsd.users image image

Добавим в самый низ строки 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: Просто снимите галочку и нажмите применить, а после поставьте галочку и еще раз применить. На этом все. Осталось проверить доступ с консоли на шлюзе.

image


На шлюзе ставим пакеты через LuCI

  • nut
  • nut-upsc
  • nut-upscmd

image


Команды для управления ИБП

Важно! На вашем ИБП список команд может отличаться от предоставленного списка

  • load.off - Turn off the load immediately
  • load.on - Turn on the load immediately
  • load.off.delay - Turn off the load possibly after a delay
  • load.on.delay - Turn on the load possibly after a delay
  • shutdown.return - Turn off the load possibly after a delay and return when power is back
  • shutdown.stayoff - Turn off the load possibly after a delay and remain off even if power returns
  • shutdown.stop - Stop a shutdown in progress
  • shutdown.reboot - Shut down the load briefly while rebooting the UPS
  • shutdown.reboot.graceful - After a delay, shut down the load briefly while rebooting the UPS
  • test.panel.start - Start testing the UPS panel
  • test.panel.stop - Stop a UPS panel test
  • test.failure.start - Start a simulated power failure
  • test.failure.stop - Stop simulating a power failure
  • test.battery.start - Start a battery test
  • test.battery.start.quick - Start a “quick” battery test
  • test.battery.start.deep - Start a “deep” battery test
  • test.battery.stop - Stop the battery test
  • calibrate.start - Start runtime calibration
  • calibrate.stop - Stop runtime calibration
  • beeper.disable - Disable UPS beeper/buzzer
  • beeper.enable - Enable UPS beeper/buzzer
  • beeper.mute - Temporarily mute UPS beeper/buzzer
  • beeper.off - Turn off UPS beeper/buzzer
  • beeper.on - Turn on UPS beeper/buzzer
  • bypass.start - Put the UPS in bypass mode
  • bypass.stop - Take the UPS out of bypass mode

Примеры для управления ИБП

image

Вывести список сенсоров ИБП

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

image

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

image image

4) Перезагружаем шлюз, можно конечно перезагрузить Home Assistant, но я все же перезагружаю шлюз целиком, так точно интеграция прогружается в Home Assistant

reboot

5) Ставим интеграцию Network UPS Tools и указываем IP адрес к серверу ИБП. Логин и пароль можно не указывать и без него пускает, если не пустит, то указывайте ту УЗ, которую прописали в upsd.users

Безымянный-1


Создадим выключатели

image

Для выключателей будем использовать платформу 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 можно здесь

image


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

Данную карточку для ИБП я создал с использованием нескольких пользовательских интеграции

image

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, то получите подобное сообщение, что такой команды нет

image

При попытке установить пакет nut apk add nut получите сообщение, что такого пакета нет

image


Вариант решения проблемы

Для того, чтобы установить клиента nut, необходимо открыть repositories по пути /etc/apk/repositories и добавить ссылки на тестовые и крайние репозитории

image image

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

image

Важно! После того, как вы добавите ссылки в /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

image


Выключатель звукового оповещения

Примеры как использовать данные службы для включения или выключения звука

Включаем звук

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 %}

Источники