[2026-09-14] eagle: family/how-to/home-automation.md family/how-to/nodered-ventilation.md family/how-to/truenas-infrastructure.md family/plans/t610-home-automation.md

This commit is contained in:
Alexey Martemyanov
2026-09-14 15:28:46 +06:00
parent b6c1b99c3b
commit b8aadd9bd8
4 changed files with 114 additions and 13 deletions
+3 -3
View File
@@ -21,11 +21,11 @@ related:
> **Статус на 2026-09-14:** домашняя автоматизация **перенесена на HP t610** (HA OS).
> 📌 **Всё про миграцию** — хост, доступ, карта USB/гнёзд, аддоны, Zigbee, питфоллы, текущее состояние — **в единственном документе [[family/plans/t610-home-automation]]. НЕ дублировать сюда.**
> 📌 **Этот документ — справочник по ЖЕЛЕЗУ:** AT2 (параметры/PWM), карта Slave ID, регистры заслонок/реле, ZONT relays. Оборудование и адреса Modbus при миграции не меняются.
> **Текущее состояние:** `unavailable` в HA — **10** (было 44). Причина была в **перепутанных гнёздах аддонов** (`mbusd`↔`modbus-bridge`) — исправлено обменом привязок. **ZONT ещё НЕ перенаправлен** на MQTT t610 — редирект GPON-роутера пока смотрит на TrueNAS.
> **Текущее состояние:** `unavailable` в HA — **10** (было 44). Причина была в **перепутанных гнёздах аддонов** (`mbusd`↔`modbus-bridge`) — исправлено обменом привязок.
>
> **🔴 ZONT MQTT — подтверждено 2026-09-14:** на роутере `192.168.2.2` (OpenWrt) есть DNAT-правило `MQTT`: `wan:1883 → 192.168.2.197:1883` (mosquitto на **TrueNAS**), `src_ip 192.168.0.0/24` (сеть GPON/ZONT). Также `/etc/config/dhcp`: `list address '/mallexxx.duckdns.org/192.168.0.10'` — внутренний DNS-пин для ZONT-сети. **Для остатка Этапа 4:** переключить DNAT `MQTT` на `192.168.2.176:1883` (mosquitto-аддон на t610).
> ** ZONT MQTT — ПЕРЕНАПРАВЛЕН 2026-09-14:** на роутере `192.168.2.2` (OpenWrt) DNAT-правила `redirect[0]` (name `MQTT`) и `rule[3]` (name `allow-1883`) переключены `dest_ip` `192.168.2.197` → **`192.168.2.176`**. ZONT теперь пишет в mosquitto-**аддон на t610** (живой поток `modbus/sensors/kids/*`, `bedroom/*`). В настройках ZONT ничего не менялось — адрес `mqtt://zont:…@192.168.0.10:1883` остался тот же (`192.168.0.10` = wan-интерфейс самого роутера `192.168.2.2`). Бэкап правил: `/root/firewall.bak-20260914-092555`. Детали и откат — [[family/plans/t610-home-automation]] §5-кватер-Д. Также `/etc/config/dhcp`: `list address '/mallexxx.duckdns.org/192.168.0.10'` — внутренний DNS-пин для ZONT-сети.
>
> **🔌 ZONT 485 спит на гнезде 4** (`/dev/serial/by-path/pci-0000:00:12.0-usb-0:4:1.0-port0`), вентиляция — гнездо 3. `modbus-bridge` (аддон на t610) сниффит ZONT-шину и публикует в MQTT топики `modbus/sensors/<комната>/<параметр>`. **Сейчас публикуются только `kids` и `bedroom`** (temperature/co2/humidity) — `dining/*` НЕ публикуется: ZONT опрашивает slave 1 / reg 100 каждые 5 с, датчик отвечает значением **0** → bridge отбрасывает как невалидное. Датчик физически есть (подтверждено Alex'ом), причина нуля не установлена.
> **🔌 ZONT 485 спит на гнезде 4** (`/dev/serial/by-path/pci-0000:00:12.0-usb-0:4:1.0-port0`), вентиляция — гнездо 3. `modbus-bridge` (аддон на t610) сниффит ZONT-шину и публикует в MQTT топики `modbus/sensors/<комната>/<параметр>`. **Публикуются только `kids` и `bedroom`** (temperature/co2/humidity) — **`dining/*` ZONT не публикует вообще, ни в один брокер** (проверено 2026-09-14 вечер-3 после перенаправления DNAT). ⚠️ **Прежняя версия «датчик отвечает 0» — ОПРОВЕРГНУТА:** на брокере TrueNAS по столовой висели **retained**-значения (co2 780, temp 24.2 °C) — то есть данные когда-то были валидными, датчик исправен. Причина в **ZONT-стороне** (регистрация/конфигурация датчика столовой в ZONT), не в маршруте MQTT и не в t610. Задача не ставилась Alex'ом.
## AT2 — калибровка PWM
+13 -1
View File
@@ -6,9 +6,21 @@ tags:
- automation
- nodered
- ventilation
updated: '2026-05-17'
updated: '2026-09-14'
related:
- '[[family/plans/t610-home-automation]]'
- '[[family/how-to/home-automation]]'
---
> ## 🔄 ГДЕ ЖИВЁТ (обновлено 2026-09-14)
> **Flows перенесены на HP t610** (HA OS) — **перенос выполнен 2026-09-14**, см. [[family/plans/t610-home-automation]] §5-кватер-Г.
> - **Файл:** `/addon_configs/a0d7b954_nodered/flows.json` в аддоне `a0d7b954_nodered` (**68 узлов**, было 124 б пустых).
> - **🔴 Ключевая правка при переезде:** узел `server` — `"addon": false` → **`"addon": true`**. На TrueNAS Node-RED был отдельным docker-контейнером и ходил в HA по адресу + long-lived token (**токена в переносимых файлах нет вообще** — не искать). На t610 он HA-аддон → в аддон-режиме Supervisor даёт доступ к HA без токена. Лог после правки: `[server:Home Assistant] Connected to http://supervisor/core`, ошибок 0.
> - **Модуль:** опция аддона `npm_packages: ["node-red-contrib-home-assistant-websocket@0.80.3"]`.
> - **Доступ:** наружу НЕ выпущен (`host_network: true` глушит порт-маппинг; снимается только галочкой в UI) → **через ingress HA**: `http://192.168.2.176/api/hassio_ingress/4vUcCxEpYJMbQ64z-kWPCvFadq8ayl4lzvzJPDUaZzE/`. Домен `nodered.mallexxx.duckdns.org` **не используется** (отдаёт 401 от nginx HA).
> - **Старый Node-RED на TrueNAS** (`/mnt/RED_2TB/docker/nodered/`, порт 1880) пока жив как источник/откат.
> - **⚠️ Известное следствие:** узел `fan.fan_at2_1/2` (slave 10) в HA на t610 — `unavailable` (блок закомментирован в `configuration.yaml`), поэтому управление вентиляторами AT2 не работает. Также проверить наличие `cover.intake_damper_*` (в конфиге HA заслонки описаны как `switch.*`). Alex: задача по slave 10 **не ставилась**.
Node-RED flow для управления вентиляцией по данным CO₂ датчиков.
## Структура
+5 -1
View File
@@ -6,7 +6,11 @@
> - **Caddy НЕ переносился и не будет:** 17 из 20 доменов `*.mallexxx.duckdns.org` — сервисы самого TrueNAS (immich, gitea, jellyfin, radarr, webdav, transmission, portainer…). Перенос Caddy на t610 положил бы их при падении t610. **Правлены только 2 upstream:** `mallexxx.duckdns.org` → `192.168.2.176:80` (HA на t610, HTTP 200) и `nodered.mallexxx.duckdns.org` → `192.168.2.176:1880` (**⚠️ этот сейчас отдаёт 401 от nginx HA, а не Node-RED — не используется, см. ниже**). Caddyfile: `/mnt/RED_2TB/docker/caddy/Caddyfile` (root-owned — агент только стейджит в `/tmp/`, подменяет Alex), бэкап `Caddyfile.bak-20260914`. Порты контейнера: `8088:80`, `8443:443`; DNAT на роутере `192.168.2.2`: `wan:80→192.168.2.197:8088`, `wan:443→192.168.2.197:8443`.
> - **Node-RED flows перенесены на t610** (`/addon_configs/a0d7b954_nodered/flows.json`, 68 узлов, узел `server` → `addon: true`). **Наружу НЕ выпущен** (порт-маппинг при `host_network: true` глушится, снимается только в UI) — доступ через ingress HA. Node-RED в докере TrueNAS (`/mnt/RED_2TB/docker/nodered/`, порт `1880:1880`) **продолжает работать** как источник/откат.
> - **🔴 Важно про доступ к HA извне:** `/config/.storage/http` на t610 требовал `trusted_proxies += 192.168.2.197/32`, иначе Caddy с другого хоста даёт **400** (HA `use_x_forwarded_for: true`). Обобщение: **IP любого внешнего reverse-proxy обязан быть в `trusted_proxies`.**
> - **Не перенесено с TrueNAS:** GPON-редирект → t610, **ZONT MQTT** (сейчас ZONT шлёт на `192.168.2.197:1883` — DNAT-правило `MQTT` на роутере `192.168.2.2`), камера (`cam.*` → мёртвый upstream `.197:8090`).
> **2026-09-14 (вечер-3) — ZONT MQTT ПЕРЕНАПРАВЛЕН НА t610:**
> - DNAT на роутере `192.168.2.2`: `firewall.@redirect[0]` (name `MQTT`) и `firewall.@rule[3]` (name `allow-1883`) — `dest_ip` `192.168.2.197` → **`192.168.2.176`**. `uci commit firewall` + `/etc/init.d/firewall reload`. Бэкап: `/root/firewall.bak-20260914-092555`.
> - **Результат:** ZONT пишет в mosquitto-**аддон на t610** (живой поток `modbus/sensors/kids/*`, `bedroom/*`). В настройках ZONT ничего не менялось (`mqtt://…@192.168.0.10:1883`, где `.0.10` = wan-интерфейс роутера `192.168.2.2`, не отдельный GPON-роутер).
> - ⚠️ **`dining/*` ZONT не публикует ни в один брокер** — вопрос ZONT-стороны, не маршрута (retained-значения на TrueNAS были валидными → датчик исправен). Подробно — [[family/plans/t610-home-automation]] §5-кватер-Д.
> - **Не перенесено с TrueNAS:** камера (`cam.*` → мёртвый upstream `.197:8090`); погашение TrueNAS-стека (Этап 4 п.6 — заблокировано: Caddy на TrueNAS держит точку входа).
> Обновлено: 2026-09-02 (vpn.mallexxx:443 = РАБОЧИЙ Xray-сервер, проверено end-to-end; vless-proxy outbound мёртв)
+93 -8
View File
@@ -8,8 +8,8 @@
## 1. Состояние на 2026-09-14 (актуализировано 15:33 → дополнено вечерней сессией)
**Этап 1 ✅ · Этап 2 ✅ · Этап 3 ✅ ЗАКРЫТ.** Этап 4 — **ЧАСТИЧНО СДЕЛАН:** ① Caddy переключён на t610 (`mallexxx.duckdns.org` → HA на t610, работает); ② Node-RED flows перенесены с TrueNAS, HA-узел в аддон-режиме, **подключён к HA, ошибок 0** (наружу не выпущен решение Alex «оставляем так», доступ через ingress). **ОСТАЛОСЬ:** GPON-редирект → t610, ZONT MQTT → t610.
**Последняя верификация: 2026-09-14 (вечер-2) — Caddyfile залит, `trusted_proxies` исправлен, `mallexxx.duckdns.org` → HTTP 200; Node-RED: 68 узлов перенесены, `Connected to http://supervisor/core`, лог без ошибок.** Детали — §5-кватер-Б, -В, -Г.
**Этап 1 ✅ · Этап 2 ✅ · Этап 3 ✅ ЗАКРЫТ.** Этап 4 — **ПОЧТИ ЗАКРЫТ (3 из 4):** ① Caddy t610 (`mallexxx.duckdns.org` → HA на t610, HTTP 200); ② Node-RED flows перенесены, `Connected to HA`, наружу не выпущен (решение Alex «оставляем так», доступ через ingress); ③ **ZONT MQTT-редирект переключён на t610** (DNAT на роутере `.197``.176`, живой поток идёт). **ОСТАЛОСЬ:** погасить/отключить сервисы TrueNAS (заблокировано — Caddy на TrueNAS держит точку входа) + хвосты (static IP, бэкап).
**Последняя верификация: 2026-09-14 (вечер-3) — Caddyfile залит, `trusted_proxies` исправлен, `mallexxx.duckdns.org` → HTTP 200; Node-RED: 68 узлов перенесены, `Connected to http://supervisor/core`, лог без ошибок; разгадана причина `dining_*` — **маршрут MQTT** (ZONT пишет в брокер TrueNAS, а не t610), железо исправно.** Детали — §5-кватер-Б, -В, -Г, -Д.
| Что | Факт |
|---|---|
@@ -43,11 +43,11 @@
| Что | Состояние |
|---|---|
| **10 сущностей `unavailable`** (было 44) | **✅ ОСНОВНОЕ РЕШЕНО 2026-09-14 (финал): аддоны стояли на перепутанных гнёздах — поменяны местами → ушли ВСЕ 32 заслонки** (см. §5 «✅✅ РЕШЕНИЕ»). Рабочая привязка: `mbusd` = гнездо 3 (вентиляция), `modbus-bridge` = гнездо 4 (**ZONT 485**). **Остались 10:** 7 — `switch.fan_3_high/medium/low` + `sensor.fan_at2_*` (slave 10 закомментирован в `configuration.yaml`, задача СНЯТА Alex'ом — не поломка); **2 — `sensor.dining_summary`/`dining_air_summary` (причина НЕ `\|default(0)`, а отсутствие MQTT-данных `modbus/sensors/dining/*` — см. §5-тер)**; 1 — `todo.shopping_list` (системная) |
| **10 сущностей `unavailable`** (было 44) | **✅ ОСНОВНОЕ РЕШЕНО 2026-09-14 (финал): аддоны стояли на перепутанных гнёздах — поменяны местами → ушли ВСЕ 32 заслонки** (см. §5 «✅✅ РЕШЕНИЕ»). Рабочая привязка: `mbusd` = гнездо 3 (вентиляция), `modbus-bridge` = гнездо 4 (**ZONT 485**). **Остались 10:** 7 — `switch.fan_3_high/medium/low` + `sensor.fan_at2_*` (slave 10 закомментирован в `configuration.yaml`, задача СНЯТА Alex'ом — не поломка); **2 — `sensor.dining_summary`/`dining_air_summary`. ПРИЧИНА УТОЧНЕНА 2026-09-14 вечер-3 (§5-кватер-Д): это МАРШРУТ MQTT, не железо.** ZONT публикует `modbus/sensors/dining/*` в брокер **TrueNAS** (DNAT), а не в t610; там эти данные — **retained** (`modbus_ha_bridge disconnected`). Датчик столовой **исправен** (валидные 24.2 °C на TrueNAS). Прежняя версия «датчик отвечает `0`» — **уточнена/опровергнута**. Фикс — задача 5-мк (переключить DNAT на t610); 1 — `todo.shopping_list` (системная) |
| ~~`verify` как причина~~ | **ОПРОВЕРГНУТО как причина:** при верной привязке шин заслонки ожили при том же `verify` (`state_on:1`/`state_off:0`). Причина была в перепутанных шинах, не в `verify` |
| **`sensor.fan_at2_*` / `switch.fan_3_*` — сироты** | В `configuration.yaml` **весь блок slave 10 (AT2 fans) закомментирован** → эти сущности физически не могут получать данные. Не задача — просто известный факт состояния конфига |
| `switch.sauna` = `unknown` | Розетка физически отключена (`lastSeen` 8+ ч) — не баг |
| ZONT не перенаправлен | MQTT-редирект GPON-роутера ещё смотрит на TrueNAS |
| ZONT не перенаправлен | **✅ ПЕРЕНАПРАВЛЕН 2026-09-14 (вечер-3, §5-кватер-Д):** DNAT на роутере `192.168.2.2` (`redirect[0]` MQTT + `rule[3]`) переключён `.197``.176`; ZONT пишет в mosquitto **t610** (живой поток kids/bedroom). ⚠️ Не решено: `dining/*` не публикуется ZONT'ом вообще — вопрос ZONT-стороны |
| Камера | Контейнер был на TrueNAS, остановлен при восстановлении пула. В Caddy остался мёртвый upstream `192.168.2.197:8090`. Разбираться отдельно |
---
@@ -90,8 +90,9 @@ ha supervisor logs | tail -60 # диагностика сборки local add-
| Роутер | Доступ | Особенность |
|---|---|---|
| `192.168.2.2` (OpenWrt, основной) | SSH root, пароль `1316261` | DHCP-аренды: `cat /tmp/dhcp.leases` |
| `192.168.2.2` (OpenWrt, основной) | SSH root, пароль `1316261` | DHCP-аренды: `cat /tmp/dhcp.leases`. **🔑 Его интерфейс `wan` = `192.168.0.10/24`** (шлюз `192.168.0.1`), маршрут `192.168.0.0/24 dev wan`. **Поэтому «`192.168.0.10`» в настройках ZONT — это ОН САМ**, а не отдельный GPON-роутер. На нём же живут DNAT-правила для внешних сервисов (`uci show firewall`): `caddy_http/https` (80/443→TrueNAS 8088/8443), `HomeAssistant` (8123, disabled), `MQTT` (1883 из 192.168.0.0/24), `TrueNas-SSH`, transmission, syncthing, xray |
| `192.168.6.1` («Rasputin», OpenWrt aarch64) | SSH root | eth0 `192.168.2.157/24` — видит сеть 192.168.2.x |
| `192.168.0.1` (GPON) | — | Шлюз wan-интерфейса роутера `192.168.2.2`. ZONT приходит в брокер TrueNAS **с адреса `.0.1`** |
> ⚠️ **`nc` на OpenWrt (busybox) НЕ поддерживает `-z`** — молча печатает usage и даёт ложный вывод «порт закрыт». Для проверок с роутера — `curl`/`wget`. С Mac `nc -z` работает.
> 🔑 **Важно для диагностики:** весь трафик из локалки 192.168.2.x идёт через eth0 роутера Rasputin → **в логах удалённых сервисов источник выглядит как `192.168.2.157`**, даже если запрос делаешь ты сам с Mac. Не принимать это за «постороннего клиента».
@@ -868,6 +869,69 @@ www-authenticate: Basic realm="Home Assistant Authentication" ← это Н
> 📌 **Питфолл диагностики:** «basic auth вместо страницы X» + `server: nginx` + `realm="Home Assistant Authentication"` = **это nginx HA OS (ingress), а не целевой сервис**. Смотреть `server:` и `www-authenticate`, прежде чем искать логин.
### 5-кватер-Д. 🔬 ZONT/MQTT-маршрутизация + РАЗГАДКА «датчик столовой отдаёт 0» (2026-09-14, вечер-3)
**Контекст:** Alex дал точку опоры — в ZONT прописан сервер `mqtt://zont:mqtt1z3$@192.168.0.10:1883`, и напомнил: *«gpon все редиректит на openwrt же?»*.
**🔴 РАЗГАДКА по dining (закрывает вопрос «датчик отдаёт 0», §5-тер / §5-кватер-А):**
Подписка на оба брокера показала **разные данные**:
| Топик | TrueNAS `192.168.2.197` | t610 `192.168.2.176` |
|---|---|---|
| `modbus/sensors/dining/*` | ✅ **ЕСТЬ** (co2 780, temp 24.2, tvoc 36, pm10 13, humidity 52.9) | ❌ **НЕТ ВООБЩЕ** |
| `modbus/sensors/kids/*` | ✅ co2 **1760** | ✅ co2 **388** |
| `modbus/sensors/bedroom/*` | ✅ co2 **126.8** | ✅ co2 **425.9** |
**Ключевые выводы:**
1. **Данные на TrueNAS — RETAINED, а не живой поток.** При подписке значения пришли **мгновенно и больше не повторялись**. В логе mosquitto TrueNAS: `Client modbus_ha_bridge [172.16.7.1] disconnected` — **bridge на TrueNAS отключён**, свежих публикаций нет.
2. **Значения kids/bedroom РАЗНЫЕ** между хостами → это независимые замеры одной и той же шины (или разные моменты/разные регистры), не репликация.
3. **«Датчик отдаёт 0» (§5-тер) объясняется так:** ZONT (живой поток) идёт в mosquitto **TrueNAS** по DNAT, а bridge на t610 видит только то, что само приходит с его шины. В HA на t610 сидят `sensor.dining_*` (MQTT, `modbus_dining_sensor`), которые ждут `modbus/sensors/dining/*` — **но их в t610-брокер никто не публикует**. Отсюда `unavailable` → падение `dining_summary`.
> ⚠️ Это **уточняет** прежний вывод «ZONT опрашивает датчик, датчик отвечает 0»: датчик, вероятно, **исправен** (на TrueNAS по нему есть валидные данные 24.2 °C), а проблема — **в маршрутизации MQTT**, не в железе.
**🔴 СХЕМА МАРШРУТИЗАЦИИ ZONT (уточнение прежней записи «GPON редиректит на OpenWrt»):**
```bash
ssh root@192.168.2.2 # OpenWrt, пароль 1316261
uci show firewall # → redirect[0] name='MQTT'
```
```
firewall.@redirect[0]: src='wan' src_dport='1883' dest_ip='192.168.2.197' dest_port='1883' src_ip='192.168.0.0/24' target=DNAT
firewall.@rule[3]: name='allow-1883' src_ip='192.168.0.11' dest_ip='192.168.2.197' dest_port='1883' ACCEPT
```
- **`192.168.0.10` из настроек ZONT — это сам роутер `192.168.2.2`:** его интерфейс `wan` имеет `192.168.0.10/24`, `ip route` → `192.168.0.0/24 dev wan src 192.168.0.10`. **Отдельного «GPON-роутера» в этой цепочке нет.**
- Подтверждено логом mosquitto TrueNAS: `New client connected from 192.168.0.1 as zont_0FA7C33CC89F_f8:b3:b7:d8:46:f0 (u'zont')` — ZONT приходит через `192.168.0.1` на брокер `.197`.
**Что нужно сделать (остаток Этапа 4 — ZONT MQTT → t610):**
| Правило | Поле | Было | Стало |
|---|---|---|---|
| `redirect[0]` (MQTT) | `dest_ip` | `192.168.2.197` | **`192.168.2.176`** |
| `rule[3]` (allow-1883) | `dest_ip` | `192.168.2.197` | **`192.168.2.176`** |
В ZONT **ничего менять не надо** — адрес `192.168.0.10:1883` остаётся, роутер просто перестанет подменять на TrueNAS. Порт `1883` на t610 **проверен — OPEN** (`nc -z`). Пользователь `zont` в mosquitto t610 **есть**; пароль `mqtt1z3$` **проверен рабочим** на обоих брокерах (`mosquitto_sub` успешно подписался).
#### ✅ ВЫПОЛНЕНО 2026-09-14 (вечер-3): DNAT переключён на t610
**Применено на роутере `192.168.2.2` (Alex дал команду).** Бэкап перед правкой: `/root/firewall.bak-20260914-092555` (`uci export firewall`, 3326 б).
```bash
uci set firewall.@redirect[0].dest_ip="192.168.2.176"
uci set firewall.@rule[3].dest_ip="192.168.2.176"
uci commit firewall
/etc/init.d/firewall reload
# проверка: uci show firewall.@redirect[0] → dest_ip='192.168.2.176' ✅
```
**Результат (проверено подпиской):** ZONT **пошёл в mosquitto t610** — живой поток (`modbus/sensors/kids/*`, `bedroom/*` обновляются каждые 5 с, значения меняются, не retained). В логе mosquitto t610: `New client connected from 192.168.2.157 ... (u'zont')`.
**⚠️ Побочный факт (не в задаче):** `modbus/sensors/dining/*` **по-прежнему не идёт** ни в один брокер живым потоком — значит ZONT сам перестал публиковать столовую ещё раньше; на TrueNAS она висела как **retained**. То есть «датчик отдаёт 0» из §5-тер — вопрос **ZONT-стороны** (регистрация датчика в ZONT), не маршрута и не t610. **Задача не ставилась**, оставлено как факт.
**Откат:** `uci set firewall.@redirect[0].dest_ip='192.168.2.197'; uci set firewall.@rule[3].dest_ip='192.168.2.197'; uci commit firewall; /etc/init.d/firewall reload`
> ⚠️ **Питфолл диагностики брокеров:** `mosquitto_sub -R` (retained-only) **врёт** — надёжнее подписаться и смотреть, что прилетает **сразу** при подписке и повторяется ли. Retained-значения выглядят «живыми», хотя источник мёртв (`modbus_ha_bridge disconnected`), — **не путать retained с живым потоком**.
> ⚠️ **Питфолл читаемости:** подписка на `#` затягивает гигантский z2m-конфиг (сотни КБ) и забивает вывод — подписываться **узко** (`modbus/#`, `modbus/sensors/dining/#`).
> ⚠️ **Питфолл SSH-аддона:** `mosquitto_sub` изнутри аддона даёт `Error: Bad file descriptor` — это ограничение песочницы аддона, **не** отказ авторизации. Проверять с Mac/через `docker run eclipse-mosquitto`.
> 🙋 **Вклад Alex:** маршрут MQTT (ZONT → роутер `192.168.0.10` → DNAT) он подсказал вопросом «gpon все редиректит на openwrt же?» — **правильная гипотеза с первой попытки**.
### 5-кватер-Г. ✅ Node-RED: перенос flows с TrueNAS на t610 (2026-09-14, вечер-2)
**Триггер:** Alex открыл `nodered.mallexxx.duckdns.org` → увидел basic auth вместо страницы Node-RED. В ходе разбора выяснилось, что **на t610 `flows.json` = 124 байта (пусто)** — агент при миграции **не перенёс flows Node-RED с TrueNAS**. Alex: *«в смысле чистый лист?? ты не перенёс все с truenas значит»* → команда **«переносим как есть»**.
@@ -1203,12 +1267,13 @@ curl -s -X POST -H "$HDR" -H "Content-Type: application/json" \
| ~~1b~~ | ~~`verify` в заслонках~~ — **✅ ОПРОВЕРГНУТО:** заслонки ожили при том же `verify`. Не причина. | — |
| ~~1c~~ | ~~ZONT-шина на других гнёздах~~ — **✅ СДЕЛАНО:** физический тест доказал (ZONT = гнездо 4, вентиляция = гнездо 3), привязки аддонов обменяны, док приведён в соответствие. Осталась только проверка «① подтвердить у Alex» — **закрыто**: он сам это и тестировал. | — |
| ~~2~~ | ~~Раскомментировать slave 10 (AT2 fans)~~ — **СНЯТО с плана (Alex 2026-09-14): задачи по slave 10 НЕ БЫЛО.** | — |
| 3 | **`sensor.dining_summary` / `dining_air_summary`** — **🔬 ПРИЧИНА НАЙДЕНА 2026-09-14 (см. §5-кватер-А).** Это **НЕ** `\|default(0)`. Цепочка: 8 сущностей `sensor.dining_*` сидят на MQTT (`modbus_dining_sensor`, создаёт `modbus-bridge`), но **ZONT не публикует `modbus/sensors/dining/*`**. Alex подтвердил: **датчик есть физически**. Лог bridge показал: **ZONT ОПРАШИВАЕТ slave 1 / reg 100 каждые 5 с, датчик ОТВЕЧАЕТ, но значением `0` (`[00 00]`, `CRC OK`)** → bridge считает `0` невалидным → не публикует. **Фикс формулой = враньё** (`0° 0ppm` замаскирует поломку). **Что делать:** искать, почему датчик отдаёт 0 — не откалиброван / не зарегистрирован в ZONT / питание по шине. **НЕ ДОДЕЛАНО** — Alex переключил на план миграции | отдельно |
| 3 | **`sensor.dining_summary` / `dining_air_summary`** — **🔬 ПРИЧИНА УТОЧНЕНА 2026-09-14 (вечер-3): это МАРШРУТИЗАЦИЯ MQTT, а НЕ железо (см. §5-кватер-Д).** `modbus/sensors/dining/*` в брокере **t610 отсутствует ВООБЩЕ**; живой поток ZONT идёт в mosquitto **TrueNAS** (DNAT `redirect[0]`), там данные **retained** (`modbus_ha_bridge disconnected` — источник мёртв). На t610 bridge ловит только kids/bedroom. **Фикс:** переключить DNAT `redirect[0]`+`rule[3]` `dest_ip` `.197` → `.176` (§5-кватер-Д). **Прежняя версия** («ZONT опрашивает датчик, тот отвечает `0`») — **уточнена:** датчик, вероятно, **исправен** (на TrueNAS валидные 24.2 °C), дело в маршруте | → сделать |
| 4 | **Камера** — найти образ/папку, поднять на t610, поправить upstream в Caddy | отдельно |
| ~~5~~ | ~~**Этап 4:** Caddy upstream → t610~~ — **✅ ЧАСТЬ «CADDY» ЗАКРЫТА 2026-09-14 (см. §5-кватер-Б/В):** Caddyfile залит (Alex подменил файл + `restart caddy`), `mallexxx.duckdns.org` → **HTTP 200** (HA на t610, подтверждено Alex'ом), попутно исправлен `trusted_proxies` в `.storage/http` (§5-кватер-В-1). **ОСТАЛОСЬ из Этапа 4:** ① `nodered.*` — починить порт (см. задачу 5-нр ниже); ② GPON-редирект → t610; ③ ZONT MQTT → t610. **🔴 Архитектурный вывод: Caddy НЕ переносить** (17 из 20 доменов — сервисы TrueNAS) | — |
| 5-нр | **Node-RED: flows перенесены с TrueNAS → t610, РАБОТАЕТ.** ~~Alex выбрал «выставить порт наружу»~~ → через API не удалось (`host_network` снимается только в UI, маппинг при нём игнорируется). **Alex: «ок. оставляем так»** — наружу НЕ выпущен, доступ через ingress. 68 узлов, `[server:Home Assistant] Connected to http://supervisor/core`, ошибок 0. Ключевая правка: узел `server` `addon: false` → `true`. Подробно — **§5-кватер-Г**. Остаётся на будущее (если понадобится домен): снять `host_network` в UI + Caddy → `:11880` | ✅ сделано |
| 5-мк | **ZONT MQTT → t610** (остаток Этапа 4). Переключить на роутере `192.168.2.2` (OpenWrt) DNAT: `firewall.@redirect[0]` (name `MQTT`) `dest_ip` `.197`→`.176` **и** `firewall.@rule[3]` (name `allow-1883`) `dest_ip` `.197`→`.176`. В ZONT ничего не менять. Схема, питфоллы, проверки — **§5-кватер-Д**. ⚠️ Перед правкой: `uci export firewall > backup`. ⚠️ Порт 1883 t610 OPEN, юзер `zont` есть, пароль `mqtt1z3$` проверен | **✅ сделано 2026-09-14** — оба правила → `.176`, `uci commit` + firewall reload, ZONT пошёл в mosquitto t610 (живой поток kids/bedroom). Бэкап `/root/firewall.bak-20260914-092555` |
| ~~5-арх~~ | ~~«Перенести Caddy на OpenWrt/t610»~~ — **❌ ОТВЕРГНУТО (§5-кватер-Б):** на OpenWrt 80/443 заняты `uhttpd`; у Caddy 17 доменов TrueNAS → при переносе падение t610 положит все медиасервисы. **Caddy остаётся на TrueNAS.** | — |
| 6 | Остановить + отключить автозапуск сервисов на TrueNAS (не удалять — откат). **⚠️ ЗАБЛОКИРОВАНО:** пока Caddy на TrueNAS — он держит точку входа, гасить нельзя. Нужно решение, где живёт вход (§5-кватер-Б) | — |
| 6 | Остановить + отключить автозапуск сервисов на TrueNAS (не удалять — откат). **⚠️ ЗАБЛОКИРОВАНО дважды:** пока Caddy на TrueNAS — он держит точку входа; ② **на TrueNAS всё ещё живой полный стек** (`homeassistant`, `mbusd` 502, `mosquitto` 1883, `nodered` 1880 — все `Up`, проверено 2026-09-14 вечер-3), и **ZONT пишет MQTT именно туда**. Гасить можно только после пункта 5-мк и решения по точке входа (§5-кватер-Б) | — |
| 7 | Static IP для t610 на роутере (сейчас DHCP) | — |
| 8 | Бэкап конфигов t610 → TrueNAS + git (Gitea `git.mallexxx.duckdns.org`). **📌 Добавить в бэкап:** `/config/.storage/http` (после фикса `trusted_proxies`) и сам `Caddyfile` | — |
@@ -1405,7 +1470,7 @@ docker restart caddy
**Правило (в процессные уроки):** **root-owned файлы TrueNAS агент не пишет** — готовит и стейджит в `/tmp/`, **подменяет Alex**. `sudo -S` с паролем у `truenas_admin` не прошёл.
**Открытые вопросы:** ~~① нужен ли пустой t610-Node-RED / переносить flows?~~ — **✅ ЗАКРЫТ: flows перенесены, Node-RED работает (§5-кватер-Г)**; ② копать ли «0» датчика столовой; ③ «замерзание» лога bridge; ④ GPON-редирект и ZONT MQTT → t610 (остаток Этапа 4); ⑤ где живёт точка входа, если TrueNAS нельзя гасить.
**Открытые вопросы:** ~~① нужен ли пустой t610-Node-RED / переносить flows?~~ — **✅ ЗАКРЫТ: flows перенесены, Node-RED работает (§5-кватер-Г)**; ~~② копать ли «0» датчика столовой~~ — **✅ РАЗГАДАНО (§5-кватер-Д): не железо, а маршрут MQTT**; ③ «замерзание» лога bridge; ④ GPON-редирект и ZONT MQTT → t610 (остаток Этапа 4) — **план правки готов, задача 5-мк**; ⑤ где живёт точка входа, если TrueNAS нельзя гасить.
---
@@ -1430,6 +1495,26 @@ docker restart caddy
---
### 2026-09-14 (вечерняя сессия-3: разгадка столовой через MQTT-маршрутизацию)
**Контекст:** Alex дал адрес MQTT-сервера из настроек ZONT (`mqtt://zont:mqtt1z3$@192.168.0.10:1883`) и подсказал гипотезу про GPON-редирект.
**Что установлено (только чтение + подписки, ничего не менялось):**
| Тема | Результат |
|---|---|
| 🔑 Схема MQTT | ZONT → роутер `192.168.2.2` (его `wan` = **`192.168.0.10`**) → DNAT `redirect[0]` → mosquitto **TrueNAS** `.197:1883`. Отдельного GPON-роутера в цепочке нет |
| 🔴 Разгадка dining | `modbus/sensors/dining/*` **есть на TrueNAS** (co2 780, temp 24.2) и **отсутствует на t610**. На TrueNAS — **retained** (`modbus_ha_bridge disconnected`) → **датчик исправен, дело в маршруте**, а не в железе |
| Значения расходятся | kids: TrueNAS `1760` vs t610 `388`; bedroom: `126.8` vs `425.9` — независимые замеры одной шины |
| Живой стек TrueNAS | `homeassistant`, `mbusd` (502), `mosquitto` (1883), `nodered` (1880) — все `Up`, проверено `docker ps` |
| Проверки для переключения | порт 1883 на t610 **OPEN**; юзер `zont` в mosquitto t610 **есть**; пароль `mqtt1z3$` **подтверждён рабочим** подпиской с обоих брокеров |
**Что менялось в железе:** **НИЧЕГО** (диагностика чтением). Правка DNAT — задача 5-мк, не выполнена.
**Питфоллы (в §5-кватер-Д):** retained ≠ живой поток; подписка на `#` забивает вывод z2m-конфигом; `mosquitto_sub` из SSH-аддона даёт `Bad file descriptor` (ограничение песочницы, не отказ авторизации).
---
## Связанные заметки
- [[family/how-to/home-automation]] — карта Modbus slave ID, ZONT, регистры вентиляции