Home Assistant на Raspberry Pi 5

—

от автора

Краткая инструкция по установке Home Assistant под Raspberry Pi OS без Supervisor. HA Supervisor — это Docker-контейнер, управляющий другими контейнерами экосистемы Home Assistant, который отказывается уживаться с контейнерами, не относящимися к экосистеме, и сам по себе совершенно необоснованно плодит «необходимые» контейнеры (audio, multicast, cli и dns). Supervisor в экосистеме Home Assistant отвечает за установку дополнений и обновлений одним кликом, а также помогает настроить автоматическую архивацию. Враждебное отношение Supervisor к другим контейнерам невозможно понять и нельзя простить — ведь из‑за этого приходится выбирать между функционалом Supervisor и возможностью разворачивания дополнительных контейнеров.

Помимо этого, разработчики Home Assistant официально подложили и другую свинью заявляют совместимость только с Debian, и зачастую не отвечают на проблемы возникшие на любых других дистрибутивах Linux, в том числе ответвлениях от Debian, включая Ubuntu и Raspberry Pi OS. Но надо отдать им должное, от потребностей сообщества они совсем не отмахиваются, и зачастую проявляется несовместимость с другими дистрибутивами предупреждением, и проблем мне пока не встретилось.

Кто хочет поэкспериментировать, может обратиться к статье «Устанавливаем Home Assistant Supervised», там же описано решение нескольких проблем, которые могут возникнуть в процессе установки и настройки Home Assistant.

Краткая информация о Home Assistant

HA OS

Container

Core

Supervised

Автоматизации

✔

✔

✔

✔

Дашборд

✔

✔

✔

✔

Интеграции

✔

✔

✔

✔

Дополнения

✔

✔

Чертежи

✔

✔

✔

✔

Быстрое обновление

✔

✓

Бэкапы

✔

✓

✓

✔

Что понадобится:

  • Raspberry Pi 4 / 5 или их производные (RPI 400 / 500)

  • Локальная сеть, желательно по проводу

1. Raspberry Pi OS

Все тесты производились на Raspberry Pi 5, поэтому здесь и далее речь будет идти именно об этом мини-ПК, но инструкция актуальна и для Raspberry Pi 4, а вот более старые модели использовать хоть и возможно, но не рекомендуется — у них очень скромные аппаратные возможности.

Всю установку можно выполнить с помощью консоли по SSH, однако лично мне некоторые задачи удобнее выполнять в графическом интерфейсе, и поэтому будет использована Raspberry Pi OS Full (64-bit).

Если коротко, то нужно выбрать ОС для малинки и записать на SD-карту или USB-флешку с помощью Raspberry Pi Imager или другой программы для записи загрузочных образов. Подробнее под спойлером.

Raspberry Pi OS с помощью Raspberry Pi Imager

Raspberry Pi OS — это бесплатная операционная система на базе Debian, оптимизированная для аппаратного обеспечения Raspberry Pi. Raspberry Pi OS поддерживает более 35 000 пакетов Debian. Выпуски происходят примерно каждые 2 года. Последняя версия Raspberry Pi OS основана на Debian Bookworm. Предыдущая версия была основана на Debian Bullseye.

По умолчанию Raspberry Pi проверяет наличие операционной системы на любой SD-карте, вставленной в слот для SD-карты. В зависимости от модели Raspberry Pi можно загрузить ОС с других устройств хранения данных, включая USB-накопители, устройства хранения данных подключённые через HAT (HDD / SSD / SSD NVMe, eMMC), и сетевые хранилища.

Большинство пользователей Raspberry Pi выбирают карты microSD в качестве загрузочного устройства. Сервер Home Assistant не требователен к «железу» микрокомпьютера, однако в процессе его работы происходит большое количество операций чтения-записи, что приводит к ускоренному исчерпанию ресурса microSD-карт. Поэтому следует выбирать карту максимально доступного объёма или отдать предпочтение USB-накопителю. В статье будет рассмотрен вариант использования SSD NVMe, как носителя с максимальным ресурсом и скоростью.

Вместе с Raspberry Pi пришла SD-карта на 128 Гб, чего для экспериментов более чем достаточно, поэтому первоначально она и будет использоваться. Запись ОС на SD-карту проще всего выполнить с помощью Raspberry Pi Imager.

Raspberry Pi Imager — это инструмент, который помогает загружать и записывать образы на macOS, Windows и Linux. Imager включает в себя множество популярных образов операционных систем для Raspberry Pi. Imager также поддерживает загрузку образов, загруженных напрямую с Raspberry Pi или сторонних поставщиков, таких как Ubuntu. С помощью Imager можно предварительно настроить учётные данные и параметры удалённого доступа для Raspberry Pi.

