Просмотрено
Category: Умный дом

Гибернация компьютера в Home Assistant

Гибернация компьютера в Home Assistant

Гибернация компьютера в Home Assistant

Поскольку я часто использую гибернацией, я решил сделать гибернацию своего ПК через Home Assistant.

Если с выключением компьютера через RPC Shutdown всё понятно, то с переходом в режим гибернации возник вопрос, так как RPC Shutdown не может отправить ПК в этот режим.

Я начал искать варианты и наткнулся на программу под названием Airytec Switch Off. Эта программа позволяет автоматически или удаленно выключать компьютер с любого компьютера или мобильного телефона. Что для меня важно, так это то, что она имеет веб-интерфейс с ссылками на команды, из которых я и получил URL которые я использовал в Home Assistant.

Теперь я расскажу, как я реализовал это у себя. Для начала, нужно скачать и установить саму программу. После установки и запуска, в трее появится иконка. Чтобы получить доступ к настройкам программы, нужно кликнуть правой клавишей мыши по иконке и выбрать пункт Options.

Выбираем пункт Options

Далее переходим во вкладку Remote и ставим галочку Enable web interface. После кликаем по View web interface.

Включаем web интерфейс

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

Web интерфейс Airytec Switch Off.

Чтобы получить адрес ссылки для выключения/перезагрузки/сна/гибернации, щелкните правой кнопкой мыши по ссылке и выберите Копировать адрес ссылки. В моем случае, если я хочу перейти в режим гибернации, ссылка будет выглядеть так:

http://localhost:700/?action=System.Hibernate

Чтобы использовать этот адрес, необходимо заменить localhost на локальный IP-адрес вашего компьютера. В моем случае это будет так:

http://192.168.30.68:700/?action=System.Hibernate

Обратите внимание, что эти адреса могут отличаться в зависимости от вашей конфигурации и настроек системы.

В Home Assistant необходимо создать команды Shell. Я сделал это сразу для всех вариантов.

shell_command:
  shutdown_mypc: "curl -k http://192.168.30.68:700/?action=System.Shutdown"
  restart_mypc: "curl -k http://192.168.30.68:700/?action=System.Restart"
  sleep_mypc: "curl -k http://192.168.30.68:700/?action=System.Sleep"
  hibernate_mypc: "curl -k http://192.168.30.68:700/?action=System.Hibernate"

Для включения или гибернации своего ПК я использую переключатель. Вот пример моего переключателя:

switch:
  - platform: wake_on_lan
    name: "Мой ПК"
    mac: XX:XX:XX:XX:XX:XX
    turn_off:
      service: shell_command.hibernate_mypc
      

На этом все. Надеюсь, моя статья кому-то поможет.

Скрипты для кофеварки Redmond(RedSolution) SkyCoffee M1509S/M1519S в Home Assistant

Скрипты для кофеварки Redmond(RedSolution) SkyCoffee M1509S/M1519S в Home Assistant

Скрипты для кофеварки Redmond(RedSolution) SkyCoffee M1509S/M1519S в Home Assistant

Просили показать как у меня реализована дозирование кофе в кофеварке Redmond M1509S/M1519S. В двух словах:

В роли шлюза использую ESP32 с прошивкой https://github.com/alutov/ESP32-R4sGate-for-Redmond.

Устройства прилетают в Home Assistant через MQTT.

Кофеварка в MQTT

Скрипты:

01_coffee:
  alias: Кофеварка - Одна чашка кофе
  sequence:
    - service: switch.turn_off
      data:
        entity_id: switch.r4s01_coffee_strength
    - delay: 0:00:02
    - service: switch.turn_on
      data:
        entity_id: switch.r4s01_coffee_switch
    - delay: 0:02:00
    - service: switch.turn_off
      data:
        entity_id: switch.r4s01_coffee_switch
    - delay: 0:0:10
    - service: media_player.play_media
      entity_id: media_player.yandex_station_m00scgg00cx7cg
      data:
        media_content_id: Ваш кофе готов
        media_content_type: text

02_coffee:
  alias: Кофеварка - Две чашки кофе
  sequence:
    - service: switch.turn_off
      data:
        entity_id: switch.r4s01_coffee_strength
    - delay: 0:00:02
    - service: switch.turn_on
      data:
        entity_id: switch.r4s01_coffee_switch
    - delay: 0:04:00
    - service: switch.turn_off
      data:
        entity_id: switch.r4s01_coffee_switch
    - delay: 0:0:10
    - service: media_player.play_media
      entity_id: media_player.yandex_station_m00scgg00cx7cg
      data:
        media_content_id: Ваш кофе готов
        media_content_type: text
