Рассказываю про умный дом и отвечаю на ваши вопросы №1

В субботу прошел стрим, где я отвечал на вопросы подписчиков. Ниже прикладываю все ссылки и конфиги, которые обсуждались на стриме.

Вопросы и тайм-коды ответов

00:04:49 Про мой умный дом и настройки Home Assistant

00:23:18 Микроволновые датчики

00:30:36 Чат-бот для мамы

00:48:44 Вопрос о работе увлажнителя

01:06:35 Автоматизация с датчиком проксимити

01:13:08 Вопрос о розетке и слайдере + 01:29:31 Выключение розетки по истечении таймера

01:39:06 Вопрос об автоматизации в Telegram

01:52:55 Воспроизведение папок на колонках

02:01:13 Автоматизация воспроизведения на Android боксах

02:04:05 Отслеживание телефона в машине

Если интересно, задача была оптимизировать ворота, чтобы они открывались, когда я выхожу из дома и сажусь в авто, также чтобы сами закрывались, когда я отдаляюсь(находясь именно в авто), еще чтобы ворота сами открывались по приезду(тут возникли сложности, т.к живу за городом и gps сигнал теряется на моменте, когда еду по трассе, находится устройство секунд через 30, после того, как я подъеду к воротам, а хотелось бы заранее, хоть и зона, которая реагирует на открытие ворот находится достаточно далеко от дома всё равно точку gps находит уже только у ворот). Вообщем как-то так, кому интересно задача с обнаружением в авто была решена след. Образом: когда подключается магнитола через автоматизацию в ios запускается определенный режим фокусирования(который я создал именно для авто, он не глушит уведомления и тд, весь функционал я у него убрал, т.к уведомления в авто мне нужны. Это нужно лишь для условия, что я в авто). Далее отсюда у людей возможно возникнут вопросы, а как ложиться спать, возможно включается фокусирование на сон, объясню. Режим фокусирования HA видит при условии, что уведомления на приложение HA заглушены т.е я просто в настройках фокусирования для авто заглушил приложение HA, а в фокусировании для сна оставил HA с уведомлениями, таким образом HA думает, что в машине фокусирование включено, а во сне фокусирование выключено. Приложу на всякий случай скрины

Цитата @queenuis 👆

02:08:44 Интеграция с умным домом Яндекса

02:10:58 Шаблон для проверки состояния устройств

02:48:31 Доступ к хомассистену из глобальной сети

02:49:19 Безопасность и DNS

02:58:57 Использование Meshastic Bridge

03:08:26 Взаимодействие с ассистентом

Приложения

Пример автоматизации освещения

automation:
  - id: function_bathroom_lights_on_motion
    alias: 'Turn on bathroom lights if there is movement'
    trigger:
      - platform: state
        entity_id: binary_sensor.bath_pir
        to: 'on'
    condition:
      condition: template
      value_template: '{{ not is_state("timer.bathroom_lights_manual_mode", "active") }}'
    action:
      - service: scene.turn_on
        data_template:
          entity_id: >
            {% if states('sensor.roland_sleep') in ['should_be_sleeping', 'getting_ready_for_bed', 'sleeping'] %}
              scene.bath_sleep_light
            {% elif states('sensor.time_of_day') in ['evening', 'night'] %}
              scene.bath_night_light
            {% else %}
              scene.bath_day_light
            {% endif %}
  - id: function_bathroom_lights_off_motion
    alias: 'Turn off bathroom lights by the timer'
    trigger:
      - platform: state
        entity_id: binary_sensor.bath_pir
        from: 'on'
        to: 'off'
        for: 00:10:00
      - platform: state
        entity_id: binary_sensor.showering
        from: 'on'
        to: 'off'
      - platform: event
        event_type: timer.finished
        event_data:
          entity_id: timer.bathroom_lights_manual_mode
    condition:
      - condition: state
        entity_id: binary_sensor.bath_pir
        state: 'off'
      - condition: state
        entity_id: binary_sensor.showering
        state: 'off'
      - condition: template
        value_template: '{{ not is_state("timer.bathroom_lights_manual_mode", "active") }}'
    action:
      service: light.turn_off
      data:
        entity_id: light.bath_mirror_lamp
        transition: 8

timer:
  bathroom_lights_manual_mode:
    name: Bathroom lights manual mode
    duration: '00:30:00'
    icon: mdi:motion-sensor-off

Автоматическое включение и выключение увлажнителя

alias: Включить увлажнитель, когда кто-то зашел в комнату
description: ""
triggers:
  - trigger: state
    entity_id:
      - binary_sensor.bath_pir
    to: "on"
conditions:
  - condition: template
    value_template: >-
      {{ not is_state("timer.vremennyi_ruchnoi_rezhim_upravleniia_uvlazhnitelem" "active") }}
actions:
  - action: humidifier.turn_on
    metadata: {}
    data: {}
    target:
      entity_id: humidifier.humidifier
