В субботу прошел стрим, где я отвечал на вопросы подписчиков. Ниже прикладываю все ссылки и конфиги, которые обсуждались на стриме.
Вопросы и тайм-коды ответов
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
- Решения попроще
- Решения, если разбираетесь в SQL или программировании
01:52:55 Воспроизведение папок на колонках
- Воспроизведение на одной колонке того же, что и на первой
- Воспроизведение всей директории целиком
- Никак, но…
- Emby
- Music Asssitant (от разработчиков HA)
- Multiroom аудиосистема для дома
- Music Assistant
- Emby
- Lyrion Music Server (аддон для HA + поддержка DLNA)
- Mopidy
02:01:13 Автоматизация воспроизведения на Android боксах
- Синхронизация Kodi
- MySQL
- Emby
- Jellyfin
- И другие
02:04:05 Отслеживание телефона в машине
- Activity Sensor
- Bluetooth-метка в машине: iBeacon Region Entered
- NFC, приклеенный на держалку для телефона: Bringing your device near an NFC tag or scanning a QR code will show a notification which, when tapped, will launch the app and fire an event.
- Держалка с зарядкой: Battery Sensors
- Костыли
- sensor.distance
- sensor.bssid + мобильный роутер в машине
- ESP32 + мобильный роутер + может быть BLE scan
Если интересно, задача была оптимизировать ворота, чтобы они открывались, когда я выхожу из дома и сажусь в авто, также чтобы сами закрывались, когда я отдаляюсь(находясь именно в авто), еще чтобы ворота сами открывались по приезду(тут возникли сложности, т.к живу за городом и 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 }}"}}