03_coffee:
  alias: Кофеварка - Три чашки кофе
  sequence:
    - service: switch.turn_off
      data:
        entity_id: switch.r4s01_coffee_strength
    - delay: 0:00:02
    - service: switch.turn_on
      data:
        entity_id: switch.r4s01_coffee_switch
    - delay: 0:06:00
    - service: switch.turn_off
      data:
        entity_id: switch.r4s01_coffee_switch
    - delay: 0:0:10
    - service: media_player.play_media
      entity_id: media_player.yandex_station_m00scgg00cx7cg
      data:
        media_content_id: Ваш кофе готов
        media_content_type: text

01_coffee_strength:
  alias: Кофеварка - Одна чашка крепкого кофе
  sequence:
    - service: switch.turn_on
      data:
        entity_id: switch.r4s01_coffee_strength
    - delay: 0:00:02
    - service: switch.turn_on
      data:
        entity_id: switch.r4s01_coffee_switch
    - delay: 0:02:30
    - service: switch.turn_off
      data:
        entity_id: switch.r4s01_coffee_switch
    - delay: 0:00:02
    - service: switch.turn_off
      data:
        entity_id: switch.r4s01_coffee_strength
    - delay: 0:0:10
    - service: media_player.play_media
      entity_id: media_player.yandex_station_m00scgg00cx7cg
      data:
        media_content_id: Ваш кофе готов
        media_content_type: text

02_coffee_strength:
  alias: Кофеварка - Две чашки крепкого кофе
  sequence:
    - service: switch.turn_on
      data:
        entity_id: switch.r4s01_coffee_strength
    - delay: 0:00:02
    - service: switch.turn_on
      data:
        entity_id: switch.r4s01_coffee_switch
    - delay: 0:05:00
    - service: switch.turn_off
      data:
        entity_id: switch.r4s01_coffee_switch
    - delay: 0:00:02
    - service: switch.turn_off
      data:
        entity_id: switch.r4s01_coffee_strength
    - delay: 0:0:10
    - service: media_player.play_media
      entity_id: media_player.yandex_station_m00scgg00cx7cg
      data:
        media_content_id: Ваш кофе готов
        media_content_type: text

03_coffee_strength:
  alias: Кофеварка - Три чашки крепкого кофе
  sequence:
    - service: switch.turn_on
      data:
        entity_id: switch.r4s01_coffee_strength
    - delay: 0:00:02
    - service: switch.turn_on
      data:
        entity_id: switch.r4s01_coffee_switch
    - delay: 0:07:30
    - service: switch.turn_off
      data:
        entity_id: switch.r4s01_coffee_switch
    - delay: 0:00:02
    - service: switch.turn_off
      data:
        entity_id: switch.r4s01_coffee_strength
    - delay: 0:0:10
    - service: media_player.play_media
      entity_id: media_player.yandex_station_m00scgg00cx7cg
      data:
        media_content_id: Ваш кофе готов
        media_content_type: text

00_coffee_stop:
  alias: Кофеварка - Стоп
  sequence:
    - service: script.turn_off
      target:
        entity_id:
          - script.01_coffee_strength
          - script.02_coffee_strength
          - script.03_coffee_strength
          - script.01_coffee
          - script.02_coffee
          - script.03_coffee
    - delay: 0:00:01
    - service: switch.turn_off
      target:
        entity_id: switch.r4s01_coffee_switch
    - delay: 0:00:01
    - service: switch.turn_off
      target:
        entity_id: switch.r4s01_coffee_strength



Активирую скрипты через команды колонке. Использую компонент https://github.com/dext0r/ha-yandex-station-intents.

Intents:

yandex_station_intents:
  intents:
    Сделай кофе: Заказ принят, делаю чашечку кофе #1
    Сделай чашку кофе: Заказ принят, делаю чашечку кофе #2
    Сделай две чашки кофе: Заказ принят, делаю две чашки кофе #3
    Сделай три чашки кофе: Заказ принят, делаю три чашки кофе #4
    Сделай чашку крепкого кофе: Заказ принят, делаю чашечку крепкого кофе #5
    Сделай две чашки крепкого кофе: Заказ принят, делаю две чашки крепкого кофе #6
    Сделай три чашки крепкого кофе: Заказ принят, делаю три чашки крепкого кофе #7
    Сделай крепкий кофе: Заказ принят, делаю чашечку крепкого кофе #8
    Отмени кофе: Отменяю заказ #9

Автоматизации:

- alias: Кофеварка - Одна чашка кофе
  trigger:
    platform: event
    event_type: yandex_intent
    event_data:
      text: Сделай кофе
  action:
    - service: script.01_coffee