Imager поддерживает образы, упакованные в формат .img, а также форматы контейнеров, такие как .zip.

Если у нет другого компьютера для записи образа на загрузочное устройство, можно установить операционную систему прямо на Raspberry Pi из интернета, но в данной статье этот вариант рассматриваться не будет.

Установка с помощью Imager

Установить Imager можно следующими способами:

  • Скачать последнюю версию с raspberrypi.com/software и запустить установщик.

  • Установить из терминала с помощью менеджера пакетов (актуально для Linux), например sudo apt install rpi-imager.

После установки Imager запустите приложение, нажав на значок Raspberry Pi Imager или выполнив команду rpi-imager.

Raspberry Pi Imager - Стартовый экран

Raspberry Pi Imager — Стартовый экран

Raspberry Pi Imager — Стартовый экран

Устройство Raspberry Pi → Raspberry Pi 5

  1. Операционная система → Raspberry PI OS Full (64-bit)

  2. Запоминающее устройство → SD-карта / USB-флешка

Raspberry Pi Imager - Диалог применения кастомных параметром

Raspberry Pi Imager — Диалог применения кастомных параметром

Raspberry Pi Imager — Диалог применения кастомных параметром

  • Изменить параметры — Переход в диалог предварительной настройки ОС

  • Нет, очистить параметры — Очистка ранее сохраненных параметров

  • Да — Применение ранее сохранённых предварительных настроек ОС

  • Нет — Запись образа без применения параметров (при первом запуске будет запущен мастер настройки ОС)

Для установки Home Assistant достаточно доступа по SSH, т.е. подключать монитор, клавиатуру и мышь не обязательно — достаточно кабеля питания и сетевой провод от роутера. Для этого потребуется разрешить подключение по SSH. Дополнительно я задаю и другие параметры, что бы даже на начальном этапе не ничего кроме двух проводов к малинке не подключать.

Raspberry Pi Imager - Общие параметры предварительной настройки ОС

Raspberry Pi Imager — Общие параметры предварительной настройки ОС

Raspberry Pi Imager — Общие параметры предварительной настройки ОС

Raspberry Pi Imager - Настройка служб: Включение SSH

Raspberry Pi Imager — Настройка служб: Включение SSH

Raspberry Pi Imager — Настройка служб: Включение SSH

Raspberry Pi Imager -  Параметры: Выключить телеметрию

Raspberry Pi Imager — Параметры: Выключить телеметрию

Raspberry Pi Imager — Параметры: Выключить телеметрию

После предварительной настройки ОС можно записывать образ на носитель.

Raspberry Pi Imager - Подтверждение перезаписи носителя

Raspberry Pi Imager — Подтверждение перезаписи носителя

Raspberry Pi Imager — Подтверждение перезаписи носителя

По окончании записи SD-карты, и установки её в Raspberry Pi (подключение/отключение SD-карты нужно выполнять при выключенном питании), остаётся включить питание малинки и дождаться её подключения к сети.

Подключение к Raspberry Pi OS с помощью Bitvise SSH Client

После загрузки Raspberry Pi OS должно появиться новое подключение на роутере, можно задать фиксированный IP, чтобы при перезагрузке роутера не искать его заново (как это сделать, рассматриваться в статье не будет).

Для подключения к RPI будет использоваться Bitvise SSH Client

Bitvise SSH Client с параметрами подключения к RPI: IP он же Host, Port, Username и Passwort

Bitvise SSH Client с параметрами подключения к RPI: IP он же Host, Port, Username и Passwort

Bitvise SSH Client с параметрами подключения к RPI: IP он же Host, Port, Username и Passwort

Настройки можно сделать один раз и сохранить в файле, последний открытый файл будет загружаться при следующей запуске программы.

При успешном подключении (кнопка «Log In«) интерфейс программы немного изменится — появятся дополнительные кнопки. При первом подключении воспользоваться можно только двумя: «New terminal console» и «New SFTP window» — первая служит для открытия терминала, а вторая для передачи/скачивания файлов.

Bitvise SSH Client после успешного подключения к RPI

Bitvise SSH Client после успешного подключения к RPI

Bitvise SSH Client после успешного подключения к RPI

Настоятельно рекомендую научиться работать в командной строке. Это экономит большое количество времени. И далеко не все операции можно сделать в UI.
Лично мне только терминала мало, поэтому я добавляю ещё и поддержку XRDP. Он позволит подключаться к рабочему столу, если Linux устанавливалась с графической оболочкой. Для включения поддержки XRDP нужен графический интерфейс, именно поэтому устанавливалась не Lite, а Full версия ОС.

