Просмотрено
Tag: Hass

Гибернация компьютера в 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
      

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

Интеграция ИБП 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: "Питание восстановлено"

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

Датчик протечки или система Анти-кот в 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') }}"

Радуемся: