Home Assistant – одна из самых популярных систем домашней автоматизации, поддерживающая устройства различных производителей. Тут можно завязать в один сценарий устройства Sonoff, Xiaomi и Tuya. Настроить под себя интерфейс. Сделать отправку оповещений в Telegram. И полностью избавиться от облачных сервисов от производителей умного дома.
Home Assistant является open-source проектом и работает на Python. В качестве сервера может выступать как одноплатный Raspberry Pi, так и обычный ПК под управлением Windows или Linux.
Ознакомиться с возможностями программного обеспечения, а так же оценить интерфейс можно на сайте с онлайн-демонстрацией.
Настройка Home Assistant
На данном сайте можно найти уроки по установке и настройке Home Assistant. Для удобства привожу полный список:
- Установка Home Assistant на Windows.
- Установка HA на Raspberry Pi 4.
- Первые настройки: file editor, системные сенсоры, интерфейс.
- Настраиваем резервное копирование в Google Drive.
- Инструкция по добавлению Xiaomi Gateway 2 в Home Assistant.
- Добавление розетки Xiaomi и светильников Yeelight.
- Как создать карту дома и расположить на ней датчики и устройства.
- Устанавливаем расширение HACS.
- Добавляем робот-пылесос Xiaomi Vacuum Cleaner Mop в Home Assistant.
- Получаем информацию о подключенных к роутеру Mikrotik устройствах и выводим ее на карту дома.
- Считаем, сколько времени была включена розетка или другое умное устройство.
- Автоматизации в Home Assistant. Структура.
- Примеры сценариев автоматизации в Home Assistant.
- Как запустить сценарий Home Assistant при нажатии на кнопку Aqara D1.
- Ping в Home Assistant
Некоторые возможности веб-интерфейса Home Assistant
-
Добавление плана помещения с расположенными на нем умными устройствами и дальнейшее управление приборами простым нажатием на иконку. Захотели включить или выключить свет в определенной комнате — нажали на соответствующую лампочку. Посмотреть определенную камеру — нажали на ее иконку и получили изображение. Посмотреть историю открытия входной двери или последнее замеченное движение в коридоре? Тоже не проблема — нажимаем на нужный значок и получаем всю необходимую информацию.
-
Одна из самых полезных функций — выключение света во всей квартире одним нажатием на нужный значок. При наличии охранных датчиков можно так же легко управлять и постановкой квартиры на охрану.
- Умный дверной звонок с камерой — просматривайте историю звонков, а также время последнего движения у входной двери.
- Используя умные лампы свет можно не только включать и выключать, но и изменять температуру и яркость (должно поддерживаться устройством).
- При наличии Mi flora plant sensor можно вывести на экран текущие значения яркости, температуры и влажности у Ваших домашних цветов.
- И многое многое другое.
Плюсы Home Assistant
- Большой выбор устройств и плагинов. Список поддерживаемого оборудования можно найти на официальном сайте.
- Настраиваемый веб-интерфейс. Программное обеспечение имеет веб-интерфейс, на который выводятся все устройства и дополнительная информация. Все это можно настроить под себя — добавить нужные вкладки, расположить блоки в удобном порядке, нарисовать карту.
- Автоматизация. Куда больше различных возможностей для автоматизации по сравнению со стандартными приложениями, такими как MiHome.
- Система постоянно обновляется — добавляется поддержка новых девайсов, появляются новые возможности, улучшается интерфейс.
- Большое количество информации по системе. Ответы практически на все вопросы можно легко найти на официальном сайте, Youtube каналах или на сайтах про умный дом. Все таки Home Assistant — самая популярная на данный момент система домашней автоматизации.
- Работа с оборудованием напрямую, без использования китайских серверов, соответственно их блокировка или недоступность никак не скажется на работе умного дома.
Из минусов стоит выделить разве что большое количество времени, которое потребуется на то, чтобы разобраться в системе. Это не Mi Home, который настраивается за 10 минут. Тут потребуется потратить несколько недель, а может даже и месяцев для реализации всего требуемого функционала. Но результат однозначно того стоит.
Время на прочтение
14 мин
Количество просмотров 173K
Home Assistant – популярное приложение с открытым исходным кодом для организации умного дома. Первый опыт автора в работе с Home Assistant основывается на попытке интеграции в него ‘умной рисоварки‘. Автор постарается описать основные компоненты и возможности данного приложения, с которыми ему привелось пошагово познакомиться. Статья является в чем-то обзором, в чем-то руководством для желающих начать свое знакомство с Home Assistant.
Тем, у кого мало свободного времени, советую пропустить присказку – первую главу – и перейти сразу ко второй. Вам нужно знать только, что работать мы будем с умной китайской рисоваркой от Xiaomi.
Умная рисоварка
Рисоварка, очевидно, — это устройство для приготовления риса. Вики демонстрирует нам керамические рисовые пароварки из Британского музея, датирующиеся 1250 г. до н.э. В 1945 году корпорация Mitsubishi стала первой в Японии компанией, производящей домашнюю электрическую рисоварку. Наша модель — Rice Cooker от Xiaomi – может готовить не только рис. “Это великолепное устройство для приготовления не только риса, но других типов блюд. Оно может готовить и супы, и пирожные, и многое другое” — говорится в рекламе. Но самое главное — это наличие wi-fi модуля, ПО с возможностями автоматизации и 200+ программно установленных рецептов. “Путь к умному дому через желудок – это правильно”, подумал автор, и решился.
Xiaomi Rice Cooker, как и подобает цифровому устройству, внешне очень привлекательна, радует округлостью форм и общим минимализмом. Для её настройки и использования производитель предлагает приложение Mi Home. После регистрации Mi account, программа легко отыскивает новое устройство, и вы регистрируете его в вашей локальной сети. Интерфейс приложения не самый плохой, предоставляет базовые средства для автоматизации, может принимать уведомления от устройств. Однако, есть существенные недостатки. Не всех может порадовать отправление информации разработчику о каждом клике пользователя. И неприятное выражение находит часто упоминаемый нынче национальный калорит. Вместо 200+ рецептов на иностранные языки переведено и доступно всего лишь четыре. Остальное – исключительно для китайского народа. Когда ваша ‘умная’ рисоварка не способна выполнять все обещаные кулинарные обязанности, тут, согласитесь, становится грустно. Побродя некоторое время по интернетам, погрустневший автор наткнулся на следующий интересный проект (вечных благ автору). Который оказался посвящен разработке модуля для некоего Home Assistant.
Home Assistant
Сперва, немного общей информации. Как нам говорят на домашней странице HA, ”Это ПО с открытым кодом для автоматизации умного дома, ориентирующееся на локальное управление и конфиденциальность. Развиваемый трудом открытого сообщества энтузиастов, он отлично подходит для работы на Raspberry Pi или локальном сервере.” Проекту более пяти лет, он использует python и лицензию Apache 2.0. Версия релиза на момент написания этих строк – 0.99.3.
Для управления устройствами HA использует отдельные модули (integrations, или components). Создать такой довольно просто. На сайте можно найти каталог основных (одобренных и поддерживаемых сообществом) модулей. Среди общего их количества (1485 штук) попадаются совершенно разнообразные, в каталоге значятся имена amazon, google, xiaomi, и даже один раз yandex.
Попробуем установить HA в виртуальное окружение на линукс десктопе. Нам понадобится python3 и менеджер пакетов pip.
python3 -m venv homeassistant # Создаем виртуальное окружение
cd homeassistant
source bin/activate # Активируем виртуальное окружение
python3 -m pip install homeassistant # Устанавливаем Home Assistant
hass --open-ui # Запускаем Home Assistant
После этого на http://localhost:8123 станет доступнен графичекий интерфейс HA. При первом входе потребуется создать аккаунт пользователя. Веб-интерфейс HA довольно объемен. Пара важных элементов, о которых стоит упомянуть в самом начале, это закладка Configuration → General, где вы легко можете перезагрузить файлы конфигурации или сам сервер. А также страница Info в списке Developers tools, где можно посмотреть логи ошибок.
Все необходимые пользователю данные HA хранит, в случае линукс, в папке настроек “~/.homeassistant”. Файлы настройки записаны в формате YAML, и основной из них – это “configuration.yaml”. Он объединяет данные модулей, автоматизаций, etc. Возможность импорта позволяет разбить настройки на отдельные логически организованные файлы. Модули же хранятся в подпапках “components” (встроенные) и “custom_components”.
Этих знаний для установки нового модуля нам должно быть достаточно. Копируем с репозитория папку “xiaomi_cooker” в нашу “~/.homeassistant/custom_components”. Согласно описанию, добавляем настройки модуля в файл “configuration.yaml”:
configuration.yaml
xiaomi_cooker: # Имя модуля
name: 'Akari' # Имя устройства
host: 192.168.1.10 # IP адрес устройства
token: '4921def609273302248d040a24243a25' # Замуты протокола Xiaomi
model: chunmi.cooker.normal2 # Модель устройства
Готово. После перезагрузки HA в разделе General → Integrations веб-интерфейса появится запись о новом модуле.
Любой модуль представляет собой некоторый набор объектов (entities) и сервисов (services, по сути — функции). Объекты хранят различные принимаемые от устройств данные. Например, sensor.xiaomi_cooker_temperature – температуру рисоварки, sun.sun – положение солнца. Данные объекта выражаются одним основным значением — статусом (state), и произвольным набором дополнительных аттрибутов (attributes). Сервисы используются для передачи команд и значений устройствам. Например, xiaomi_cooker.start – команда начала работы рисоварки, или homeassistant.check_config – инициализация поиска ошибок в файлах настроек HA. В списке Developer Tools веб-интерфейса находится раздел Services, где можно просмотреть доступный вам список сервисов и поиграться с их вызовами. Рядом есть раздел States, где, соответственно, можно просмотреть и поизменять значения объектов. Нужно заметить, что изменения значений объектов в разделе States имеют односторонний характер. Т.е. если, например, поменять здесь состояние объекта lights.state с off на on, на истинном состоянии устройства это не отразится, и при следующем же обновлении данных от устройства значение объекта будет перезаписано в реальное.
Automation
Основным инструментом управления умного дома являются автоматизации (automation). Добавлять и редактировать их можно с помощью графического интерфеса в разделе General → Automation или непосредственно в файле “automations.yaml”. Основная функция автоматизаций – вызов сервисов при достижении тех или иных условий. Базовые инструменты задания условий вызова значения объектов, в т.ч. данные о времени. Есть и чуть более специфические решения, как, например, события (events). В качестве простого примера автоматизации приведем код, выполняющий обновление данных о плюсанутости автора с периодом в 15 минут:
automations.yaml
- id: '1565889970818' # ID автоматизации
alias: Umpiro decharging # Имя
trigger: # Условия срабатывания
- platform: time_pattern # Тип условия - временной
minutes: /15 # Задание условия (в нашем случае – условие выполняется каждые 15 минут)
condition: [] # Дополнительные условия срабатывания
action: # Выполняемые автоматизацией действия
- data: # Аргументы, передаваемые при вызове сервиса
entity_id: sensor.umpiro_charge # Аргумент (ключ: значение)
service: homeassistant.update_entity # Имя вызываемого сервиса
Нужно заметить, что пока еще не все доступные автоматизации (например, приведенную выше) можно сконфигурировать без редактирования yaml-кода, через графический интерфейс, но разработчики говорят об активной работе над устранением этого недостатка.
Templating
После автоматизаций будет самое время рассказать о шаблонах (templating). Различные элементы настроек в yaml-файлах позволяют использовать вставки на скриптовом языке jinja2. Многие из этих элементов объединены общим названием ‘Templates’, как то service_template или trigger_template. Используя шаблоны, мы получаем доступ к значениям объектов в HA и возможность использовать эти данные в комплексных математических и логических выражениях, что значительно расширяет наш потенциал. В качестве примера, приведем записанный в “configuration.yaml” чуть подусложненный код упомянутого ранее sensor.umpiro_charge. Это template_sensor, i.e. “сенсор, формирующий данные на основании значений других объектов”. Наш сенсор будет представлять собой некоторый аналог постепенно разряжающейся батарейки:
configuration.yaml
sensor: # Название модуля
platform: template # Тип модуля - шаблон
sensors: # Список объектов
# Название объекта – sensor.umpiro_charge
umpiro_charge:
# Задает форму отображения объекта в UI (опционально)
unit_of_measurement: '%'
# Шаблон, задающий значение объекта
value_template: >-
# Получение значения объекта – конвертация фильтром ‘int’
# + проверка на соответствие типа
{% if states('sensor.umpiro_charge')|int('unknown') is number %}
# запись в переменную нового значения объекта
# на основе текущего значения и времени последнего обновления
{% set value = (states('sensor.umpiro_charge')|int - (as_timestamp(now()) - as_timestamp(states.sensor.umpiro_charge.last_updated))/60/15)|round %}
# Тонкая работа фильтрами для ограничения плюсанутости
{{ [[0, value]|max, 100]|min }}
{% else %}
# Значение, используемое HA по умолчанию
# для не определенных состояний объектов
{{ 'unknown' }}
{% endif %}
# ID стороннего объекта, при изменение значения которого
# будет обновляться значение данного объекта
entity_id: []
friendly_name: 'Charge' # Имя объекта
# Задает форму отображения объекта в UI (опционально)
device_class: battery
entity_id мы оставили пустым, поскольку уже добавили автоматизацию, которая будет самостоятельно вызывать обновление данных объекта.
Python Scripts
В свою очередь, для создания новых сервисов простым инструментом являются пайтон-скрипты (python scripts). После добавления в “configuration.yaml” строчки: “python script:”, все файлы с расширением “.py”, которые мы поместим в папку “~/.homeassistant/python_scripts”, станут доступны в качестве сервисов с именами “python_scripts.<file_name>”. Их код выполняется в заранее заданном окружении, где переменные data и hass дают нам доступ к аргументам вызова сервиса, а также объектам и сервисам HA. В качестве примера приведем код файла “charge_set.py” для сервиса “python_scripts.charge_set”. Его функцией будет установка заряда нашей батарейки:
python_scripts/charge_set.py
# Получение первого аргумента вызова
name = data.get('name', 'sensor.umpiro_charge')
# Получение второго аргумента вызова
new_state = data.get('charge', '100')
# Получение данных объекта
attributes = hass.states.get(name).attributes
# Изменение данных объекта
hass.states.set(name, new_state, attributes)
Creating integration
Все что мы сделали с помощью шаблонов и пайтон-скриптов, возможно, было бы проще осуществить написанием отдельного модуля. Как уже говорилось, неофициальные модули хранятся в папке “custom_components”. В будущем нам понадобится объект, хранящий информацию о текущем рецепте для нашей рисоварки, и сервис, позволяющий изменять эти данные. На основе примера из документации создадим для этого новый модуль, “overmind”. Первый шаг – это файл custom_components/overmind/__init__.py:
custom_components/overmind/__init__.py
# Домен для регистрации сервиса
DOMAIN = 'overmind'
# Значение по умолчанию для нашего объекта (рецепта)
DEFAULT_RECIPE = {
"title": "Habr post",
"description": "Post an article on habr.com",
"profile": "471822"
}
# Функция настройки модуля
def setup(hass, config):
# Установка значений объекта
hass.states.set('overmind.current_recipe', 'on', DEFAULT_RECIPE)
# Функция с описанием сервиса установки рецепта
def handle_set(call):
# Получение значения аргумента
recipe = call.data.get(‘recipe’, DEFAULT_RECIPE)
# Выполнение задачи - изменение значения объекта
hass.states.set('overmind.current_recipe', 'set', recipe)
# Регистрация сервиса
hass.services.register(DOMAIN, 'recipe_set', handle_set)
return True
После этого сообщим о новом модуле файлу настроек “configuration.yaml”, добавив в него строчку с названием модуля: “overmind:”. Задача решена.
Lovelace UI
Так называется используемый HA фронтенд. Этот графический интерфейс, через который обычному пользователю предлагается управлять умным домом, является заглавной страницей веб-интерфейса HA. Интерфейс LUI формируется из карточек (сards) разнообразых типов, которые могут отражать значения объектов, служить для вызова функций и прочих задач. Карточки можно распределять по страницам (view), по аналогии с браузерными закладками. Настройка удобно организована через тот же графический интерфейс, но доступна и посредством yaml-кода, для чего там же присутствует встроенный текстовый редактор. Рекомендую заглянуть на страницу https://demo.home-assistant.io/, где приведено несколько различных примеров настройки LUI, и где их легко можно посмотреть, пощелкать и поизменять.
Пример настройки графического интерфейса
Говоря о недостатках интерфейса, к сожалению, разработчики сами признаются, что проект пытается усидеть одновременно на стульях десктопа и смартфона. LUI, по умолчанию, любит самостоятельно определять расположение и размеры карточек, что иногда может превращать нормально выглядящую на мониторе страницу в полную кашу на экране смартфона, и наоборот. Присутствуют некоторые простые инструменты для упорядочения интерфейса, но и они, по моему опыту, не всегда эффективны.
Думаю, не имеет большого смысла описывать создание интерфейса посредством графических инструментов, поэтому я приведу несколько примеров в виде использованного мной yaml-кода. Создав для нашей рисоварки отдельную страницу (view), мы постараемся заполнить её самыми необходимыми элементами так, чтобы это не вызывало отторжения при пользовании с экрана смартфона.
Тут же опробуем те самые простые инструменты упорядочения интерфеса, это – horizontal-stack и vertical-stack. Сперва, создадим vertical-stack из карточек типов entity-button и sensor. Первая будет служить для запуска нашей рисоварки, вторая – для отображения значения температуры:
vertical-stack
cards: # Список карточек стека
- type: entity-button # Тип первой карточки в стеке
entity: sensor.xiaomi_cooker_state # Объект, связанный с данной карточкой
icon: 'mdi:selection' # Иконка для данной кнопки
icon_height: 100px # Размер иконки
name: Offline # Имя под кнопкой
show_icon: true #
show_name: true #
tap_action: # Действие при нажатии
action: call-service # Действие – вызов сервиса
service: script.turn_on # Сервис – вызов скрипта
service_data: # Аргументы вызова сервиса
entity_id: script.order_cooker_start # Аргумент – название скрипта
hold_action: # Действие при удержании
action: none #
- type: sensor # Тип второй карточки в стеке
entity: sensor.xiaomi_cooker_temperature # Объект, связанный с данной карточкой
name: Temper # Имя карточки
type: vertical-stack # Тип карточки – вертикальный стек
Home Assistant включает в себя архив иконок Material Design Icons, которые, через соответствующие имена (например, mdi:selection), можно использовать в элементах настроек. Скрипт (в данном случае, не python-, а yaml-), который мы использовали для вызова сервиса, это еще один удобный инструмент HA.
Теперь объединим приведенный выше vertical-stack с карточкой портрета нашей в теперь уже horizontal-stack. Все будет так же просто:
horizontal-stack
сards: # Список карточек стека
- type: picture # Тип карточки
image: /local/akari_r.jpg # Адрес файла изображения
- # Тут мы помещаем написанный выше код вертикального стека
type: horizontal-stack # Тип карточки – горизонтальный стек
Здесь нужно отметить строчку ‘image:’. Все файлы, которые мы помещаем в папку ‘~/.homeassistant/www’ становятся доступными по ссылке http://localhost/local/filename.
Следующим шагом мы немного поработаем над созданной нами кнопкой вызова сервиса. Для нас было бы удобно, если бы она работала как тумблер, т.е. на включение/выключение, а не так, как это сделано сейчас. Этого можно добиться через использование карточки типа conditional, отображение которой на экране можно регулировать через задание определенных условий. Ниже приведен код для карточки, которая является кнопкой выключения рисоварки и видна только при условии, если рисоварка находится в процессе приготовления блюда:
conditional
card: # Описание содержания карточки
entity: sensor.xiaomi_cooker_state #
icon: 'mdi:star-box-outline' #
icon_height: 100px #
name: Running #
tap_action: #
action: call-service #
service: xiaomi_cooker.stop #
type: entity-button #
conditions: # Условия отображения
# Объект, значение которого проверяется
entity: sensor.xiaomi_cooker_mode
# Значение объекта, необходимое для выполнения условия
state: Running
type: conditional # Тип карточки
Переписав подобным образом ранее созданный код кнопки влючения, и объединив его с этим, мы получим одну кнопку, работающую одновременно на включение и выключение.
Дополним наш интерефейс еще одной карточкой — с отображением времени до окончания приготовления (аналогично карточке температуры), и еще одной – с деталями приготовляемого рецепта (custom:recipe-card). В итоге получим что-то такое:
Custom Cards
Home Assistant помимо богатства встроенного набора типов карточек, конечно же, предоставляет возможность создавать и свои. Такие карточки называются пользовательскими карточками (custom cards), и для их создания используется javascript. Здесь можно ознакомиться с двумя простыми примерами кода. В сети несложно найти готовые карточки, созданные различными энтузиастами, а если хочется поэкспериментировать самому, то полезно будет узнать, что существуют и специальные js-модули, созданные для упрощения работы над написанием новых. Мой опыт обращения с javascript продолжает желать меньшего, поэтому, в качестве примера, я приведу только небольшую часть кода карточки, используемой для выбора и отображения текущего рецепта.
www/recipe-card.js
import {
// Импорт из стороннего модуля lit-element
LitElement,
html,
css
} from "https://unpkg.com/lit-element@latest/lit-element.js?module";
// Класс с описанием новой карточки
class RecipeCard extends LitElement {
// Получение доступа к элементам HA
static get properties() {
return {
hass: {},
config: {}
};
}
// Пример вызова сервиса
callServiceEx() {
this.hass.callService('persistent_notification', 'create', {message: 'example'});
}
// Получение html-кода карточки
render() {
// Получение информации об объекте, связанном с данной карточкой
const entityId = this.config.entity;
// Получение состояния объекта
const state = this.hass.states[entityId];
// Получение аттрибута объекта
const titleStr = state ? state.attributes.title : 'unavailable';
const descrStr = state ? state.attributes.description : 'unavailable';
// Формирование кода карточки
return html`
<ha-card>
<div class="flex" style="margin-top:16px;">
<div class="icon">
<ha-icon icon="mdi:bowl"></ha-icon>
</div>
<div class="header">
<span class="name">Recipe</span>
</div>
</div>
<div class="flex info" style="margin-bottom:16px;">
<span class="recipe-title">${titleStr}</span>
<span class="recipe-descr">${descrStr}</span>
</div>
</ha-card>
`;
}
// Задание имени новой карточки
customElements.define('recipe-card', RecipeCard);
Для использования новой карточки нужно будет добавить в начале файла настроек LUI следующий код:
recipe-card
resources: # Задание внешних ресурсов
- type: module # Тип ресурса – модуль
url: /local/recipe-card.js # Расположение ресурса
и среди списка карточек:
- type: 'custom:recipe-card' # Тип карточки
entity: overmind.current_recipe # Объект, связанный с данной карточкой
Notifications
Необходимой частью умного дома является отправка сообщений пользователю. В HA такие сообщения называются notifications (уведомления) и существует два базовых типа уведомлений. Первый – это внутренние уведомления (persistent notifications). Для их отправки используется встроенный сервис «persistent_notification.create». Список таких сообщений доступен через иконку колокольчика в графическом интерфейсе, они используют markdown разметку и по сути довольно просты.
Другим, более интересным, инструментом является встроенный модуль notify, который через установку дополнительных модулей позволяет передавать сообщения, используя сторонние платформы. В качестве примера рассмотрим модуль для telegram.
Для использования модуля нам, прежде всего, будет необходимо создать бота в самом telegram. При настройке нам понадобится chat_id нашего пользователя и API token бота. Как получить эти данные – детально рассказано по ссылке выше, будем считать, что они у нас готовы. Переходя непосредственно к установке модуля, сперва, как мы уже делали, скопируем его исходники в папку components, а затем добавим его настройки в файл “configuration.yaml”:
configuration.yaml
telegram_bot: # Настройки модуля telegram
platform: polling # Тип модуля
api_key: XXXXXXXXXXXXX # API Token вашего бота
allowed_chat_ids:
XXXXXXX # chat_id вашего пользователя
proxy_url: socks5://XXXXXXXXXXXXX # Адрес нашего любимого прокси
proxy_params:
username: umpiro
password: umpiro_password
плюс настройки модуля notify:
notify: # Настройка модуля notify
name: notify_send # Название сервиса (в нашем случае – будет notify.notify_send)
platform: telegram # Тип модуля
chat_id: XXXXXXX # chat_id вашего пользователя
Модуль telegram позволяет нам отправлять сообщения, картинки, или видео. В качестве примера, создадим автоматизацию для отправки сообщения с картинкой, уведомляющее нас об окончании приготовления блюда.
automations.yaml
- id: '1571074941908' # ID автоматизации
alias: EOC # Имя автоматизации
trigger: # Условия срабатывания автоматизации
# Объект, определяющий срабатывание
- entity_id: sensor.xiaomi_cooker_mode
from: Running # Исходное состояние объекта
# Тип автоматизации – изменение состояния объекта
platform: state
to: Waiting # Конечное состояние объекта
condition: [] # Дополнительные условия
action: # Выполнияемые автоматизацией действия
- service: notify.notify_send # Действие – вызов сервиса
data: # Аргументы, передаваемые при вызове сервиса
title: End of Cooking # Заголовок
message: "EOC" # Сообщение
data: # Дополнительные данные сообщения
photo: # Тип данных - изображение
# Файл изображения
- file: /home/umpiro/.homeassistant/www/cat.jpg
# Заголовок изображения
caption: “EOC”
Послесловие
Home Assistant может заинтересовать тех, кто хочет попробовать организовать локальное управление умным домом. Это широкий, интересный, открыто и активно развивающийся за счет усилий коммьюнити проект. Разнообразие инструментов Home Assistant не может не радовать (некоторые важные я не успел упомянуть). В качестве минуса можно назвать относительную запутанность и неполноту документации.
P.S.
Недавно, 10 октября произошел, не знаю можно ли это назвать релизом, переход проекта от версии 0.99 к версии 0.100.
Цитата из Release Notes:
Welcome to the release notes of yet another wonderful release! No, we’re not going for 1.0, we’re doing 0.100! We feel like we’re not ready yet with our goals for 1.0, but we’re making progress every day. For a sneak peak of what we’re thinking about, check our blog Simple mode in Home Assistant 1.0.
Здравия всем! После первой установки Home Assistant скажу честно, я выпал в осадок! А что же делать дальше? В данной статье расскажу самые основы.
Введение
После привычного MajorDomo, Home Assistant был странной и непонятной разработкой наших западных коллег. Я привык, к MajorDomo, к его структуре, что у него большое русское комьюнити, есть у Сергея, разработчика MajorDomo, шикарный форум, где если нет нужной информации, то всегда можно спросить у сообщества и почти всегда найдется ответ.
Ну вот поставили мы Home Assistant, а дальше что?
Как добавлять устройства? Где хранить данные? Как конфигурировать? Вот основные вопросы которые я задавал. После прочтения статей и просмотра роликов на YouTube в рунете, у меня так и не сложилась в общая картина! Пришлось лезть в официальную информацию на сайте Home Assistant
Логика
Для понимания Home Assistant нужно понять, что логика Home Assistant построена на принципах объектно — ориентированного программирования. Конечное устройство будь то кнопка или реле всегда принадлежат тому или иному классу. Рассмотрим пример:
Мы видим на картинке конечное устройство Гостиная лампа над комодом, которое управляет конечной лампочкой. Если посмотреть поле ID объекта, то нам становится понятно, что конечное устройство принадлежит классу Light, а объект имеет имя commode_lamp. Чтобы обратиться к конечному объекту нам нужно указывать полный ID объекта, те light.commode_lamp. У каждого объекта есть свойства, методы и состояние.
Свойства объектов в Home Assistant называются Атрибуты
Методы объектов в Home Assistant называются Сервисы
Основные единицы
Основными единицами в Home Assistant являются Home Assistant, Устройства, Объекты и Пространства. Доступ к ним можно получить через Настройки -> Home Assistant
Интеграции
Чтобы подключить то или иное устройство нужно использовать Интеграции. Они описываю как работать с тем или иным устройством, какие протоколы использовать, заложенные в них разработчиком конкретной Интеграции.
Устройства
Фактически это контейнер или группа, содержащая один или несколько объектов и привязанный к конкретному физическому устройству, создающийся Интеграциями.
Объекты
Объект это уже конечная единица описывающая то или иное конечное устройство, будь то реле или температурный дачтик. Это самый обширный раздел. Фактически все объекты в Home Assistant находятся в этом разделе. Разделяются по классу объектов. Объекты могут создаваться автоматически Интеграциями, либо в ручную через конфигурационный файл.
В новой системе совсем немного объектов
Пространства
Это тоже контейнер или группу, содержащая один или несколько объектов, только группирует она не физические устройства, а содержит привязку к определенной комнате в вашем доме. Список Пространств формируется вручную.
Привязывать к Пространству можно как Устройства так и Объекты в соответствующих меню.
Заключение
После того, как я понял логику Home Assistant, мне стало намного легче. Во многих описанных статьях и роликах на YouTube в Рунете рассказывается «как сделать?», но на вопрос «почему именно так?» многие не отвечают. После прочтения информации на официальном сайте, главное, что я понял, Home Assistant он просто другой. Он сделан специалистами с другим мышлением, и не всегда оно понятно почему именно так. Данной статьей я начинаю цикл статей о Home Assistant, чтобы людям, которые хотят внедрить его у себя, было намного легче понять его.
Знакомство
Добавляя очередное, только что приобретенное, устройство в HA, я понял, что так дальше продолжаться не может и архитектура моего проекта должна быть переписана с чистого листа. Мой зоопарк устройств насчитывает не так много жителей, всего около 30 различных лампочек, кнопочек, датчиков и прочих вещей, которых, раз вы читаете эту статью, и в вашем доме не меньше. Home Assistant дает огромные, если не безграничные, возможности для реализации управления своим умным домом, но в этом и кроется проблема, так как нет единых стандартов, даже нет примеров как «хорошо» и как «плохо», и вы вольны творить то, что вашей душе угодно, пока весь ваш проект превращается в одну большую свалку, где все автоматизации и компоненты живут своей жизнью, а не являются частью однородной системы.
Этот цикл статей будет посвящен попытке создать идеальную конфигурацию Home Assistant с углублением в каждую функцию и настройку этого гиганта. Если вы не хотите сильно запариваться над тем, чтобы все было идеально до блеска, то можете просто подчеркнуть для себя интересные моменты.
Железо
Рассматривать Raspberry как основой сервер умного дома стоит только в том случае, если вы пока не готовы тратить большую сумму на полноценное оборудование. Моя сборка основана на Raspberry Pi 4B, так как это один из самых мощных вариантов из доступного ценового сегмента.
Многие знают, а кто-то и сталкивался, с проблемой умирающих карт памяти, которые просто изнашивают весь свой заложенный цикл перезаписи за год, а иногда и меньше, поэтому было принято решение использовать чип eMMC с помощью переходника с Aliexpress. Кстати, сейчас вышли новые версии, я так понимаю, на основе ROCK PI 4, выглядят посимпатичнее.
Конечно же, не забудем про корпус, ибо внешний вид никто не отменял. На KickStarter представили еще один очень крутой корпус от Cooler Master, но пока он только едет и не известно, когда придет. Поэтому пока воспользуемся Argon Neo, один из самых красивых, как по мне, и подходящих под наши задачи корпус (потому как Argon One, например, больше предназначен как компьютерный корпус, а не серверный).
Собираем это все в единую кучу и немного огорчаемся, потому как переходник не влезает в корпус, но быстро находим кусок наждачной бумаги, подсточим края и все влезает (возможно, позже перепаяю это соединение, либо заверну в термоусадочную трубку, но на время тестов оставим так).
Установка
Первая проблема, с которой вы столкнетесь, если будете использовать eMMC память — ее поддержку добавили только с недавним обновлением bootloader’а, так что для начала необходимо будет обновить его. Есть несколько вариантов как это сделать, я выбрал самый простой и воспользовался утилитой Raspberry Pi Imager. Берем обычную карту памяти (которая работает в raspberry без танцев с бубном), подключаем к компьютеру, устанавливаем и открываем утилиту, там идем по пути «Choose OS -> Misc utility images -> Raspberry Pi 4 EEPROM boot recovery» и записываем образ на карту памяти. После этого вставляем в вашу малинку, подключаем питание, ждем пока зеленый светодиод не начнет мигать (около 10 секунд) — все, загрузчик обновлен, можно двигаться дальше.
Наконец подготовительные работы закончены и мы перейдем к пункту, который охватит большую часть читателей. Установка Home Assistant. Перепробовав разные способы за длительное время — от HassOS до голой установки HA Core, я сделал следующие выводы по каждому из способов.
Home Assistant OS — должен использоваться тем, кто впервые сталкивается с HA, так как иначе справиться с наплывом информации весьма проблематично. По сути, единственный минус, который вы получаете при таком варианте установки — у вас нет возможности пользоваться операционной системой как линуксом, от слова совсем, нельзя установить никакие дополнительные программы, пакеты, надстройки напрямую в ОС.
Home Assistant Container — лучший вариант, если вы хотите абсолютного контроля над каждым программным компонентом на вашем сервере. Вы всегда контролируете к каким данным, интерфейсам, портам имеет доступ любой из контейнеров. Но это так же и главный минус, так как вы очень сильно теряете в удобстве, у вас больше нет вкладки Hassio и вы один в поле, любой addon (к примеру, zigbee2mqtt, node-red, mosquitto и тд) вам придется устанавливать, настраивать и интегрировать это все в контейнер Home Assistant вручную. Лично мне этот вариант нравится идеей, но сам я не смог протянуть, слишком много времени необходимо уделять на то, что при обычном раскладе делается одной кнопкой.
Home Assistant Core — самый странный вариант из всех. Произведя установку данным способом, вы лишаетесь все того же пресловутого hassio со своим магазином (все те минусы, что были описаны выше), так еще и полностью засорите вашу основную систему (в отличии от варианта с докер контейнером, где система остается первозданно чистая).
Home Assistant Supervised — вариант, если мы хотим удобства базовой Home Assistant OS, но при этом нужен доступ к операционной системе. Магазин Hassio доступен только при установке этим и базовым способами. К минусам можно отнести то, что нужно соблюдать некоторые требования и быть весьма аккуратным при работе в основной операционной системе, так как supervised решение устанавливает все пакеты прямо внутрь вашей ОС.
Мой выбор остановился на Supervised вариации, хотя концептуально очень нравится контейнерное решение, может однажды я решусь и перейду на него, но пока что удобство берет верх.
Хорошо, с вариацией мы определились. Теперь приступим к самой установке. Для начала определимся с дистрибутивом. Мне лично больше нравится Ubuntu, по разным причинам, это дело каждого, и на Ubuntu есть возможность поставить HA Supervised. Но я столкнулся с большим количеством проблем уже после установки, в виде неработающего network manager и некоторыми незначительными, но вплоть до сегодняшнего дня я пользовался именно такой версией. Сегодня мы попробуем максимально приблизиться к официально поддерживаемой установке, хотя и осознанно будем нарушать правила. Информацию о том, как сделать установку официально поддерживаемой, можно найти тут. Если вы прочитаете требования, которые там предоставлены, то увидите пункт «Debian Linux Debian 10 aka Buster (no derivatives)», то есть Raspbian не является поддерживаемой ОС. Подумав, я принял решение все же ставить Raspbian, так как в ней заложено и настроено много софта для работы с Raspberry Pi (обновления загрузчика, настройки, управление внутренними регистрами, конфигами и тп), при этом Lite версия ничем не отличается от голой установки Debian 10.
Установка Raspbian (новое название Raspberry Pi OS) очень проста. Воспользуемся все той же утилитой Raspberry Pi Imager, выбираем образ Raspberry Pi OS Lite, выбираем eMMC память и нажимаем кнопку записи. На выходе будем иметь разбиение на несколько разделов, заходим в самый маленький раздел (он единственный форматирован в fat32 и потому будет доступен и из под windows), и создаем пустой файл ssh (можете создать текстовый файл и переименовать без расширения.txt)
Далее создаем нового пользователя (в моем случае, flamingo) согласно инструкции по обеспечению безопасности. Удаляем базового пользователя pi и его домашнюю директорию, больше они нам не понадобятся. На этом этапе соединение ssh разорвется, подключитесь снова, используя новые данные.
Теперь открываем конфигуратор Raspberry, командой
sudo raspi-config. Выбираем 4 пункт и в нем настраиваем часовой пояс согласно вашему. В 3 пункте можете выбрать страну, чтобы активировать WiFi модуль (отключен, пока не выберете доступные частоты). Далее очень важный 7 пункт, в нем выбираем первую опцию «A1 – expand file system», после чего подтверждаем, нажимаем Finish и соглашаемся на перезагрузку.
После того, как сервер включился, опять подключаемся по ssh и вводим команду для обновления всех пакетов sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y. После чего необходимо еще раз перезагрузиться, можно использовать команду sudo reboot.
Теперь непосредственно установка Home Assistant Supervised.
Для начала подготавливаем систему.
- Вводим команду sudo apt-get install -y software-properties-common apparmor-utils apt-transport-https avahi-daemon ca-certificates curl dbus jq network-manager для установки всех недостающих пакетов.
- Отключаем ModemManager, так как возможны конфликты, командой sudo systemctl disable ModemManager & sudo systemctl stop ModemManager.
- Устанавливаем Docker командой curl -fsSL get.docker.com | sudo sh, если у вас возникла ошибка во время установки — перезагружаем Raspberry и вводим команду еще раз, перезагрузкой все лечится
- Добавляем текущего пользователя в группу docker (flamingo поменять на имя своего пользователя) командой sudo usermod -aG docker flamingo.
- Загружаем установщик HA в текущую директорию curl -Lo installer.sh https://raw.githubusercontent.com/home-assistant/supervised-installer/master/installer.sh.
- Запускаем установщик с необходимыми нам параметрами, указав директорию конфигурации по удобному нам пути (например, прям в /home/flamingo, либо /home/flamingo/hassio, я выбрал второй вариант, так как не хочу захламлять домашнюю директорию) командой sudo bash installer.sh -m raspberrypi4 -d /home/flamingo/hassio.
После этого начнется установка Home Assistant Supervised. Через пару минут будет доступен онлайн статус по адресу http://ip.ip.ip.ip:8123, можете следить за ходом выполнения.
На этом этап установки заканчивается, следующим этапом будет настройка и конфигурация, о чем мы поговорим в следующих статьях. Данная статья является вводной и далее пойдет уже основная часть, ради чего это все делается.
Home Assistant — это популярная система умного дома, которая автоматизирует привычные бытовые процессы и работает на YAML файлах. В этой статье я расскажу, как настроить Home Assistant (далее HA), и что конкретно я использую в повседневной жизни. Это поможет вам избежать ошибок и быстрее продвинуться в изучении HA.
На Хабре уже есть статьи о HA (раз, два, три), но здесь я хочу рассказать об установке и настройке системы от начала до конца. От первого запуска сервера до полноценно работающей системы, которую потом можно улучшать и дорабатывать для себя.
Основной единицей в HA является интеграция — логика, которая описывает взаимодействие с умным устройством или внешним сервисом. Большая часть полезной нагрузки HA ориентировано на связку: умное устройство + интеграция или внешнее API + интеграция.
Набор моих интеграций
Железо, участвующее в статье:
- Микроконтроллер Esp8266, а также датчик температуры и влажности DHT11;
- Лампа Xiaomi Desk Lamp;
- Raspberry Pi 4B в 2GB версии, как сервер для HA (в дальнейшем буду ее называть малинкой);
- Xiaomi Router 4A .
Сервисы, которые будем использовать:
- OpenWeatherMap для получения погоды, температуры, влажности на улице и других метеопараметров;
- Telegram для создания системы уведомлений;
- Google drive для создания бекапов;
- SpeedTest для замеров скорости;
- А также OpenUV для замеров ультрафиолетового излучения и др.
Установка
Установка HA предельно проста:
- Записать образ HA на SD карточку (подробная инструкция с ссылками на скачивание для разных версий Raspberry Pi тут).
- Подключить питание и Ethernet к малинке
- Подождать несколько минут, пока система развернется в локальной сети на
<ip адрес малинки>:8123
.
Также можно установить на уже имеющуюся систему с помощью Docker-compose:
version: '3'
services:
homeassistant:
container_name: homeassistant
image: homeassistant/raspberrypi4-homeassistant:stable
volumes:
- /PATH_TO_YOUR_CONFIG:/config
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped
network_mode: host
А теперь разберем несколько сценариев использования.
Отслеживание устройств
Начнем с отслеживания устройств, с помощью которого мы можем фиксировать вход и выход носителей из дома.
Я предлагаю 2 способа отслеживания:
- с помощью роутера (у меня в наличии Xiaomi Router Mi4A),
- с помощью GPS.
В системе доступно много производителей роутеров. Для старых и не перечисленных в списке моделей можно использовать nmap (более подробно тут).
Если установить на телефон официальное приложение, HA по умолчанию создаст интеграцию, и в системе появится дополнительное устройство, которое можно отследить.
С помощью Xiaomi Router Mi4A
Плюсы
- Не требует никаких действий на устройстве, отслеживает всех в локальной сети.
Минусы
- Если устройство не подключено к домашней сети, то устройство пропадает в пустоту, и на картах мы его не увидим.
- Иногда может сработать триггер выхода/входа из зоны, когда фактически девайс не покидает зону (можно попробовать решить расширением зоны).
С помощью GPS
Плюсы
- Точность работы сравнима с GPS трекером в телефоне.
- О телефоне можно узнать: процент заряда аккумулятора, заряжается устройство или нет, а также показатель состояния аккумулятора.
- Можно контролировать устройства (пользователей) не только на вход домой, но и на вход в любую из кастомных зон.
Минусы
- Активно тратит заряд.
- Требует подключение Интернета.
- Для точного трекинга необходимо настроить SSL, чтобы телефон мог отправлять данные о местоположении из вне локальной сети.
- Требует дополнительных прав доступа к GPS, возможна утечка данных третьей стороне в будущем.
- На бюджетных телефонах, которые имеют свойство неожиданно менять местоположение GPS, возможны проблемы с выпадением из зоны.
Создание системы отслеживания через роутер
Трекинг через локальную сеть роутера требует настройки, в отличие от GPS отслеживания. Два вида трекинга можно комбинировать для повышения точности. Ниже можно заметить, что в моем случае отслеживание через роутер работает лучше, чем через GPS. Зеленая зона значит, что телефон внутри зоны, красная — вне зоны.
Результаты работы отслеживания (сверху — роутер, снизу — GPS)
Редактирование конфигурационных файлов через VSCode
Можно подключиться через плагин SSH в VS Code, но получить доступ к проводнику в данный момент мне было удобнее. Поэтому, добавим сетевое расположение.
Нажмем обзор, найдем каталог config (мы в основном будем редактировать его) и выберем его как сетевую папку.
Дальше мы можем перейти в созданную папку и открыть ее через редактор.
router_device_tracker.yaml
platform: xiaomi
host: 192.168.31.1
password: !secret xiaomi_router_password
configuration.yaml
device_tracker: !include configs/router_device_tracker.yaml
После перезагрузки HA мы можем увидеть, что у нас появился новый глобальный объект device_tracker и наши устройства в нем.
Трекинг устройств через роутер
Освещение
Теперь, когда мы умеем отслеживать пользователя, мы можем включать и выключать определенные лампочки с учетом информации о его местоположении.
Для этого необходимо произвести действие по определенному событию. В этом нам помогут автоматизации.
automation/phone_tracker
- alias: Entering home
trigger:
platform: state
to: home
entity_id: device_tracker.mi9lite
action:
- service: light.turn_on
data:
entity_id: light.midesklamp1s_f86f
brightness: 35
color_temp: 350
- alias: Leaving home
trigger:
platform: state
to: not_home
entity_id: device_tracker.mi9lite
action:
- service: light.turn_off
entity_id: light.midesklamp1s_f86f
Теперь импортируем в наш основной файл весь каталог automation — так нам будет удобнее при написании следующих автоматизаций.
configuration.yaml
automation: !include_dir_merge_list automation
Пример работы:
https://www.youtube.com/watch?v=Sii4rBtXYVw
Для того, чтобы получить адаптивное освещение в зависимости от времени суток, нужно настроить цветовую температуру. Это удобно сделать внутри блока switch. Тут важно понимать, что пока данный switch включен, изменить параметры температуры будет невозможно (через interval
минус время_с_прошлого_обновления
лампа примет старые параметры).
Здесь вы найдете больше про динамическую цветовую температуру (flux в терминологии HA). А если вам интересна тема адаптивного освещения, на Хабре есть отличная статья по этому поводу.
configuration.yaml
switch:
- platform: flux
lights:
- light.midesklamp1s_f86f
name: Fluxer
start_time: '9:00'
stop_time: '0:00'
start_colortemp: 5000
sunset_colortemp: 3200
stop_colortemp: 2800
brightness: 25.5
disable_brightness_adjust: true # яркость будет константой
mode: mired # для не rgb ламп
transition: 30
interval: 30```
<!--</spoiler>-->
# Погода
По умолчанию в HA уже присутствует интеграция с погодным API от [Meteorologisk institutt](https://www.home-assistant.io/integrations/met/) (Норвежский метеорологический институт), но мы можем легко создать другую прямо через UI.
## Создание новой интеграции OpenWeatherMap
Переходим в config / Integration на UI , нажимаем на Add integration, и выбираем из списка OpenWeatherMap.
![](https://habrastorage.org/webt/wk/q5/gu/wkq5guripld3x0rlvuuvrh6us-8.png)
Вводим api_key, полученный на их сайте и нажимаем Submit. В итоге получим 19 сущностей, которые можем использовать для своих целей в автоматизациях.
![](https://habrastorage.org/webt/l1/dj/ps/l1djps20zhxaghdhbfrxzcm7tac.png)
*Сущности OWM (на скриншот попали не все 19)*
Таким же образом через UI можно создать интеграции к другим сервисам вроде SpeedTest, или OpenUV.
# Уведомления
Для настройки уведомлений можно использовать стандартные оповещения HA, отображаемые в боковом меню, уведомления на конкретных устройствах (нужно установленное приложение на девайсе), а также оповещения в сторонние сервисы.
![](https://habrastorage.org/webt/vw/lo/uk/vwloukneshhkvd6sklfjojnsvrc.png)
*persistent_notification*
Альтернативный способ уведомлений - это уведомления в сторонние сервисы, например Telegram. Для начала нужно создать бота, получить его api_key (при создании отправят ключ) и chat_id, который можно найти в ответе внутри `result.chat.id` после запроса на https://api.telegram.org/bot{api_key}/getUpdates .
<!--<spoiler title="Ответ с Telegram API приходит пустой">-->
Такое иногда случается по разным причинам.
В таких случаях подходит другой способ получения chat_id - написать @getmyid_bot боту и скопировать себе user ID.
![](https://habrastorage.org/webt/h_/em/a_/h_ema_sk04ldd4xsfkdzdthaml4.png)
<!--</spoiler>-->
Простейшая настройка Telegram бота:
<!--<spoiler title="notification/telegram_bot.yaml">-->
- platform: polling
api_key: !secret telegram_api
allowed_chat_ids:- !secret telegram_chat_id
Для того, чтобы не разглашать всем секретные данные, создадим еще secrets.yaml
. Туда мы сложим все данные, которые не должны попасть в публичный доступ. Для использования переменных из этого файла используем !secret.
Пример секретов:
secrets.yaml
telegram_api: %api_key%
telegram_chat_id: %chat_id%
configuration.yaml
telegram_bot: !include notification/telegram_bot.yaml
В итоге у нас имеется Telegram бот, готовый к отправке сообщений.
Утренние (или нет) погодные оповещения
Теперь, когда у нас есть настроенный сервис уведомлений и погодная интеграция, мы можем сделать утренние оповещения о погоде.
Создаем новый файл автоматизации, и начинаем писать логику.
Пишем переменную, которая будет отвечать за срабатывание оповещений только по будням. Если он true — то в выходные оповещений не будет.
input_boolean.yaml
alarmweekday:
name: Weekdays Only
initial: off
icon: mdi:calendar
И подключаем в основном конфиг файле.
configuration.yaml
input_boolean: !include input_boolean.yaml
automation/morning_alarm.yaml
- alias: 'Wake Me Up'
trigger:
platform: time
at: input_datetime.weather_notification
condition:
condition: or
conditions:
- condition: and
conditions:
- condition: state
entity_id: input_boolean.alarmweekday # оповещение в выходные
state: 'on'
- condition: time
weekday:
- mon
- tue
- wed
- thu
- fri
- condition: and
conditions:
- condition: state
entity_id: input_boolean.alarmweekday
state: 'off'
action:
service: telegram_bot.send_message
data: # тут
message: "{% if now().strftime('%H')|int < 7 %}
Доброй ночи,
{% elif now().strftime('%H')|int < 12 %}
Доброе утро,
{% elif now().strftime('%H')|int < 18 %}
Хорошего дня,
{% else %}
Хорошего вечера,
{% endif %}
сейчас на улице {{states('sensor.openweathermap_temperature')}}°C. "
Пример работы:
https://www.youtube.com/watch?v=vSmSbSd_f-Q
Добавим blueprints
Теперь небольшое лирическое отступление в виде рассказа о написании blueprints на примере уведомлений.
В данном случае я бы перевел blueprints не как чертежи, а как шаблоны или заготовки. Их удобнее использовать, если нужно написать несколько похожих автоматизаций, а основную логику оставить нетронутой.
Например, можно упростить создание уведомлений о начинающихся осадках.
blueprints/precipitation_start.yaml
blueprint:
name: Fallout start notification
domain: automation
input: # аргументы шаблона
precipitation:
name: Precipitation level
selector:
entity:
domain: sensor # только для ui, поможет создать автоматизацию, предоставляя только сенсоры в выпадающем списке
message_start:
name: Telegram message
default: "No message"
trigger: # условия срабатывания
- platform: numeric_state
entity_id: !input precipitation
above: 0.9
for:
minutes: "{{ states('input_number.minimum_time_for_stable_value')|int }}"
action:
- service: telegram_bot.send_message
data:
message: !input message_start
“for” — это время, в котором должен оставаться выбранный параметр, чтобы сработал триггер на превышение уровня осадков.
input_number.yaml
minimum_time_for_stable_value:
name: Minimum time for stable value
initial: 1
min: 0
max: 59
step: 1
Теперь, когда есть blueprint, мы можем написать автоматизацию с меньшим количеством логики.
Создадим уведомления о начале осадков.
automation/rain_start.yaml
- alias: 'Rainy is started'
use_blueprint:
path: homeassistant/fallout_start_notification.yaml
input:
precipitation: sensor.openweathermap_rain
message_start: "Похоже, дождь начинается. Уже накапало {{states('sensor.openweathermap_rain')}}мм."
automation/snow_start.yaml
- alias: 'Snow is started'
use_blueprint:
path: homeassistant/fallout_start_notification.yaml
input:
precipitation: sensor.openweathermap_snow
message_start: "Пошел снежок. Уже навалило {{states('sensor.openweathermap_snow')}}мм."
Мы смогли вынести часть функциональности в отдельный файл. В подобных случаях, когда со временем появляется похожий код, можно выносить часть логики в отдельный файл.
Для большей полезности можно изменить шаблон и поменять action на повышение яркости для света в доме или закрытие штор.
Бэкапы
В бэкап попадает весь каталог /config
, а также все установленные расширения. С любого бекапа можно восстановить состояние системы на момент его создания.
Можно настроить создание резервных копий в Google Drive:
-
Скопировать ссылку https://github.com/sabeechen/hassio-google-drive-backup и зайти в HA (также можно прочитать подробную инструкцию в ReadMe репозитория по ссылке)
-
Добавить ссылку как кастомный репозиторий в Supervisor’е через UI.
-
Открыть его (Open Web UI) и следовать инструкциям по аутентификации с Google Drive
После этих манипуляций мы получаем регулярное создание бекапов, важность которых сложно переоценить.
Интерфейс бекапов
ESP
NodeMCU
Так как умного градусника у меня нет, а температуру измерять хочется, воспользуемся ESP8266.
Сначала установим интеграцию ESPHome из официального списка интеграций.
Для каждого микроконтроллера, используемого в системе, требуется создать файл с подобным содержанием.
esphome/home_params.yaml
Проинициализируем контроллер.
esphome:
name: home_params
platform: ESP8266
board: nodemcuv2
logger:
api:
ota:
Подключимся к WiFi
wifi:
ssid: !secret xiaomi_router_ssid
password: !secret xiaomi_router_password
По умолчанию используются секреты только от ESPHome. А для того, чтобы подгрузить секреты из HA, можно создать отдельный файл, где мы заинклудим эти секреты.
Теперь подключим data pin (обычно это средняя нога) термометра к D2 порту, дадим на него питание и землю. Потом создаём сам термометр (DHT11) и две переменные, которые будем отслеживать в HA.
sensor:
- platform: dht
model: DHT11
pin: D2
temperature:
name: "Living Room Temperature"
humidity:
name: "Living Room Humidity"
update_interval: 60s
Дальше нужно скомпилировать прошивку и загрузить на контроллер. Если он подключен напрямую к Raspberry Pi, то мы увидим его на /dev/ttyUSB0 и сможем загрузить прошивку в первый раз. Все последующие обновления можно загружать по воздуху. А если в списке устройства не видно, то можно скачать прошивку и воспользоваться ESPHome-Flasher.
Загружаем прошивку.
Если все заработало, то в Developer Tools мы увидим созданные переменные.
Developer Tools
Немного оптимизации
По умолчанию в HA используется SQLite, и сброс данных на диск происходит часто (каждую секунду). Это может привести в скором времени к выходу из строя SD карточки на малинке (если сервер стоит на ней). Чтобы продлить срок службы карточки, скажем HA, что нужно записывать на диск раз в commit_interval
и исключить некоторые сущности, которые мы не хотим отслеживать на длинном временном промежутке (или вообще не хотим отслеживать).
configs/recorder.yaml
commit_interval: 1500
purge_keep_days: 7
exclude:
domains:
- updater
- automation
entity_globs:
- sensor.miwifi_router*
entities:
- sensor.date
- sensor.date_time
- sensor.time
- sensor.openweathermap_forecast_time
configuration.yaml
recorder: !include configs/recorder.yaml
Если мы хотим использовать СУБД, отличную от SQLite, то можно сделать один из следующих пунктов на выбор:
- Установить соответствующий аддон для перехода на MariaDB.
- Использовать существующую реляционную базу данных на удаленной машине, если указать строку для подключения в параметр
db_url
.
Отслеживание системных параметров
Чтобы отслеживать остаток свободной памяти, загруженность процессора или скорость Интернет соединения, мы можем добавить мониторинг показателей системы.
sensors/system_monitor.yaml
- platform: systemmonitor
resources:
- type: disk_use_percent
arg: /
- type: memory_free
- type: memory_use_percent
- type: processor_use
- type: processor_temperature
- type: disk_free
arg: /
При желании можем создать автоматизацию, которая при критических показателях будет отправлять уведомление о необходимости принятия мер.
Также мы можем посмотреть Uptime сервера.
sensors/uptime.yaml
- platform: uptime
name: Time Online
configuration.yaml
sensor: !include_dir_merge_list sensors
Вариант представления на UI
Заключение
Плюсы HA
- Простая установка и настройка, не требующая знания программирования.
- Большое коммьюнити — вопросов на форуме много, ответов тоже хватает.
- Огромное количество готовых интеграций со сторонними сервисами — скорее всего не придется писать свою интеграцию руками.
Минусы HA
- Достаточно сложно отлаживать систему. Если action можно запустить программно в обход триггера, то триггер тестировать уже сложнее.
В итоге мы создали несложную систему умного дома, которую каждый может расширить покупкой новых устройств или написанием своих продуманных и продвинутых автоматизаций. По этой ссылке можно найти полную версию моих автоматизаций дома.
Главный экран
Что дальше? Можно добавить HACS (сборник UI компонентов и даже целых интеграций от коммьюнити, пригодится при использовании Яндекс Станции) и установить несколько UI элементов. Можно интегрировать умную колонку или телевизор и включать их по определенному условию. Вариантов апгрейда бесконечное множество.
Успехов в автоматизации!
Литература
- Документация HA