59. Home Assistant и UPS.
Обеспечение бесперебойного электропитания – залог надежной работы систем. В этой статье рассмотрим, как использовать Home Assistant для мониторинга UPS и безопасного выключения Windows и гипервизора Proxmox, с помощью автоматизации.
Источники Бесперебойного Питания (UPS - Uninterruptable Power Supply), по сути это большие батарейки с мозгами. Они позволяют подключенным к ним устройствам, поработать некоторое время в случае отключения электропитания.
При перебоях подачи электричества, самым главным моментом является грамотное и корректное завершение работы устройств. Компьютерные компоненты к таким вещам очень чувствительны. Если не будет использован ИБП, возможны потеря данных, сбои в работе программ и операционной системы, а также поломки физических компонентов компьютера.
Поэтому необходим мониторинг состояния UPS. Отслеживание состояния батареи и других параметров, вместе с настроенными автоматизациями, позволяет безболезненно пережить потенциальные сбои питания, произведя корректное выключение системы.
Большинство домашних и офисных UPS имеют до 6 электрических выходов, к которым могут быть подключены компьютеры, серверы, мониторы, раутеры, и т.д.. Но существует ограничение: обычно есть только один порт для передачи данных (чаще всего USB), и он может быть подключен только к одной системе.
NUT
Для мониторинга UPS будем использовать решение Network UPS Tools.
Оно состоит из серверной и клиентской частей.
Сервер NUT устанавливается на системе, получающей данные с UPS. Он позволяет ретранслировать информацию дальше по локальной сети.
Клиент NUT устанавливается на остальных устройствах, которым необходимо получать данные от сервера, для выполнения автоматических задач.
Важно учитывать, что для успешной работы сервера NUT требуется поддерживаемое UPS-устройство и соответствующие драйверы.
Поэтому необходимо убедиться что производитель и модель находятся в списке поддерживаемых устройств NUT сервера.
Итак, подключим UPS к системе, на которой работает Home Assistant. В случае, если HA установлен на физическом компьютере, то просто подключаем UPS в USB-порт. Если HA работает в виртуальной машине, необходимо "пробросить" USB-порт в неё.
Настройка в Home Assistant.
Серверная часть
Устанавливаем дополнение Network UPS Tools (NUT) Server. Заходим в Settings -> Add-ons -> Add-on Store -> Network UPS Tools.
или по ссылке:
Вся документация с описанием есть на домашней страничке дополнения.
После установки и перед запуском настраиваем, указав следующие параметры:
- Имя пользователя и пароль, с помощью которых клиент будет подключаться к этому серверу. Стоит отметить что пароль должен быть сложным и уникальным, иначе в логах дополнения постоянно будет предупреждение что после проверки в онлайн базах, он уже фигурирует и его использование небезопасно. Однако! Т.к. речь идёт о закрытой системе внутри локальной сети, то можно жить и с простым паролем, а предупреждение в логах отключить указанием опции i_like_to_be_pwned: true
пример из лога о ненадёжном пароле
2. Имя - имя ИБП с которым его будут видеть клиенты.
3. Драйвер - универсальный USB драйвер.
4. Порт - можно отследить в системе вручную, а можно оставить и автовыбор.
5. Режим работы - сетевой сервер
6. Что делать когда заряд батареи на UPS подойдёт к концу. Опция shutdown_host: false только выключит сам аддон (NUT сервер), но не погасит хост на котором он работает (т.е. ХА). Соответственно с ключом true будет выключаться весь хост.
7. list_usb_devices включает или выключает отображение в логах найденных устройств. Включение этого параметра может быть полезно при первичном запуске, чтобы проверить корректность настроек и опознание устройств.
8.При первом запуске, опцию log_level рекомендуется выставить на trace, чтобы видеть максимально подробный лог, на случай возникновения ошибок. В дальнейшем, можно будет поменять на info.
9. upsmon - выставляется на режим slave если режим работы (п.5) сетевой клиент. В случае если настраиваем как сервер, то ставим на master.
Переключаем настройку конфигурации в YAML режим и пишем:
users:
- username: ***
password: ***
instcmds:
- all
actions: []
devices:
- name: UPS
driver: usbhid-ups
port: auto
config: []
mode: netserver
shutdown_host: false
i_like_to_be_pwned: true
log_level: info
list_usb_devices: false
upsmon: master
Теперь запускаем и смотрим лог. Если всё нормально и сервер работает, то переходим к клиентской части.
пример ошибок в логе:
пример корректной работы в логе:
Клиентская часть.
Устанавливаем интеграцию: Settings -> Devices and Services -> Add Integration -> Network UPS Tools
или же по ссылке:
Всё что нужно, это написать имя сервера (в данном случае это имя NUT сервера созданного ранее, оно указано в документации на его домашней страничке) и имя пользователя + пароль, записанные в настройках только что настроенного дополнения.
результат интеграции
Кстати, если зайти в средства разработчика и найти там сущность "Уровень заряда аккумулятора", то можно увидеть что в ней указывается время в секундах до разрядки батареи. Эта информация будет полезна в будущем.
Выключение Windows.
Ранее здесь уже упоминалось про такой инструмент как Hass Agent
Как раз с его помощью и будем осуществлять выключение. (это не единственный способ выполнения задачи, но самый простой)
На компьютере откроем командную строку с правами администратора и напишем команду shutdown -a, но не нажимая Enter, чтобы не запустить её.
В интерфейсе Hass Agent создадим команду типа кнопка для выключения компьютера. После создания команды, она должна моментально отобразиться в виде сущности в Home Assistant через интеграцию MQTT.
При нажатии на кнопку выключения компьютера в интерфейсе Home Assistant будет отправлена стандартная команда имеющая задержку в одну минуту. Об этом будет сообщено в предупреждении на экране.
Для отмены действия ожидающей команды на выключение, вернёмся в подготовленное ранее окно командной строки и нажмём Enter.
Выключение Proxmox.
Т.к. эта система является гипервизором, и безопасности здесь отведено не последнее место, а выключение извне является очень критичным действием, придётся действовать не так топорно как в примере выше.
Для выполнения выключения нужен пользователь обладающий правами на это действие. Можно создать нового админа, а можно воспользоваться уже имеющимся root.
С этим пользователем Home Assistant будет подключаться к гипервизору и передавать ему команду на выключение.
Чтобы не раскрывать пароль этого пользователя (а данные для входа в удалённую систему ХА хранит в открытом виде), воспользуемся токеном (TOKEN). Это некий уникальный ключ присвоенный юзеру. Его можно легко менять и удалять, не затрагивая при этом сам пароль.
Заходим в Датацентр -> API токены и создаём новый токен для текущего пользователя
В итоге получим идентификатор токена и его секретный ключ. Очень важно скопировать в сторону и сохранить сам ключ, т.к. после закрытия окна его больше нельзя будет увидеть.
Это всё что нужно сделать на стороне Proxmox.
Создадим теперь команду для выключения.
Для этого добавим в файл configuration.yaml следующий код:
shell_command:shutdown_proxmox: 'curl "https://PROXMOX_IP:8006/api2/extjs/nodes/NODE_NAME/status" -H "Authorization: PVEAPIToken=root@pam!bla-bla-bla=5ab654c2-313a-4822-9a4c-bea605490765" -H "Content-Type: application/x-www-form-urlencoded" --data "command=shutdown" --insecure'
в котором заменяем:
PROXMOX_IP на то что это подразумевает.
NODE_NAME на имя своей ноды проксмокс.
В параметре PVEAPIToken указываем пользователя Proxmox которому выдали токен на предыдущем шаге. После восклицательного знака указываем идентификатор, и после знака равенства сам токен, скопированный ранее.
Сохраняем, проверяем на ошибки, перезагружаем конфигурацию.
Если всё ок, то в разделе Developer mode, в сервисах можно будет найти новый элемент: shell_command.shutdown_proxmox
При вызове этой службы, на Proxmox будет отправлена команда выключения, эквивалентная нажатию кнопки Shutdown в интерфейсе или же одноимённой команде набранной в консоли. Гипервизор остановит все контейнеры/виртуалки и выключится.
Автоматизация по отключению.
Теперь готовы все элементы для создания автоматизации по корректному отключению хоста с Проксмоксом и компьютера с Windows, на случай если отключилось электричество и время автономной работы батареи UPS подошло к концу.
Немного вводных данных:
- Home Assistant опрашивает UPS по умолчанию каждые 30 секунд.
- Компьютер начнёт процесс выключения через минуту после получения команды.
- Проксмоксу тоже надо некоторое время на выключение всех виртуалок и контейнеров.
- С другой стороны, нужно обеспечить максимально долгую работу всех систем на резервном питании, т.к. электричество может вернуться в любой момент.
Триггером будет числовое состояние сенсора уровня заряда аккумулятора, если оно меньше, допустим, 5 минут.
Условием для выполнения будет работа UPS от батареи, а не от сети.
Ну и действием будет либо правильная последовательность команд, либо их одновременное выполнение:
В любом случае понадобится вызов сервиса. Для компьютера это будет нажатие кнопки и выбор соответствующей сущности созданной интеграцией MQTT. Для проксмокса описанный ранее, созданный вручную сервис.
Так же, можно при желании добавить оповещение для приложения на смартфон.
Автовключение.
Во многих компьютерах BIOS предоставляет опцию автоматического включения после восстановления питания. Это может быть удобно, но перед активацией этой функции стоит задуматься и вот почему.
Допустим, произошел сбой в подаче электроэнергии, и UPS почти полностью разрядился, что привело к автоматическому отключению устройств. Однако, что случится, если электроэнергия внезапно вернется на короткое время, например, всего на минуту? ИБП перейдет в режим зарядки и начнет подавать электроэнергию. Устройства, увидев это, начнут включаться и загружаться. Но что с ними будет когда через минуту электричество опять исчезнет?
Поэтому, выбирая опцию автовключения, важно помнить о возможных кратковременных сбоях в подаче электроэнергии. И стоит убедиться что эта функция соответствует потребностям и риски по потере данных или оборудования оценены осознанно.
Альтернативная конфигурация.
В примере выше был рассмотрен случай когда мини пк и обычный компьютер запитаны от одного UPS. При этом данные о состоянии ЮПС шли напрямую в Home Assistant, т.к. ИБП подключен через юсб к мини пк, на котором работает система управления умным домом. Однако по разным причинам может возникнуть ситуация, когда необходимо оставить управление на десктопе (стационарном компьютере). При таком раскладе необходимо решить следующую задачу: как передать данные о состоянии ЮПС с обычного компьютера на ХА. Решений несколько, но рассмотрим одно из них.
- Попытаться воспользоваться программным обеспечением от производителя своего ИБП. Если оно умеет сообщать данные по протоколу NUT, то настроить интеграцию и/или дополнение в Home Assistant.
- Установить NUT сервер на компьютере. В некоторых случаях потребуется установка альтернативных драйверов для юсб ЮПС. К сожалению она не всегда может пройти удачно, что зависит от многих факторов.
- Удалить все драйверы ЮПС (или не ставить их) и попытаться определить устройство средствами операционной системы.
Именно последний вариант является наиболее универсальным (но не единственно лучшим и правильным). Он подходит для тех, у кого стационарный компьютер включён постоянно!
Для начала следует убедиться что устройство предоставляет данные. Для чего его следует найти в дебрях WMI. Удобнее всего это сделать с помощью WMI Explorer.
После того как стал известен адрес устройства в WMI, и параметры которые оно предоставляет, остаётся только создать запрос и прописать его новом сенсоре, созданном с помощью Hass.Agent.
Делаем датчиков столько, сколько параметров надо передать с компьютера в ХА. По одному на каждый.
Что в итоге? Компьютер "знает" что у него теперь есть батарея и он может себя выключить если что. О состоянии ЮПСа так же "знает" и Home Assistant и в случае чего может отправить команду на выключение компьютера. По аналогии с настройками у мини пк в BIOS, стационарный компьютер так же можно настроить на автоматическое включение при появлении питания. Таким образом, когда электричество вернётся и система загрузится, ХА снова будет получать данные о состоянии ИБП.
Кстати, с такими же настройками можно создать сенсор для батареи ноутбука, если есть необходимость её мониторить. На всякий случай стоит изменить запрос, чтобы уточнить к какому именно устройству происходит обращение для получения данных.
Например в данном случае устройство находится по адресу: \\.\ROOT\CIMV2:Win32_Battery.DeviceID="000000000EATON5E"
значит запрос именно к нему будет выглядеть так: SELECT EstimatedRunTime FROM Win32_Battery WHERE DeviceID='000000000EATON5E'
И указать (хоть это и не обязательно) опрашиваемый диапазон WMI: \\.\ROOT\CIMV2:Win32_Battery.DeviceID="000000000EATON5E"
Остаётся выбрать свой идентификатор устройства, который будет опрашиваться, и название параметра для выбора, данные которого нас интересуют.
Комментарии
Отправить комментарий