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

525 lines
37 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: Перенос домашней автоматизации на 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 — аддоны, ВЫПОЛНЕН. Этап 2a — USB подключены 2026-09-14, способ привязки CH340 РЕШЁН; следующий шаг — z2m/mbusd/modbus-bridge).**
> Цель: убрать всю домашнюю автоматизацию с TrueNAS (он перегружен — 17/21 ГБ RAM) на выделенный HP t610, с бэкапом конфигов на TrueNAS и в git.
>
> **Прогресс 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-гонки снимается.
> - ⏭️ Следующий шаг: Этап 2b (z2m, mbusd, modbus-bridge) → Этап 3 (перенос HA-конфига).
>
> **Доступ к хосту и 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 | 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 |
| **Камера** | docker-контейнер | см. §8 — разобраться отдельно |
| udev-скрипт tty-алиасов | нативный udev + systemd | обязателен для стабильного старта mbusd/modbus-bridge |
**Остаётся на 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='<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`.
3. 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
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
6. **камера** — см. §8
### Шаг 4. Подключить USB-устройства и настроить udev-алиасы
**⚠️ САМЫЙ ОПАСНЫЙ ШАГ — на t610 другая USB-топология.**
Старые правила `KERNELS=="?-1.6:1.0"` / `"?-1.5:1.0"` **не сработают** — надо пересчитать пути.
```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")
```
Составить новые `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
```
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 (локальная сборка)
```
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=<long-lived token из HA>
restart: unless-stopped
```
> ⚠️ `HA_TOKEN` — long-lived token. **После переноса HA на t610 — сгенерировать НОВЫЙ токен** в HA (Профиль → Security → Long-lived tokens), т.к. старый привязан к прежней инсталляции (фактически токен привязан к HA `auth`, который мы не переносим вместе с `.storage` — см. примечание ниже).
### 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. Чек-лист проверки после переноса
- [ ] HA UI открывается:`http://<t610-IP>:8123`
- [ ] `docker ps` — все 5–6 контейнеров Up
- [ ] `ls -la /dev/ttyZONT /dev/ttyVent /dev/ttyACM0` — алиасы созданы, указывают на правильные ttyUSB
- [ ] **Zigbee:** устройства видны в zigbee2mqtt UI (`http://<t610-IP>: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://<t610-IP>:1880` — flows загружены, creds на месте
- [ ] **ZONT MQTT:** ZONT шлёт данные на `t610:1883` (проверить подпиской)
- [ ] **HA автоматизации:** все работают (свет, вентиляция, ГВС) — функции автоматизаций срабатывают
- [ ] **Floor plan:** dashboard с планом этажей отображается
- [ ] **Камера:** доступна по `cam.mallexxx.duckdns.org` (если переехала)
- [ ] **Стабильность:**`reboot` t610 → всё поднялось само, без ручных команд (главный тест — гонка udev!)
## 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 → <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:
```bash
# на 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:
```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