[2026-09-14] eagle: family/how-to/t610-access.md family/plans/t610-addons-deployment.md
This commit is contained in:
@@ -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("<ieee_без_0x>")) | [.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 <slug>` тяжёлый** — не ставить его в цикл ожидания (команда «висит» минутами). Ждать завершения интервью лучше через `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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user