diff --git a/family/plans/home-automation-migration-t610.md b/family/plans/home-automation-migration-t610.md index bba4adc3..f45acc0f 100644 --- a/family/plans/home-automation-migration-t610.md +++ b/family/plans/home-automation-migration-t610.md @@ -19,13 +19,15 @@ related: --- # Перенос домашней автоматизации на HP t610 -> **Статус: В ПРОЦЕССЕ. Этап 1 (аддоны) ВЫПОЛНЕН. Этап 2 (USB + Zigbee) — ✅ z2m РАБОТАЕТ (16 устройств). Следующий шаг — mbusd + modbus-bridge (local add-ons), затем Этап 3 (перенос HA-конфига).** +> **Статус: В ПРОЦЕССЕ. Этап 1 (аддоны) ВЫПОЛНЕН. Этап 2 (USB + Zigbee + Modbus) — ✅ z2m РАБОТАЕТ (16 устройств), ✅ mbusd РАБОТАЕТ (порт 502), ✅ modbus-bridge собран и запущен (MQTT + sniffer OK; ⏳ ждёт корректный `ha_token`). Следующий шаг — Этап 3 (перенос HA-конфига + `.storage/`).** > Цель: убрать всю домашнюю автоматизацию с TrueNAS (он перегружен — 17/21 ГБ RAM) на выделенный HP t610, с бэкапом конфигов на TrueNAS и в git. > -> **Прогресс 2026-09-14 — Zigbee2MQTT ПЕРЕЕХАЛ И РАБОТАЕТ:** -> - ✅ **z2m-аддон `45df7312_zigbee2mqtt` v2.14.1-1 установлен и работает.** База (`database.db`) + `network_key`/`pan_id`/`ext_pan_id`/`channel: 11` перенесены с TrueNAS 1:1 → **16 устройств на месте, переспаривание не потребовалось.** Координатор EmberZNet 7.4.5, MQTT на `core-mosquitto`. Детали и питфоллы: [[family/plans/t610-addons-deployment]] §«z2m на t610 (ВЫПОЛНЕНО)». -> - ✅ **Логин `zont` добавлен в mosquitto** (тот же пароль, что на TrueNAS) — HA-интеграция и ZONT работают по старым креденшелам. -> - ⏭️ Следующий шаг: **mbusd** (CH340 порт 4) и **modbus-bridge** (CH340 порт 3, новый `HA_TOKEN`) как local add-ons → Этап 3 (перенос HA-конфига + `.storage/`). +> **Прогресс 2026-09-14 (вечер) — Modbus-сервисы переехали:** +> - ✅ **mbusd — local add-on `local_mbusd` РАБОТАЕТ.** База: готовый образ `3cky/mbusd:latest`. Порт **502 открыт**. Устройство: `/dev/serial/by-path/pci-0000:00:12.0-usb-0:4:1.0-port0` (CH340 #2, порт 4 → шина вентиляции AT2). Питфоллы сборки local add-ons — см. [[family/plans/t610-addons-deployment]] §«Local add-ons mbusd / modbus-bridge». +> - ✅ **modbus-bridge — local add-on `local_modbus-bridge` СОБРАН И ЗАПУЩЕН.** База `python:3.11-alpine`, `uart: true` + `host_network: true`. Устройство: by-path CH340 #1 (порт 3 → шина ZONT). **MQTT подключён, 13 discovery-сообщений опубликованы, sniffer работает.** +> - ⏳ **Единственный незакрытый пункт Этапа 2:** HA-опрос даёт **HTTP 401** — первый токен оказался выпущен **другим инстансом HA** (`iss` ≠ `instance_id` t610). Нужен long-lived token, созданный на http://192.168.2.176. Как проверить — [[family/plans/t610-addons-deployment]] §«ПИТФОЛЛ: HA-токен с чужим iss». +> - ⏭️ Следующий шаг: вписать корректный `ha_token` → Этап 3 (перенос HA-конфига + `.storage/`). + > > **Прогресс 2026-09-13 — 🎉 t610 запущен и в сети:** > - ✅ **HA OS 18.2 записана на диск, t610 загрузился и работает.** IP **`192.168.2.176`** (DHCP-имя `homeassistant`). Web UI: **`http://192.168.2.176`** (⚠️ порт **80**, не 8123). @@ -35,7 +37,7 @@ related: > - ✅ **Этап 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 РЕШЁН 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-гонки снимается. -> - ⏭️ Следующий шаг: Этап 2b (z2m, mbusd, modbus-bridge) → Этап 3 (перенос HA-конфига). +> - ⏭️ Следующий шаг: Этап 3 (перенос HA-конфига) — Этап 2b (z2m, mbusd, modbus-bridge) выполнен 2026-09-14. > > **Доступ к хосту и CLI: [[family/how-to/t610-access]].** > @@ -53,13 +55,13 @@ related: | Сервис | Образ / способ | Почему | |--------|----------------|--------| | **Home Assistant** | **HA OS** (нативно, вся ОС) | ядро автоматизации | -| Zigbee2MQTT | docker-контейнер | нужен USB-Zigbee координатор | -| Mosquitto (MQTT) | docker-контейнер | брокер для z2m, Node-RED, ZONT | -| Node-RED | docker-контейнер | логика автоматизаций | -| mbusd | docker-контейнер | RS-485 → TCP :502 (шина вентиляции AT2) | -| modbus-bridge | docker-контейнер (локальная сборка) | снифф 485-датчиков + виртуальные slaves для ZONT | +| Zigbee2MQTT | HA-аддон (`45df7312_zigbee2mqtt`) | ✅ работает — 16 устройств | +| Mosquitto (MQTT) | HA-аддон (`core_mosquitto`) | ✅ работает — 1883/1884 | +| Node-RED | HA-аддон (`a0d7b954_nodered`) | ✅ работает — 1880 | +| mbusd | HA local add-on (`local_mbusd`) | ✅ работает — RS-485 → TCP :502 (шина вентиляции AT2) | +| modbus-bridge | HA local add-on (`local_modbus-bridge`) | ✅ собран/запущен — снифф 485-датчиков + виртуальные slaves для ZONT; ⏳ ждёт `ha_token` | | **Камера** | docker-контейнер | см. §8 — разобраться отдельно | -| udev-скрипт tty-алиасов | нативный udev + systemd | обязателен для стабильного старта mbusd/modbus-bridge | +| ~~udev-скрипт tty-алиасов~~ | ~~нативный udev + systemd~~ | ❌ **ОТМЕНЁН** — на HA OS невозможен; привязка serial по `/dev/serial/by-path/...` через флаг аддона `uart: true` | **Остаётся на TrueNAS:** immich, media-стек (jellyfin/transmission/radarr/sonarr/prowlarr), caddy, gitea, filebrowser, webdav, syncthing, rclone, cups, portainer, hermes-taiga, xray-*. @@ -197,24 +199,26 @@ uci commit dhcp && /etc/init.d/dnsmasq restart HA OS внутри использует host docker 29.6.2 (`ha docker info` подтверждает), но управлять им из аддона нельзя. Рабочий путь — аддоны. Контейнеры (в порядке зависимостей): -1. **mosquitto** — порт 1883, конфиги см. §5.1 -2. **zigbee2mqtt** — нужен mosquitto, USB-Zigbee`/dev/ttyACM0` -3. **nodered** — нужен mosquitto, порт 1880 -4. **mbusd** — порт 502, USB-CH340#2 (шина AT2) -5. **modbus-bridge** — USB-CH340#1 (шина ZONT), host-network +1. **mosquitto** — порт 1883, конфиги см. §5.1 — ✅ аддон `core_mosquitto` +2. **zigbee2mqtt** — USB-Zigbee by-id — ✅ аддон `45df7312_zigbee2mqtt` +3. **nodered** — порт 1880 — ✅ аддон `a0d7b954_nodered` +4. **mbusd** — порт 502, by-path CH340#2 (порт 4, шина AT2) — ✅ local add-on `local_mbusd` +5. **modbus-bridge** — by-path CH340#1 (порт 3, шина ZONT), `host_network` — ✅ local add-on `local_modbus-bridge` (⏳ ждёт `ha_token`) 6. **камера** — см. §8 -### Шаг 4. Подключить USB-устройства и настроить udev-алиасы -**⚠️ САМЫЙ ОПАСНЫЙ ШАГ — на t610 другая USB-топология.** -Старые правила `KERNELS=="?-1.6:1.0"` / `"?-1.5:1.0"` **не сработают** — надо пересчитать пути. +> 📌 **Фактически выполнено 2026-09-14** (детали, точные пути, питфоллы сборки local add-ons — в [[family/plans/t610-addons-deployment]]). Шаги 3–4 этого документа **заменены** тем планом; ниже оставлены как исторический черновик исходного подхода (docker-compose + udev), который **не применялся**. + +### Шаг 4. Подключить USB-устройства — ✅ ВЫПОЛНЕНО 2026-09-14 (алиасы ОТМЕНЕНЫ) + +> ✅ **Факт (2026-09-14):** все 3 USB подключены и опознаны; привязка — по `/dev/serial/by-path/...` (НЕ udev-алиасы). +> Карта портов, by-id/by-path и sysfs-пути: **[[family/how-to/t610-access]] §USB**. +> udev-алиасы `ttyZONT`/`ttyVent` **отменены** — на HA OS невозможны (SSH-аддон = Alpine-контейнер, нет `/etc/udev/rules.d`/`udevadm`; хостовый debug-SSH 22222 включается только флешкой). Вместо них — флаг `uart: true` в манифесте аддона. +> Ниже (и в старом тексте Шага 4) — **черновик исходного подхода, не применявшийся.** + ```bash -# Подключить все 3 USB (2× CH340 + Zigbee) в ОДНИ И ТЕ ЖЕ порты навсегда! -# На t610 определить пути: -for d in /sys/class/tty/ttyUSB* /sys/class/tty/ttyACM*; do - echo "--- $d"; udevadm info -q property -p $d | grep -E "ID_VENDOR_ID|ID_MODEL_ID|ID_SERIAL|DEVPATH" -done -# DEVPATH даст что-то вида /devices/pci.../usb1/1-1/1-1.2/1-1.2:1.0/ttyUSB0 -# → путь для правила: KERNELS=="1-1.2:1.0" (или с wildcard "?-1.2:1.0") +# ИСТОРИЧЕСКИЙ ЧЕРНОВИК (не применять): на t610 другая USB-топология, старые KERNELS не сработают. +# udevadm в SSH-аддоне НЕТ — читать sysfs (/sys/class/tty//device), см. t610-access §USB. +``` ``` Составить новые `99-tty-alias.rules` **по серийникам, а не по портам** — надёжнее: ``` @@ -267,7 +271,11 @@ nodered/settings.js, package.json, node_modules (не обязательно) ``` compose: порт 1880, `TZ=Asia/Novosibirsk`. -### 5.4 mbusd +### 5.4 mbusd — ✅ РЕАЛИЗОВАНО КАК LOCAL ADD-ON (2026-09-14) + +> ⚠️ **Фактически на t610 — HA local add-on `local_mbusd`, НЕ docker-compose.** Тот же образ `3cky/mbusd:latest`, но обёрнут в аддон: `/addons/mbusd/{config.yaml,Dockerfile,run.sh}`. Serial — `/dev/serial/by-path/pci-0000:00:12.0-usb-0:4:1.0-port0` (CH340 #2, порт 4). Порт 502 открыт. Детали и питфоллы: [[family/plans/t610-addons-deployment]] §«Local add-ons mbusd / modbus-bridge». +> Ниже — исходный черновик (docker-compose с TrueNAS), **не применявшийся**. + ``` mbusd/mbusd.conf # device=/dev/ttyUSB0, speed=9600, port=502 ``` @@ -284,7 +292,11 @@ services: restart: unless-stopped ``` -### 5.5 modbus-bridge (локальная сборка) +### 5.5 modbus-bridge — ✅ РЕАЛИЗОВАНО КАК LOCAL ADD-ON (2026-09-14) + +> ⚠️ **Фактически на t610 — HA local add-on `local_modbus-bridge`, НЕ docker-compose.** База `python:3.11-alpine`, `uart: true` + `host_network: true`. Serial — by-path CH340 #1 (порт 3). Опции аддона: `device`, `baudrate`, **`ha_token`**, `mqtt_user`, `mqtt_password`; `run.sh` генерирует runtime `config.yml` из шаблона (`data/config.template.tmpl`). MQTT + sniffer работают; ⏳ HA-опрос 401 (токен не от этого инстанса). +> Ниже — исходный черновик (docker-compose с TrueNAS), **не применявшийся**. + ``` modbus-bridge/Dockerfile modbus-bridge/modbus_ha_bridge.py # основной скрипт @@ -307,7 +319,9 @@ services: - HA_TOKEN= restart: unless-stopped ``` -> ⚠️ `HA_TOKEN` — long-lived token. **После переноса HA на t610 — сгенерировать НОВЫЙ токен** в HA (Профиль → Security → Long-lived tokens), т.к. старый привязан к прежней инсталляции (фактически токен привязан к HA `auth`, который мы не переносим вместе с `.storage` — см. примечание ниже). +> ⚠️ `HA_TOKEN` — long-lived token. **После переноса HA на t610 — сгенерировать НОВЫЙ токен** в HA (Профиль → Security → Long-lived tokens), т.к. старый привязан к прежней инсталляции. +> 📌 **Подтверждено на практике 2026-09-14:** токен, выпущенный другим инстансом, отвергается с **401** — HA сверяет `iss` в JWT с `instance_id` (см. [[family/plans/t610-addons-deployment]] §«ПИТФОЛЛ: HA-токен с чужим iss»). + ### 5.6 Home Assistant config ``` @@ -344,20 +358,24 @@ system/start-modbus.sh # скрипт ожидания tty перед doc ## 6. Чек-лист проверки после переноса -- [ ] HA UI открывается:`http://:8123` -- [ ] `docker ps` — все 5–6 контейнеров Up -- [ ] `ls -la /dev/ttyZONT /dev/ttyVent /dev/ttyACM0` — алиасы созданы, указывают на правильные ttyUSB -- [ ] **Zigbee:** устройства видны в zigbee2mqtt UI (`http://:8080` или HA), `permit_join` работает, датчики обновляются -- [ ] **MQTT:**`mosquitto_sub -h localhost -t '#' -v` — видно трафик z2m -- [ ] **Modbus вентиляция:** HA видит AT2, заслонки переключаются (проверить физически!) -- [ ] **ZONT:** датчики 485 (Dining/Kids/Bedroom) в ZONT **не «недоступные»**, температуры идут -- [ ] **modbus-bridge:** логи без ошибок, MQTT-топики `modbus/sensors/*` публикуются -- [ ] **Node-RED:**`http://:1880` — flows загружены, creds на месте -- [ ] **ZONT MQTT:** ZONT шлёт данные на `t610:1883` (проверить подпиской) +> ℹ️ Обновлён 2026-09-14 под аддонную архитектуру (был: docker ps / tty-алиасы / порт 8123 — всё неактуально). +> ✅ = уже подтверждено на живом t610; ⏳ = ждёт Этапа 3. + +- [x] ✅ HA UI открывается: **`http://192.168.2.176`** (⚠️ порт **80**, не 8123) +- [ ] `ha apps` — все аддоны `started` (z2m, mosquitto, nodered, mbusd, modbus-bridge, core_ssh) +- [x] ✅ **Serial:** by-path/b-id видны в аддонах (`uart: true`); привязка по `/dev/serial/by-path/...` (НЕ tty-алиасы — они на HA OS невозможны) +- [x] ✅ **Zigbee:** z2m работает — **16 устройств** подхватились из старой базы, координатор EmberZNet 7.4.5 +- [x] ✅ **MQTT:** трафик z2m идёт (discovery-сообщения публикуются), логин `zont` работает +- [ ] **Modbus вентиляция:** HA видит AT2, заслонки переключаются (проверить физически!) — требует Этапа 3 (перенос HA-конфига) +- [ ] **ZONT:** датчики 485 (Dining/Kids/Bedroom) в ZONT **не «недоступные»**, температуры идут — требует `ha_token` в modbus-bridge + Этап 3 +- [x] ✅ **modbus-bridge:** sniffer работает, MQTT подключён, **13 discovery-топиков** `modbus/sensors/*` опубликованы (⏳ HA-опрос 401 — ждёт корректный токен) +- [x] ✅ **mbusd:** порт 502 открыт, устройство на by-path CH340 #2 (порт 4) +- [ ] **Node-RED:** `http://192.168.2.176:1880` — flows загружены, creds на месте +- [ ] **ZONT MQTT:** ZONT шлёт данные на `t610:1883` (проверить подпиской) — требует перенаправления GPON-роутера - [ ] **HA автоматизации:** все работают (свет, вентиляция, ГВС) — функции автоматизаций срабатывают - [ ] **Floor plan:** dashboard с планом этажей отображается - [ ] **Камера:** доступна по `cam.mallexxx.duckdns.org` (если переехала) -- [ ] **Стабильность:**`reboot` t610 → всё поднялось само, без ручных команд (главный тест — гонка udev!) +- [ ] **Стабильность:** `reboot` t610 → всё поднялось само, без ручных команд ## 7. Отключение на TrueNAS (только после проверки!) diff --git a/family/plans/t610-addons-deployment.md b/family/plans/t610-addons-deployment.md index dbfefde1..f8f2a8c7 100644 --- a/family/plans/t610-addons-deployment.md +++ b/family/plans/t610-addons-deployment.md @@ -179,7 +179,36 @@ ha apps restart "$SLUG" 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. [x] ✅ **mbusd local add-on СОБРАН И РАБОТАЕТ (2026-09-14)** — slug `local_mbusd`, порт **502 открыт** (проверено `nc` с Mac), устройство by-path CH340 #2 (порт 4). Подробности — §«Local add-ons mbusd / modbus-bridge» ниже. -14. [x] ✅ **modbus-bridge local add-on СОБРАН И ЗАПУЩЕН (2026-09-14)** — slug `local_modbus-bridge`, устройство by-path CH340 #1 (порт 3), конфиг валиден, sniffer работает. ⏳ **Ждёт `HA_TOKEN` + MQTT-пароль** (без них MQTT code 5 = not authorized, HA poller выключен). +14. [x] ✅ **modbus-bridge local add-on СОБРАН И ЗАПУЩЕН (2026-09-14)** — slug `local_modbus-bridge`, устройство by-path CH340 #1 (порт 3), конфиг валиден, **MQTT подключён, 13 discovery-сообщений ушли**, sniffer работает. ⏳ **HA-опрос даёт HTTP 401** — нужен корректный long-lived token от ЭТОГО инстанса HA (см. питфолл ниже). + +#### ⚠️ ПИТФОЛЛ: HA-токен с чужим `iss` отвергается (401) + +Первый присланный `ha_token` (от Alex) при обращении к API давал **401 и с Mac, и из аддона**. Токен синтаксически валиден (payload: `iss`/`iat`/`exp` до 2036), НО: + +| | Значение | +|---|---| +| `iss` в токене | `76e344271cb74a2098c6de2839a79f0f` | +| **`instance_id` этого HA** (`/config/.storage/core.uuid`) | **`d3b24dad8c684291a31b687cff7f9d30`** | + +→ Токен выпущен **другим инстансом** (старый HA на TrueNAS / другая установка). HA проверяет `iss` и отвергает чужой токен. + +**Как проверить токен перед вставкой:** +```bash +# payload токена (base64url, средняя часть) +echo '' | base64 -D +# сравнить "iss" с instance_id: +ssh ... root@192.168.2.176 'jq -r .data.uuid /config/.storage/core.uuid' +``` +**Создавать токен только на http://192.168.2.176** → профиль `ha_admin` → Security → Long-lived access tokens. +**Быстрая проверка:** `curl -s -o /dev/null -w '%{http_code}' -H "Authorization: Bearer " http://192.168.2.176/api/` → должно быть **200** (401 = токен не от этого инстанса). + +**Что уже подтверждено работоспособным (не зависит от токена):** +- MQTT-подключение к `core-mosquitto` ✓ +- Публикация discovery-сообщений (13 шт: dining kids bedroom × co2/formaldehyde/tvoc/pm2.5/pm10/temp/humidity) ✓ +- Serial sniffing на CH340 порт 3 (шина ZONT) ✓ +- HA poller запускается, но получает 401 + +**Настройка токена через Supervisor API (рабочий рецепт):** см. `~/tmp-t610/set_bridge_opts.sh`. ⚠️ Значения токена **маскируются** при прогоне через bash-переменную/`echo` — записывать токен в JSON-файл на t610 через `jq --arg` из env, НЕ подставлять в строку через `echo`/`sed`. ### ✅ Local add-ons mbusd / modbus-bridge — ВЫПОЛНЕНО (2026-09-14)