From 5f07567b3da745a499cc68ec531b4db6f82ecff8 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sat, 12 Sep 2026 16:05:11 +0600 Subject: [PATCH] [2026-09-12] eagle: family/how-to/home-automation.md family/how-to/truenas-infrastructure.md family/plans/home-automation-migration-t610.md --- family/how-to/home-automation.md | 2 + family/how-to/truenas-infrastructure.md | 2 + .../plans/home-automation-migration-t610.md | 499 ++++++++++++++++++ 3 files changed, 503 insertions(+) create mode 100644 family/plans/home-automation-migration-t610.md diff --git a/family/how-to/home-automation.md b/family/how-to/home-automation.md index f064665d..066509c2 100644 --- a/family/how-to/home-automation.md +++ b/family/how-to/home-automation.md @@ -7,6 +7,8 @@ related: ["[[family/how-to/router-bishkek-asus]]"] --- # 🏠 Умный дом — автоматика +> ⚠️ **ПЛАН ПЕРЕНОСА (2026-09-12):** весь стек домашней автоматизации (HA, zigbee2mqtt, nodered, mosquitto, mbusd, modbus-bridge) планируется перенести с TrueNAS на **HP t610** (HA OS). План со всеми путями/шагами: [[family/plans/home-automation-migration-t610]]. Карты Slave ID и регистров ниже **остаются в силе** — оборудование и адреса Modbus не меняются. + ## AT2 — калибровка PWM ``` diff --git a/family/how-to/truenas-infrastructure.md b/family/how-to/truenas-infrastructure.md index a8745eb8..60dd618d 100644 --- a/family/how-to/truenas-infrastructure.md +++ b/family/how-to/truenas-infrastructure.md @@ -1,5 +1,7 @@ # TrueNAS — инфраструктура +> ⚠️ **ПЛАН ПЕРЕНОСА (2026-09-12):** вся домашняя автоматизация (HA, zigbee2mqtt, nodered, mosquitto, mbusd, modbus-bridge + камера) планируется к переносу с TrueNAS на **HP t610** (HA OS). Причина: TrueNAS на пределе RAM (17/21 ГБ). План: [[family/plans/home-automation-migration-t610]]. **НЕ ВЫПОЛНЯЕТСЯ, ждёт подтверждения.** + > Обновлено: 2026-09-02 (vpn.mallexxx:443 = РАБОЧИЙ Xray-сервер, проверено end-to-end; vless-proxy outbound мёртв) > ## ⚠️ ПРИОРИТЕТ 2026-09-01: VPS qentra.top УДАЛЁН → vless-proxy и сетевые туннели сломаны diff --git a/family/plans/home-automation-migration-t610.md b/family/plans/home-automation-migration-t610.md new file mode 100644 index 00000000..84d5cc11 --- /dev/null +++ b/family/plans/home-automation-migration-t610.md @@ -0,0 +1,499 @@ +--- +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 1–2 ГБ — **мало для 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.3–1) = ~3–4 ГБ. **Работать будет, но без запаса.** Если в 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='' +uci set dhcp.@host[-1].ip='192.168.2.150' # ← выбранный статический IP +uci commit dhcp && /etc/init.d/dnsmasq restart +``` +> 💡 Выбрать свободный IP (проверить ping). Кандидат: `192.168.2.150`. +3. HA OS Web UI: `http://:8123` → первичная настройка (создать аккаунт). +> ⚠️ HA OS ставит HA «с нуля» — **конфиги мы переносим вручную** (§5), НЕ через бэкап-снапшот, чтобы не тащить мусор от старой версии долей. + +### Шаг 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}=="", SYMLINK+="ttyZONT" +SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", ATTRS{serial}=="", SYMLINK+="ttyVent" +``` +> ⚠️ У дешёвых CH340 **серийники часто отсутствуют/одинаковые** → тогда только по `KERNELS` (физическому порту). Тогда — жёстко зафиксировать, в какой USB-порт какой адаптер вставлен, и подписать порты физически. +> ⚠️ **Гонка с udev** (та же проблема, что на TrueNAS): docker стартует раньше udev → контейнеры с `devices:` падают. На HA OS решать через `systemd` unit `After=dev-ttyZONT.device` ИЛИ через скрипт ожидания (§ Шаг 6). + +### Шаг 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= + 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://:8123` +- [ ] `docker ps` — все 5–6 контейнеров Up +- [ ] `ls -la /dev/ttyZONT /dev/ttyVent /dev/ttyACM0` — алиасы созданы, указывают на правильные ttyUSB +- [ ] **Zigbee:** устройства видны в zigbee2mqtt UI (`http://: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://: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 → :8123 +# cam.mallexxx... → :8090 +docker restart caddy +# 5. Опционально (позже): archive папки +# mv /mnt/RED_2TB/docker/ha /mnt/RED_2TB/docker/ha.decommissioned-2026-09 +``` +> ⚠️ Caddy остаётся на TrueNAS — он терминирует TLS для всех доменов. Меняем только upstream-адреса HA и камеры. +> ⚠️ Редирект GPON-роутера на 8123 тоже переключить на t610. + +## 8. Камера — ОТКРЫТЫЙ ВОПРОС + +**Факт (проверено 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@:/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