525 lines
37 KiB
Markdown
525 lines
37 KiB
Markdown
---
|
||
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
|