- alias: Кофеварка - Одна чашка кофе2
  trigger:
    platform: event
    event_type: yandex_intent
    event_data:
      text: Сделай чашку кофе
  action:
    - service: script.01_coffee

- alias: Кофеварка - Две чашки кофе
  trigger:
    platform: event
    event_type: yandex_intent
    event_data:
      text: Сделай две чашки кофе
  action:
    - service: script.02_coffee

- alias: Кофеварка - Три чашки кофе
  trigger:
    platform: event
    event_type: yandex_intent
    event_data:
      text: Сделай три чашки кофе
  action:
    - service: script.03_coffee

- alias: Кофеварка - Одна чашка крепкого кофе
  trigger:
    platform: event
    event_type: yandex_intent
    event_data:
      text: Сделай крепкий кофе
  action:
    - service: script.01_coffee_strength

- alias: Кофеварка - Одна чашка крепкого кофе2
  trigger:
    platform: event
    event_type: yandex_intent
    event_data:
      text: Сделай чашку крепкого кофе
  action:
    - service: script.01_coffee_strength

- alias: Кофеварка - Две чашки крепкого кофе
  trigger:
    platform: event
    event_type: yandex_intent
    event_data:
      text: Сделай две чашки крепкого кофе
  action:
    - service: script.02_coffee_strength

- alias: Кофеварка - Три чашки крепкого кофе
  trigger:
    platform: event
    event_type: yandex_intent
    event_data:
      text: Сделай три чашки крепкого кофе
  action:
    - service: script.03_coffee_strength

- alias: Кофеварка - Стоп
  trigger:
    platform: event
    event_type: yandex_intent
    event_data:
      text: Отмени кофе
  action:
    - service: script.00_coffee_stop
Прошивка камеры IPC8232SWC-WE от Ростелеком на оригинальную прошивку

Прошивка камеры IPC8232SWC-WE от Ростелеком на оригинальную прошивку

Прошивка камеры IPC8232SWC-WE от Ростелеком на оригинальную прошивку

Внимание! Автор не несет ответственность за ваши неудачи, и не призывает к действию! Все что вы делаете — вы делаете на свой страх и риск!

Данный способ прошивки подсмотрен на 4pda, дополнен и немного изменен для лучшего понимания.

Немного о камере

Данная камера была приобретена на Avito за копейки. Хотелось избавиться от камер Xiaomi и приложения MiHome. Оригинальная прошивка поддерживает протокол Onvif и RTSP, что собственно мне и было нужно для добавления камер в видеорегистратор и Home Assistant. Так же у камеры на ножке есть магнит, который позволяет крепить камеру на металлических поверхностях, либо на металлическом пятаке, который идет в комплекте и прикручивается на пару саморезов. Еще один из плюсов — наличие Ethernet разъема на камере.

Наличие Ethernet разъема
Наличие Ethernet разъема

Прошивка камеры

Для прошивки нужно вскрыть камеру поддев чем-нибудь плоским черную часть камеры.

Поддеваем с краю черную часть камеры
Поддеваем с краю черную часть камеры

После того, как отковыряли лицевую часть камеры аккуратной отключаем микрофон и подцветку.

Отключаем микрофон и подсветку
Отключаем микрофон и подсветку

После этого ищем UART рядом с Ethernet разъемом. Нас интересуют только контакты Tx Rx и Gnd.

UART
UART

К UART можно под паяться или же использовать иголки как сделал я. Так же нужно воткнуть LAN кабель.

Подключаем UART и LAN кабель
Подключаем UART и LAN кабель

Теперь качаем TFTP сервер, архив с прошивкой и Pytty.

Распаковываем файлы прошивки в рядом с TFTP сервером.

Файлы прошивки рядом с TFTP сервером
Файлы прошивки рядом с TFTP сервером

Редактируем файл manuinfo.txt под себя

DEVICE_SERIAL_NUMBER: серийный номер вашей камеры (12 знаков)
MAC_ADDRESS: мак-адрес сетевого интерфейса в формате 0123-4567-89AB
ACTIVE_CODE: регистрационный код для облака EZ (25 знаков). Предлагаю использовать следующий формат: 0SSSSSSSSSSSSMMMMMMMMMMMM (S — серийный номер, M — мак адрес)
REGION_CODE: код региона IN — голосовые сообщения на английском, NONE — голосовые сообщения на китайском, FF — без голосовых сообщений

Запускаем TFTP, открываем Pytty выбираем наш COM порт и скорость 115200.

Настройки Pytty
Настройки Pytty

Подаем питание на камеру и жмем в Pytty Ctrl + Enter либо Ctrl + B чтобы остановить загрузку.

Останавливаем загрузку
Останавливаем загрузку

