Files
obsidian-vault/family/plans/t610-addons-deployment.md
T

18 KiB
Raw Blame History

title, status, tags, created, updated, related
title status tags created updated related
t610 — развёртывание через HA-аддоны in-progress
family
plan
homeautomation
t610
haos
addons
2026-09-13 2026-09-14
family/plans/home-automation-migration-t610
family/how-to/home-automation

t610 — развёртывание через HA-аддоны

Статус: Этап 1 ВЫПОЛНЕН (2026-09-13). Этап 2 (USB) — РАЗБЛОКИРОВАН 2026-09-14: все 3 USB-устройства подключены, карта адресов зафиксирована, способ привязки РЕШЁН (by-path + uart: true). Следующий шаг — установка z2m-аддона (шаг 12). Родительский план: family/plans/home-automation-migration-t610 (Шаг 3 в нём заменяется на этот документ). Доступ к хосту, CLI и питфоллы: family/how-to/t610-access.

Ключевые решения (кратко, для быстрого входа в контекст)

Решение Что выбрано Почему
Формат развёртывания сервисов HA-аддоны (не docker-compose) из SSH-аддона host docker не виден; аддоны штатны и снимают udev-гонку
Источник z2m community-repo zigbee2mqtt/hassio-zigbee2mqtt в официальном сторе z2m нет
mbusd / modbus-bridge local add-ons (/addons/...) кастомный код, в сторе нет
Привязка CH340 (2 одинаковых адаптера) /dev/serial/by-path/... by-id у обоих идентичен (нет серийников)
Как аддон видит serial флаг uart: true в манифесте аддона даёт доступ ко всем serial (by-id + by-path) автоматически; devices: не нужен
udev-алиасы ttyZONT/ttyVent отменены на HA OS невозможны (SSH-аддон = Alpine-контейнер); by-path функционально эквивалентен
Доступ к хостовому шеллу не нужен debug-SSH 22222 включается только флешкой; всё делается через Supervisor API

Контекст: почему аддоны, а не docker-compose 1:1

Изначально в родительском плане (Шаг 3, Вариант B) предполагалось перенести docker-compose.yml с TrueNAS 1:1. При проверке живого t610 выяснилось:

  • HA OS 18.2 внутри использует host docker 29.6.2 (overlayfs, journald) — docker есть, ha docker info подтверждает.
  • Но из SSH-аддона docker CLI не виден — аддон живёт в своём контейнере. Доступ к host docker только через Supervisor (ha docker) или через Portainer-аддон.
  • Поэтому штатный и наименее хрупкий путь — аддоны.

Решение Alex (2026-09-13): «Делай всё аддонами».

Состав аддонов

Сервис Slug Источник Статус
Mosquitto broker (MQTT) core_mosquitto Official (core) есть в сторе
Node-RED a0d7b954_nodered Community есть в сторе
Advanced SSH & Web Terminal a0d7b954_ssh Community есть в сторе (запасной путь)
Terminal & SSH core_ssh Official уже установлен и работает
Samba share (для доступа к файлам) core_samba Official есть в сторе
File editor core_configurator Official есть в сторе
Zigbee2MQTT ⚠️ В сторе НЕТ надо local add-on / community repo
mbusd ⚠️ В сторе НЕТ надо local add-on
modbus-bridge ⚠️ В сторе НЕТ (локальная сборка) надо local add-on

Про Zigbee2MQTT