Большинство команд в статье будут выполняться от имени «администратора» (root), поэтому, чтобы не писать перед каждой командой sudo для повышения прав, нужно переключиться на администратора:

$ sudo su -

Если Raspberry Pi OS устанавливалась без среды рабочего стола, то необходимо добавить Xfce через терминал:

# apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utils -y

Если Raspberry Pi OS устанавливалась со средой рабочего стола или если она была установлена предыдущей командой — ставим сам XRDP:

# apt install xrdp -y # adduser xrdp ssl-cert # systemctl restart xrdp

Теперь можно подключиться к рабочему столу малинки с компьютера по кнопке «New remote desktop«:

Bitvise SSH Client - подключение к XRDP

Bitvise SSH Client — подключение к XRDP

Bitvise SSH Client — подключение к XRDP

При первом подключении может отображаться чёрный экран. Это связано с тем, что вход в учетную запись по умолчанию выполняется автоматически, а подключиться к графическому интерфейсу под одной учётной записью можно только один раз. Исправить это можно, отключив автологин и перезагрузив малинку.

# raspi-config

Выбрать «1 System Options», чтобы настроить параметры системы:

Bitvise SSH Client - SSH: главное меню утилиты raspi-config

Bitvise SSH Client — SSH: главное меню утилиты raspi-config

Bitvise SSH Client — SSH: главное меню утилиты raspi-config

Теперь нужно зайти в меню «S5 Boot / Auto Login»

Bitvise SSH Client - SSH: меню системных опций утилиты raspi-config

Bitvise SSH Client — SSH: меню системных опций утилиты raspi-config

Bitvise SSH Client — SSH: меню системных опций утилиты raspi-config

В меню предоставляется два варианта:

  • Загрузка в консоль (B1 и B2)

  • Загрузка на рабочий стол (B3 и B4)

Bitvise SSH Client - SSH: меню режима загрузки ОС в утилите raspi-config

Bitvise SSH Client — SSH: меню режима загрузки ОС в утилите raspi-config

Bitvise SSH Client — SSH: меню режима загрузки ОС в утилите raspi-config

Для корректной работы требуется выбор «B3 Desktop», требующий предварительной авторизации перед открытием рабочего стола. После применения этой настройки можно подключаться по XRDP — рабочий стол будет отображаться нормально.

Выбор B1 или B2 переключит ОС в консольный режим, что сэкономит ресурсы при работе малинки в качестве сервера и немного ускорит загрузку. При этом сохранит возможность загрузки в графическом режиме, если возникнет такая необходимость.

После установки Raspberry Pi OS самое важное, что нужно сделать — обновить ПО, дистрибутив и прошивку:

$ sudo su - # apt update && apt upgrade -y && apt dist-upgrade -y # apt --fix-broken install && apt autoremove -y # reboot
Raspberry Pi OS — Desktop — Настройка локализации

По неведомой причине, настройки локали полноценно не применяются при предварительной настройке, и нужно их делать либо при первом запуске, либо в графическом интерфейсе — я выбрал последнее. Для чего они нужны — для того, чтобы приложения, унаследованные от Debian (консольные и графические, включая менеджер пакетов — APK), были на русском языке — мне так комфортнее.

Raspberry Pi Configuration (находится в меню, в группе Параметры/Settings)

Raspberry Pi Configuration (находится в меню, в группе Параметры/Settings)

Raspberry Pi Configuration (находится в меню, в группе Параметры/Settings)

2. Docker и Portainer

Практически все компоненты, рассмотренные в статье, будут разворачиваться в Docker-контейнерах — так их удобнее обновлять и бэкапить. Приступим.

sudo apt install apparmor bluez cifs-utils curl dbus jq libglib2.0-bin lsb-release network-manager nfs-common systemd-journal-remote systemd-resolved udisks2 nano htop wget -y sudo systemctl restart systemd-resolved.service sudo curl -fsSL get.docker.com | sh

Теперь подготовим центральное «хранилище» для данных контейнеров, чтобы упростить настройку и бэкапирование, а также чтобы не терять данных при обновлениях.

mkdir -p docker-home/portainer/data cd ./docker-home nano docker-compose.yaml

Последняя команда откроет консольный текстовый редактор с с пустым файлом, который нужно наполнить текстом ниже, а затем сохранить и закрыть с помощью Ctrl+O и Ctrl+X.