mode: single
alias: Выключить увлажнитель, если никого нет в комнате в течение часа
description: ""
triggers:
  - trigger: state
    entity_id:
      - binary_sensor.bath_pir
    from: "on"
    to: "off"
    for:
      hours: 1
      minutes: 0
      seconds: 0
conditions:
  - condition: template
    value_template: >-
      {{ not is_state("timer.vremennyi_ruchnoi_rezhim_upravleniia_uvlazhnitelem" "active") }}
actions:
  - action: humidifier.turn_off
    metadata: {}
    data: {}
    target:
      entity_id: humidifier.humidifier
mode: single

+ ещё понадобится создать таймер timer.vremennyi_ruchnoi_rezhim_upravleniia_uvlazhnitelem, который позволит временно отключить автоматику и переводить увлажнитель в режим ручного управления.

Пример автоматизации, использующей proximity

alias: Включить увлажнитель при приближении Алисы к дому
description: ""
triggers:
  - trigger: numeric_state
    entity_id:
      - sensor.dom_alice_distance
    below: 3
conditions:
  - condition: state
    entity_id: sensor.dom_alice_direction_of_travel
    state: towards
actions:
  - action: humidifier.turn_on
    metadata: {}
    data: {}
    target:
      entity_id: humidifier.humidifier
mode: single

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

alias: Запускает таймер на N минут
description: ""
triggers:
  - trigger: state
    entity_id:
      - input_number.cherez_skolko_minut_vykliuchit_rozetku
conditions: []
actions:
  - action: timer.start
    metadata: {}
    data:
      duration: >-
        {{ (states('input_number.cherez_skolko_minut_vykliuchit_rozetku') | int) * 60 }}
    target:
      entity_id: timer.vykliuchaet_rozetku_cherez_zadannoe_vremia
mode: single
alias: Выключить свет по истечении таймера
description: ""
triggers:
  - trigger: state
    entity_id:
      - timer.vykliuchaet_rozetku_cherez_zadannoe_vremia
    to: idle
conditions: []
actions:
  - action: light.turn_off
    metadata: {}
    data: {}
    target:
      entity_id: light.desk_spot
mode: single

+ ещё нужно создать вспомогательный таймер timer.vykliuchaet_rozetku_cherez_zadannoe_vremia.

history_stats

sensor:
  - platform: history_stats
      name: Front door openings today
      entity_id: binary_sensor.0x00158d0002b82f82_contact
      state: 'on'
      type: count
      duration:
        hours: 16
      end: '{{ now() }}'

Воспроизведение на одной колонке того же, что и на первой

Вариант примерный (не на чем было протестировать):

script:
  sync_media_players:
    description: "Синхронизация плееров"
    sequence:
      service: media_player.play_media
      data:
        entity_id: media_player.second_player
        media_content_id: "{{ state_attr('media_player.first_player', 'media_content_id') }}"
        media_content_type: music

Автоматизация для управления умным домом по радио через Meshtastic

Управление через Assist (ассистент Home Assistant, который умеет обрабатывать простые интенты):

alias: Управление умным домом через Meshtastic с помощью встроенного ассистента
description: ""
triggers:
  - trigger: mqtt
    topic: mesh/tastic
conditions:
  - condition: template
    value_template: "{{ trigger.payload_json['toId'] == '34928349' }}" # ID вашей ноды, которая принимает пакеты - так фильтруются сообщения «в личку»
actions:
  - action: conversation.process
    data:
      text: "{{ trigger.payload_json['decoded']['text'] }}" # это можно поотлаживать через какой-нибудь MQTTX
      agent_id: conversation.home_assistant
    response_variable: assistant_response
  - action: mqtt.publish # это если нужно отправить ответ ассистента обратно
    metadata: {}
    data:
      evaluate_payload: false
      qos: 0
      retain: false
      topic: meshtastic/radio-network1
      payload: "{{ assistant_response.response.speech.plain.speech }}"
mode: single

«Общение» с YandexGPT:

automation:
  - id: function_meshtastic_chat_bot
    alias: 'Meshtastic chat bot'
    mode: queued
    trigger:
      platform: mqtt
      topic: 'meshtastic/out' # настраивается в Meshtastic Bridge
    action:
      choose:
        - conditions:
            - condition: template
              value_template: "{{ trigger.payload_json['to'] == 3667000000 }}" # ID принимающей ноды, если нужно принимать сообщения из общего чата, то: ^all 
            - condition: template
              value_template: "{{ trigger.payload_json['from'] == 3667000000 }}" # ID отправляющей ноды
          sequence:
            - service: conversation.process
              data:
                agent_id: conversation.unnamed_device
                text: "{{ trigger.payload_json['decoded']['text'] }}"
              response_variable: ai_completion
            - service: mqtt.publish
              data:
                topic: 'meshtastic/in' # настраивается в Meshtastic Bridge
                retain: false
                payload: >
                  {"to": {{ trigger.payload_json['from'] }}, "decoded": {"text": "{{ ai_completion.response.speech.plain.speech }}"}}