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

500 lines
33 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: draft
tags:
- family
- plan
- homeautomation
- t610
- migration
created: '2026-09-12'
updated: '2026-09-12'
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]]'
---
# Перенос домашней автоматизации на HP t610
> **Статус: ПЛАН, НЕ ВЫПОЛНЯЕТСЯ. Ждёт подтверждения Alex.**
> Создан 2026-09-12. Цель: убрать всю домашнюю автоматизацию с TrueNAS (он перегружен — 17/21 ГБ RAM) на выделенный HP t610, с бэкапом конфигов на TrueNAS и в git.
## 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 — на TrueNAS НЕ найдена |
| 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 (штатно), **до 16 ГБ** (2 слота) | ⚠️ узкое место. HA OS + 6 контейнеров на 4 ГБ — впритык |
| USB | **2× USB 3.0** + 4× USB 2.0 | ✅ хватает: Zigbee + 2× CH340 |
| Сеть | Gigabit (Broadcom BCM57781) | ок |
| COM | 1× RS-232 | резерв (если перейдём на нативный mbusd) |
| Диск | DOM в SATA-разъёме + 2-й SATA | ⚠️ если DOM 12 ГБ — **мало для HA OS**, нужен SSD/USB-диск |
| БП | 19.5V 3.3A, штекер 7.4×5.0 мм | нужен родной БП |
| Потребление | ~12 Вт idle, ~20 Вт под нагрузкой | ✅ тихий, дёшево 24/7 |
**⚠️ Риск RAM.** HA OS требует ~2 ГБ минимум. На 4 ГБ: HA OS (2 ГБ) + z2m (0.15) + mosquitto (0.05) + node-red (0.25) + mbusd (0.02) + modbus-bridge (0.1) + камера (0.31) = ~34 ГБ. **Работать будет, но без запаса.** Если в t610 есть 2 слота и планки 2+2 — рекомендую поставить 8 ГБ (2×4) перед переносом. Проверить фактические планки и объём DOM — шаг 1.
## 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. Инвентаризация железа t610 (перед всем)
```bash
# На t610 (после загрузки в Live-USB или уже установленную ОС):
lscpu | grep -iE "model name|^CPU\(s\)|MHz"
free -h
lsblk -o NAME,SIZE,TYPE,MODEL # какой DOM/SSD, хватит ли места
sudo dmidecode -t 17 | grep -E "Size|Locator" # сколько слотов RAM и планки
```
**Решения по результату:**
- RAM < 8 ГБ → решить, ставить ли 2×4 ГБ (рекомендуется)
- Диск < 32 ГБ → нужен SSD или USB-диск для HA OS
### Шаг 2. Установка HA OS на t610
**Откуда качать образ:** официальный раздел https://www.home-assistant.io/installation/generic-x86-64/
- Прямая ссылка на образ (generic x86-64):https://github.com/home-assistant/operating-system/releases
- Файл: `haos_generic-x86-64-<версия>.img.xz` (в разделе **Assets** последнего релиза)
- Записать на USB-флешку/SSD:
```bash
# на Mac:
xz -d haos_generic-x86-64-<версия>.img.xz
diskutil list # найти целевой диск (НЕ ошибиться!)
diskutil unmountDisk /dev/diskN
sudo dd if=haos_generic-x86-64-<версия>.img of=/dev/rdiskN bs=4m && sync
```
> ⚠️ В HA OS **UEFI**: в BIOS t610 включить UEFI-boot (не Legacy). Если t610 не грузит HA OS — вариант: **HA OS на Proxmox/Debian + qemu**, но это сложнее; сначала пробуем bare-metal.
- После записи → вставить в t610 → загрузиться → HA OS сама расширит раздел.
### Шаг 3. Первый запуск 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), НЕ через бэкап-снапшот, чтобы не тащить мусор от старой версии долей.
### Шаг 4. Установка вспомогательных контейнеров на t610
HA OS поддерживает **аддоны** (встроенный docker). Два подхода:
- **(A) Аддоны HA OS** — Zigbee2MQTT и Mosquitto есть в официальном store. Быстро, но на t610 (4 ГБ) тяжелее и менее гибко.
- **(B) Отдельный docker** — как на TrueNAS (портируем `docker-compose.yml` 1:1). Больше контроля, совпадает со старой схемой.
**Рекомендация: (B) отдельный docker**, чтобы конфиги переносились как есть. На HA OS это делается через **SSH-аддон + `docker` CLI** или через add-on «Portainer».
Контейнеры (в порядке зависимостей):
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
### Шаг 5. Подключить 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).
### Шаг 6. Перенести конфиги (см. §5) и поднять сервисы
Порядок: скопировать конфиги → `docker compose up -d` по одному → проверить.
### Шаг 7. Проверка работоспособности (чек-лист §6)
### Шаг 8. Бэкап на TrueNAS + git (§9)
### Шаг 9. Отключить на 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. Камера — ОТКРЫТЫЙ ВОПРОС
**Факт (проверено 2026-09-12):** на TrueNAS камеры **нет** — ни контейнера, ни образа, ни папки в `/mnt/RED_2TB/docker/`, ни в `docker.bak/` (бэкап до пересоздания пула), ни в `storage/`, ни в `backup/`. Есть **только** мёртвая прокси-строка в Caddy (`cam.mallexxx.duckdns.org → 192.168.2.197:8090`), повторяющаяся во всех бэкапах Caddyfile с июля. Порт 8090 на TrueNAS никто не слушает.
**Что нужно выяснить у Alex:**
1. Модель камеры (RTSP-IP-камера? USB? бренд)
2. Где она сейчас физически работает (HTPC / Kraken / Mac / отдельное устройство?)
3. Что нужно: только просмотр (MJPEG/HLS) или запись/детекция?
**Кандидаты на t610 (по выбору):**
| Инструмент | Для чего | Образ |
|------------|----------|-------|
| **go2rtc** | RTSP → WebRTC/HLS/MJPEG, лёгкий | `alexxit/go2rtc` или `roflcoopter/...` |
| **motionEye** | просмотр + запись по детекции движения | `ccrisan/motioneye` |
| **mediamtx** | RTSP/WebRTC-сервер | `bluenviron/mediamtx` |
| **Frigate** | детекция объектов (AI) | ⚠️ **не для t610** — нужен Coral/GPU, съест всю RAM |
**Рекомендация:** если нужен просто просмотр → **go2rtc** (легчайший, идеален для слабого t610). Если запись по движению → motionEye (но следить за RAM).
## 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. Риски и подводные камни
| Риск | Вероятность | Митигация |
|------|-------------|-----------|
| **RAM 4 ГБ мало** | высокая | поставить 8 ГБ до переноса; следить за `free -h` |
| **udev-гонка** (docker стартует раньше tty) | высокая | скрипт ожидания + `After=dev-tty*.device` |
| **USB-пути t610 ≠ TrueNAS** | 100% | пересчитать udev по серийнику/физическому порту |
| **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 |
| **Диск DOM мал** | средняя | проверить `lsblk`, при малом — SSD |
| **Камера неизвестна** | — | §8, уточнить у Alex |
| **Слабый CPU (T56N)** | средняя | 6 контейнеров + HA OS — ок; камера с детекцией — нет |
## 11. План выполнения (этапы)
| Этап | Содержание | Требует |
|------|-----------|---------|
| **0** | Инвентаризация t610 (RAM/диск/USB) | физ. доступ |
| **1** | (если нужно) апгрейд RAM до 8 ГБ, диск | покупка |
| **2** | Установка HA OS + static IP на роутере | ✅ |
| **3** | Docker + 5 контейнеров (mosquitto, z2m, nodered, mbusd, modbus-bridge) | ✅ |
| **4** | udev-алиасы + скрипт старта | ✅ |
| **5** | Перенос конфигов всех сервисов | ✅ |
| **6** | Перенос HA config (`.storage` + yaml + www) | ✅ |
| **7** | Правка хардкод-адресов (modbus host, HA_TOKEN) | ✅ |
| **8** | ZONT MQTT → на t610 | ✅ (доступ к ZONT) |
| **9** | Камера (после выяснения §8) | ❓ |
| **10** | Полная проверка (§6) | ✅ |
| **11** | Бэкап: rsync на TrueNAS + git в Gitea | ✅ |
| **12** | GPON-редиректы + Caddy → t610 | ✅ |
| **13** | Отключение на TrueNAS (§7) | ✅ после проверки |
## 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"
```
**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