Files
obsidian-vault/family/plans/home-automation-migration-t610.md
T

43 KiB
Raw Blame History

title, status, tags, created, updated, related
title status tags created updated related
Перенос домашней автоматизации на HP t610 in-progress
family
plan
homeautomation
t610
migration
2026-09-12 2026-09-14
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.yamlmodbus.host 192.168.2.197 IP t610 иначе HA на t610 не найдёт mbusd (он теперь локальный — можно 127.0.0.1, т.к. mbusd host-network)
modbus-bridge/config.ymlha.url http://localhost:8123 без изменений остаётся localhost
modbus-bridge/config.ymlmqtt.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.img1.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 — правильное поведение.

Команда, которой записан образ:

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).

# на 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) — обязательно, до всего остального:
# 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='<MAC t610>'
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.

  1. HA OS Web UI: http://<IP t610>: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) — черновик исходного подхода, не применявшийся.

# ИСТОРИЧЕСКИЙ ЧЕРНОВИК (не применять): на t610 другая USB-топология, старые KERNELS не сработают.
# udevadm в SSH-аддоне НЕТ — читать sysfs (/sys/class/tty/<tty>/device), см. t610-access §USB.
Составить новые `99-tty-alias.rules` **по серийникам, а не по портам** — надёжнее:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{serial}=="<serial CH340 #1>", SYMLINK+="ttyZONT" SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{serial}=="<serial CH340 #2>", 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):

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=<long-lived token из HA>
    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.

  • HA UI открывается: http://192.168.2.176 (⚠️ порт 80, не 8123)
  • ha apps — все аддоны started (z2m, mosquitto, nodered, mbusd, modbus-bridge, core_ssh)
  • Serial: by-path/b-id видны в аддонах (uart: true); привязка по /dev/serial/by-path/... (НЕ tty-алиасы — они на HA OS невозможны)
  • Zigbee: z2m работает — 16 устройств подхватились из старой базы, координатор EmberZNet 7.4.5
  • MQTT: трафик z2m идёт (discovery-сообщения публикуются), логин zont работает
  • Modbus вентиляция: HA видит AT2, заслонки переключаются (проверить физически!) — требует Этапа 3 (перенос HA-конфига)
  • ZONT: датчики 485 (Dining/Kids/Bedroom) в ZONT не «недоступные», температуры идут — требует ha_token в modbus-bridge + Этап 3
  • modbus-bridge: sniffer работает, MQTT подключён, 13 discovery-топиков modbus/sensors/* опубликованы, HA-опрос работает (ha.url = http://192.168.2.176:80)
  • 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 (только после проверки!)

⚠️ НЕ удалять, а остановить + отключить автозапуск. Данные остаются как откат.

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  → <t610-IP>:8123
#    cam.mallexxx...       → <t610-IP>: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:
# на TrueNAS, cron 03:30:
rsync -a --delete root@<t610-IP>:/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:

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:

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 (ключевое):

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

Связанные заметки