После того, как остановили загрузку нужно указать IP адрес камеры и IP адрес TFTP сервера.

ipaddr — адрес камеры, serverip — адрес tftp сервера.

setenv ipaddr 192.168.0.99
setenv serverip 192.168.0.111
Указываем IP адреса камеры и TFTP сервера
Указываем IP адреса камеры и TFTP сервера

Далее очищаем флеш-память камеры, загружаем новый загрузчик и перезагружаем камеру.

mw.b 0x42000000 0xff 0x1000000;tftp 0x42000000 u-boot.bin
nand erase 0 0x8000000;nand write 0x42000000 0 0x100000
reset

В TFTP сервере должны увидеть скачивание файла загрузчика.

Скачивание загрузчика
Скачивание загрузчика

После перезагрузки камеры снова выставляем IP адреса камеры и сервера.

setenv ipaddr 192.168.0.99
setenv serverip 192.168.0.111

Обновляем прошивку, загружаем конфигурацию, выставляем свой MAC-адрес и перезагружаемся.

update all
manuinfo manuinfo.txt
config ethaddr 01:23:45:67:89:AB (mac-адрес вашей камеры)
reset
Загрузка прошивки
Загрузка прошивки

После перезагрузки если все правильно сделали можно перейти в web-интерфейс камеры.

Страница авторизации
Страница авторизации

По умолчанию данные для входа admin/123456.

Web-интерфейс камеры
Web-интерфейс камеры

Итог

Прошивка камеры на этом закончена. Теперь камеру можно добавить в регистратор через протокол Onvif или RTSP.

RTSP основного потока rtsp://admin:123456@ipaddress:554/media/video1
RTSP второго потока rtsp://admin:123456@ipaddress:554/media/video2

Интеграция ИБП CyberPower в Home Assistant

Интеграция ИБП CyberPower в Home Assistant

В данной статье я расскажу как добавить мониторинг ИБП в Home Assistant на примере CyberPower Value500EI.

У данной модели есть USB разъем для мониторинга состояния ИБП. Для мониторинга у CyberPower есть своя утилита под названием PowerPanel. Скачать ее можно с сайта производителя. У меня на домашнем сервере стоит Ubuntu 20.04, по этому я скачал PowerPanel for Linux 64bit (deb).

Подключаем ИБП через USB и устанавливаем PowerPanel:

 dpkg -i CyberPower_PPL_Linux+64bit+\(deb\)_v1.4.1.deb

После установки проверяем командой:

pwrstat -status

В ответ, если все нормально, должны увидеть примерно следующее:

    The UPS information shows as following:

    Properties:
            Model Name................... Value500EI
            Firmware Number.............. BZAB100.B31
            Rating Voltage............... 230 V
            Rating Power................. 275 Watt(500 VA)

    Current UPS status:
            State........................ Normal
            Power Supply by.............. Utility Power
            Utility Voltage.............. 224 V
            Output Voltage............... 226 V
            Battery Capacity............. 100 %
            Remaining Runtime............ 31 min.
            Load......................... 49 Watt(18 %)
            Line Interaction............. None
            Test Result.................. Unknown
            Last Power Event............. Blackout at 2022/09/13 23:53:27 for 7 sec.

В файле /etc/pwrstatd.conf настраиваем выключение компьютера через время после перехода на резервное питание или при разряде аккумулятора на определенный процент. Также можно настроить отправку E-Mail или выполнение произвольного скрипта. После изменения перезапускаем демона:

service pwrstatd restart

У меня настроено выключение сервера при разряде аккумулятора до 35%. Мой конфиг:

# pwrstatd configuration file
#

# You must restart pwrstatd after changing this file in order for changes to take effect.
# Ex:/etc/init.d/pwrstatd restart

#
# Action setting for event of Power Failure
#

# A delay time in seconds since event of Power Failure occur then to run shell
# script and shutdown system. Allowed range is 0 ~ 3600. Default is 60 sec.
powerfail-delay = 60

# Enable to run shell script when the event of Power Failure occur.
# The allowed options are yes and no. Default is yes.
powerfail-active = yes

# Assign a path of script file for event of Power Failure.
# The default is /etc/pwrstatd-powerfail.sh
powerfail-cmd-path = /etc/pwrstatd-powerfail.sh

# How much time in seconds to take script running for event of Power Failure.
# The allowed range is 0 ~ 3600. Default is 0 sec.
powerfail-duration = 0

# Allow Daemon to shutdown system for event of Power Failure.
# The allowed options are yes and no. Default is yes.
powerfail-shutdown = no

#
# Action setting for event of Battery Low
#

