[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)
|
||||
|
||||
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user