В официальном сторе z2m нет (есть только deCONZ core_deconz и core_silabs_multiprotocol). Варианты:

  • A. Community-репозиторий z2m — у сообщества есть репо (https://github.com/zigbee2mqtt/hassio-zigbee2mqtt), добавляется как app repository, дальше штатная установка.
  • B. Local add-on — свой Dockerfile в /addons/zigbee2mqtt.

Решение: A (community repo) — меньше ручной работы, поддерживается сообществом, обновления через UI.

Про mbusd и modbus-bridge

В сторе нет и быть не может (кастомный код). Только local add-ons:

/addons/mbusd/          → Dockerfile + config
/addons/modbus-bridge/  → Dockerfile + modbus_ha_bridge.py + config.yml

Local add-ons требуют Advanced Mode в профиле HA (Settings → Add-ons появляются только с ним) + репозиторий «Local apps» уже подключён (проверено: addons_repositories содержит Local apps).

USB-устройства подключены (2026-09-14) — блокер снят

Все 3 устройства воткнуты и видны (карта by-id/by-path: family/how-to/t610-access §USB).

/dev/ttyUSB0 → CH340 #1  by-path: pci-0000:00:12.0-usb-0:3:1.0-port0  (порт 3)  → ZONT / modbus-bridge
/dev/ttyUSB1 → CH340 #2  by-path: pci-0000:00:12.0-usb-0:4:1.0-port0  (порт 4)  → Vent / mbusd
/dev/ttyACM0 → Zigbee Inswift ZBP-MG21  by-id: usb-Inswift_Zigbee_ZBP-MG21_535A000001-if00

⚠️ Два CH340 неразличимы по by-id (у обоих 1a86:7523, serial отсутствует) → привязка только по by-path / адресу шины.

🔑 РЕШЕНИЕ: привязка по by-path вместо udev-алиасов

Проверено на живом t610 (2026-09-14): udev-алиасы (ttyZONT/ttyVent) на HA OS не нужны и сделать их «как на TrueNAS» нельзя — SSH-аддон это Alpine-контейнер, у него нет /etc/udev/rules.d и нет udevadm. Хостовый доступ = только debug-SSH 22222, который на t610 выключен и включается лишь флешкой с authorized_keys (по сети — никак: ha host без ssh-команд, Supervisor API /host/services/ssh → 403, роль аддона manager).

Рабочая схема — штатный механизм Supervisor: uart: true.

  • В config.yaml (или config.json) аддона флаг uart: true даёт контейнеру доступ ко всем serial-устройствам хоста — вместе с симлинками /dev/serial/by-id/ и /dev/serial/by-path/.
  • Подтверждено: core_ssh имеет uart: true → из него виден весь /dev/serial/by-path/ (см. таблицу выше). z2m-аддон тоже имеет uart: true.
  • devices: в конфиг аддона прописывать НЕ надо — при uart: true проброс serial автоматический.

Как прописывать путь в конфиге сервиса:

# zigbee2mqtt (Settings → Apps → Zigbee2MQTT → Configuration → serial)
serial:
  adapter: ember
  port: /dev/serial/by-path/pci-0000:04:00.0-usb-0:1:1.0   # Zigbee — by-id тоже ок (уникальный серийник)

Для mbusd / modbus-bridge (local add-ons) — в их config.yaml/опциях указывать by-path:

ZONT  → /dev/serial/by-path/pci-0000:00:12.0-usb-0:3:1.0-port0
Vent  → /dev/serial/by-path/pci-0000:00:12.0-usb-0:4:1.0-port0

Это функциональный аналог udev-алиасов с TrueNAS: имя не «прыгает» при перезагрузке, привязка к физическому порту. Разница только в том, что вместо ttyZONT пишется полный by-path.

⚠️ by-path привязан к физическому порту. CH340 #1 обязан остаться в порту 3, CH340 #2 — в порту 4. Если поменять — пути поедут. Порты зафиксированы (проверено).

Порядок работы:

  1. Установить z2m-аддон (by-id/by-path уникальны для Zigbee) → настроить serial → перенести database.db + network_key + pan_id (иначе переспаривание!).
  2. Собрать local add-on mbusd (порт 502, CH340 #2 / порт 4).
  3. Собрать local add-on modbus-bridge (CH340 #1 / порт 3), перенести modbus_ha_bridge.py + config.yml, env HA_TOKEN (новый!).

План по шагам

Этап 1 — базовые аддона (не требуют USB) — ВЫПОЛНЕНО 2026-09-13

  1. Advanced Mode — не понадобился для CLI (всё сделано через ha apps), понадобится позже для local add-ons
  2. Mosquitto broker (core_mosquitto v7.1.1) — установлен, started, порты 1883 (MQTT) + 1884 (WS) открыты, discovery отправлен в HA автоматически
  3. Node-RED (a0d7b954_nodered v22.0.6) — установлен, started, порт 1880 открыт, уже подключился к HA (Connected to http://supervisor/core)
  4. Samba share (core_samba) — установлен, но stopped: требует задать password (по умолчанию null) → логин homeassistant. Задать в UI: Settings → Apps → Samba → Configuration
  5. File editor (core_configurator) — установлен, started
  6. Репозиторий Zigbee2MQTT добавлен: ha store add https://github.com/zigbee2mqtt/hassio-zigbee2mqtt → появился как Home Assistant App: Zigbee2MQTT (slug 45df7312)
  7. HA MQTT-интеграция на core-mosquitto — проверить/настроить после переноса конфига

Питфоллы, выявленные при установке:

  • ha apps НЕ имеет команды для изменения опций (только install/start/stop/restart/logs/info/update/uninstall). Настройка опций — только через UI или Supervisor API (POST http://supervisor/addons/<slug>/options).
  • Node-RED по умолчанию ssl: true → падает при старте без сертификата (init-nginx: command exited 1, state: error). Фикс: ssl: false через API (см. ниже).
  • API требует полный набор опций (схема валидирует все ключи) — нельзя послать только {"ssl": false}, будет Missing option 'certfile'. Надо взять текущие опции и поменять нужное.
  • В SSH-аддоне нет python3 (только bash/curl/jq/ha). Скрипты для t610 писать на bash+jq.
  • ha store add <url> (не ha store repositories add).

Рабочий рецепт смены опций аддона (bash+jq через SSH-аддон):

SLUG="a0d7b954_nodered"
API="http://supervisor/addons/${SLUG}"
AUTH="Authorization: Bearer ${SUPERVISOR_TOKEN}"
curl -s -H "${AUTH}" "${API}/info" | jq '.data.options | .ssl = false' > /tmp/o.json
jq -n --slurpfile o /tmp/o.json '{options: $o[0]}' > /tmp/post.json
curl -s -X POST -H "${AUTH}" -H "Content-Type: application/json" -d @/tmp/post.json "${API}/options"
ha apps restart "$SLUG"

Скрипты лежат локально: ~/tmp-t610/nr_set_ssl.sh.

Этап 2 — USB-устройства (все подключены 2026-09-14) 🟡 В РАБОТЕ

  1. Alex втыкает 3 USB в t610 — ВЫПОЛНЕНО 2026-09-14. Порты зафиксированы: CH340 #1 → USB1 порт 3, CH340 #2 → USB1 порт 4, Zigbee → USB3 порт 1. Устройства из портов не вынимать!
  2. Пути определены (ls /dev/serial/by-id/, by-path, sysfs) — подробная карта: family/how-to/t610-access §USB
  3. Карта составлена: ttyUSB0 = CH340 #1 (ZONT), ttyUSB1 = CH340 #2 (Vent), ttyACM0 = Zigbee
  4. СПОСОБ ПРИВЯЗКИ РЕШЁН 2026-09-14 — привязка по by-path, никаких udev-алиасов. Механизм: флаг uart: true в манифесте аддона даёт доступ ко всем serial включая /dev/serial/by-path/ (проверено на живом t610: core_ssh uart:true видит все by-path; z2m тоже uart:true). devices: прописывать не надо. Подробности: family/how-to/t610-access §USB. Блокер снят.
  5. Установить z2m-аддон, указать serial-порт (usb-Inswift_Zigbee_ZBP-MG21_535A000001-if00 или by-path pci-0000:04:00.0-usb-0:1:1.0), перенести database.db + network_key + pan_id (1:1, иначе переспаривание!)
  6. Собрать local add-on mbusd (/addons/mbusd), порт 502, устройство = CH340 #2 / порт 4 (by-path pci-0000:00:12.0-usb-0:4:1.0-port0)
  7. Собрать local add-on modbus-bridge (/addons/modbus-bridge), перенести modbus_ha_bridge.py + config.yml, устройство = CH340 #1 / порт 3 (by-path pci-0000:00:12.0-usb-0:3:1.0-port0), env HA_TOKEN (сгенерировать новый!)

Этап 3 — перенос HA-конфига

  1. Перенести configuration.yaml, automations.yaml, scripts.yaml, secrets.yaml, www/
  2. Перенести .storage/ (критично: core.entity_registry, lovelace.home_plan) — см. родительский план §5.6
  3. Поправить modbus.host127.0.0.1 (mbusd теперь локальный)

Этап 4 — проверка и отключение TrueNAS

  1. Чек-лист из родительского плана §6
  2. Caddy upstream → t610; GPON-редирект → t610
  3. Остановить + отключить автозапуск на TrueNAS (§7)

Отличия от родительского плана (что меняется)

Было (родительский план) Стало (этот план)
docker-compose 1:1 на HA OS HA-аддоны
udev-алиасы 99-tty-alias.rules на t610 не нужно — аддоны с uart: true видят /dev/serial/by-path/... и /dev/serial/by-id/... автоматически; в конфиге сервиса указывается by-path
Скрипт ожидания tty + systemd не нужно — Supervisor сам ждёт устройство при старте аддона
Ручной docker compose up ha apps start <slug> / UI
Пути /mnt/data/... /addon_configs/<slug>/ и /share, /config
Хостовый SSH (как на TrueNAS) недоступен — SSH-аддон = Alpine-контейнер; debug-SSH 22222 только через флешку CONFIG. Привязка serial решается штатным uart: true, хостовый шелл не нужен

Плюс: проблема udev-гонки на t610 снимается — Supervisor управляет зависимостями и пробросом устройств. Это была самая опасная часть старого плана.

Открытые вопросы

  • РЕШЕНО 2026-09-14 — способ привязки CH340 в аддонах: привязка по /dev/serial/by-path/...; механизм Supervisor — флаг uart: true в манифесте аддона (доступ ко всем serial автоматически, devices: не нужен). Проверено на живом t610. Детали: family/how-to/t610-access §USB.
  • Community-repo z2m: проверить, что он совместим с HA OS 18.2 / Core 2026.9.x
  • mbusd/modbus-bridge как local add-on: их собственный config.yamlв манифесте тоже нужен uart: true, чтобы увидеть by-path (тот же механизм, что у z2m и core_ssh)
  • Куда переносить данные z2m: /addon_configs/<slug>/ (HA OS 12+ путь для app-конфигов)
  • Камера (§8 родительского плана) — не аддон, разбираться отдельно

Связанные заметки