services:   portainer:     container_name: portainer     image: portainer/portainer-ce:latest     restart: unless-stopped     deploy:       resources:         limits:           cpus: '0.5'     ports:       - "9000:9000/tcp"       - "9443:9443/tcp"     environment:       - TZ=Europe/Moscow     volumes:       - /etc/localtime:/etc/localtime:ro       - /var/run/docker.sock:/var/run/docker.sock       - ./portainer/data/:/data

Чтобы убедиться, что нет ошибок в конфигурации, нужно выполнить команду
docker compose -f docker-compose.yaml config, и Docker выведет то, что будет запущено, а также все ошибки в конфиге и предупреждения.

Теперь выполняем команду docker compose up -d, чтобы Docker загрузил последний образ и настроил его. Уже запущенные образы, если таковые будут, обрабатываться не будут.

При первом посещении Portainer будет 10 минут на создание учетной записи, если не успеть, то придётся перезапускать контейнер. Это сделано для безопасности, так как не всегда Portainer запускается локально.

По завершению настройки контейнера появится доступ к web-интерфейсу

Web-интерфейс Portainer: http://<IP>:9000
Portainer - web интерфейс первом запуске - создание пользователя

Portainer — web интерфейс первом запуске — создание пользователя
Portainer - web интерфейс после входа пользователя

Portainer — web интерфейс после входа пользователя

