Home Assistant
Home Assistant
Пока это заготовка статьи про домашнюю автоматизацию и реализацию некоторых фич
Прежде чем начать
Для удобства работы (что б меньше возиться c UI) удобно выпустить токен и читать данные через API
- Профиль (снизу справа)
- Безопасность
- Долгосрочные токены доступа
Токен выглядит как-то так
eyJhbGciOiJIUzI1NiIsInR5cCI6Ikp <пропущенно-много-букав> sImlhdCI6MTcyMTkwNzUzNywiZXhwIjoyMDM3MjY3NTM3fQ.YDLTNoOFebK4BVHFo-V1q7a84Cs78Z0b3H2e-F5mBpk"
Сразу сохранить, в открытом виде он показывается один раз
Ссылки
Пока что тут в основном ссылки
- WebOS : https://www.home-assistant.io/integrations/webostv/
- ModKam Реле https://www.youtube.com/watch?v=u3zDXNGVbgo
- (рус) Базовая установка в контейнерах https://habr.com/ru/articles/731110/
- (рус) Тут кой-какие примеры ручного добавления в конфиги - https://sprut.ai/article/home-assistant-statya-3-dobavlyaem-ustroystva (но качество статьи спорное)
- Прошивки
Zigbee2Tasmota
- Тут вроде бы должно быть описание как интегрироваться с ХА ноя ничего не понял https://thehelpfulidiot.com/how-to-use-zigbee2tasmota-with-home-assistant
Прошивки
- Tasmota https://zigbee.blakadder.com/Sonoff_ZBBridge-P.html
- Еще одна инструкция по прошивке бриджа https://dialedin.com.au/blog/sonoff-zbbridge-p-setup
- Ещ инструкция (по-моему самая полная и правильная) https://notenoughtech.com/home-automation/tasmota-on-sonoff-zb-bridge-pro/#flash
Термины и понятия
Когда что использовать
- Срабатывание по условию -> automation (с trigger описывающим условие)
- Если automation сложный, то код можно разбить на несколько скриптов
automation = логика запуска + условия + действия;
automation
Automation — правило “если-то”:
automation:
- alias: Door opened → notify
trigger:
- platform: state
entity_id: binary_sensor.external_door
from: 'off'
to: 'on'
condition: []
action:
- service: notify.chat
data: {message: "Дверь открыта"}
script
Script — именованная последовательность action (шагов).
Не имеет триггера, запускается вручную (кнопкой/сервисы) или из automation.
Скрипт можно так же рассматривть как процедуру (для группировки и переиспользования кода)
script:
send_door_alert:
alias: Send door alert
sequence:
- service: notify.chat
data: {message: "Дверь открыта"}
Вызов из automation:
action: - service: script.send_door_alert
Пример скрипта
Помещать в файл scripts.yaml или любой другой определенный в script: !include scripts.yaml
tv_living_room_wol:
alias: "TV Living Room: Power On (WOL)"
sequence:
- service: wake_on_lan.send_magic_packet
data:
mac: "38:8c:50:00:a3:14"
Что бы запустить скрипт можно добавить кнопку
Настройки панели --> добавить карточку (справа внизу) --> Объект (что бы вписать вкод вручную)
type: button
name: Включить ТВ
icon: mdi:television
tap_action:
action: call-service
service: script.turn_on
target:
entity_id: script.tv_living_room_wol
hold_action:
action: none
double_tap_action:
action: none
show_state: false
trigger
Trigger — часть automation. Это событие, которое запускает automation: смена состояния, время, MQTT-сообщение, вебхук, нажатие кнопки и т.д. Сам по себе trigger вне automation не существует.
Примеры триггеров:
state (изменение состояния сущности) time / time_pattern event / webhook mqtt device (из интеграций) numeric_state (порог)
script = только действия;
trigger = причина старта automation.
Разбор примера автоматизации
- alias: external_door_open_logged
description: "Открытие Внешней Двери (с логированием)"
mode: parallel
trigger:
- platform: state
entity_id: binary_sensor.sonoff_external_door_sensor_contact # твоя сущность
from: 'off'
to: 'on'
variables:
from: "{{ trigger.from_state.state if trigger.from_state is not none else 'none' }}"
to: "{{ trigger.to_state.state if trigger.to_state is not none else 'none' }}"
action:
- choose:
- conditions: [] # сюда твои прежние условия (если были)
sequence:
- service: logbook.log
data:
name: "door_automation"
entity_id: binary_sensor.external_door
message: "TRIGGERED ({{ from }} → {{ to }})"
- service: system_log.write
data:
logger: automation.door
level: info
message: "[door] sending notify ({{ from }} → {{ to }})"
- service: system_log.write
data:
logger: automation.door
level: info
message: "[door] notify SENT"
default:
- service: system_log.write
data:
logger: automation.door
level: info
message: "[door] SKIPPED: conditions not met ({{ from }} → {{ to }})"
mode
alias: external_door_open_loggedПо этомdescription: "Открытие Внешней Двери (с логированием)"mode: parallelРежим выполнения автоматики при повторном запуске до завершения предыдущего- single — новый запуск игнорируется.
- restart — оборвать текущий, начать заново.
- queued — поставить в очередь (можно max).
- parallel — запустить ещё один экземпляр параллельно.
Тут я хочу запускать автоматизацию не зависимо от того есть ли уже запущенная -> parallel
trigger
trigger:- начало секции триггеров
platform
- platform: state
основные платформы триггеров
Состояния/шаблоны
- state — смена состояния сущности.
- numeric_state — пороги (above/below) для числовых значений/атрибутов.
- template — когда Jinja-шаблон стал true.
Время
- time — в заданный момент (at: "08:30:00").
- time_pattern — по шаблону, типа cron (minutes: "/5").
- calendar — начало/конец события календаря.
Астрономия
- sun — рассвет/закат (+ оффсеты).
- zone — вход/выход из зоны (для device_tracker/person).
- geo_location — объекты geo_location (например, оповещения о землетрясениях).
События/внешние источники
- event — любое событие шины HA (например, telegram_command).
- homeassistant — события ядра (start, shutdown, т.п.).
- webhook — входящий вебхук.
- mqtt — сообщение в топике MQTT.
- tag — скан NFC-тега.
- device — триггеры, определяемые конкретной интеграцией/устройством (кнопки, клики, движения и т.д.).
entity_id
entity_id: binary_sensor.sonoff_external_door_sensor_contactКакой именно сенсор братьfrom: 'off'переход из состоянияto: 'on'в состояние
Тут можно указать только одно - тогда например будет срабатывать при переходе их unknown
condition
condition:(на уровне с trigger)
Дополнительные условия ограничивающие срабатывания
- Временное окно:
condition:
- condition: time
after: "08:00:00"
before: "23:00:00"
- Только когда нет дома
condition:
- condition: state
entity_id: person.max
state: not_home
- Только в темноте (через 30 минут после захода солнца):
condition:
- condition: sun
after: sunset
after_offset: "-00:30:00"
- Батарея датчика > 10% (если конечно такой датчик есть)
condition:
- condition: numeric_state
entity_id: sensor.sonoff_external_door_sensor_battery
above: 10
Шаблон (кастомная логика):
condition:
- condition: template
value_template: "{{ states('alarm_control_panel.home') == 'armed_away' }}"
= variables
variables:from: "Шаблон:Trigger.from state.state if trigger.from state is not none else 'none'}}"to: "{{{{ trigger.to_state.state if trigger.to_state is not none else 'none' }}}}"
= actions
action:
choose
choose не обязателен. Это просто “ветвление” внутри action (как if / elif / else):
проверяет наборы conditions;
выполняет первую подходящую sequence;
если ни одна не подошла — выполняет default (если есть).
Когда нужен:
разные действия при разных условиях;
нужно сделать fallback (например, залогировать «пропущено»), даже если условия не прошли.
Когда не нужен:
одно действие без условий → вызывай сервис напрямую.
Примеры
1) Без условий (тебе хватит этого):
action:
- service: notify.chat
data:
message: "Дверь открыта"
2) Условие “сверху” (без choose):
condition:
- condition: time after: "08:00:00" before: "23:00:00"
action:
- service: notify.chat
data:
message: "Дверь открыта"
Минус: если условие не прошло — ничего не выполнится (и ты не залогируешь «пропущено»).
3) Ветвление с choose (и default):
action:
- choose:
- conditions:
- condition: sun
after: sunset
sequence:
- service: notify.chat
data: {message: "Дверь открыта (ночью)"}
default:
- service: notify.chat
data: {message: "Дверь открыта (днём)"}
4) Логировать “пропущено” (то, ради чего я предлагал choose):
action:
- choose:
- conditions:
- condition: time
after: "08:00:00"
before: "23:00:00"
sequence:
- service: notify.chat
data: {message: "Дверь открыта"}
default:
- service: system_log.write
data:
logger: automation.door
level: info
message: "[door] SKIPPED: conditions not met"
- choose:- conditions: []sequence:
Запись в лог датчика
- service: logbook.logdata:name: "door_automation"entity_id: sensor.sonoff_external_door_sensor_batterymessage: "TRIGGERED (Шаблон:From → Шаблон:To)"
Запись в системный лог
- service: system_log.writeЗапись в системнвй логdata:logger: automation.doorlevel: infoУровень логгированияmessage: "[door] sending notify (Шаблон:From → Шаблон:To)"текст сообщения
- service: system_log.writedata:logger: automation.doorlevel: infomessage: "[door] notify SENT"
default:- service: system_log.writedata:logger: automation.doorlevel: infomessage: "[door] SKIPPED: conditions not met (Шаблон:From → Шаблон:To)"