[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-доступ не включён. Рабочий путь — аддон.
### Хостовый 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-аддона (что доступно из шелла)
Внутри аддона `core_ssh` **НЕТ** `docker` CLI и **НЕТ** `python3`.
@@ -63,6 +76,30 @@ ha host info # диск, версия OS, features
> ⚠️ `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
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).
- t610: путь `pci-0000:00:12.0-usb-0:3` и `...-0:4`**порт 3 и порт 4** на одном OHCI-контроллере. Т.е. udev-правило на t610: `KERNELS=="1-3"` и `KERNELS=="1-4"`.
### Решение для HA-аддонов (открытый вопрос)
В HA-аддонах udev-правила на хосте применить нельзя (аддон — контейнер). Варианты привязки:
- **A.** В `config.yaml` аддона пробрасывать по `by-path` — но Supervisor в `devices:` обычно принимает `/dev/serial/by-id/...`; проверить, принимает ли `by-path`.
- **B.** Прописать в аддоне `devices: [/dev/ttyUSB0]` + зафиксировать физические порты (какой адаптер в какой порт) — хрупко, tty-номера могут меняться.
- **C.** Local add-on, внутри которого свой udev/симлинк-хак.
> Порты 3 и 4 **зафиксированы** — CH340 #1 в порт 3, CH340 #2 в порт 4. Устройства из портов не вынимать!
### 🔑 РЕШЕНИЕ: привязка по `by-path` (udev-алиасы на HA OS не нужны)
**Как на TrueNAS — нельзя.** Там был хостовый шелл TrueNAS → `/etc/udev/rules.d/99-tty-alias.rules`. На t610 SSH-аддон = **Alpine-контейнер**: нет `/etc/udev/rules.d`, нет `udevadm`. Хостовый доступ = только **debug-SSH 22222**, но он **выключен** и включается **только флешкой** (`authorized_keys` в разделе с меткой `CONFIG`); по сети — никак:
- `ha host` — ssh-команд нет
- Supervisor API `/host/services/ssh`**403 Forbidden** (аддон `core_ssh` имеет роль `manager`, нужен `admin`)
- `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 не нужны.