# A threshold of Battery Capacity, If the battery capacity is lower than this
# value and a event of Battery Low will be identified. The unit is percentage.
# The allowed range is 0 ~ 90. Default is 35 %.
lowbatt-threshold = 35

# A threshold of Remaining Runtime, If the Remaining Runtime is lower than this
# value and a event of Battery Low will be identified. The unit is second.
# The allowed range is 0 ~ 3600. Default is 300 sec.
# Note: When meet this condition the below 'shutdown-sustain' property
# will be ignored.
runtime-threshold = 300

# Enable to run shell script when the event of Battery Low occur.
# The allowed options are yes and no. Default is yes.
lowbatt-active = yes

# Assign a path of script file for event of Battery Low.
# The default is /etc/pwrstatd-lowbatt.sh
lowbatt-cmd-path = /etc/pwrstatd-lowbatt.sh

# How much time in seconds to take script running for event of Battery Low.
# The allowed range is 0 ~ 60. Default is 0 sec.
lowbatt-duration = 0

# Allow Daemon to shutdown system for event of Battery Low.
# The allowed options are yes and no. Default is yes.
lowbatt-shutdown = yes

# Turn UPS alarm on or off.
# The allowed options are yes and no. Default is yes.
enable-alarm = yes

# The necessary time in seconds for system shutdown.
# The UPS will turn power off when this time is expired.
# The allowed range is 0 ~ 3600. Default is 600 sec.(10 min.)
# If the computer shutdown is cause by low runtime condition, the UPS will
# turn power off when the time is expired that time is assigned on
# 'runtime-threshold' property and it is no longer to refer the
# 'shutdown-sustain' property.

shutdown-sustain = 600

# Daemon will turn UPS power off once it ask system shutdown cause by a power
# event. Allowed options are yes and no. Default is yes.
turn-ups-off = yes

# The period of polling UPS in seconds.
# The allowed range is 1 ~ 60. Default is 3 sec.
ups-polling-rate = 3

# the period of re-try to find available UPS in seconds since find nothing at
# last time. The allowed range is 1 ~ 300. Default is 10 sec.
ups-retry-rate = 10

# Prohibiting daemon to provide communication mechanism for client, such as
# pwrstat command. normally, it should be 'no'. It can be 'yes' if any security
# consideration. Allowed options are yes and no. Default is no.
prohibit-client-access = no
# The pwrstatd accepts four types of device node which includes the 'ttyS',
# 'ttyUSB', 'hiddev', and 'libusb' for communication with UPS. The pwrstatd
# defaults to enumerate all acceptable device nodes and pick up to use an
# available device node automatically. But this may cause a disturbance to the
# device node which is occupied by other software. Therefore, you can restrict
# this enumerate behave by using allowed-device-nodes option. You can assign
# the single device node path or multiple device node paths divided by a
# semicolon at this option. All groups of 'ttyS', 'ttyUSB', 'hiddev', or
# 'libusb' device node are enumerated without a suffix number assignment.
# Note, the 'libusb' does not support suffix number only.
#
# For example: restrict to use ttyS1, ttyS2 and hiddev1 device nodes at /dev
# path only.
# allowed-device-nodes = /dev/ttyS1;/dev/ttyS2;/dev/hiddev1
#
# For example: restrict to use ttyS and ttyUSB two groups of device node at
# /dev,/dev/usb, and /dev/usb/hid paths(includes ttyS0 to ttySN and ttyUSB0 to
# ttyUSBN, N is number).
# allowed-device-nodes = ttyS;ttyUSB
#
# For example: restrict to use hiddev group of device node at /dev,/dev/usb,
# and /dev/usb/hid paths(includes hiddev0 to hiddevN, N is number).
# allowed-device-nodes = hiddev
#
# For example: restrict to use libusb device.
# allowed-device-nodes = libusb
allowed-device-nodes =

# Daemon will hibernate system to instead of system shutdown when power
# event occur. Allowed options are yes and no. Default is no.
hibernate = no

# Enable cloud solution.
# The allowed options are yes and no. Default is no.
cloud-active = no

# Account for cloud server login.
cloud-account =

Далее в Docker необходимо установить контейнер, который будет парсить эту информацию и передавать в MQTT брокер:

docker pull dwinks/pwrstat_docker
docker volume create pwrstat_data
docker run -d -p 5003:5003 --name=pwrstat --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v pwrstat_data:/data dwinks/pwrstat_docker

После запуска контейнера смотрим его ID из списка:

docker ps -a
Список запущенных контейнеров

Переходим в консоль контейнера:

docker exec -it a86d79a48027 bash

В контейнере нам нужно для удобства установить nano и отредактировать конфиг. Для это выполняем:

apt update
apt install nano -y
nano /pwrstat.yaml

