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

193 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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 (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 автоматический.
**Как прописывать путь в конфиге сервиса:**
```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/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. [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/<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-аддон):**
```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. [ ] Установить 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`)
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 <slug>` / UI |
| Пути `/mnt/data/...` | `/addon_configs/<slug>/` и `/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.
- [ ] 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 родительского плана) — не аддон, разбираться отдельно
## Связанные заметки
- [[family/plans/home-automation-migration-t610]] — родительский план
- [[family/how-to/home-automation]] — карта slave ID, ZONT, регистры
- [[family/how-to/zont-modbus-bridge-udev-race-protection]] — старая проблема гонки udev (на аддонах неактуальна)
- [[family/how-to/truenas-infrastructure]] — текущий docker-стек TrueNAS