From d2022c611273f4b4dc8cc2cb8077128b05660b6b Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Mon, 14 Sep 2026 09:11:59 +0600 Subject: [PATCH] [2026-09-14] eagle: family/how-to/home-automation.md family/how-to/t610-access.md family/plans/home-automation-migration-t610.md family/plans/t610-addons-deployment.md --- family/how-to/home-automation.md | 2 +- family/how-to/t610-access.md | 51 ++++++++++++++++++- .../plans/home-automation-migration-t610.md | 16 +++--- family/plans/t610-addons-deployment.md | 5 +- 4 files changed, 61 insertions(+), 13 deletions(-) diff --git a/family/how-to/home-automation.md b/family/how-to/home-automation.md index b6439323..9bdc4f75 100644 --- a/family/how-to/home-automation.md +++ b/family/how-to/home-automation.md @@ -9,7 +9,7 @@ related: ["[[family/how-to/router-bishkek-asus]]", "[[family/plans/home-automati > ⚠️ **ПЕРЕНОС ИДЁТ (начат 2026-09-12):** весь стек домашней автоматизации (HA, zigbee2mqtt, nodered, mosquitto, mbusd, modbus-bridge) переносится с TrueNAS на **HP t610** (HA OS). План со всеми путями/шагами и прогрессом: [[family/plans/home-automation-migration-t610]], детали развёртывания: [[family/plans/t610-addons-deployment]]. > -> **Статус на 2026-09-14:** ✅ на t610 работают HA Core, mosquitto (логин `zont`), Node-RED, **zigbee2mqtt (16 Zigbee-устройств, база перенесена 1:1)**, **mbusd (порт 502, шина вентиляции)** и **modbus-bridge (снифф 485-датчиков, ждёт `ha_token`+MQTT-пароль)**. ⏳ Осталось: Этап 3 — перенос HA-конфига (`configuration.yaml`, `.storage/core.entity_registry` и т.д.), затем Этап 4 — переключение трафика. **ZONT ещё НЕ перенаправлен** на MQTT t610 — редирект GPON-роутера и `modbus.host` в HA-конфиге пока смотрят на TrueNAS. Подробности: [[family/plans/t610-addons-deployment]]. +> **Статус на 2026-09-14 (Этап 2 закрыт):** ✅ на t610 работают HA Core, mosquitto (логин `zont`), Node-RED, **zigbee2mqtt (16 Zigbee-устройств, база перенесена 1:1)**, **mbusd (порт 502, шина вентиляции)**, **modbus-bridge (снифф 485-датчиков + MQTT + HA-опрос)** и **MQTT-интеграция в HA** (её не было → z2m/bridge не создавали сущности; стало 104 сущности / 69 Zigbee). ⏳ Осталось: Этап 3 — перенос HA-конфига (`configuration.yaml`, `.storage/core.entity_registry` и т.д.), затем Этап 4 — переключение трафика. **ZONT ещё НЕ перенаправлен** на MQTT t610 — редирект GPON-роутера и `modbus.host` в HA-конфиге пока смотрят на TrueNAS. Подробности: [[family/plans/t610-addons-deployment]]. > > Карты Slave ID и регистров ниже **остаются в силе** — оборудование и адреса Modbus не меняются. diff --git a/family/how-to/t610-access.md b/family/how-to/t610-access.md index e8c1919e..6bea8c10 100644 --- a/family/how-to/t610-access.md +++ b/family/how-to/t610-access.md @@ -4,7 +4,7 @@ > План переноса: [[family/plans/home-automation-migration-t610]] > Развёртывание сервисов: [[family/plans/t610-addons-deployment]] -> 🟡 **Состояние на 2026-09-14:** z2m, mbusd, modbus-bridge развёрнуты аддонами (см. §«Установленные аддоны»). **Незакрытый пункт:** modbus-bridge ждёт `ha_token` (long-lived token из HA UI) + `mqtt_password` — без них `MQTT connection failed code 5` и HA poller выключен. Далее — Этап 3 (перенос HA-конфига). +> ✅ **Состояние на 2026-09-14 (Этап 2 закрыт):** z2m (16 устройств), mbusd (порт 502), modbus-bridge (MQTT + HA-опрос) — все развёрнуты аддонами и **работают**. В HA добавлена **MQTT-интеграция** (её не было → z2m/bridge не создавали сущности; стало 104 сущности, 69 Zigbee). Далее — Этап 3 (перенос HA-конфига с TrueNAS). ## Основное @@ -116,8 +116,55 @@ curl -s -X POST -H "${AUTH}" -H "Content-Type: application/json" -d @/tmp/post.j ha apps restart "$SLUG" ``` +> ⚠️ **ПРИМЕЧАНИЕ (2026-09-14):** в некоторых скриптах этой доки переменная токена при записи через инструменты выглядит как `AUTH="...***..."` — это артефакт маскировки секретов, а не рабочий код. В живом скрипте должно быть `AUTH="Authorization: Bearer ${SUPERVISOR_TOKEN}"`. Если строку с `AUTH` съело при редактировании — перезаписать файл целиком (см. `~/tmp-t610/*.sh` на Mac, они рабочие). + > ⚠️ API требует **полный** набор опций — схема валидирует все ключи. Посылать только изменённое нельзя: вернёт `Missing option ''`. Берём текущие опции и меняем нужное. +### Long-lived token HA и обращение к API из аддонов (важно, 2026-09-14) + +**Как создать токен:** `http://192.168.2.176` → профиль (аватар) → **Security** → **Long-lived access tokens** → **Create token**. + +**Проверка токена:** +```bash +curl -s -o /dev/null -w '%{http_code}\n' -H "Authorization: Bearer " http://192.168.2.176/api/ +# 200 = рабочий, 401 = негодный +``` + +**⚠️ ПИТФОЛЛ 1 — токен маскируется в bash.** Если подставлять токен через переменную окружения / `echo` / `sed`, в итоговый JSON/опции попадает **заглушка** (наблюдалось `` вместо реальных 183 символов). **Рабочий способ:** записать токен в **файл** → скопировать файлом на t610 → читать на месте: +```bash +TOK=$(tr -d '\n\r' < /tmp/ha_token.txt) +jq --arg t "$TOK" '.ha_token = $t' input.json > out.json +``` + +**⚠️ ПИТФОЛЛ 2 — адрес для аддона.** Внутри аддона `http://supervisor/core` требует **внутренний** `SUPERVISOR_TOKEN`, а пользовательский long-lived token там даёт **401**. Для обращения к HA Core из аддона использовать **прямой адрес**: +``` +http://192.168.2.176:80 ✅ работает с пользовательским токеном (200) +http://supervisor/core ❌ 401 с пользовательским токеном +``` +Это ровно то, что нужно modbus-bridge в его `ha.url` (см. [[family/plans/t610-addons-deployment]]). + +`host_network: true` в манифесте аддона не обязателен для этого, но не мешает — `192.168.2.176` достижим и без него. + +**⚠️ ЛОЖНЫЙ СЛЕД (не повторять):** гипотеза «`iss` в JWT должен совпадать с `core.uuid` HA» — **НЕВЕРНА**. У рабочего токена `iss` и `core.uuid` не совпадают (проверено: `iss=e75d1d6f…`, `core.uuid=d3b24dad…`), и это норма. Единственный надёжный критерий — HTTP-код на `/api/`. + +### Добавление интеграции MQTT в HA (Config Entry Flow API) + +Если в HA **нет MQTT-интеграции**, discovery-сообщения z2m/bridge уходят в mosquitto и **висят** — сущности не создаются (симптом: `404` при обращении к сущности; в HA только системные ~22 сущности). + +```bash +T="" +BASE="http://192.168.2.176/api/config/config_entries/flow" +# 1) создать flow (тип меню) +FID=$(curl -s -X POST -H "Authorization: Bearer $T" -H "Content-Type: application/json" \ + -d '{"handler":"mqtt","show_advanced_options":false}' "$BASE" | jq -r .flow_id) +# 2) выбрать вариант "addon" (Mosquitto Mqtt Broker) — креды Supervisor подставит сам +curl -s -X POST -H "Authorization: Bearer $T" -H "Content-Type: application/json" \ + -d '{"next_step_id":"addon"}' "$BASE/$FID" +# ответ {"type":"create_entry"} = интеграция создана +``` +Проверка: `jq -r '.data.entries[].domain' /config/.storage/core.config_entries | grep mqtt` → `mqtt`. +**Эффект:** сущностей стало 104 (69 Zigbee) вместо 22. Скрипт: `~/tmp-t610/setup_mqtt_integration.sh`. + ## Доступ к роутерам (диагностика сети t610) t610 в сети `192.168.2.0/24`. Роутеры для проверки: @@ -204,7 +251,7 @@ ZONT (modbus-bridge): /dev/serial/by-path/pci-0000:00:12.0-usb-0:3:1.0-por | File editor | `core_configurator` | — | ✅ started | web UI | | **Zigbee2MQTT** | `45df7312_zigbee2mqtt` | 2.14.1-1 | ✅ **started (16 устройств)** | ingress 8099 | | **mbusd** | `local_mbusd` | 1.0.0 | ✅ **started** | 502 (Modbus TCP) | -| **modbus-bridge** | `local_modbus-bridge` | 1.0.0 | ✅ started — ⏳ ждёт `ha_token`/`mqtt_password` | sniffer шины ZONT | +| **modbus-bridge** | `local_modbus-bridge` | 1.0.0 | ✅ **started — MQTT + HA-опрос** | sniffer шины ZONT | | Samba share | `core_samba` | — | ⏸️ stopped (нужен пароль) | — | Репозитории аддонов: официальный + **Zigbee2MQTT** (`https://github.com/zigbee2mqtt/hassio-zigbee2mqtt`) + Local apps. diff --git a/family/plans/home-automation-migration-t610.md b/family/plans/home-automation-migration-t610.md index f45acc0f..83c24546 100644 --- a/family/plans/home-automation-migration-t610.md +++ b/family/plans/home-automation-migration-t610.md @@ -19,14 +19,14 @@ related: --- # Перенос домашней автоматизации на HP t610 -> **Статус: В ПРОЦЕССЕ. Этап 1 (аддоны) ВЫПОЛНЕН. Этап 2 (USB + Zigbee + Modbus) — ✅ z2m РАБОТАЕТ (16 устройств), ✅ mbusd РАБОТАЕТ (порт 502), ✅ modbus-bridge собран и запущен (MQTT + sniffer OK; ⏳ ждёт корректный `ha_token`). Следующий шаг — Этап 3 (перенос HA-конфига + `.storage/`).** +> **Статус: В ПРОЦЕССЕ. Этап 1 ✅. Этап 2 ✅ ПОЛНОСТЬЮ ВЫПОЛНЕН (z2m — 16 устройств, mbusd — порт 502, modbus-bridge — MQTT + HA-опрос, MQTT-интеграция в HA добавлена). Следующий шаг — Этап 3 (перенос HA-конфига + `.storage/`).** > Цель: убрать всю домашнюю автоматизацию с TrueNAS (он перегружен — 17/21 ГБ RAM) на выделенный HP t610, с бэкапом конфигов на TrueNAS и в git. > -> **Прогресс 2026-09-14 (вечер) — Modbus-сервисы переехали:** +> **Прогресс 2026-09-14 (вечер) — Этап 2 ЗАКРЫТ, Modbus-сервисы работают:** > - ✅ **mbusd — local add-on `local_mbusd` РАБОТАЕТ.** База: готовый образ `3cky/mbusd:latest`. Порт **502 открыт**. Устройство: `/dev/serial/by-path/pci-0000:00:12.0-usb-0:4:1.0-port0` (CH340 #2, порт 4 → шина вентиляции AT2). Питфоллы сборки local add-ons — см. [[family/plans/t610-addons-deployment]] §«Local add-ons mbusd / modbus-bridge». -> - ✅ **modbus-bridge — local add-on `local_modbus-bridge` СОБРАН И ЗАПУЩЕН.** База `python:3.11-alpine`, `uart: true` + `host_network: true`. Устройство: by-path CH340 #1 (порт 3 → шина ZONT). **MQTT подключён, 13 discovery-сообщений опубликованы, sniffer работает.** -> - ⏳ **Единственный незакрытый пункт Этапа 2:** HA-опрос даёт **HTTP 401** — первый токен оказался выпущен **другим инстансом HA** (`iss` ≠ `instance_id` t610). Нужен long-lived token, созданный на http://192.168.2.176. Как проверить — [[family/plans/t610-addons-deployment]] §«ПИТФОЛЛ: HA-токен с чужим iss». -> - ⏭️ Следующий шаг: вписать корректный `ha_token` → Этап 3 (перенос HA-конфига + `.storage/`). +> - ✅ **modbus-bridge — local add-on `local_modbus-bridge` РАБОТАЕТ (MQTT + HA-опрос).** База `python:3.11-alpine`, `uart: true` + `host_network: true`. Устройство: by-path CH340 #1 (порт 3 → шина ZONT). **MQTT подключён, 13 discovery-сообщений, HA-опрос возвращает значение.** Питфолл: `ha.url` обязан быть **`http://192.168.2.176:80`** (НЕ `supervisor/core` — тот требует `SUPERVISOR_TOKEN` и даёт 401 с пользовательским токеном). +> - ✅ **В HA добавлена MQTT-интеграция** (её НЕ БЫЛО → discovery-сообщения z2m/bridge не превращались в сущности, было всего 22 системные сущности). Стало **104 сущности (69 Zigbee)**. Рецепт — [[family/how-to/t610-access]] §«Добавление интеграции MQTT». +> - ⏭️ Следующий шаг: Этап 3 (перенос HA-конфига + `.storage/`). > > **Прогресс 2026-09-13 — 🎉 t610 запущен и в сети:** @@ -59,7 +59,7 @@ related: | Mosquitto (MQTT) | HA-аддон (`core_mosquitto`) | ✅ работает — 1883/1884 | | Node-RED | HA-аддон (`a0d7b954_nodered`) | ✅ работает — 1880 | | mbusd | HA local add-on (`local_mbusd`) | ✅ работает — RS-485 → TCP :502 (шина вентиляции AT2) | -| modbus-bridge | HA local add-on (`local_modbus-bridge`) | ✅ собран/запущен — снифф 485-датчиков + виртуальные slaves для ZONT; ⏳ ждёт `ha_token` | +| modbus-bridge | HA local add-on (`local_modbus-bridge`) | ✅ **работает — снифф 485-датчиков + виртуальные slaves для ZONT, MQTT + HA-опрос** | | **Камера** | docker-контейнер | см. §8 — разобраться отдельно | | ~~udev-скрипт tty-алиасов~~ | ~~нативный udev + systemd~~ | ❌ **ОТМЕНЁН** — на HA OS невозможен; привязка serial по `/dev/serial/by-path/...` через флаг аддона `uart: true` | @@ -203,7 +203,7 @@ HA OS внутри использует host docker 29.6.2 (`ha docker info` п 2. **zigbee2mqtt** — USB-Zigbee by-id — ✅ аддон `45df7312_zigbee2mqtt` 3. **nodered** — порт 1880 — ✅ аддон `a0d7b954_nodered` 4. **mbusd** — порт 502, by-path CH340#2 (порт 4, шина AT2) — ✅ local add-on `local_mbusd` -5. **modbus-bridge** — by-path CH340#1 (порт 3, шина ZONT), `host_network` — ✅ local add-on `local_modbus-bridge` (⏳ ждёт `ha_token`) +5. **modbus-bridge** — by-path CH340#1 (порт 3, шина ZONT), `host_network` — ✅ local add-on `local_modbus-bridge` (**работает: MQTT + HA-опрос**; `ha.url` = `http://192.168.2.176:80`) 6. **камера** — см. §8 > 📌 **Фактически выполнено 2026-09-14** (детали, точные пути, питфоллы сборки local add-ons — в [[family/plans/t610-addons-deployment]]). Шаги 3–4 этого документа **заменены** тем планом; ниже оставлены как исторический черновик исходного подхода (docker-compose + udev), который **не применялся**. @@ -368,7 +368,7 @@ system/start-modbus.sh # скрипт ожидания tty перед doc - [x] ✅ **MQTT:** трафик z2m идёт (discovery-сообщения публикуются), логин `zont` работает - [ ] **Modbus вентиляция:** HA видит AT2, заслонки переключаются (проверить физически!) — требует Этапа 3 (перенос HA-конфига) - [ ] **ZONT:** датчики 485 (Dining/Kids/Bedroom) в ZONT **не «недоступные»**, температуры идут — требует `ha_token` в modbus-bridge + Этап 3 -- [x] ✅ **modbus-bridge:** sniffer работает, MQTT подключён, **13 discovery-топиков** `modbus/sensors/*` опубликованы (⏳ HA-опрос 401 — ждёт корректный токен) +- [x] ✅ **modbus-bridge:** sniffer работает, MQTT подключён, **13 discovery-топиков** `modbus/sensors/*` опубликованы, **HA-опрос работает** (`ha.url` = `http://192.168.2.176:80`) - [x] ✅ **mbusd:** порт 502 открыт, устройство на by-path CH340 #2 (порт 4) - [ ] **Node-RED:** `http://192.168.2.176:1880` — flows загружены, creds на месте - [ ] **ZONT MQTT:** ZONT шлёт данные на `t610:1883` (проверить подпиской) — требует перенаправления GPON-роутера diff --git a/family/plans/t610-addons-deployment.md b/family/plans/t610-addons-deployment.md index 2b5cc126..8bfe7193 100644 --- a/family/plans/t610-addons-deployment.md +++ b/family/plans/t610-addons-deployment.md @@ -165,15 +165,16 @@ z2m: Connected to MQTT server ```bash SLUG="a0d7b954_nodered" API="http://supervisor/addons/${SLUG}" -AUTH="Authorization: Bearer ${SUPERVISOR_TOKEN}" +AUTH=*** Bearer ${SUPERVISOR_TOKEN}" curl -s -H "${AUTH}" "${API}/info" | jq '.data.options | .ssl = false' > /tmp/o.json jq -n --slurpfile o /tmp/o.json '{options: $o[0]}' > /tmp/post.json curl -s -X POST -H "${AUTH}" -H "Content-Type: application/json" -d @/tmp/post.json "${API}/options" ha apps restart "$SLUG" ``` +> ⚠️ Если строка `AUTH=` выглядит искажённой — это артефакт маскировки секретов при записи доки. В живом скрипте: `AUTH=*** Bearer ${SUPERVISOR_TOKEN}"`. Рабочие скрипты лежат на Mac в `~/tmp-t610/*.sh`. Скрипты лежат локально: `~/tmp-t610/nr_set_ssl.sh`. -### Этап 2 — USB-устройства (все подключены 2026-09-14) 🟡 В РАБОТЕ +### Этап 2 — USB-устройства — ✅ ВЫПОЛНЕНО 2026-09-14 8. [x] Alex втыкает 3 USB в t610 — **ВЫПОЛНЕНО 2026-09-14**. Порты зафиксированы: CH340 #1 → USB1 порт 3, CH340 #2 → USB1 порт 4, Zigbee → USB3 порт 1. **Устройства из портов не вынимать!** 9. [x] Пути определены (`ls /dev/serial/by-id/`, `by-path`, sysfs) — подробная карта: [[family/how-to/t610-access]] §USB 10. [x] Карта составлена: ttyUSB0 = CH340 #1 (ZONT), ttyUSB1 = CH340 #2 (Vent), ttyACM0 = Zigbee