--- title: Перенос домашней автоматизации на HP t610 status: in-progress tags: - family - plan - homeautomation - t610 - migration created: '2026-09-12' updated: '2026-09-14' related: - '[[family/how-to/home-automation]]' - '[[family/how-to/truenas-infrastructure]]' - '[[family/how-to/zont-modbus-bridge-udev-race-protection]]' - '[[family/how-to/truenas-rclone-backup]]' - '[[family/how-to/gitea-config]]' - '[[family/how-to/truenas-access]]' --- # Перенос домашней автоматизации на HP t610 > **Статус: В ПРОЦЕССЕ. Этап 1 ✅. Этап 2 ✅ ПОЛНОСТЬЮ ВЫПОЛНЕН (z2m — 16 устройств, mbusd — порт 502, modbus-bridge — MQTT + HA-опрос, MQTT-интеграция в HA добавлена). Этап 3 (перенос HA-конфига + `.storage/`) 🔄 В РАБОТЕ — разведка выполнена, решения приняты (БД с нуля, реестры заменить, HACS на согласовании, Zigbee-имена чистить); ждём ответа Alex.** > Цель: убрать всю домашнюю автоматизацию с TrueNAS (он перегружен — 17/21 ГБ RAM) на выделенный HP t610, с бэкапом конфигов на TrueNAS и в git. > > **Прогресс 2026-09-14 (вечер) — Этап 2 ЗАКРЫТ, 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` РАБОТАЕТ (MQTT + HA-опрос).** База `python:3.11-alpine`, `uart: true` + `host_network: true`. Устройство: by-path CH340 #1 (порт 3 → шина ZONT). **MQTT подключён, 13 discovery-сообщений, HA-опрос возвращает значение.** Питфолл: `ha.url` обязан быть **`http://192.168.2.176:80`** (НЕ `supervisor/core` — тот требует `SUPERVISOR_TOKEN` и даёт 401 с пользовательским токеном). > - ✅ **В HA добавлена MQTT-интеграция** (её НЕ БЫЛО → discovery-сообщения z2m/bridge не превращались в сущности, было всего 22 системные сущности). Стало **104 сущности (69 Zigbee)**. Рецепт — [[family/how-to/t610-access]] §«Добавление интеграции MQTT». > - ⏭️ Следующий шаг: Этап 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). > - ✅ HA Core 2026.9.2, Supervisor 2026.09.0, OS 18.2. Диск: 228.5 ГБ, занято 5 ГБ. > - ✅ SSH включён через аддон `core_ssh` (Terminal & SSH) — вход по ключу `~/.ssh/id_rsa`. > - ✅ **Этап 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 зафиксированы — устройства не вынимать.** > - ✅ **Блокер 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-гонки снимается. > - ⏭️ Следующий шаг: Этап 3 (перенос HA-конфига) — Этап 2b (z2m, mbusd, modbus-bridge) выполнен 2026-09-14. > > **Доступ к хосту и CLI: [[family/how-to/t610-access]].** > > **Прогресс 2026-09-12:** > - ✅ План составлен на основе живого состояния TrueNAS (дампы конфигов всех контейнеров — §12). > - ✅ **HA OS 18.2 скачан и распакован** → `~/haos/haos_generic-x86-64-18.2.img` (1.8 ГБ) — см. Шаг 1. > - ✅ Диск подтверждён и записан (бывшая Windows 7 безвозвратно перезаписана с согласия Alex). ## 0. Зачем и что переносим **Причина:** TrueNAS работает на пределе по памяти (занято 17 из 21 ГБ) — на нём immich + HA + ~25 контейнеров + ZFS-кэш. Домашняя автоматизация должна жить на отдельном дешёвом/тихом хосте, чтобы не зависеть от NAS и не конкурировать за RAM. **Переносим на t610:** | Сервис | Образ / способ | Почему | |--------|----------------|--------| | **Home Assistant** | **HA OS** (нативно, вся ОС) | ядро автоматизации | | 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, MQTT + HA-опрос** | | **Камера** | docker-контейнер | см. §8 — разобраться отдельно | | ~~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-*. ## 1. Железо: HP t610 — что мы имеем | Параметр | Значение | Вывод | |----------|----------|-------| | CPU | AMD T56N, 2 ядра @ 1.65 ГГц (Bobcat, 2011) | PassMark ~850, single-thread ~450 — **вдвое слабее TrueNAS (G2020)** | | RAM | 4 ГБ DDR3-1600 SODIMM | ✅ за глаза для HA OS + контейнеров (с HA.OS+5 контейнеров ~1.5–2 ГБ реально) | | USB | **2× USB 3.0** + 4× USB 2.0 | ✅ хватает: Zigbee + 2× CH340 | | Сеть | Gigabit (Broadcom BCM57781) | ок | | COM | 1× RS-232 | резерв (если перейдём на нативный mbusd) | | Диск | **HDD** (переносим с TrueNAS) | ✅ места достаточно | | БП | 19.5V 3.3A, штекер 7.4×5.0 мм | нужен родной БП | | Потребление | ~12 Вт idle, ~20 Вт под нагрузкой | ✅ тихий, дёшево 24/7 | > 📌 Диск — HDD (есть в наличии), отдельно проверять/апгрейдить не нужно. RAM 4 ГБ достаточно. ## 2. Целевая архитектура ``` ДОМ ┌────────────────────────────────────────────────────────┐ │ │ │ ZONT (192.168.0.10) Zigbee-устройства │ │ │ Modbus master на ttyZONT │ (Tuya датчики) │ │ │ │ │ │ USB-CH340#1 (ttyZONT) USB-Zigbee (ttyACM0) │ │ │ │ │ │ ┌─────── HP t610 — HA OS ───────┴─────────┐ │ │ │ HA OS (ядро, нативно) │ │ │ │ ├ mosquitto (docker) :1883 │ │ │ │ ├ zigbee2mqtt (docker) ── mosquitto │ │ │ │ ├ nodered (docker) ── mosquitto │ │ │ │ ├ mbusd (docker) :502 ← CH340#2 (ttyVent → AT2) │ │ │ └ modbus-bridge (docker) ← CH340#1 (ttyZONT) │ │ └─────────────────────────────────────────┘ │ │ │ │ GPON-роутер ──(port forward)──► t610:8123 (HA UI) │ └────────────────────────────────────────────────────────┘ │ │ бэкап конфигов (rsync/git) ▼ TrueNAS (RED_2TB) — хранилище бэкапов + bare git repo ``` **Ключевые сетевые потоки:** - HA ↔ mosquitto (`localhost:1883`) — MQTT-интеграция - zigbee2mqtt → mosquitto → HA (датчики Zigbee) - Node-RED → mosquitto → HA (логика) - HA → `t610:502` (mbusd) — опрос вентиляции AT2 и заслонок по Modbus TCP - ZONT → `t610:1883` (mosquitto) — по MQTT (через редирект GPON-роутера) - modbus-bridge → `localhost:8123` (HA REST API) + `localhost:1883` (MQTT) ## 3. Что меняется по адресам (карта правок) Это самый важный раздел — при переносе ломаются все хардкод-адреса: | Где | Сейчас | Станет | Комментарий | |-----|--------|--------|-------------| | `ha/configuration.yaml` → `modbus.host` | `192.168.2.197` | **IP t610** | иначе HA на t610 не найдёт mbusd (он теперь локальный — можно `127.0.0.1`, т.к. mbusd host-network) | | `modbus-bridge/config.yml` → `ha.url` | `http://localhost:8123` | без изменений | остаётся localhost | | `modbus-bridge/config.yml` → `mqtt.broker` | `localhost` | без изменений | mosquitto рядом | | ZONT → MQTT-брокер | TrueNAS (192.168.2.197:1883?) | **t610:1883** | ⚠️ смотреть, где задаётся (в веб-интерфейсе ZONT, раздел MQTT) | | GPON-роутер port forward | → 192.168.2.197 | **→ IP t610** | для HA UI + MQTT | | Caddy `cam.mallexxx` | `192.168.2.197:8090` | **IP t610:8090** | камера переезжает на t610 (или остаётся — см. §8) | | Caddy `mallexxx.duckdns.org` | `192.168.2.197:8123` | **IP t610:8123** | HA UI | | udev-правила `99-tty-alias.rules` | `KERNELS=="?-1.6"` / `"?-1.5"` (USB-топология TrueNAS) | **новые пути t610** | ⚠️ ОБЯЗАТЕЛЬНО пересчитать — на t610 нумерация USB другая | ## 4. Шаги переноса — пошагово > ⚠️ Общий принцип: **ничего не удаляем на TrueNAS, пока t610 не заработает полностью.** Отключение на TrueNAS — отдельный финальный этап (§7). ### Шаг 1. Установка HA OS на t610 **Образ:** https://www.home-assistant.io/installation/generic-x86-64/ Драйвер-ссылка (последний релиз, раздел Assets): https://github.com/home-assistant/operating-system/releases > ✅ **Сделано 2026-09-12:** скачан и распакован **HA OS 18.2** (релиз 2026-07-30). > - `~/haos/haos_generic-x86-64-18.2.img.xz` — 552 МБ (архив), `xz -t` OK > - `~/haos/haos_generic-x86-64-18.2.img` — **1.8 ГБ (готов к записи)** > - SHA256 архива: `514ba5447c663026bc12ab95b68f0c206401b480560743f7a59b074de912dc4e` > - ⚠️ Отдельного файла контрольных сумм в релизе нет; целостность подтверждена `xz -t`. > - На TrueNAS сейчас **HA 2026.9.1** — совместимо с HA OS 18.x. **Записать на HDD t610** (диск переносим, образ пишем прямо на него — через USB-переходник на Mac): > ✅ **ВЫПОЛНЕНО 2026-09-13.** Образ записан на диск, диск вставлен в t610, HA OS загрузилась. Прежняя Windows 7 безвозвратно перезаписана (Alex подтвердил). > > 📌 **Было (исторический контекст):** диск был подключён к Mac как `/dev/disk29` (внешний USB, **250.1 ГБ**) и оказался **НЕ пустым** — на нём установленная Windows 7: > ``` > disk29s1 Windows_NTFS "Зарезервировано системой" 52.4 МБ > disk29s2 Windows_NTFS "Windows 7" 250.0 ГБ > ``` > `dd` был остановлен до явного подтверждения Alex — правильное поведение. > > **Команда, которой записан образ:** > ```bash > diskutil unmountDisk /dev/disk29 > sudo dd if=~/haos/haos_generic-x86-64-18.2.img of=/dev/rdisk29 bs=4m && sync > ``` > Писать в **`/dev/rdisk29`** (raw, быстрее). После записи `diskutil list` покажет разделы HA OS (hassos-boot, hassos-data). ```bash # на Mac: diskutil list # найти целевой диск (НЕ ошибиться!) diskutil info /dev/diskN # ⚠️ ОБЯЗАТЕЛЬНО: убедиться, что диск пустой/не нужный diskutil unmountDisk /dev/diskN sudo dd if=~/haos/haos_generic-x86-64-18.2.img of=/dev/rdiskN bs=4m && sync ``` > ⚠️ **Питфолл (выявлен на практике):** не писать `dd` вслепую по номеру диска. `disk29` оказался бывшим системным диском с Windows 7 — проверка `diskutil info` перед записью обязательна. > ⚠️ В HA OS **UEFI**: в BIOS t610 включить UEFI-boot (не Legacy). Если t610 не грузит HA OS — вариант: **HA OS на Proxmox/Debian + qemu**, но это сложнее; сначала пробуем bare-metal. - После записи → вставить диск в t610 → загрузиться → HA OS сама расширит раздел. ### Шаг 2. Первый запуск HA OS, сеть, static IP 1. t610 подключить кабелем к GPON-роутеру. 2. На роутере **назначить static IP (DHCP reservation)** — обязательно, до всего остального: ```bash # OpenWrt (роутер сети 192.168.2.x), SSH root@192.168.2.2: # узнать MAC t610, затем добавить в dhcp host: uci add dhcp host uci set dhcp.@host[-1].name='t610-ha' uci set dhcp.@host[-1].mac='' uci set dhcp.@host[-1].ip='192.168.2.150' # ← выбранный статический IP uci commit dhcp && /etc/init.d/dnsmasq restart ``` > 💡 Выбрать свободный IP (проверить ping). Кандидат: `192.168.2.150`. 3. HA OS Web UI: `http://:8123` → первичная настройка (создать аккаунт). > ⚠️ HA OS ставит HA «с нуля» — **конфиги мы переносим вручную** (§5), НЕ через бэкап-снапшот, чтобы не тащить мусор от старой версии долей. ### Шаг 3. Установка вспомогательных сервисов на t610 > ⚠️ **РЕШЕНО 2026-09-13: ставим всё АДДОНАМИ (Вариант C).** Детальный план развёртывания вынесен в отдельный документ: **[[family/plans/t610-addons-deployment]]**. > Причины: из SSH-аддона host docker CLI не виден (аддон в своём контейнере); аддоны = штатный путь HA OS, Supervisor сам пробрасывает USB-устройства (снимает проблему udev-гонки); Zigbee2MQTT — через community-repo, mbusd/modbus-bridge — local add-ons. HA OS внутри использует host docker 29.6.2 (`ha docker info` подтверждает), но управлять им из аддона нельзя. Рабочий путь — аддоны. Контейнеры (в порядке зависимостей): 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` (**работает: MQTT + HA-опрос**; `ha.url` = `http://192.168.2.176:80`) 6. **камера** — см. §8 > 📌 **Фактически выполнено 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 # ИСТОРИЧЕСКИЙ ЧЕРНОВИК (не применять): на t610 другая USB-топология, старые KERNELS не сработают. # udevadm в SSH-аддоне НЕТ — читать sysfs (/sys/class/tty//device), см. t610-access §USB. ``` ``` Составить новые `99-tty-alias.rules` **по серийникам, а не по портам** — надёжнее: ``` SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{serial}=="", SYMLINK+="ttyZONT" SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{serial}=="", SYMLINK+="ttyVent" ``` > ⚠️ У дешёвых CH340 **серийники часто отсутствуют/одинаковые** → тогда только по `KERNELS` (физическому порту). Тогда — жёстко зафиксировать, в какой USB-порт какой адаптер вставлен, и подписать порты физически. > ⚠️ **Гонка с udev** (та же проблема, что на TrueNAS): docker стартует раньше udev → контейнеры с `devices:` падают. На HA OS решать через `systemd` unit `After=dev-ttyZONT.device` ИЛИ через скрипт ожидания (§ Шаг 6). ### Шаг 5. Перенести конфиги (см. §5) и поднять сервисы Порядок: скопировать конфиги → `docker compose up -d` по одному → проверить. ### Шаг 6. Проверка работоспособности (чек-лист §6) ### Шаг 7. Бэкап на TrueNAS + git (§9) ### Шаг 8. Отключить на TrueNAS (§7) — ТОЛЬКО после успешной проверки ## 5. Что именно копировать (точные пути) **Источник:** `/mnt/RED_2TB/docker/` на TrueNAS (SSH `truenas_admin@mallexxx.duckdns.org`, ключ `~/.ssh/id_rsa`). **Приёмник:** t610, каталог `/mnt/data/` (или `/addon_configs` для HA OS). ### 5.1 mosquitto ``` mosquitto/config/mosquitto.conf # listener 1883, allow_anonymous false, password_file mosquitto/config/passwd # ⚠️ права 600, пароли пользователей mosquitto/config/ → /mosquitto/config mosquitto/data/ → /mosquitto/data mosquitto/log/ → /mosquitto/log ``` compose (порт 1883). ### 5.2 zigbee2mqtt ``` zigbee2mqtt/configuration.yaml # serial: /dev/ttyACM0, adapter: ember, network_key, pan_id zigbee2mqtt/database.db # ⚠️ КРИТИЧНО — иначе спаривать устройства заново! zigbee2mqtt/state.json zigbee2mqtt/coordinator_backup.json # бэкап координатора → всё в /app/data (внутри контейнера) ``` **⚠️ КРИТИЧНО:** `network_key` + `pan_id` + `database.db` должны совпасть 1:1, иначе все Zigbee-устройства надо спаривать заново. compose: `devices: /dev/ttyACM0:/dev/ttyACM0`, `network_mode: host`. ### 5.3 nodered ``` nodered/flows.json + nodered/flows_cred.json # ⚠️ cred — там пароли нод nodered/settings.js, package.json, node_modules (не обязательно) → /data ``` compose: порт 1880, `TZ=Asia/Novosibirsk`. ### 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 ``` compose (как на TrueNAS): ```yaml services: mbusd: image: 3cky/mbusd container_name: mbusd entrypoint: ["/usr/bin/mbusd", "-d", "-L", "-", "-c", "/etc/mbusd.conf"] ports: ["502:502"] devices: [/dev/ttyVent:/dev/ttyUSB0] volumes: [/mnt/data/mbusd/mbusd.conf:/etc/mbusd.conf] restart: unless-stopped ``` ### 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 # основной скрипт modbus-bridge/config.yml # serial port, ha url, mqtt broker, sniff, mappings modbus-bridge/docker-compose.yml ``` compose (как на TrueNAS): ```yaml services: modbus-bridge: build: . image: modbus-bridge-modbus-bridge container_name: modbus-bridge network_mode: host devices: [/dev/ttyZONT:/dev/ttyUSB0] volumes: - /mnt/data/modbus-bridge/config.yml:/app/config.yml:ro - /mnt/data/modbus-bridge/modbus_ha_bridge.py:/app/modbus_ha_bridge.py:ro environment: - HA_TOKEN= restart: unless-stopped ``` > ⚠️ `HA_TOKEN` — long-lived token. **После переноса HA на t610 — сгенерировать НОВЫЙ токен** в HA (Профиль → Security → Long-lived tokens), т.к. старый привязан к прежней инсталляции. > ✅ **Проверка токена — только по HTTP-коду:** `curl -o /dev/null -w '%{http_code}' -H "Authorization: Bearer $T" http://192.168.2.176/api/` → **200** ок, **401** негодный. > ❌ **ЛОЖНЫЙ СЛЕД (не повторять, 2026-09-14):** версия «HA сверяет `iss` в JWT с `instance_id`» — **НЕВЕРНА**. У рабочего токена `iss=e75d1d6f…`, `core.uuid=d3b24dad…` — не совпадают, и это норма. Токен, выпущенный другим инстансом, даёт 401 по другой причине; единственный надёжный критерий — HTTP-код на `/api/`. Детали: [[family/plans/t610-addons-deployment]] §«HA MQTT-интеграция + `ha.url`». ### 5.6 Home Assistant config ``` ha/configuration.yaml # главный: modbus, template sensors, http.trusted_proxies ha/automations.yaml ha/scripts.yaml ha/secrets.yaml ha/.storage/ # ⚠️ осторожно: тут UI-интеграции, lovelace, entity registry ha/www/floorplan/*.svg # фон плана этажей ``` **Два варианта переноса HA-конфига:** | Вариант | Что копировать | Плюсы | Минусы | |---------|----------------|-------|--------| | **A. Полный** | весь `ha/` включая `.storage` | всё UI-настроенное (интеграции, план) переезжает 1:1 | тянет мусор, `.storage` привязан к версии/аутентификации | | **B. Чистый** | yaml-файлы + `www/` + `.storage/lovelace.home_plan` | чисто, версия свежая | UI-интеграции (MQTT, Tuya, HACS) настраивать заново вручную | **Рекомендация: вариант A (полный),** т.к. в `.storage` живут: - `core.config_entries` — интеграции (MQTT, localtuya, tuya_local, modbus, HACS) - `lovelace.home_plan` — dashboard с планом этажей (⚠️ НЕ пересоздать вручную) - `core.entity_registry` / `core.device_registry` — имена entity (иначе все автоматизации сломаются по ссылкам!) > ⚠️ **Критично:** `core.entity_registry` содержит `entity_id` для всех автоматизаций. Без него `automations.yaml` не найдёт сущности. Сохранять обязательно. > ⚠️ `.storage/auth` — можно НЕ копировать (создастся новый пользователь); или скопировать, чтобы сохранить логины. ### 5.7 (опционально) камера См. §8 — сначала выяснить, что это за камера. ### 5.8 udev + скрипт старта ``` system/99-tty-alias.rules # ⚠️ ПЕРЕСОЗДАТЬ под t610 (см. Шаг 5) system/start-modbus.sh # скрипт ожидания tty перед docker start ``` Тот же паттерн, что на TrueNAS: ждать появления `/dev/ttyZONT` и `/dev/ttyVent`, потом `docker start`. ## 6. Чек-лист проверки после переноса > ℹ️ Обновлён 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-опрос работает** (`ha.url` = `http://192.168.2.176:80`) - [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 → всё поднялось само, без ручных команд ## 7. Отключение на TrueNAS (только после проверки!) **⚠️ НЕ удалять, а остановить + отключить автозапуск.** Данные остаются как откат. ```bash ssh truenas_admin@mallexxx.duckdns.org # 1. Остановить контейнеры docker stop homeassistant zigbee2mqtt nodered mosquitto mbusd modbus-bridge # 2. Убрать автозапуск (restart policy) docker update --restart=no homeassistant zigbee2mqtt nodered mosquitto mbusd modbus-bridge # 3. Отключить init-скрипт modbus (POSTINIT id=3) midclt call initshutdownscript.update 3 '{"enabled": false}' # 4. Caddy: переключить домены на t610 (не отключать!) # mallexxx.duckdns.org → :8123 # cam.mallexxx... → :8090 docker restart caddy # 5. Опционально (позже): archive папки # mv /mnt/RED_2TB/docker/ha /mnt/RED_2TB/docker/ha.decommissioned-2026-09 ``` > ⚠️ Caddy остаётся на TrueNAS — он терминирует TLS для всех доменов. Меняем только upstream-адреса HA и камеры. > ⚠️ Редирект GPON-роутера на 8123 тоже переключить на t610. ## 8. Камера — пункт (разобраться позже) Контейнер камеры **был на TrueNAS, просто остановлен** (в списке `docker ps -a` не значится — вероятно, удалён при восстановлении после пересоздания пула; в Caddy остался мёртвый upstream `192.168.2.197:8090`). Разобраться отдельно: найти исходный образ/папку, поднять на t610, поправить upstream в Caddy. ## 9. Бэкап конфигов на TrueNAS + git ### 9.1 Бэкап на TrueNAS (основной) Цель: копия конфигов t610 на TrueNAS, чтобы пережить смерть t610. - **Вариант rclone:** добавить в `/mnt/RED_2TB/docker/rclone/config/backup.sh` строку, синкающую бэкап-папку t610 → `mailru-crypt:` - **Вариант rsync:** cron на TrueNAS (или на t610) — раз в сутки тянуть конфиги с t610: ```bash # на TrueNAS, cron 03:30: rsync -a --delete root@:/mnt/data/ /mnt/RED_2TB/backup/t610-automation/ ``` > ⚠️ Для HA OS конфиги HA — в `/mnt/data/supervisor/homeassistant/` (или через SSH-аддон). Точный путь уточнить после установки. ### 9.2 Git (версионирование конфигов) Цель: история изменений конфигов, откат, диффы. **Вариант A — локальный bare-repo на TrueNAS + cron (как Obsidian sync):** ``` t610: /mnt/data/ → git repo (init, .gitignore для *.db, *.log, node_modules) ↓ push (cron, раз в час) TrueNAS: /mnt/RED_2TB/storage/git/homeassistant-config.git (bare) ``` Скрипт на t610: ```bash cd /mnt/data && git add -A && git commit -m "auto: $(date +%F\ %T)" --allow-empty git push origin main ``` **Вариант B — Gitea (уже работает на TrueNAS: `git.mallexxx.duckdns.org`):** - Создать repo `homeassistant-config` в Gitea (токен `eagle-reflect` есть в [[family/how-to/gitea-config]]) - t610 → push в Gitea - ✅ Плюс: веб-просмотр, диффы, история в UI **Рекомендация: Вариант B (Gitea)** — уже инфраструктура есть, веб-интерфейс удобнее. **Что класть в git:** ``` ✅ configuration.yaml, automations.yaml, scripts.yaml, secrets.yaml (⚠️ или отдельно) ✅ .storage/ (кроме auth, *.db-shm, *.db-wal, tmp*) ✅ mosquitto/mosquitto.conf, modbus-bridge/config.yml, mbusd/mbusd.conf ✅ zigbee2mqtt/configuration.yaml, database.db ✅ nodered/flows.json, flows_cred.json (⚠️ пароли!) ❌ home-assistant_v2.db (200 МБ, бинарная история — не в git) ❌ *.log, node_modules/, __pycache__ ``` > ⚠️ **Секреты:**`secrets.yaml`, `flows_cred.json`, `passwd`, `HA_TOKEN` — либо в отдельном **приватном** repo, либо через `git-crypt`/`.gitignore` + отдельный бэкап. Gitea `DISABLE_REGISTRATION=true` и за Caddy — приемлемо, но решить осознанно. ## 10. Риски и подводные камни | Риск | Вероятность | Митигация | |------|-------------|-----------| | **udev-гонка** (docker стартует раньше tty) | высокая | ✅ на аддонах **неактуальна** — Supervisor сам ждёт устройство при старте аддона | | **USB-пути t610 ≠ TrueNAS** | ✅ решено | фактические пути зафиксированы 2026-09-14 (§12); порты 3/4 закреплены физически | | **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; переспаривание не нужно при верном переносе | | **entity_id разъедутся** | средняя | копировать `.storage/core.entity_registry` | | **Хардкод `192.168.2.197` в HA** | высокая | заменить на `127.0.0.1` (mbusd рядом) | | **GPON-редирект** | высокая | переключить на t610:8123; проверить снаружи | | **HA OS не загрузится (Legacy/UEFI)** | средняя | включить UEFI в BIOS; fallback — HA OS в VM | | **Камера неизвестна** | — | §8, разобраться позже | | **Слабый CPU (T56N)** | низкая | HA OS + 6 контейнеров — ок; камера с AI-детекцией — нет | ## 11. План выполнения (этапы) | # | Содержание | Статус | |---|---|---| | 0 | Установка HA OS на t610 (HDD) + static IP на роутере | ✅ образ записан, t610 загружен (`192.168.2.176`). Static IP на роутере пока НЕ закреплён — работает по DHCP | | 1 | Базовые сервисы: **аддоны** (не docker!) | ✅ Mosquitto 1883, Node-RED 1880, File editor, Samba(нужен пароль) — см. [[family/plans/t610-addons-deployment]] | | 2 | udev-алиасы + скрипт старта | ✅ **НЕ НУЖНО** — аддоны снимают проблему udev-гонки (Supervisor ждёт устройство) | | 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-path + `uart: true`); дальше z2m community repo; mbusd+modbus-bridge local add-ons | | 3 | Перенос конфигов всех сервисов | ⏳ | | 4 | Перенос HA config (`.storage` + yaml + www) | ⏳ | | 5 | Правка адресов (modbus host, HA_TOKEN) | ⏳ | | 6 | ZONT MQTT → на t610 | ⏳ | | 7 | Камера (позже) | ⏳ | | 8 | Полная проверка | ⏳ | | 9 | Бэкап: rsync + git | ⏳ | | 10 | GPON-редиректы + Caddy → t610 | ⏳ | | 11 | Отключение на TrueNAS | ⏳ | ## 12. Данные, собранные при подготовке плана (2026-09-12) **Живое состояние TrueNAS (проверено):** | Контейнер | Образ | Сеть | Порты | Устройства | Ключевое | |-----------|-------|------|-------|-----------|----------| | homeassistant | `ghcr.io/home-assistant/home-assistant:stable` | `ha_default` | 8123 | — | HA 2026.9.1, volume `/mnt/RED_2TB/docker/ha:/config` | | zigbee2mqtt | `koenkk/zigbee2mqtt:latest` | host | — | `/dev/ttyACM0` (Inswift ZBP-MG21, ember) | network_key/pan_id в configuration.yaml | | nodered | `nodered/node-red:latest` | `nodered_default` | 1880 | — | `TZ=Asia/Novosibirsk`, Node-RED v5.0.7 | | mosquitto | `eclipse-mosquitto` | `mosquitto_default` | 1883 | — | `allow_anonymous false`, `password_file /mosquitto/config/passwd` | | mbusd | `3cky/mbusd` | `mbusd_default` | 502 | `/dev/ttyVent→/dev/ttyUSB0` (CH340 `1a86:7523`) | conf: 9600 8n1, trx_control=addc | | modbus-bridge | `modbus-bridge-modbus-bridge` (локальная сборка) | **host** | — | `/dev/ttyZONT→/dev/ttyUSB0` (CH340) | env `HA_TOKEN`, `config.yml` | **USB-топология TrueNAS (для справки, на t610 будет иначе):** ``` ttyUSB0 (1a86:7523 CH340) DEVPATH .../2-1/2-1.5/2-1.5:1.0 → ttyVent ttyUSB1 (1a86:7523 CH340) DEVPATH .../2-1/2-1.6/2-1.6:1.0 → ttyZONT ttyACM0 (Inswift Zigbee ZBP-MG21, 535A000001) → zigbee2mqtt ``` **Текущие udev-правила (⚠️ НЕ подойдут для t610):** ``` SUBSYSTEM=="tty", KERNEL=="ttyUSB*", KERNELS=="?-1.6:1.0", SYMLINK+="ttyZONT" SUBSYSTEM=="tty", KERNEL=="ttyUSB*", KERNELS=="?-1.5:1.0", SYMLINK+="ttyVent" ``` **USB-топология t610 (фактическая, зафиксирована 2026-09-14):** ``` Порт 3 (OHCI pci-0000:00:12.0) → ttyUSB0 CH340 #1 by-path pci-0000:00:12.0-usb-0:3:1.0-port0 → ZONT Порт 4 (OHCI pci-0000:00:12.0) → ttyUSB1 CH340 #2 by-path pci-0000:00:12.0-usb-0:4:1.0-port0 → Vent Порт 1 (xhci pci-0000:04:00.0) → ttyACM0 Inswift Zigbee ZBP-MG21 (serial 535A000001) ``` > ⚠️ Оба CH340 на t610 — **без серийника**, by-id идентичен (`usb-1a86_USB_Serial-if00-port0`). > Эквивалент udev-правила на t610 был бы `KERNELS=="1-3"` / `KERNELS=="1-4"` (порты 3 и 4). > Для аддонов udev не применяется — способ привязки решается в [[family/plans/t610-addons-deployment]]. **HA `configuration.yaml` — modbus:** ```yaml modbus: - name: rtu_bus type: tcp host: 192.168.2.197 # ← ЭТО МЕНЯЕМ на 127.0.0.1 или IP t610 port: 502 ``` (в блоке также закомментированные AT2-сенсоры и активные switch'и заслонок slave 11/12/13/14) **modbus-bridge `config.yml` (ключевое):** ```yaml serial: {port: /dev/ttyUSB0, baudrate: 9600, rts_de: true, timeout: 0.05} ha: {url: "http://localhost:8123", poll_interval: 15} mqtt: {broker: localhost, port: 1883, topic_prefix: modbus} sniff: # slave 1/2/3 → Dining/Kids/Bedroom, регистры 2 и 100 ``` ## Связанные заметки - [[family/how-to/home-automation]] — карта slave ID, ZONT, регистры вентиляции - [[family/how-to/truenas-infrastructure]] — docker-стек TrueNAS - [[family/how-to/zont-modbus-bridge-udev-race-protection]] — защита от udev-гонки - [[family/how-to/truenas-rclone-backup]] — система бэкапов - [[family/how-to/gitea-config]] — Gitea (для git-бэкапа конфигов) - [[family/how-to/truenas-access]] — доступ, железо, OpenWrt