From db192ceb7d3e1228eee522a61802ae88d8df4fb7 Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Mon, 14 Sep 2026 12:50:59 +0600 Subject: [PATCH] [2026-09-14] eagle: family/how-to/t610-access.md family/plans/t610-addons-deployment.md --- family/how-to/t610-access.md | 33 +++++++++++++++-- family/plans/t610-addons-deployment.md | 51 ++++++++++++++++++++++++-- 2 files changed, 77 insertions(+), 7 deletions(-) diff --git a/family/how-to/t610-access.md b/family/how-to/t610-access.md index bef7fb5f..b1940493 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 (Этап 3 ЗАКРЫТ, z2m = 14 устройств):** z2m, mbusd (порт 502), modbus-bridge (MQTT + HA-опрос) — развёрнуты аддонами и **работают**. В HA добавлена **MQTT-интеграция**. **HA-конфиг перенесён с TrueNAS** (`.storage` реестры + конфиги + `www/`): HA запущен, **11 зон, MQTT-интеграция цела, ошибок нет**. Zigbee-розетка `0xa4c138eb6fbe9d19` (NEO NAS-WR01B, греющий кабель) добавлена, мёртвые устройства (3 шт.) **удалены из z2m**. +> ✅ **Состояние на 2026-09-14 (Этап 3 ЗАКРЫТ, z2m = 15 устройств):** z2m, mbusd (порт 502), modbus-bridge (MQTT + HA-опрос) — развёрнуты аддонами и **работают**. В HA добавлена **MQTT-интеграция**. **HA-конфиг перенесён с TrueNAS** (`.storage` реестры + конфиги + `www/`): HA запущен, **11 зон, MQTT-интеграция цела, ошибок нет**. Zigbee-розетки добавлены: `heating_cable_plug` (NEO NAS-WR01B, греющий кабель) и **`boiler_controller_power`** (`0xa4c1381694217e10`, TS011F, Котельная — питание контроллеров котлов), мёртвые устройства (3 шт.) **удалены из z2m**. Реестр HA = **332 сущности, hex = 0**. > ✅ **Автоматизации: 16 шт., 15 `on` + 1 `off`, 0 `unavailable`** (было 13 «мёртвых» — `device_id` перемаплены + hex-`entity_id` почищен). > ✅ **HTTP-варнинг устранён** (блок `http:` → `.storage/http`), **`modbus.host` = `192.168.2.176`** (НЕ `127.0.0.1` — см. питфолл ниже), **modbus-bridge 404 исправлены** (+rebuild аддона). > ⏸️ **ОСТАЛСЯ ОДИН БЛОКЕР — аппаратный:** 32 заслонки вентиляции `unavailable` (шина не отвечает, exception 0x0B) → CH340 #2 нужно физически подключить к линиям A/B шины. Конфиг верный. @@ -153,6 +153,15 @@ rm -f /tmp/hdr.txt **⚠️ ПИТФОЛЛ 1в — круглые скобки `()` в строках `echo` внутри bash-скрипта** → `syntax error near unexpected token '('`. Не писать `(…)` в `echo "текст (пояснение)"`. То же для апострофов внутри одинарных кавычек. +**⚠️ ПИТФОЛЛ 1г — `jq '…\(…)'` инлайн в bash-скрипте ломается** → `syntax error near unexpected token ')'` / `unexpected EOF`. `jq`-выражения с интерполяцией (`"\(.state)\t\(.entity_id)"`) и вложенными кавычками писать **в отдельный файл** `q_*.jq` и вызывать `jq -rf q_x.jq`. Это самый устойчивый способ (проверено). + +**⚠️ ПИТФОЛЛ 1д — сборка curl-заголовка с токеном.** Самый надёжный обход маскировки — файл-конфиг curl: +```bash +printf 'header = "Authorization: Bearer *** > /tmp/curl.auth # токен из файла, БЕЗ литерала в скрипте +curl -s -K /tmp/curl.auth http://192.168.2.176/api/states | jq -rf q_x.jq +``` +Так в тексте скрипта токена нет → маскировщик не портит строку. + **⚠️ ПИТФОЛЛ 2 — адрес для аддона.** Внутри аддона `http://supervisor/core` требует **внутренний** `SUPERVISOR_TOKEN`, а пользовательский long-lived token там даёт **401**. Для обращения к HA Core из аддона использовать **прямой адрес**: ``` http://192.168.2.176:80 ✅ работает с пользовательским токеном (200) @@ -363,8 +372,8 @@ ha apps info 45df7312_zigbee2mqtt --raw-json | jq -r '.data.options.mqtt.passwor MPW=$(cat /tmp/mqtt_pw.z2m); rm -f /tmp/mqtt_pw.z2m mosquitto_pub -h core-mosquitto -p 1883 -u zont -P "$MPW" \ - -t 'zigbee2mqtt/bridge/request/permit_join' -m '{"value": true, "time": 180}' -# → {"data":{"time":180},"status":"ok"} + -t 'zigbee2mqtt/bridge/request/permit_join' -m '{"value": true, "time": 250}' +# → {"data":{"time":250},"status":"ok"} # результат: подписка на события timeout 10 mosquitto_sub -h core-mosquitto -p 1883 -u zont -P "$MPW" \ @@ -372,6 +381,20 @@ timeout 10 mosquitto_sub -h core-mosquitto -p 1883 -u zont -P "$MPW" \ # → {"type":"device_joined"} → {"type":"device_interview","status":"started"} ``` +> ⚠️ **ЛИМИТ ОКНА СПАРИВАНИЯ = 254 секунды.** `"time": 300` → `error: Cannot permit join for more than 254 seconds`. Ставить **≤250**. + +> ⚠️ **Спаривание через MQTT-запрос требует запуска ИЗНУТРИ контейнера аддона** (там есть `mosquitto_pub` и доступ к `core-mosquitto`). Если запускать через `ssh root@t610 'mosquitto_pub …'`, переменные окружения не пробрасываются — подставлять значения **локально в строку команды** (`. mqtt.env` → `CMD="mosquitto_pub … '$MQTT_USER' -P '$MQTT_PASS' …"` → `ssh … "$CMD"`), иначе `Connection Refused: not authorised`. + +**Переименование устройства после спаривания (обязательный шаг):** +```bash +mosquitto_pub -h core-mosquitto -u zont -P "$MPW" \ + -t 'zigbee2mqtt/bridge/request/device/rename' \ + -m '{"from":"0xa4c1381694217e10","to":"boiler_controller_power"}' +``` +⚠️ **HA успевает создать сущности под hex-именем раньше, чем rename применяется** → после rename всё равно нужно чистить hex-`entity_id` в `core.entity_registry` (HA stop → jq → HA start). Подробно: [[family/plans/t610-addons-deployment]] §«Новое устройство: boiler_controller_power». + +**Зона для нового устройства** ставится в **`core.device_registry`** (поле `area_id`), НЕ в `core.entity_registry`. Найти устройство по `identifiers`: `jq -r '.data.devices[] | select((.identifiers|tostring)|test("")) | [.id,.name,.area_id] | @tsv' /config/.storage/core.device_registry`. + Проверка результата: ```bash jq -r 'select(.ieeeAddr=="0x…") | {ieeeAddr,type,manufName,powerSource}' /config/zigbee2mqtt/database.db @@ -382,7 +405,9 @@ jq -r '.["0x…"]' /config/zigbee2mqtt/state.json - **`mosquitto_pub/sub` в аддоне НЕ поддерживают `--pwfile`** (`Error: Unknown option '--pwfile'`) — только `-u`/`-P`. Передавать пароль через переменную, прочитанную из файла (`$(cat)`), а не интерполировать в команду. - **`ha apps logs ` тяжёлый** — не ставить его в цикл ожидания (команда «висит» минутами). Ждать завершения интервью лучше через `database.db`/`state.json`, а не грепая логи в `while`. -> ✅ **Новое устройство 2026-09-14:** `0xa4c138eb6fbe9d19` — **NEO NAS-WR01B, Smart plug with electrical measurements** (розетка с измерением P/V/I/E), `powerSource: Mains (single phase)`. Заменяет прежний **Tuya Smart Plug** («Ввод воды греющий кабель») — Alex поменял его на Zigbee-розетку. `Successfully configured '0xa4c138eb6fbe9d19' (definition v0.0.1)`, discovery ушёл, сущности создались. **Итого в z2m 16 устройств** (после удаления мёртвого `0xcc86ecfffe1347fd`). +> ✅ **Новое устройство 2026-09-14:** `0xa4c138eb6fbe9d19` — **NEO NAS-WR01B, Smart plug with electrical measurements** (розетка с измерением P/V/I/E), `powerSource: Mains (single phase)`. Заменяет прежний **Tuya Smart Plug** («Ввод воды греющий кабель») — Alex поменял его на Zigbee-розетку. `Successfully configured '0xa4c138eb6fbe9d19' (definition v0.0.1)`, discovery ушёл, сущности создались. + +> ✅ **Новое устройство 2026-09-14 (поздняя сессия):** `0xa4c1381694217e10` → **`boiler_controller_power`** — **TS011F** (Tuya Smart Plug с измерениями), `manufName _TZ3000_gjnozsaz`, **Router / Mains**, зона **Котельная**. Питание контроллеров котлов. 13 сущностей переименованы из hex → `switch.boiler_controller_power` и т.д. **Итого в z2m 15 устройств.** Рецепт — §«Спаривание нового Zigbee-устройства» выше + [[family/plans/t610-addons-deployment]] §«Новое устройство: boiler_controller_power». ### Удаление мёртвого/ненужного устройств из z2m (2026-09-14) diff --git a/family/plans/t610-addons-deployment.md b/family/plans/t610-addons-deployment.md index 712bf2c4..366eb966 100644 --- a/family/plans/t610-addons-deployment.md +++ b/family/plans/t610-addons-deployment.md @@ -17,6 +17,7 @@ related: # t610 — развёртывание через HA-аддоны > **Статус (2026-09-14, поздняя сессия): Этап 1 ✅. Этап 2 ✅ ПОЛНОСТЬЮ. Этап 3 ✅ ЗАКРЫТ.** +> **z2m = 15 устройств, реестр HA = 332 сущности, hex = 0.** Добавлена розетка **`boiler_controller_power`** (`0xa4c1381694217e10`, TS011F, Котельная) — питание контроллеров котлов; 13 её сущностей переименованы из hex. > **Автоматизации: 13/16 `unavailable` → 0 (15 `on` + 1 `off`).** Причины были две, обе устранены: ① `device_id` (9 шт., 20 вхождений) перемаплены по `identifiers`; ② hex-`entity_id` в `automations.yaml` (`light.0xa4c13882a4b42db0` → `light.bed_dimmer`; `switch.0xa4c13873b5c1575b` оказался **артефактом regex** — в файле уже `_l1`/`_l2`). Файл залит, HA перезапущен. > **HTTP-варнинг устранён:** блок `http:` удалён из `configuration.yaml`, настройки перенесены в `.storage/http` (UI → Network). > **modbus.host исправлен: `127.0.0.1` → `192.168.2.176`** (mbusd в отдельном контейнере — `127.0.0.1` изнутри HA его не видел). @@ -776,13 +777,56 @@ cp /tmp/reg.new.json "$REG"; chown root:root "$REG"; chmod 644 "$REG" > 📌 Дашборд ссылается на сущности по человеческим именам, которые уже есть в реестре (`switch.sauna`, `light.smart_light_office_left`, `light.smart_light_stairs_l1`, `binary_sensor.shower_2_presence_sensor_presence`). После шага 8 всё оживёт. +#### 🔌 Новое устройство: `boiler_controller_power` — питание контроллеров котлов (2026-09-14) + +**Задача Alex:** добавить Zigbee-розетку в котельную как **питание для контроллеров котлов**. + +| Параметр | Значение | +|---|---| +| `friendly_name` | **`boiler_controller_power`** | +| IEEE | `0xa4c1381694217e10` | +| Модель | **TS011F**, `manufName = _TZ3000_gjnozsaz` (Tuya Smart Plug с измерениями P/V/I/E) | +| Тип | **Router, Mains (single phase)** — усиливает mesh в котельной | +| Зона | **Котельная** (`kotelnaia`) | +| device_id | `dab3c111a46c9c441e2c90fdfe35a702` | +| Сущности | **13**, все с человеческими `entity_id` | +| Состояние | `switch.boiler_controller_power = off`, `voltage = 218` | + +**Процедура (выполнена, рабочий рецепт):** +1. **permit_join** через MQTT: `mosquitto_pub -t zigbee2mqtt/bridge/request/permit_join -m '{"value":true,"time":250}'`. + ⚠️ **Питфолл: лимит окна — 254 секунды.** `"time":300` → `error: Cannot permit join for more than 254 seconds`. Ставить **≤250**. +2. Устройство присоединилось само → появилось в `bridge/devices` под **hex-именем** `0xa4c1381694217e10`. +3. **Переименование в z2m** (до того как HA создаст сущности!): + `mosquitto_pub -t zigbee2mqtt/bridge/request/device/rename -m '{"from":"0xa4c1381694217e10","to":"boiler_controller_power"}'` +4. ⚠️ **HA всё равно создал сущности по hex-имени** (успел между join и rename) → понадобился **второй фикс: переименование `entity_id` в `core.entity_registry`** (HA stop → jq → HA start). +5. Зона ставится **в `core.device_registry`** (`area_id`), НЕ в entity_registry. Устройство найдено по `identifiers` = `[["mqtt","zigbee2mqtt_0xa4c1381694217e10"]]` → `area_id = "kotelnaia"`. + +**Явный маппинг (13 hex → человеческие):** +```bash +# jq-фильтр: replace по каждому суффиксу +switch.0xa4c1381694217e10 -> switch.boiler_controller_power +switch.…_child_lock -> switch.boiler_controller_power_child_lock +number.…_countdown -> number.boiler_controller_power_countdown +select.…_power_outage_memory -> select.boiler_controller_power_power_outage_memory +select.…_switch_type_button -> select.boiler_controller_power_switch_type_button +select.…_indicator_mode -> select.boiler_controller_power_indicator_mode +sensor.…_power / _current / _voltage / _energy / _linkquality +button.…_identify -> button.boiler_controller_power_identify +update.0xa4c1381694217e10 -> update.boiler_controller_power +``` +Скрипты: `~/tmp-t610/etap3-fix/{permit_join.sh,z2m_devices.sh,rename_plug.sh,rename_plug_ids.jq,set_area.jq,check_plug.sh}`. + +**⚠️ ВЫВОД (обобщение питфолла):** `bridge/request/device/rename` в z2m **не спасает** — HA успевает создать сущности под hex-именем. Порядок «сначала rename в z2m, потом join» невозможен → **после каждого нового устройства всегда проверять `core.entity_registry` на hex и переименовывать через jq**. + #### 📍 СОСТОЯНИЕ НА КОНЕЦ СЕССИИ 2026-09-14 (поздняя) — для следующей сессии -**Факты (проверено API):** HA `http://192.168.2.176` → 200; z2m `started`, 14 устройств; реестр 319 сущностей, **hex = 0**; `light.*` (5 шт.) работают; MQTT-интеграция на месте; `switch_as_x` (4) восстановлены; **автоматизации 16 шт.: 15 `on` + 1 `off` (0 `unavailable`)**; HTTP-варнинг устранён; modbus.host = `192.168.2.176`; modbus-bridge опрос работает (без 404). +**Факты (проверено API):** HA `http://192.168.2.176` → 200; z2m `started`, **15 устройств**; реестр **332 сущности**, **hex = 0**; `light.*` (5 шт.) работают; MQTT-интеграция на месте; `switch_as_x` (4) восстановлены; **автоматизации 16 шт.: 15 `on` + 1 `off` (0 `unavailable`)**; HTTP-варнинг устранён; modbus.host = `192.168.2.176`; modbus-bridge опрос работает (без 404). -**Счётчики живого API:** 233 сущности; `unavailable` 44 (из них **32 — заслонки вентиляции**, аппаратный блокер); `unknown` 69. +**Счётчики живого API:** 253 сущности; `unavailable` 44 (из них **32 — заслонки вентиляции**, аппаратный блокер); `unknown` 69. -**Живые zigbee-датчики (проверено):** `sensor.office_temperature_sensor_temperature = 23.82`, `sensor.recirculation_pump_voltage = 221`, `sensor.light_sensor_stairs_illuminance = 556`, `sensor.heating_cable_plug_voltage = 222`. +**Живые zigbee-датчики (проверено):** `sensor.office_temperature_sensor_temperature = 23.96`, `sensor.recirculation_pump_voltage = 221`, `sensor.light_sensor_stairs_illuminance = 556`, `sensor.heating_cable_plug_voltage = 222`, `sensor.boiler_controller_power_voltage = 218`. + +**✅ Добавлено в конце сессии:** Zigbee-розетка **`boiler_controller_power`** (`0xa4c1381694217e10`, TS011F, зона Котельная) — питание контроллеров котлов. Итого **15 устройств в z2m**, **332 сущности в реестре**. См. §«Новое устройство: boiler_controller_power». **✅ Этап 3 ЗАКРЫТ.** Всё, что осталось — вне конфигов: @@ -833,6 +877,7 @@ cp /tmp/reg.new.json "$REG"; chown root:root "$REG"; chmod 644 "$REG" - [x] ✅ **УСТРАНЕНО 2026-09-14 — HTTP-варнинг:** блок `http:` удалён из `configuration.yaml`, `trusted_proxies`/`use_x_forwarded_for` перенесены в `.storage/http`. - [x] ✅ **ИСПРАВЛЕНО 2026-09-14 — modbus.host:** `127.0.0.1` → `192.168.2.176`. - [x] ✅ **ИСПРАВЛЕНО 2026-09-14 — modbus-bridge 404:** hex-entity_id в коде аддона → человеческие + `ha addons rebuild`. +- [x] ✅ **ВЫПОЛНЕНО 2026-09-14 (поздняя сессия) — Zigbee-розетка `boiler_controller_power` добавлена** (`0xa4c1381694217e10`, TS011F, зона Котельная) как питание контроллеров котлов; 13 сущностей переименованы из hex. **Итого z2m = 15 устройств, реестр = 332 сущности, hex = 0.** - [ ] ⏸️ **ГЛАВНЫЙ ОСТАВШИЙСЯ БЛОКЕР (аппаратный, за Alex):** 32 заслонки вентиляции `unavailable` — шина не отвечает (exception 0x0B). Подключить линии A/B к CH340 #2 (`by-path ...0:4:1.0-port0`, slave 11). Конфиг верный, оживут сами. - [ ] Камера (§8 родительского плана) — не аддон, разбираться отдельно - [ ] ⚠️ Незакреплённое: `sensor.0xa4c138f8da8bc478_voltage/energy/power/current` (11 hex-сущностей розетки Насос обратки) — проживут ли под новым `friendly_name` или создадутся дубли; проверить после шага 8.