--- title: t610 — развёртывание через HA-аддоны status: in-progress tags: - family - plan - homeautomation - t610 - haos - addons created: '2026-09-13' updated: '2026-09-14' related: - '[[family/plans/home-automation-migration-t610]]' - '[[family/how-to/home-automation]]' --- # t610 — развёртывание через HA-аддоны > **Статус: Этап 1 ВЫПОЛНЕН (2026-09-13). Этап 2 в работе: все 3 USB подключены (2026-09-14), привязка решена (by-path + `uart: true`), ✅ z2m-аддон УСТАНОВЛЕН И РАБОТАЕТ (16 устройств). Следующий шаг — local add-on mbusd (шаг 13).** > Родительский план: [[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) | ✅ установлен, `started` (1883/1884) | | Node-RED | `a0d7b954_nodered` | Community | ✅ установлен, `started` (1880) | | Advanced SSH & Web Terminal | `a0d7b954_ssh` | Community | ✅ есть в сторе (запасной путь) | | Terminal & SSH | `core_ssh` | Official | ✅ **установлен и работает** | | Samba share (для доступа к файлам) | `core_samba` | Official | ⏸️ установлен, `stopped` (нужен `password`) | | File editor | `core_configurator` | Official | ✅ установлен, `started` | | **Zigbee2MQTT** | `45df7312_zigbee2mqtt` | Community repo | ✅ **установлен, работает — 16 устройств** | | **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. ✅ Реализовано 2026-09-14. ### Про 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 → Apps появляются только с ним) + репозиторий «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 выключен и включается лишь флешкой с ключом в разделе `CONFIG` (по сети — никак: `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 автоматический. **Как прописывать путь в конфиге сервиса:** ```yaml # 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. Если поменять — пути поедут. Порты зафиксированы (проверено). ### ✅ z2m на t610 — ВЫПОЛНЕНО (2026-09-14) **Что сделано:** 1. **Бэкап с TrueNAS** → Mac `~/tmp-t610/z2m-backup-20260914/` (`database.db`, `configuration.yaml`, `state.json`, `coordinator_backup.json`). Источник на TrueNAS: `/mnt/RED_2TB/docker/zigbee2mqtt/`. 2. Установлен аддон `45df7312_zigbee2mqtt` v**2.14.1-1** (community repo). Манифест содержит **`uart: true`** → доступ ко всем serial, `devices:` не нужен. 3. **Mosquitto**: добавлен логин `zont` (тот же пароль, что на TrueNAS) через Supervisor API → `POST /addons/core_mosquitto/options` → `ha apps restart core_mosquitto`. Нужен, чтобы HA-интеграция и ZONT продолжили работать по старым креденшелам. 4. **Опции z2m** (Supervisor API `POST /addons/45df7312_zigbee2mqtt/options`): ```json serial: { "port": "/dev/serial/by-id/usb-Inswift_Zigbee_ZBP-MG21_535A000001-if00", "adapter": "ember", "baudrate": 115200, "rtscts": false } mqtt: { "server": "mqtt://core-mosquitto:1883", "user": "zont", "password": "<как на TrueNAS>" } ``` 5. **База перенесена 1:1.** ⚠️ `data_path` аддона = **`/config/zigbee2mqtt`** — внутри HA-конфига, НЕ `/addon_configs/...`. Создана `/config/zigbee2mqtt/`, залиты `database.db` + `configuration.yaml` (тот же `network_key`/`pan_id`/`ext_pan_id`/`channel: 11`, но serial → by-id, MQTT → core-mosquitto). 6. `ha apps start 45df7312_zigbee2mqtt` → **работает.** **Лог подтверждает успех** (`/config/zigbee2mqtt/log//log.log`): ``` zh:ember: [INIT TC] Adapter network matches config. z2m: Coordinator firmware: EmberZNet 7.4.5 [GA], EZSP 13 z2m: Currently 16 devices are joined. z2m: Connected to MQTT server ``` ✅ **16 устройств на месте, переспаривание НЕ потребовалось.** (Tuya: модули реле, диммеры, розетки, датчики t°/влажности, протечки, радар присутствия, светильник.) **Питфоллы z2m-переноса:** - **Пароль MQTT содержит `$`** (`mqtt1z3$`) → при передаче через `sed`/интерполяцию в шелле ломается экранирование, скрипт падает с `unmatched '|'`. Надёжный путь: файл `configuration.yaml` готовить **локально**, заливать копированием файла, значения с `$` не подставлять в bash-строки. Для Supervisor API — JSON собирать через `jq`, а не конкатенацией. - Supervisor API требует **полный** набор опций (схема валидирует все ключи) — брать текущие и менять нужное. - Пароль в выводе `ha`/API маскируется как `***` — это нормально, значение применяется. - `uart: true` = автоматический проброс всех serial (by-id + by-path). `devices:` в конфиг аддона прописывать не надо. - В SSH-аддоне **нет python3**, и он неустойчив к сложному экранированию строк — готовые конфиги заливать файлом, а не генерировать на хосте. ## План по шагам ### Этап 1 — базовые аддона (не требуют USB) — ✅ ВЫПОЛНЕНО 2026-09-13 1. [x] Advanced Mode — не понадобился для CLI (всё сделано через `ha apps`), понадобится позже для local add-ons 2. [x] **Mosquitto broker** (`core_mosquitto` v7.1.1) — установлен, `started`, порты **1883** (MQTT) + **1884** (WS) открыты, discovery отправлен в HA автоматически 3. [x] **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. [x] **File editor** (`core_configurator`) — установлен, `started` 6. [x] Репозиторий 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//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 ` (не `ha store repositories add`). **Рабочий рецепт смены опций аддона (bash+jq через SSH-аддон):** ```bash 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) 🟡 В РАБОТЕ 8. [x] Alex втыкает 3 USB в t610 — **ВЫПОЛНЕНО 2026-09-14**. Порты зафиксированы: CH340 #1 → USB1 порт 3, CH340 #2 → USB1 порт 4, Zigbee → USB3 порт 1. **Устройства из портов не вынимать!** 9. [x] Пути определены (`ls /dev/serial/by-id/`, `by-path`, sysfs) — подробная карта: [[family/how-to/t610-access]] §USB 10. [x] Карта составлена: ttyUSB0 = CH340 #1 (ZONT), ttyUSB1 = CH340 #2 (Vent), ttyACM0 = Zigbee 11. [x] **СПОСОБ ПРИВЯЗКИ РЕШЁН 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. **Блокер снят.** 12. [x] ✅ **z2m-аддон УСТАНОВЛЕН И РАБОТАЕТ (2026-09-14)** — аддон `45df7312_zigbee2mqtt` v2.14.1-1, serial по by-id, база перенесена 1:1, **16 устройств на месте, переспаривание не потребовалось.** Подробности — §«z2m на t610 (ВЫПОЛНЕНО)» выше. 13. [ ] Собрать local add-on **mbusd** (`/addons/mbusd`), порт 502, устройство = CH340 #2 / порт 4 (by-path `pci-0000:00:12.0-usb-0:4:1.0-port0`) 14. [ ] Собрать 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-конфига 15. [ ] Перенести `configuration.yaml`, `automations.yaml`, `scripts.yaml`, `secrets.yaml`, `www/` 16. [ ] Перенести `.storage/` (критично: `core.entity_registry`, `lovelace.home_plan`) — см. родительский план §5.6 17. [ ] Поправить `modbus.host` → `127.0.0.1` (mbusd теперь локальный) ### Этап 4 — проверка и отключение TrueNAS 18. [ ] Чек-лист из родительского плана §6 19. [ ] Caddy upstream → t610; GPON-редирект → t610 20. [ ] Остановить + отключить автозапуск на 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 ` / UI | | Пути `/mnt/data/...` | `/addon_configs//` и `/share`, `/config` | | Хостовый SSH (как на TrueNAS) | **недоступен** — SSH-аддон = Alpine-контейнер; debug-SSH 22222 только через флешку `CONFIG`. Привязка serial решается штатным `uart: true`, хостовый шелл не нужен | > ✅ Плюс: проблема **udev-гонки на t610 снимается** — Supervisor управляет зависимостями и пробросом устройств. Это была самая опасная часть старого плана. ## Открытые вопросы - [x] ✅ **РЕШЕНО 2026-09-14 — способ привязки CH340 в аддонах:** привязка по `/dev/serial/by-path/...`; механизм Supervisor — флаг `uart: true` в манифесте аддона (доступ ко всем serial автоматически, `devices:` не нужен). Проверено на живом t610. Детали: [[family/how-to/t610-access]] §USB. - [x] ✅ **РЕШЕНО 2026-09-14 — куда переносить данные z2m:** `data_path` аддона = **`/config/zigbee2mqtt`** (внутри HA-конфига), НЕ `/addon_configs/`. Туда залиты `database.db` и `configuration.yaml`. - [x] ✅ **Проверено 2026-09-14 — совместимость community-repo z2m с HA OS 18.2 / Core 2026.9.2:** работает (v2.14.1-1, координатор EmberZNet 7.4.5, 16 устройств). - [ ] mbusd/modbus-bridge как local add-on: их собственный `config.yaml` — **в манифесте тоже нужен `uart: true`**, чтобы увидеть by-path (тот же механизм, что у z2m и core_ssh) - [ ] Камера (§8 родительского плана) — не аддон, разбираться отдельно ## Связанные заметки - [[family/plans/home-automation-migration-t610]] — родительский план - [[family/how-to/home-automation]] — карта slave ID, ZONT, регистры - [[family/how-to/t610-access]] — доступ к хосту, CLI, карта USB, питфоллы - [[family/how-to/zont-modbus-bridge-udev-race-protection]] — старая проблема гонки udev (на аддонах неактуальна) - [[family/how-to/truenas-infrastructure]] — текущий docker-стек TrueNAS