Позже можно будет добавить в Home Assistant ссылку на Portainer, у меня это (у меня это http://192.168.157.91:9000/#!/2/docker/containers.

3. Home Assistant

И главный герой сегодняшней статьи…

sudo apt install dbus-broker bluez sudo systemctl enable dbus-broker.service mkdir -p homeassistant/config nano docker-compose.yaml

Следует обратить внимание, что на борту Raspberry Pi и в RPI OS имеется поддержка Bluetooth, а это значит, что можно подключать устройства по этому протоколу. Для этого обновляются/устанавливаются пакет брокера DBus и пакет BlueZ, а затем включается установленная служба.

Дополняем docker-compose.yaml следующей конфигурацией

services:   portainer:     #...    homeassistant:     container_name: homeassistant     image: "ghcr.io/home-assistant/home-assistant:stable"     restart: unless-stopped     privileged: true     deploy:       resources:         limits:           cpus: '2'     logging:       driver: "json-file"       options:         max-size: "10m"         max-file: "2"     ports:       - "8123:8123"     environment:       - TZ=Europe/Moscow     volumes:       - ./homeassistant/config/:/config       - /etc/localtime:/etc/localtime:ro       - /run/dbus:/run/dbus:ro

После запуска контейнера потребуется 2–10 минут на разворачивание, в зависимости от скорости носителя.

Настройка Home Assistant при первом входе
Создание пользователя при первом входе в Home Assistant

Создание пользователя при первом входе в Home Assistant
По окончанию настройки может быть выведен список найденных совместимых устройств

По окончанию настройки может быть выведен список найденных совместимых устройств
Добавление интеграции Bluetooth
HA должен предложить установить интеграцию с обнаруженным адаптером Bluetooth

HA должен предложить установить интеграцию с обнаруженным адаптером Bluetooth
Ручно добавление интеграции Bluetooth

Ручно добавление интеграции Bluetooth

4. Редакторы

Чтобы каждый раз не подключаться через SSH для изменения параметров, установим один или оба редактора — FileEditor или CodeServer.

mkdir -p fileeditor/config mkdir -p codeserver/config nano docker-compose.yaml

Дополняем docker-compose.yaml следующей конфигурацией (если нужен только один, то вторую секцию нужно удалить):

services:   portainer:     #...    hass-configurator:     container_name: hassconf     image: causticlab/hass-configurator-docker     restart: unless-stopped     deploy:       resources:         limits:           cpus: '0.5'     environment:       - HC_BASEPATH=/hass-config       - DIRSFIRST=true     ports:       - "3218:3218/tcp"     volumes:       - ./fileeditor/config/:/config       - ./homeassistant/config/:/hass-config    code-server:     image: lscr.io/linuxserver/code-server:latest     container_name: code-server     restart: unless-stopped     deploy:       resources:         limits:           cpus: '2'     environment:       - PUID=1000       - PGID=1000       - TZ=Europe/Moscow     volumes:       - ./codeserver/config/:/config       - ./homeassistant/config/:/hass-config     ports:       - "8043:8443"

Как видно из параметров, FileEditor будет доступен на порту 3218 малинки, а CodeServer на 8043 (при желании порты можно изменить).

Теперь редактор(-ы) можно добавить в Home Assistant через Панели.

Настройки > Панели > Добавить панель
Диалог добавления панели (компоненты разворачиваемые в контейнерах будут добавляться как "Веб-страница")

Диалог добавления панели (компоненты разворачиваемые в контейнерах будут добавляться как «Веб-страница»)
Диалог ввода URL-адреса

Диалог ввода URL-адреса
Панель с FileEditor

Панель с FileEditor
Панель с CodeServer

Панель с CodeServer

Обратите внимание, что указываются локальные адреса, и при открытии Home Assistant из внешней сети ссылки будут невалидны, а значит, на панелях ничего отображаться не будет.

5. PostgreSQL

Home Assistant по умолчанию использует SQLite. SQLite является встраиваемой безсерверной БД, поддерживающей базы 256 ТБ. Её плюс в мобильности и легковесности, а минус в низкой производительности. Несмотря на поддержку БД большого объёма, производительность обработки данных будет очень сильно падать, а нагрузка на ЦП быстро расти. Home Assistant по умолчанию периодически очищает, переупаковывает данные, да и запись в БД ведёт не постоянно, а порциями, поэтому SQLite справляется с нагрузкой мониторинга большого числа часто спамящих китайских датчиков. Но наша цель — сохранение всех данных для построения исторических графиков, внешний доступ к БД и использование того же сервера БД для других задач (например, хранения карт OSM). Можно было бы использовать легковесную MariaDB (она же MySQL), но это ограничит использование БД, а на неё большие планы (не в этой статье). Кроме того, MariaDB также имеет проблемы с большими базами и индексами. Поэтому будет использован PostgreSQL.

Home Assistant достаточно щадяще пишет данные в БД, и можно было бы использовать прямое соединение с БД, но в целях оптимизации под дополнительное ПО установим ещё и программу управления пулом соединений — pgbouncer. Предназначение pgbouncer — минимизировать издержки, связанные с установлением новых подключений к Postgres. Любое конечное приложение может подключиться к pgbouncer, как если бы это был непосредственно сервер Postgres Pro, и pgbouncer создаст подключение к реальному серверу либо задействует одно из ранее установленных подключений.

Для базового администрирования PostgreSQL, в качестве легковесной альтернативы консольной утилите, будем использовать adminer. Это вспомогательный, не обязательный элемент.

Также пропишем «зависимости» контейнеров, так как порядок их запуска и завершения теперь важен — PostgreSQL должен запускаться перед pgbouncer, а уже после этого должен стартовать Home Assistant.

mkdir -p postgresdb/data mkdir -p postgresdb/initdb nano docker-compose.yaml

Дополняем docker-compose.yaml следующей конфигурацией

services:   portainer:     #...    postgresdb:     container_name: postgresdb     image: imresamu/postgis:17-3.5-alpine     restart: unless-stopped     shm_size: 128mb     deploy:       resources:         limits:           cpus: '2'     environment:       - POSTGRES_USER=homeassistent       - POSTGRES_PASSWORD=mysecretpassword1       - POSTGRES_DB=homeassistent     healthcheck:       test: ["CMD-SHELL", "pg_isready -U homeassistent -d homeassistent"]       interval: 10s       timeout: 5s       retries: 5       start_period: 150s     logging:       driver: "json-file"       options:         max-size: "10m"         max-file: "2"     volumes:       - ./postgresdb/data:/var/lib/postgresql/data       - ./postgresdb/initdb:/docker-entrypoint-initdb.d     ports:       - "5432:5432"    pgbouncerha:     container_name: hapgbouncerha     image: edoburu/pgbouncer     restart: unless-stopped     deploy:       resources:         limits:           cpus: '1'     environment:       - DB_HOST=postgresdb       - DB_USER=homeassistent       - DB_PASSWORD=mysecretpassword1       - AUTH_TYPE=scram-sha-256       - ADMIN_USERS=postgres,admin     ports:       - "6432:5432"     depends_on:       - postgresdb    adminer:     container_name: adminer     image: adminer     restart: unless-stopped     environment:       - ADMINER_DEFAULT_SERVER=postgresdb       - ADMINER_PLUGINS=frames     ports:       - "8077:8080/tcp"     depends_on:       - postgresdb    homeassistant:     #...     depends_on:       - pgbouncerha

Переключаем Home Assistant на Postgres, для чего, используя один из установленных редакторов, дополняем файлы конфигурации — secrets.yaml (не забываем менять ip/домен, логин/пароль и имя БД на актуальные для вас).

postgresdb: "postgresql://homeassistent:mysecretpassword1@pgbouncerha/homeassistent"

И добавляем новую секцию в конец configuration.yaml.

#... scene: !include scenes.yaml  # База Данных recorder:   db_url: !secret postgresdb # параметры подключения к БД   db_max_retries: 30   # Количество попыток подключения регистратора к БД   db_retry_wait: 10    # Время (сек) ожидания подключения к БД   auto_purge: false    # Автоматическая еженочная очистка БД в 04:12   auto_repack: false   # Автоматически переупаковывайте БД каждое воскресенье   purge_keep_days: 365 # Срок (дней) хранения истории после очистки   commit_interval: 5   # Частота (сек) фиксации события и изменения состояния в БД

Обратите внимание на то, что в configuration.yaml используется константа, описанная в secrets.yaml. Все параметры достаточно хорошо описаны в официальной документации.

Настройки > Панели > Добавить панель

Веб-интерфейс Adminer доступен на порту 8077.
Например, http://192.168.157.91:8077

Панель с Adminer

6. Mosquitto MQTT

Брокер Mosquitto MQTT позволит нам подключаться к широкому спектру устройств.

mkdir -p mosquitto/config mkdir -p mosquitto/data mkdir -p mosquitto/log nano docker-compose.yaml
services:   portainer:     #...    mosquitto:     container_name: mosquitto     image: eclipse-mosquitto     restart: unless-stopped     ports:       - "1883:1883/tcp"     environment:       - TZ=Europe/Moscow     volumes:       - ./mosquitto/config:/mosquitto/config       - ./mosquitto/data:/mosquitto/data       - ./mosquitto/log:/mosquitto/log     stdin_open: true     tty: true    homeassistant:     #...     depends_on:       - pgbouncerha       - mosquitto

Обратите внимание на строки stdin_open и tty — они нужны, чтобы можно было подключиться к терминалу контейнера для выполнения команд (позже это понадобится).
А также нужно, чтобы Home Assistant запускался после Mosquitto, и для этого была добавлена зависимость. К слову, порядок описания контейнеров не важен, и вполне можно добавлять каждый новый контейнер в конец — зависимости будут работать.

touch nano ./mosquitto/config/mosquitto.conf sudo docker compose up -d

После запуска контейнера Mosquitto, если не создать файл конфигурации (mosquitto.conf), журналы будут заполнены ошибками вида Unable to open config file /mosquitto/config/mosquitto.conf.

Файл конфигурации заполним позже, иначе не сможем вызвать утилиту mosquitto_passwd для задания пароля. Можно включить настройку allow_anonymous true, но это не наш путь.

sudo docker exec -it mosquitto   -c /mosquitto/config/mqttuser mosquitto2ha
Задание пароля mosquitto

Теперь заполняем конфиг

sudo nano ./mosquitto/config/mosquitto.conf
persistence true persistence_location /mosquitto/data/  listener 1883  allow_anonymous false  log_dest file /mosquitto/log/mosquitto.log log_dest stdout  password_file /mosquitto/config/mqttuser 
sudo docker compose restart mosquitto

Теперь мы можем подключить Home Assistant к нашему брокеру MQTT, чтобы он мог начать подписываться на топики и отправлять сообщения. Поскольку другие клиенты MQTT еще не подключены, Home Assistant пока не будет добавлять новые устройства.

Переходим в список интеграций, ищем MQTT. Вписываем данные для пользователя/пароль (mosquitto2ha) и подтверждаем соединение.

Подключение Home Assistant к mosquitto
Подключение Home Assistant к mosquitto

Подключение Home Assistant к mosquitto

Убеждаемся, что подключение прошло успешно, через лог контейнера в Portainer

Открытие лога контейнера

Открытие лога контейнера
Просмотр лога контейнера

Просмотр лога контейнера

7. Zigbee2MQTT

Zigbee — это беспроводной протокол, разработанный специально для устройств IoT, и в некотором смысле похож на Wi-Fi, но гораздо более энергоэкономичный. В сети Zigbee устройства с питанием от сети (например, умные розетки или термостаты) выступают в качестве роутеров для увеличения радиуса действия сети. Координатор Zigbee получает данные от всех устройств и поддерживает взаимодействие между ними, а также обеспечивает взаимодействие с устройствами, не относящимися к Zigbee.

В Home Assistant есть встроенная интеграция с Zigbee — ZHA. Другой популярной альтернативой является Zigbee2MQTT, который использует обнаружение MQTT Home Assistant для создания устройств и объектов в Home Assistant. Сейчас будем подключать сеть Zigbee к Home Assistant через Zigbee2MQTT, так как его сообщество гораздо больше и активнее, и большинство рецептов написано под него.

В конфигурации создания Docker нужно назначить координатор Zigbee, который подключен через USB, к контейнеру Docker.

После подключения адаптера посмотрите на вывод dmesg, чтобы найти устройство:

sudo dmesg  ... [432908.666081] usb 3-2: new full-speed USB device number 5 using xhci-hcd [432908.837357] usb 3-2: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.62 [432908.837364] usb 3-2: New USB device strings: Mfr=0, Product=2, SerialNumber=0 [432908.837367] usb 3-2: Product: USB2.0-Serial [432908.844428] ch341 3-2:1.0: ch341-uart converter detected [432908.858450] usb 3-2: ch341-uart converter now attached to ttyUSB0

Как видно, адаптер был идентифицирован и смонтировался как ttyUSB0. Теперь нужно узнать уникальный идентификатор.

ls -l /dev/serial/by-id/
Список устройств
Список подключенных USB-устройств (интересует длинное именование, сейчас это "usb-...")

Список подключенных USB-устройств (интересует длинное именование, сейчас это «usb-…»)
Пример Zigbee-стика

Пример Zigbee-стика

Будем использовать полученный уникальный путь по by-id в конфигурации вместо типичного /dev/ttyUSB0, потому что всегда существует риск того, что устройство получит новый TTY, назначенный после перезагрузки, что особенно вероятно при подключении нескольких устройств (например, zigbee-адаптера, flash и чего-то ещё).

services:   mosquitto:     #...    zigbee2mqtt:     container_name: zigbee2mqtt     image: koenkk/zigbee2mqtt     restart: unless-stopped     devices:       - /dev/serial/by-id/[обнаруженный адаптер]:/dev/ttyUSB0     ports:       - "8020:8020"     environment:       - TZ=Europe/Moscow     volumes:       - ./zigbee2mqtt/data:/app/data       - /run/udev:/run/udev:ro     depends_on:       - mosquitto    homeassistant:     #...     depends_on:       - pgbouncerha       - mosquitto       - zigbee2mqtt
mkdir -p ./zigbee2mqtt/data nano ./zigbee2mqtt/data/configuration.yaml
homeassistant: true  permit_join: false  mqtt:   base_topic: zigbee2mqtt   server: '!secret server'   user: '!secret user'   password: '!secret password'   client_id: zigbee  serial:   port: /dev/ttyUSB0   adapter: zstack  frontend:   port: 8020
nano ./zigbee2mqtt/data/secret.yaml
server: "mqtt://mosquitto:1883" user: "mosquitto2ha" password: "<PASSWORD>"

Обратите внимание, что с осени 2024 года zigbee2mqtt автоматически не определяет zstack адаптеры, так как это вызывало проблемы с другими адаптерами, и необходимо явно указывать тип адаптера, — в нашем случае это zstack.

Вспоминаем пароль, который задавали через утилиту mosquitto_passwd, подставляем вместо <PASSWORD>, сохраняем конфиг и запускаем контейнер:

sudo docker compose up -d
Настройки > Панели > Добавить панель

Режим сопряжения включается по нажатию кнопки «Разрешить обнаружение» (рядом с кнопкой изменения темы).

Активация сопряжения / подключения устройств

Активация сопряжения / подключения устройств
Пример списка устройств
Пример списка устройств: первое устройство не поддерживалось из коробки — подключен кастомным конвертером, следующие два не поддерживаемые без кастомных конверторов, последние два завелись «из коробки».

Пример списка устройств: первое устройство не поддерживалось из коробки — подключен кастомным конвертером, следующие два не поддерживаемые без кастомных конверторов, последние два завелись «из коробки».

8. Node-RED

Node-RED — это инструмент потокового программирования, требующий минимум написания кода. С его помощью можно более наглядно делать автоматизации в Home Assistant. И хотя в Home Assistant есть некоторые встроенные средства автоматизации, мы рассмотрим и этот инструмент для того, чтобы можно было выбирать, какой инструмент использовать применительно к той или иной задаче.

mkdir -p ./nodered/data/ sudo chown -R 1000:1000 ./nodered/data nano docker-compose.yaml

Обратите внимание на изменение прав на каталог — это необходимо, потому что пользователь nodered внутри контейнера имеет такие идентификаторы и не меняет права на каталог самостоятельно.

services:   #...      nodered:     container_name: nodered     image: nodered/node-red     restart: unless-stopped     ports:       - "1880:1880/tcp"     environment:       - TZ=Europe/Moscow     volumes:       - ./nodered/data:/data     depends_on:       - homeassistant       - mosquitto

После запуска контейнера sudo docker compose up -d, Node-RED будет доступен по адресу http://<ip>:1880.

Настройки > Панели > Добавить панель
При запуске Node-RED хвастается последними обновлениями

При запуске Node-RED хвастается последними обновлениями

Для взаимодействия Node-RED с Home Assistant нужен долгосрочный токен доступа, для получения которого нужно нажать на свое имя в нижней части боковой панели Home Assistant, перейти на вкладку «Безопасность» и прокрутить страницы до конца вниз, пока не увидите раздел «Долгосрочные токены доступа», и нажать кнопку «Создать токен», после чего будет сгенерирован новый токен доступа.

Получение долгосрочного токена доступа Home Assistant для Node-RED
Профиль пользователя > Безопасность > Долгосрочные токены доступа > Создать токен

Профиль пользователя > Безопасность > Долгосрочные токены доступа > Создать токен
После ввода имени открывается диалог с токеном

После ввода имени открывается диалог с токеном

Теперь нужно установить необходимые для взаимодействия узлы. В меню (три черточки в правом верхнем углу) нужно выбрать «Управление палитрой» для входа в обзор доступных и установленных узлов, перейти на вкладку «Установить», найти и установить node-red-contrib-home-assistant-websocket.

Установка узлов для взаимодействия Node-RED с Home Assistant

И собственно, настроить соединение между Node-RED и Home Assistant:

  1. Перейти на главный экран Node-RED и перетащить узел events: all на доску.

  2. Дважды щелкнуть по узлу для открытия его свойств.

  3. В поле «Сервер» выбрать «Добавить новый сервер…» и кликнуть значок «+» рядом.

  4. Дать конфигурации сервера имя (например, Home Assistant).

  5. В поле «Базовый URL» ввести адрес для доступа к Home Assistant http://<ip>:8123, или нажать на лупу рядом, что бы Node-RED попытался найти сервера самостоятельно.

  6. НЕ устанавливать флаг Using the Home Assistant Add-on.

  7. Ввести ранее полученный долгосрочный токен доступа к Home Assistant.

  8. Нажать «Добавить», а затем «Сохранить».

Настройка подключения Node-RED к Home Assistant

Можно настроить и прямой доступ Node-RED к MQTT-брокеру. Настройка очень похожа на предыдущею, но сначала нужно создать ещё одну учетную запись:

docker exec -it mosquitto mosquitto_passwd /mosquitto/config/mqttuser nodered # Enter a password
  1. Добавить узел MQTT.

  2. Дважды щелкнуть по узлу для открытия его свойств.

  3. Ввести тему (для подписки на все топики, что нужно для теста соединения): #

  4. Добавить новый сервер.

  5. На вкладке «Соединение» ввести адрес сервера (<ip>) и порт (1883) нашего брокера, можно выбрать протокол MQTT V5 (поддерживаются все).

  6. На вкладке «Безопасность» ввести имя пользователя и пароль только что созданного пользователя MQTT.

  7. Нажмите «Добавить», а затем «Сохранить».

Настройка подключения Node-RED к mosquito
Добавление нового сервера: IP, порт, протокол

Добавление нового сервера: IP, порт, протокол
Добавление нового сервера: логин и пароль

Добавление нового сервера: логин и пароль
Добавление нового узла: подписка на все события (Тема/Topic: #)По данным из интернета, иногда нужно ещё несколько раз поменять QoS, что бы заработала подписка

Добавление нового узла: подписка на все события (Тема/Topic: #)
По данным из интернета, иногда нужно ещё несколько раз поменять QoS, что бы заработала подписка

Что бы видитеть только debug-вывод можно сразу разместить два debu-узла и включать один из них (хвостик должен быть длиннее и светиться ярче).

Для запуска нужна нажать кнопку «Развернуть» в правом верхнем углу.

Просмотр отладочных сообщений Home Assistant

Просмотр отладочных сообщений Home Assistant
Просмотр отладочных сообщений Node-RED

Просмотр отладочных сообщений Node-RED
Пример автоматизаций Node-RED
Пример тестовой автоматизации на коленке, для отправки данных на портал Narodmon.ru

Пример тестовой автоматизации на коленке, для отправки данных на портал Narodmon.ru

Заключение

В этой статье создана база для автоматизации умного дома на основе Home Assistant и Node-RED. В следующей стать будут рассмотрены примеры автоматизаций средствами Home Assistant и Node-RED, а так же будут затронуты встроенные инструменты zigbee2mqtt.


ссылка на оригинал статьи https://habr.com/ru/articles/875044/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *