Краткая инструкция по установке 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
# rpi-update
# 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

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

mkdir -p homeassistant/config
nano docker-compose.yaml

Дополняем 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

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

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

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, и в некоторым смысле похож на WiFi, но гораздо более энергоэкономичный. В сети 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.

Комментарии (11)


  1. igrushkin
    20.01.2025 13:36

    а можете пояснить, зачем устанавливать PostgreSQL? мне кажется, HA и так прекрасно работает


    1. igrushkin
      20.01.2025 13:36

      и еще: у вас работает Homebridge? У меня HA был установлен в bridged режиме, но Homebridge не работал. Пришлось поменять настройки контейнера на host


      1. neadm1n Автор
        20.01.2025 13:36

        Увы нет. Как только разберусь почему - дополню статью.


        1. igrushkin
          20.01.2025 13:36

          ответ "почему" есть в моем вопросе


    1. neadm1n Автор
      20.01.2025 13:36

      Вы правы, HA хорошо работает на встроенной SQLite. Разработчики HA позаботились, что бы производительность не снижалась - данные в БД пишутся порциями с небольшими интервалами, старые данные регулярно удаляются и БД пересобирается. Для много дома это не проблема. Моя же цель - сбор и долгосрочное хранение данных для получения исторических срезов. PostgreSQL можно использовать и другими приложениями, например, для хранения локальной копии OSM, для красивого отображения истории геолокации (с картами у меня большой опыт работы), чем HA похвастаться не может. PostgreSQL можно напрямую подключать в Node-RED для дополнительной обработки данных умного дома, используя привычный мне JS и при этом иметь возможность их простого вывода в Home Assistant, в виде датчика.


      1. Timick
        20.01.2025 13:36

        Все таки HA на rpi не про базы данных. Штатно у вас microsd для которой лимит циклов записи ограничен. Может накрыться достаточно быстро.


        1. neadm1n Автор
          20.01.2025 13:36

          Верное замечание. Именно поэтому сам использую, и всем рекомендую, NVMe SSD - RPI 5 с ними прекрасно интегрируется.


  1. blindmen
    20.01.2025 13:36

    Позвольте пару дурацких вопросов) я правильно понял что ha os так же запускает ha в докере?

    Проброс встроенного Bluetooth происходит по аналогии с ZigBee ? Только не usb а нейкий device?


    1. neadm1n Автор
      20.01.2025 13:36

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

      Raspberry Pi имеет встроенный Bluetooth, для его подключения достаточно в volumes примонтировать точку /run/dbus:/run/dbus:ro и добавить интеграцию Bluetooth, после чего можно цеплять устройства.


  1. Timick
    20.01.2025 13:36

    Наверное начинающим лучше начать с zha. Я считал что mqtt больше для координаторов не поддерживаемых zha.


    1. Harwest
      20.01.2025 13:36

      Без разницы с чего начинать, просто z2m исторически появился раньше и поддерживает больше устройств (и кстати более полно). С выходом прошивок 'ember' для чипов EFR32xx стабильность работы под z2m заметно улучшилась и ставить ZHA кмк смысла нет.