В конфиге указываем IP адрес и порт MQTT брокера, частота обновления, имя и пароль MQTT.

pwrstat_api: # optional
  log_level: WARNING # optional
mqtt:
  broker: "192.168.0.24"
  port: 1883
  client_id: "pwrstat_mqtt"
  topic: "sensors/basement/power/ups"
  refresh: 5
  qos: 0
  retained: true
  username: "*****" # optional
  password: "*****" # optional, required if username specified
rest:
  port: 5003
  bind_address: "0.0.0.0"
prometheus:
  port: 9222
  bind_address: "0.0.0.0"
  labels:
    rack: "0"

Перезапускаем контейнер:

docker restart pwrstat

Проверяем работоспособность по ссылкам: http://192.168.0.24:5003/health и http://192.168.0.24:5003/mqtthealth. Не забудьте поменять IP на свой. Если все нормально, то мы увидим:

{"code":"SUCCESS","message":"OK"}

Отлично! Данные отправляются в MQTT. Теперь необходимо достать их в Home Assistant. Для этого создаем сенсоры:

mqtt:
  sensor:
    # UPS Sensors
    - name: "UPS Model Name"
      icon: mdi:rename-box
      state_topic: "sensors/basement/power/ups"
      value_template: "{{ value_json['Model Name'] }}"

    - name: "UPS Rating Voltage"
      icon: mdi:flash-triangle
      state_topic: "sensors/basement/power/ups"
      value_template: "{{ value_json['Rating Voltage'] }}"

    - name: "UPS Rating Power"
      icon: mdi:lightning-bolt
      state_topic: "sensors/basement/power/ups"
      value_template: "{{ value_json['Rating Power'] }}"

    - name: "UPS State"
      icon: mdi:transmission-tower
      state_topic: "sensors/basement/power/ups"
      value_template: "{{ value_json['State'] }}"

    - name: "UPS Power Supply by"
      icon: mdi:power-socket-eu
      state_topic: "sensors/basement/power/ups"
      value_template: "{{ value_json['Power Supply by'] }}"

    - name: "UPS Utility Voltage"
      icon: mdi:flash-triangle-outline
      state_topic: "sensors/basement/power/ups"
      value_template: "{{ value_json['Utility Voltage'] }}"

    - name: "UPS Output Voltage"
      icon: mdi:flash-triangle-outline
      state_topic: "sensors/basement/power/ups"
      value_template: "{{ value_json['Output Voltage'] }}"

    - name: "UPS Battery Capacity"
      icon: mdi:car-battery
      state_topic: "sensors/basement/power/ups"
      value_template: "{{ value_json['Battery Capacity'] }}"

    - name: "UPS Remaining Runtime"
      icon: mdi:timer-sand
      state_topic: "sensors/basement/power/ups"
      value_template: "{{ value_json['Remaining Runtime'] }}"

    - name: "UPS Load"
      icon: mdi:lightning-bolt
      state_topic: "sensors/basement/power/ups"
      value_template: "{{ value_json['Load'] }}"

    - name: "UPS Line Interaction"
      state_topic: "sensors/basement/power/ups"
      value_template: "{{ value_json['Line Interaction'] }}"

    - name: "UPS Test Result"
      state_topic: "sensors/basement/power/ups"
      value_template: "{{ value_json['Test Result'] }}"

    - name: "UPS Last Power Event"
      state_topic: "sensors/basement/power/ups"
      value_template: "{{ value_json['Last Power Event'] }}"

У меня это выглядит вот так:

Список датчиков UPS

Так же я настроил уведомления в Telegramm при отключении и включении электричества.

- alias: "Уведомления - Питание от ИБП"
  mode: single
  trigger:
    - platform: template
      value_template: "{{ states('sensor.ups_state') == 'Power Failure' }}"
  action:
    - service: notify.me
      data:
        message: "Внимание! Проблемы с питанием, переход на питание от аккумулятора."

- alias: "Уведомления - Питание от сети"
  mode: single
  trigger:
    - platform: template
      value_template: "{{ states('sensor.ups_state') == 'Normal' }}"
  action:
    - service: notify.me
      data:
        message: "Питание восстановлено"

На этом настройка завершена! Спасибо за внимание 🙂

Автоматическое удаление записей в ZoneMinder

Автоматическое удаление записей в ZoneMinder

Автоматическое удаление записей в  ZoneMinder

Сколько не искал как настроить ZM, чтобы он сам удалял старые записи, так и не смог найти. Пришлось сделать свой костыль на PHP. Скрипт писался исключительно для себя, и не претендует на правильность.

