[2026-09-14] eagle: family/how-to/t610-access.md family/plans/home-automation-migration-t610.md family/plans/t610-addons-deployment.md

This commit is contained in:
Alexey Martemyanov
2026-09-14 08:21:05 +06:00
parent 7a806dfe45
commit 30af77bf73
3 changed files with 113 additions and 22 deletions
+58 -6
View File
@@ -35,6 +35,19 @@ ssh -i ~/.ssh/id_rsa root@192.168.2.176
> ⚠️ **Порт 22222 (debug SSH) на t610 закрыт** — debug-доступ не включён. Рабочий путь — аддон. > ⚠️ **Порт 22222 (debug SSH) на t610 закрыт** — debug-доступ не включён. Рабочий путь — аддон.
### Хостовый SSH (debug-SSH 22222) — как и зачем
Порт **22222** даёт root-шелл **самого хоста HA OS** (не контейнера) — там есть `/etc/udev/rules.d`, `udevadm`, systemd. Это аналог того доступа, что был на TrueNAS.
**Но включить его по сети НЕЛЬЗЯ** (проверено 2026-09-14):
- `ha host` — ssh-команд нет (только reboot/shutdown/disks/options/logs)
- Supervisor API `/host/services/ssh`**403 Forbidden** (роль аддона `core_ssh` = `manager`, нужен `admin`)
- `ha os import` — только импорт конфигов с флешки
**Единственный штатный способ:** флешка (FAT32, метка тома **`CONFIG`**) с файлом `authorized_keys` (публичный ключ) в корне → воткнуть в t610 → перезагрузка/ожидание → порт 22222 открывается.
> 📌 **На практике хостовый SSH на t610 не нужен:** задача алиасов serial решается штатным механизмом Supervisor — флагом `uart: true` (см. §USB → «РЕШЕНИЕ»). Хостовый шелл потребовался бы только для кастомных udev-правил, а они не требуются.
## Ограничения SSH-аддона (что доступно из шелла) ## Ограничения SSH-аддона (что доступно из шелла)
Внутри аддона `core_ssh` **НЕТ** `docker` CLI и **НЕТ** `python3`. Внутри аддона `core_ssh` **НЕТ** `docker` CLI и **НЕТ** `python3`.
@@ -63,6 +76,30 @@ ha host info # диск, версия OS, features
> ⚠️ `ha apps` **не умеет менять опции** (нет команды `options`). Настройка — через UI или Supervisor API (см. ниже). > ⚠️ `ha apps` **не умеет менять опции** (нет команды `options`). Настройка — через UI или Supervisor API (см. ниже).
### Диагностика USB/serial из аддона (udevadm НЕТ)
В SSH-аддоне **нет `udevadm`** (`udevadm info` вернёт пусто / command not found). Атрибуты USB-устройств читать напрямую из **sysfs**:
```bash
# все serial-симлинки (по id и по адресу шины)
ls -la /dev/serial/by-id/ /dev/serial/by-path/
# для конкретного tty — найти sysfs-путь и прочитать атрибуты
P=$(readlink -f /sys/class/tty/ttyUSB0/device) # базовый sysfs-путь
for f in idVendor idProduct serial product manufacturer; do
v=$(cat "${P%/*}/$f" 2>/dev/null); [ -n "$v" ] && echo "$f = $v"
done
# топология USB (какое устройство на каком контроллере/порту)
lsusb
lsusb -t
# быстрый срез всех tty + их sysfs
for d in ttyUSB0 ttyUSB1 ttyACM0; do echo "$d -> $(readlink -f /sys/class/tty/$d/device)"; done
```
> 📌 **Питфолл:** у двух CH340 (`1a86:7523`) поля `serial`/`manufacturer` **пустые** → их `by-id` совпадает. Различать только по `by-path` (адрес шины). Подробнее — §USB.
### Смена опций аддона через Supervisor API ### Смена опций аддона через Supervisor API
API доступен из аддона (`SUPERVISOR_TOKEN` уже в окружении): API доступен из аддона (`SUPERVISOR_TOKEN` уже в окружении):
@@ -131,12 +168,27 @@ ttyACM0 → /sys/devices/pci0000:00/0000:00:15.3/0000:04:00.0/usb3/3-1/3-1:1.0
- TrueNAS: `KERNELS=="?-1.5"` / `"?-1.6"` (другая топология USB). - TrueNAS: `KERNELS=="?-1.5"` / `"?-1.6"` (другая топология USB).
- t610: путь `pci-0000:00:12.0-usb-0:3` и `...-0:4`**порт 3 и порт 4** на одном OHCI-контроллере. Т.е. udev-правило на t610: `KERNELS=="1-3"` и `KERNELS=="1-4"`. - t610: путь `pci-0000:00:12.0-usb-0:3` и `...-0:4`**порт 3 и порт 4** на одном OHCI-контроллере. Т.е. udev-правило на t610: `KERNELS=="1-3"` и `KERNELS=="1-4"`.
### Решение для HA-аддонов (открытый вопрос) ### 🔑 РЕШЕНИЕ: привязка по `by-path` (udev-алиасы на HA OS не нужны)
В HA-аддонах udev-правила на хосте применить нельзя (аддон — контейнер). Варианты привязки:
- **A.** В `config.yaml` аддона пробрасывать по `by-path` — но Supervisor в `devices:` обычно принимает `/dev/serial/by-id/...`; проверить, принимает ли `by-path`. **Как на TrueNAS — нельзя.** Там был хостовый шелл TrueNAS → `/etc/udev/rules.d/99-tty-alias.rules`. На t610 SSH-аддон = **Alpine-контейнер**: нет `/etc/udev/rules.d`, нет `udevadm`. Хостовый доступ = только **debug-SSH 22222**, но он **выключен** и включается **только флешкой** (`authorized_keys` в разделе с меткой `CONFIG`); по сети — никак:
- **B.** Прописать в аддоне `devices: [/dev/ttyUSB0]` + зафиксировать физические порты (какой адаптер в какой порт) — хрупко, tty-номера могут меняться. - `ha host` — ssh-команд нет
- **C.** Local add-on, внутри которого свой udev/симлинк-хак. - Supervisor API `/host/services/ssh`**403 Forbidden** (аддон `core_ssh` имеет роль `manager`, нужен `admin`)
> Порты 3 и 4 **зафиксированы** — CH340 #1 в порт 3, CH340 #2 в порт 4. Устройства из портов не вынимать! - `ha os import` — только импорт конфигов с флешки
**Рабочая схема — штатный `uart: true`:**
- Флаг **`uart: true`** в манифесте аддона даёт контейнеру доступ ко **всем** serial-устройствам хоста, включая симлинки `/dev/serial/by-id/` **и** `/dev/serial/by-path/`.
- Проверено на живом t610: `core_ssh` имеет `uart: true` → его `/dev/serial/by-path/` содержит все пути (таблица выше). z2m-аддон тоже `uart: true`.
- **`devices:` прописывать не нужно** — проброс автоматический.
**Что писать в конфигах сервисов:**
```
Zigbee (z2m): serial.port = /dev/serial/by-id/usb-Inswift_Zigbee_ZBP-MG21_535A000001-if00 (или by-path pci-0000:04:00.0-usb-0:1:1.0)
ZONT (modbus-bridge): /dev/serial/by-path/pci-0000:00:12.0-usb-0:3:1.0-port0 (CH340 #1, порт 3)
Вентиляция (mbusd): /dev/serial/by-path/pci-0000:00:12.0-usb-0:4:1.0-port0 (CH340 #2, порт 4)
```
Функциональный аналог TrueNAS-алиасов: имя не «прыгает» при перезагрузке. Отличие — вместо `ttyZONT` пишется полный by-path.
> ⚠️ **by-path привязан к физическому порту** — CH340 #1 держать в порту 3, CH340 #2 в порту 4. Порты зафиксированы.
> ✅ **Плюс аддонов:** старая проблема гонки udev ([[family/how-to/zont-modbus-bridge-udev-race-protection]]) на t610 **неактуальна** — Supervisor сам ждёт устройство при старте аддона, скрипты ожидания tty не нужны. > ✅ **Плюс аддонов:** старая проблема гонки udev ([[family/how-to/zont-modbus-bridge-udev-race-protection]]) на t610 **неактуальна** — Supervisor сам ждёт устройство при старте аддона, скрипты ожидания tty не нужны.
@@ -19,7 +19,7 @@ related:
--- ---
# Перенос домашней автоматизации на HP t610 # Перенос домашней автоматизации на HP t610
> **Статус: В ПРОЦЕССЕ (Этап 1 — аддоны, ВЫПОЛНЕН. Этап 2a — USB подключены 2026-09-14, идёт настройка z2m/mbusd/modbus-bridge; живой блокер — способ привязки CH340 в аддонах).** > **Статус: В ПРОЦЕССЕ (Этап 1 — аддоны, ВЫПОЛНЕН. Этап 2a — USB подключены 2026-09-14, способ привязки CH340 РЕШЁН; следующий шаг — z2m/mbusd/modbus-bridge).**
> Цель: убрать всю домашнюю автоматизацию с TrueNAS (он перегружен — 17/21 ГБ RAM) на выделенный HP t610, с бэкапом конфигов на TrueNAS и в git. > Цель: убрать всю домашнюю автоматизацию с TrueNAS (он перегружен — 17/21 ГБ RAM) на выделенный HP t610, с бэкапом конфигов на TrueNAS и в git.
> >
> **Прогресс 2026-09-13 — 🎉 t610 запущен и в сети:** > **Прогресс 2026-09-13 — 🎉 t610 запущен и в сети:**
@@ -28,9 +28,9 @@ related:
> - ✅ SSH включён через аддон `core_ssh` (Terminal & SSH) — вход по ключу `~/.ssh/id_rsa`. > - ✅ SSH включён через аддон `core_ssh` (Terminal & SSH) — вход по ключу `~/.ssh/id_rsa`.
> - ✅ **Этап 1 развёртывания аддонов ВЫПОЛНЕН** (Mosquitto 1883, Node-RED 1880, File editor, Samba). Детали: [[family/plans/t610-addons-deployment]]. > - ✅ **Этап 1 развёртывания аддонов ВЫПОЛНЕН** (Mosquitto 1883, Node-RED 1880, File editor, Samba). Детали: [[family/plans/t610-addons-deployment]].
> - ✅ **Этап 2a ВЫПОЛНЕН 2026-09-14:** все 3 USB-устройства подключены к t610 и видны. Карта: `ttyUSB0` = CH340 #1 (порт 3 → ZONT), `ttyUSB1` = CH340 #2 (порт 4 → Vent), `ttyACM0` = Zigbee Inswift ZBP-MG21. Подробности: [[family/how-to/t610-access]] §USB. **Порты 3/4 зафиксированы — устройства не вынимать.** > - ✅ **Этап 2a ВЫПОЛНЕН 2026-09-14:** все 3 USB-устройства подключены к t610 и видны. Карта: `ttyUSB0` = CH340 #1 (порт 3 → ZONT), `ttyUSB1` = CH340 #2 (порт 4 → Vent), `ttyACM0` = Zigbee Inswift ZBP-MG21. Подробности: [[family/how-to/t610-access]] §USB. **Порты 3/4 зафиксированы — устройства не вынимать.**
> - ⚠️ **Живой блокер 2b:** оба CH340 = `1a86:7523` **без серийника** → by-id у них ОДИНАКОВЫЙ, проброс по by-id в аддонах сломается. Решить способ привязки (by-path / фиксированные порты / local add-on) — см. [[family/plans/t610-addons-deployment]] §Этап 2. > - **Блокер 2b РЕШЁН 2026-09-14:** оба CH340 = `1a86:7523` без серийника → by-id идентичен, **но привязка по `/dev/serial/by-path/...` работает**, и аддон видит её через флаг **`uart: true`** (штатный механизм Supervisor, `devices:` не нужен). udev-алиасы `ttyZONT`/`ttyVent` на HA OS отменены (невозможны: SSH-аддон = Alpine-контейнер). Детали: [[family/plans/t610-addons-deployment]] §Этап 2.
> - ⚠️ **Решение изменено: ставим всё АДДОНАМИ**, а не docker-compose 1:1 (Шаг 3 заменён — см. [[family/plans/t610-addons-deployment]]). Плюс: проблема udev-гонки снимается. > - ⚠️ **Решение изменено: ставим всё АДДОНАМИ**, а не docker-compose 1:1 (Шаг 3 заменён — см. [[family/plans/t610-addons-deployment]]). Плюс: проблема udev-гонки снимается.
> - ⏭️ Следующий шаг: решить привязку CH340 → Этап 2b (z2m, mbusd, modbus-bridge) → Этап 3 (перенос HA-конфига). > - ⏭️ Следующий шаг: Этап 2b (z2m, mbusd, modbus-bridge) → Этап 3 (перенос HA-конфига).
> >
> **Доступ к хосту и CLI: [[family/how-to/t610-access]].** > **Доступ к хосту и CLI: [[family/how-to/t610-access]].**
> >
@@ -431,9 +431,9 @@ git push origin main
| Риск | Вероятность | Митигация | | Риск | Вероятность | Митигация |
|------|-------------|-----------| |------|-------------|-----------|
| **udev-гонка** (docker стартует раньше tty) | высокая | скрипт ожидания + `After=dev-tty*.device` | | **udev-гонка** (docker стартует раньше tty) | высокая | ✅ на аддонах **неактуальна** — Supervisor сам ждёт устройство при старте аддона |
| **USB-пути t610 ≠ TrueNAS** | ✅ решено | фактические пути зафиксированы 2026-09-14 (§12); порты 3/4 закреплены физически | | **USB-пути t610 ≠ TrueNAS** | ✅ решено | фактические пути зафиксированы 2026-09-14 (§12); порты 3/4 закреплены физически |
| **BY-ID CH340 одинаковый** | ⚠️ **высокая** | оба CH340 без серийника → проброс по by-id ломается; решить привязку по by-path / портам | | **BY-ID CH340 одинаковый** | ✅ решено | оба CH340 без серийника → by-id идентичен, но привязка по **`/dev/serial/by-path/...`** + флаг `uart: true` в аддоне. Детали: [[family/plans/t610-addons-deployment]] §Этап 2 |
| **Zigbee отвалится** | средняя | `database.db` + `network_key` 1:1; переспаривание не нужно при верном переносе | | **Zigbee отвалится** | средняя | `database.db` + `network_key` 1:1; переспаривание не нужно при верном переносе |
| **entity_id разъедутся** | средняя | копировать `.storage/core.entity_registry` | | **entity_id разъедутся** | средняя | копировать `.storage/core.entity_registry` |
| **Хардкод `192.168.2.197` в HA** | высокая | заменить на `127.0.0.1` (mbusd рядом) | | **Хардкод `192.168.2.197` в HA** | высокая | заменить на `127.0.0.1` (mbusd рядом) |
@@ -450,7 +450,7 @@ git push origin main
| 1 | Базовые сервисы: **аддоны** (не docker!) | ✅ Mosquitto 1883, Node-RED 1880, File editor, Samba(нужен пароль) — см. [[family/plans/t610-addons-deployment]] | | 1 | Базовые сервисы: **аддоны** (не docker!) | ✅ Mosquitto 1883, Node-RED 1880, File editor, Samba(нужен пароль) — см. [[family/plans/t610-addons-deployment]] |
| 2 | udev-алиасы + скрипт старта | ✅ **НЕ НУЖНО** — аддоны снимают проблему udev-гонки (Supervisor ждёт устройство) | | 2 | udev-алиасы + скрипт старта | ✅ **НЕ НУЖНО** — аддоны снимают проблему udev-гонки (Supervisor ждёт устройство) |
| 2a | USB-устройства: Zigbee + 2× CH340 | ✅ **ПОДКЛЮЧЕНЫ 2026-09-14** — ttyUSB0/ttyUSB1/ttyACM0, порты 3/4 зафиксированы ([[family/how-to/t610-access]] §USB) | | 2a | USB-устройства: Zigbee + 2× CH340 | ✅ **ПОДКЛЮЧЕНЫ 2026-09-14** — ttyUSB0/ttyUSB1/ttyACM0, порты 3/4 зафиксированы ([[family/how-to/t610-access]] §USB) |
| 2b | z2m / mbusd / modbus-bridge | 🟡 ждут решения привязки CH340 (by-id одинаковый!) — z2m community repo; mbusd+modbus-bridge local add-ons | | 2b | z2m / mbusd / modbus-bridge | 🟡 привязка CH340 **решена** (by-path + `uart: true`); дальше z2m community repo; mbusd+modbus-bridge local add-ons |
| 3 | Перенос конфигов всех сервисов | ⏳ | | 3 | Перенос конфигов всех сервисов | ⏳ |
| 4 | Перенос HA config (`.storage` + yaml + www) | ⏳ | | 4 | Перенос HA config (`.storage` + yaml + www) | ⏳ |
| 5 | Правка адресов (modbus host, HA_TOKEN) | ⏳ | | 5 | Правка адресов (modbus host, HA_TOKEN) | ⏳ |
+49 -10
View File
@@ -16,10 +16,22 @@ related:
--- ---
# t610 — развёртывание через HA-аддоны # t610 — развёртывание через HA-аддоны
> **Статус: Этап 1 ВЫПОЛНЕН (2026-09-13). Этап 2 (USB) — РАЗБЛОКИРОВАН 2026-09-14: все 3 USB-устройства подключены, карта адресов зафиксирована. Идёт настройка аддонов z2m/mbusd/modbus-bridge.** > **Статус: Этап 1 ВЫПОЛНЕН (2026-09-13). Этап 2 (USB) — РАЗБЛОКИРОВАН 2026-09-14: все 3 USB-устройства подключены, карта адресов зафиксирована, способ привязки РЕШЁН (by-path + `uart: true`). Следующий шаг — установка z2m-аддона (шаг 12).**
> Родительский план: [[family/plans/home-automation-migration-t610]] (Шаг 3 в нём заменяется на этот документ). > Родительский план: [[family/plans/home-automation-migration-t610]] (Шаг 3 в нём заменяется на этот документ).
> Доступ к хосту, CLI и питфоллы: [[family/how-to/t610-access]]. > Доступ к хосту, 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 ## Контекст: почему аддоны, а не docker-compose 1:1
Изначально в родительском плане (Шаг 3, Вариант B) предполагалось перенести `docker-compose.yml` с TrueNAS 1:1. Изначально в родительском плане (Шаг 3, Вариант B) предполагалось перенести `docker-compose.yml` с TrueNAS 1:1.
@@ -66,15 +78,41 @@ Local add-ons требуют **Advanced Mode** в профиле HA (Settings
**Все 3 устройства воткнуты и видны** (карта by-id/by-path: [[family/how-to/t610-access]] §USB). **Все 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) /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) /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 /dev/ttyACM0 → Zigbee Inswift ZBP-MG21 by-id: usb-Inswift_Zigbee_ZBP-MG21_535A000001-if00
``` ```
⚠️ **Два CH340 неразличимы по by-id** (у обоих `1a86:7523`, serial отсутствует) → привязка только по **by-path / адресу шины**, как на TrueNAS udev-правилами. Для аддонов надо решить, как пробрасывать (открытый вопрос ниже). ⚠️ **Два 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 автоматический.
**Как прописывать путь в конфиге сервиса:**
```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. Если поменять — пути поедут. Порты зафиксированы (проверено).
**Порядок работы:** **Порядок работы:**
1. Установить z2m-аддон (by-id уникален → безопасно), перенести `database.db` + `network_key` + `pan_id`. 1. Установить z2m-аддон (by-id/by-path уникальны для Zigbee) → настроить serial → перенести `database.db` + `network_key` + `pan_id` (иначе переспаривание!).
2. Собрать local add-on **mbusd** (порт 502, CH340 #2 / порт 4). 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` (новый!). 3. Собрать local add-on **modbus-bridge** (CH340 #1 / порт 3), перенести `modbus_ha_bridge.py` + `config.yml`, env `HA_TOKEN` (новый!).
@@ -112,8 +150,8 @@ ha apps restart "$SLUG"
8. [x] Alex втыкает 3 USB в t610 — **ВЫПОЛНЕНО 2026-09-14**. Порты зафиксированы: CH340 #1 → USB1 порт 3, CH340 #2 → USB1 порт 4, Zigbee → USB3 порт 1. **Устройства из портов не вынимать!** 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 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 10. [x] Карта составлена: ttyUSB0 = CH340 #1 (ZONT), ttyUSB1 = CH340 #2 (Vent), ttyACM0 = Zigbee
11. [ ] ⚠️ **РЕШИТЬ СПОСОБ ПРИВЯЗКИ ДЛЯ АДДОНОВ** — оба CH340 имеют ОДИНАКОВЫЙ by-id → проброс по by-id сломается. Проверить, принимает ли Supervisor в `devices:` путь `by-path`; иначе — фиксированные порты или local add-on с udev. **Это текущий блокер.** 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. [ ] Установить z2m-аддон, указать serial-порт (`usb-Inswift_Zigbee_ZBP-MG21_535A000001-if00`), перенести `database.db` + `network_key` + `pan_id` (1:1, иначе переспаривание!) 12. [ ] Установить 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, иначе переспаривание!)
13. [ ] Собрать local add-on **mbusd** (`/addons/mbusd`), порт 502, устройство = CH340 #2 / порт 4 (by-path `pci-0000:00:12.0-usb-0:4:1.0-port0`) 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` (сгенерировать новый!) 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` (сгенерировать новый!)
@@ -132,17 +170,18 @@ ha apps restart "$SLUG"
| Было (родительский план) | Стало (этот план) | | Было (родительский план) | Стало (этот план) |
|--------------------------|-------------------| |--------------------------|-------------------|
| docker-compose 1:1 на HA OS | HA-аддоны | | docker-compose 1:1 на HA OS | HA-аддоны |
| udev-алиасы `99-tty-alias.rules` на t610 | **не нужно** — аддоны пробрасывают `/dev/serial/by-id/...` напрямую через свою конфигурацию | | udev-алиасы `99-tty-alias.rules` на t610 | **не нужно** — аддоны с `uart: true` видят `/dev/serial/by-path/...` и `/dev/serial/by-id/...` автоматически; в конфиге сервиса указывается by-path |
| Скрипт ожидания tty + systemd | **не нужно** — Supervisor сам ждёт устройство при старте аддона | | Скрипт ожидания tty + systemd | **не нужно** — Supervisor сам ждёт устройство при старте аддона |
| Ручной `docker compose up` | `ha apps start <slug>` / UI | | Ручной `docker compose up` | `ha apps start <slug>` / UI |
| Пути `/mnt/data/...` | `/addon_configs/<slug>/` и `/share`, `/config` | | Пути `/mnt/data/...` | `/addon_configs/<slug>/` и `/share`, `/config` |
| Хостовый SSH (как на TrueNAS) | **недоступен** — SSH-аддон = Alpine-контейнер; debug-SSH 22222 только через флешку `CONFIG`. Привязка serial решается штатным `uart: true`, хостовый шелл не нужен |
> ✅ Плюс: проблема **udev-гонки на t610 снимается** — Supervisor управляет зависимостями и пробросом устройств. Это была самая опасная часть старого плана. > ✅ Плюс: проблема **udev-гонки на t610 снимается** — Supervisor управляет зависимостями и пробросом устройств. Это была самая опасная часть старого плана.
## Открытые вопросы ## Открытые вопросы
- [ ] ⚠️ **ТЕКУЩИЙ БЛОКЕР — способ привязки CH340 в аддонах:** оба CH340 = `1a86:7523` без серийника → by-id идентичен. Проверить, принимает ли Supervisor в `devices:` путь `/dev/serial/by-path/...`; если нет — фиксированные порты (уже зафиксированы физически) или local add-on со своим udev-симлинком. - [x] **РЕШЕНО 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 - [ ] Community-repo z2m: проверить, что он совместим с HA OS 18.2 / Core 2026.9.x
- [ ] mbusd/modbus-bridge как local add-on: синтаксис `devices:` в `config.yaml` аддона (Supervisor, не compose) - [ ] mbusd/modbus-bridge как local add-on: их собственный `config.yaml`**в манифесте тоже нужен `uart: true`**, чтобы увидеть by-path (тот же механизм, что у z2m и core_ssh)
- [ ] Куда переносить данные z2m: `/addon_configs/<slug>/` (HA OS 12+ путь для app-конфигов) - [ ] Куда переносить данные z2m: `/addon_configs/<slug>/` (HA OS 12+ путь для app-конфигов)
- [ ] Камера (§8 родительского плана) — не аддон, разбираться отдельно - [ ] Камера (§8 родительского плана) — не аддон, разбираться отдельно