<?php
$servername = ""; // IP адрес MySQL сервера
$database = "zm"; // Имя БД
$username = ""; // Имя пользователя БД
$password = ""; // Пароль пользователя БД
$path = ""; // Путь к папке с записями
$interval = "7"; // Удалять записи старше N дней

// Создаем соединение
$mysqli = new mysqli($servername, $username, $password, $database);

// Получаем записи старше N дней
$result = $mysqli->query('SELECT * FROM `Events` WHERE StartDateTime < (NOW() - INTERVAL '.$interval.' DAY)');
$rows = $result->fetch_all(MYSQLI_ASSOC);

// Форматируем дату
$arrDates = array();
foreach($rows as $row) {
    $date = explode(' ', $row['StartDateTime'])[0];
    array_push($arrDates, $date);
}
// Удаляем дубликаты дат
$arrDates = array_unique($arrDates);

// Удаляем папки старше N дней
foreach($arrDates as $date) {
    // Удаление для каждого монитора отдельно
    exec('rm -R '.$path.'5/'.$date);
    exec('rm -R '.$path.'6/'.$date);
}

// Удаляем записи старше N дней
$mysqli->query('DELETE FROM `Events` WHERE StartDateTime < (NOW() - INTERVAL '.$interval.' DAY)');

// Закрываем соединение
$mysqli->close();

Скрипт запускается командой php script.php из консоли и может быть добавлен в cron.


Датчик протечки или система Анти-кот в Home Assistant

Датчик протечки или система Анти-кот в Home Assistant

Кот повадился гадить на входной коврик, да так метко, что иногда не замечаешь, вся лужа под ковриком! Что бы не портился ламинат от влаги, пришлось быстро собрать на коленке систему анти-кот которая будет оповещать о совершенном котом преступлении. Для этого понадобилось:

  • Макетная плата
  • NodeMCU или Wemos
  • Резистор 10кОм
  • Пару проводов
  • Пару полосок фольги
  • Припой
  • Паяльник
  • Блок питания MicroUSB 5V

Схема выглядит так

Схема системы анти-кот

Конфиг ESPHome для прошивки:

esphome:
  name: leak-detector
  platform: ESP8266
  board: nodemcuv2

# Enable logging
logger:

# Enable Home Assistant API
api:

ota:
  password: ""

wifi:
  ssid: ""
  password: ""

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Leak-Detector Fallback Hotspot"
    password: ""

captive_portal:

sensor:
  - platform: wifi_signal
    name: "Leak Sensor WiFi Signal"
    update_interval: 15s
    filters:
      - sliding_window_moving_average:
          window_size: 15
          send_every: 15
          send_first_at: 15
    icon: mdi:wifi
    
  - platform: adc
    pin: A0
    icon: mdi:lightning-bolt
    name: "Leak Voltage"
    update_interval: 1s
    filters:
      - multiply: 3.3
    
  - platform: adc
    pin: A0
    icon: mdi:water-alert
    name: "Sink Leak"
    id: sink_leak
    update_interval: 1s
    filters:
      - multiply: 3.3
    internal: true
          
binary_sensor:
  - platform: template
    name: "Leak Status"
    lambda: |-
         float analog = id(sink_leak).state;
         return analog < 2.5; 

В роле контактов я использую полоски фольги с приклеенными к ним малярным скотчем проводами:

Контакты из фольги

В Home Assistant это выглядит так:

Анти-кот в Home Assistant

Система относительно простая, но рабочая. Из минусов — необходимо подводить питание. Если нету рядом розетки, то это немного проблематично. Можно также использовать и как датчик протечки воды.

Подвох с интеграцией Xiaomi Mi LED Desk Lamp в Home Assistant

Подвох с интеграцией Xiaomi Mi LED Desk Lamp в Home Assistant

Xiaomi Mi LED Desk Lamp(MJTD01YL)

Купили пару настольных ламп от Xiaomi заранее посмотрев список поддерживающихся устройств.

Модель в списке поддерживающихся
Модель в списке поддерживающихся

Но тут я столкнулся с проблемой — отсутствует пункт включения локального управления лампой! Соответственно добавить лампу через интеграцию Yeelight не получится.

Отсутствует пункт включения управления по LAN

После гугления проблемы оказалось, что после очередного обновления приложения Yeelight зачем-то убрали этот пункт. Решение — откатить приложение Yeelight и включить локальное управление, а затем можно обновиться до последней версии.

В старой версии приложения есть пункт включения LAN режима

После включения режима лампа без проблем добавляется в Home Assistant через стандартную интеграцию.

Лампа в Home Assistant

Альтернативная интеграции потолочной лампы Yeelight в Home Assistant

Альтернативная интеграции потолочной лампы Yeelight в Home Assistant

Yeelight — Каталог товаров — Яндекс.Маркет

Так как меня изрядно задолбало видеть «unavailable» и идти перещелкивать автомат на свет, то я начал искать выход из положения. Нашел интеграцию через MIIO https://github.com/al-one/hass-miio-yeelink.
Интеграция ставится либо вручную в папку custom_components, либо через HACS.

Для добавления понадобиться токен устройства, который можно посмотреть через шлюз, либо через модифицированный Mi Home от vevs.

После добавления появится 1 объект(по крайней мере для моей модели ceiling20) light без ночного режима и RGB подсветки. Для добавления ночника необходимо создать кнопку и написать автоматизацию.

configuration.yaml:

input_boolean:
  yeelink_nightlight:
    name: nightlight
    icon: mdi:lightbulb

automations.yaml:

- alias: Nightlight Off
  trigger:
  - platform: state
    entity_id: input_boolean.yeelink_nightlight
    to: "off"
  action:
    - service: miio_yeelink.send_command
      data:
        entity_id: light.xiaomi_yeelink
        method: set_ps
        params:
        - nightlight
        - 'off'

- alias: Nightlight On
  trigger:
  - platform: state
    entity_id: input_boolean.yeelink_nightlight
    to: "on"
  action:
    - service: miio_yeelink.send_command
      data:
        entity_id: light.xiaomi_yeelink
        method: set_ps
        params:
        - nightlight
        - 'on'

Получим результат:

Да, пока нету поддержки RGB подсветки, но думаю в будущем автор ее добавит. Мне же не особо важна подсветка, а в крайнем случае ей можно управлять через приложение Yeelight. Самое главное, что теперь моя лампа не отваливается несколько раз в сутки, и не приходится бегать дергать автомат, что бы можно было включать с Яндекс.Станции.

Интеграция GyverLamp в Home Assistant

Интеграция GyverLamp в Home Assistant

Лампа Гайвера декоративный светильник | Festima.Ru - Мониторинг объявлений

Шьем свою ESP прошивкой с MQTT отсюда. В Home Assistant в configuration.yaml добавляем:

input_number:
  gl_brightness:
    name: Brightness
    initial: 10
    min: 1
    max: 255
    step: 1
    icon: mdi:brightness-6
  gl_speed:
    name: Speed
    initial: 30
    min: 0
    max: 255
    step: 1
    icon: mdi:speedometer

  gl_scale:
    name: Scale
    initial: 30
    min: 1
    max: 100
    step: 1
    icon: mdi:ruler
    
input_select:
  gl_effect:
    name: Effects
    options:
      - "Конфетти"
      - "Огонь"
      - "Радуга верт."
      - "Радуга гориз."
      - "Смена цвета"
      - "Безумие 3D"
      - "Облака 3D"
      - "Лава 3D"
      - "Плазма 3D"
      - "Радуга 3D"
      - "Павлин 3D"
      - "Зебра 3D"
      - "Лес 3D"
      - "Океан 3D"
      - "Цвет"
      - "Снегопад"
      - "Матрица"
      - "Светлячки"
      - "Аквариум"
      - "Звездопад"
      - "Пейнтбол"
      - "Спираль"
      - "Теплый свет"
      - "Маятник"
      - "Мерцание"
      - "Полицейская сирена"
      - "Дрейф"
      - "Стая"
      - "Мотыльки в банке"
      - "Демо"
    initial: "Демо"
    icon: mdi:panda

В automations.yaml:

- alias: Gyver Speed
  trigger:
    platform: state
    entity_id: input_number.gl_speed
    
  action:
    - service: mqtt.publish
      data_template:
        topic: homeassistant/light/ESP-dec1cf/effect/speed/set
        payload_template: "{{ trigger.to_state.state | int }}"
    
- alias: Gyver Scale
  trigger:
    platform: state
    entity_id: input_number.gl_scale
    
  action:
    - service: mqtt.publish
      data_template:
        topic: homeassistant/light/ESP-dec1cf/effect/scale/set
        payload_template: "{{ trigger.to_state.state | int }}"
        
- alias: Gyver Brightness
  trigger:
    platform: state
    entity_id: input_number.gl_brightness
    
  action:
    - service: mqtt.publish
      data_template:
        topic: homeassistant/light/ESP-dec1cf/brightness/set
        payload_template: "{{ trigger.to_state.state | int }}"
        
- alias: Gyver Effect
  trigger:
    - platform: state
      entity_id: input_select.gl_effect
  action:
    - service: mqtt.publish
      data_template:
        topic: homeassistant/light/ESP-dec1cf/effect/set
        retain: true
        payload: "{{ states('input_select.gl_effect') }}"

Радуемся: