diff --git a/family/how-to/ha-automations.md b/family/how-to/ha-automations.md index b0331158..66b6d510 100644 --- a/family/how-to/ha-automations.md +++ b/family/how-to/ha-automations.md @@ -35,9 +35,12 @@ related: | `098a641cb1d30f08f1ae293e00d9885b` | `light.bed_dimmer` (TS0052) | | `16d2c6f64ec399e5261c89b35c1e75c6` | розетка циркуляции ГВС | | `b9d384a51b780a7924ed9504eddec12e` | `boiler_water_leak` — датчик протечки котельной (TS0207) | -| `bcf47eeae909877978bdaf6c705210f8` | датчик t° Zigbee | +| `bcf47eeae909877978bdaf6c705210f8` | датчик t° Zigbee = `office_temperature_sensor` (`0xa4c13862d39377e6`, TS0201, кабинет). Уточнено 2026-09-15 | +| *(новый, device_id не зафиксирован)* | **`0xa4c138c650636cf6`** (TS0201, `_TZ3000_dowj6gyi`) — Zigbee-датчик t°/влажности, спарен 2026-09-15, назначается как `toilet_1_floor_temperature`. См. [[family/how-to/zigbee2mqtt-t610]] §5 | | `0c7a0eb6d60e852b447266da69a7785e` | *(entity-хелпер, см. mapping)* | +> ⚠️ **H2000 PRO не в этой карте и не Zigbee.** `sensor.h2000_pro_*` приходят отдельной интеграцией (`config_entry 01M2EXY2D5YJZY71VAKJTTGB16`), не через z2m/Modbus. **Не трогать** (Alex 2026-09-15). + **Сущности радара душевой 2** (`device_id 4095e7c3…`, платформа `mqtt`): - `sensor.shower_2_presence_sensor_illuminance` — «Освещенность», lx - `binary_sensor.shower_2_presence_sensor_presence` — «Занятость», on/off diff --git a/family/how-to/home-automation.md b/family/how-to/home-automation.md index da234d08..c8ebea4b 100644 --- a/family/how-to/home-automation.md +++ b/family/how-to/home-automation.md @@ -33,6 +33,8 @@ related: > > **✅ 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-сети. > +> **🔴 КАНОН (2026-09-15): H2000 PRO — НЕ Zigbee и НЕ Modbus-датчик.** Сущности `sensor.h2000_pro_temperatura_teplogo_pola` (**82.04**), `sensor.h2000_pro_temperatura_podachi` (81.14), `sensor.h2000_pro_temperatura_ulitsa` (57.2) есть в HA, но **в z2m их нет** (`grep -c H2000 configuration.yaml` → 0) и в карте Modbus их нет. Приходят **отдельной HA-интеграцией** (`config_entry 01M2EXY2D5YJZY71VAKJTTGB16`) — это **контроллер отопления H2000-серии (ZONT)**, не датчик. **НЕ ТРОГАТЬ** (прямое требование Alex 2026-09-15). В задачах про Zigbee/тёплый пол его **не рассматривать как кандидата**. Разбор — [[family/how-to/zigbee2mqtt-t610]] §3. +> > **⛔ ДЕКОМИССИЯ TrueNAS-СТЕКА (2026-09-14, ночь):** старый стек автоматизации на TrueNAS **погашен** — `homeassistant`, `mbusd`, `mosquitto`, `nodered`, `zigbee2mqtt`, `modbus-bridge`, `ser2net` (`docker stop` + `--restart=no`, **НЕ удалены**). Контейнеров на TrueNAS в этой схеме **больше нет** — весь домашний контур живёт на **t610** (`192.168.2.176`). USB-адаптеры CH340 физически на t610 → на TrueNAS узлов `/dev/ttyVent`/`/dev/ttyZONT` не существует. Полный разбор — [[family/plans/t610-home-automation]] §5-кватер-Л, канон-блок — [[family/how-to/truenas-infrastructure]]. > > **🔌 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` И `dining`.** diff --git a/family/how-to/zigbee2mqtt-t610.md b/family/how-to/zigbee2mqtt-t610.md index a961e53e..0d1c6421 100644 --- a/family/how-to/zigbee2mqtt-t610.md +++ b/family/how-to/zigbee2mqtt-t610.md @@ -14,8 +14,9 @@ related: > **Назначение документа:** инвентарь Zigbee-устройств, пути и доступ к z2m, операции (спаривание/переименование), питфоллы диагностики. > Хост/аддоны/USB/гнёзда — [[family/plans/t610-home-automation]]. Карта Modbus/железа — [[family/how-to/home-automation]]. Логика автоматизаций — [[family/how-to/ha-automations]]. > -> **📌 Статус 2026-09-15:** задача «спарить датчик Т тёплого пола (туалет 1 этаж)» **в процессе** — `permit_join` включён и подтверждён, устройство Alex'ом поставлено в режим спаривания, **назначение имени не завершено** (сессия остановлена Alex). Продолжение — §5. +> **📌 Статус 2026-09-15:** задача «спарить датчик Т тёплого пола (туалет 1 этаж)» — **устройство СПАРЕНО** ✅ (`0xa4c138c650636cf6`, TS0201, 24.82 °C). **Не завершено:** имя в z2m (`friendly_name` = автоприсвоенный IEEE) и зона. Способ переименования не выбран — см. §5. > ✅ **Главный вывод сессии:** с HA работать **через домен `mallexxx.duckdns.org`**, НЕ через raw IP (см. §4, КАНОН). +> 🔴 **КАНОН-1 (записано по прямому требованию Alex):** **H2000 PRO — НЕ Zigbee-устройство.** Это контроллер отопления, приходит в HA отдельной интеграцией. **НЕ ТРОГАТЬ** (Alex: «НЕ ТРОГАЙ ЕГО БЛЯДЬ»). Не путать с Zigbee-датчиками при выполнении задач по Zigbee. --- @@ -48,13 +49,14 @@ related: --- -## 2. Инвентарь устройств — 15 спарено (2026-09-15) +## 2. Инвентарь устройств — **17** спарено (2026-09-15, после сессии) -`Currently 15 devices are joined.` Соответствие **IEEE ↔ friendly_name ↔ модель** — из `configuration.yaml` + `database.db`: +Изначально `Currently 15 devices are joined.` В сессии 2026-09-15 добавлено **2** устройства (id 22 — новый Zigbee-датчик; ещё один уже присутствовал в `database.db`). Соответствие **IEEE ↔ friendly_name ↔ модель** — из `configuration.yaml` + `database.db`: | IEEE address | friendly_name | Модель | Что это | |---|---|---|---| | `0xa4c13862d39377e6` | `office_temperature_sensor` | `TS0201` (_TZ3000_akqdg6g7) | **Датчик t°/влажности Zigbee** (кабинет) — 23.48 °C / 44.8 % | +| **`0xa4c138c650636cf6`** | **`toilet_1_floor_temperature`** *(не применено)* | **`TS0201` (_TZ3000_dowj6gyi)** | ⭐ **НОВЫЙ Zigbee-датчик t°/влажности** — спарен 2026-09-15. 24.82 °C / 46.75 %. Интервью `SUCCESSFUL`. См. §5 | | `0xa4c138c4a94a6a31` | `shower_2_presence_sensor` | `TS0601` (_TZE204_qasjif9e) | Радар присутствия душевой 2 (+ освещённость lx) | | `0xa4c138f8da8bc478` | `recirculation_pump` | `TS011F` (_TZ3000_gjnozsaz) | Розетка насоса рециркуляции ГВС (с мониторингом: V/E/P/I) | | `0xa4c138eb6fbe9d19` | `heating_cable_plug` | `TS011F` (_TZ3000_gjnozsaz) | **Розетка греющего кабеля** (с мониторингом). На 2026-09-15: `OFF`, 0 Вт, 222 В | @@ -68,11 +70,11 @@ related: | `0xa4c138b0f9e674a5` | `wireless_light_switch_bed` | `TS0041` (_TZ3000_kccru4oi) | Беспроводная кнопка спальни | | `0xa4c13882a4b42db0` | `bed_dimmer` | `TS0052` (_TZ3000_ooc8illt) | Диммер спальни | | `0xa4c1383d5fcaa063` | `boiler_water_leak` | `TS0207` (Zbeacon) | Датчик протечки котельной (батарея 100 %) | -| `0xa4c138d…` *(см. конфиг)* | — | — | 15-е устройство — сверять по живому `configuration.yaml` | -**Бэкапы конфига (актуальный список):** `configuration.yaml.bak-20260914-114609`, `.bak-20260914-121108`, **`.bak-20260915-121254`** (перед правкой спаривания 2026-09-15). +**Бэкапы конфига (актуальный список):** `configuration.yaml.bak-20260914-114609`, `.bak-20260914-121108`, `.bak-20260915-121254` (перед спариванием 2026-09-15), **`.bak-rename-`** (перед попыткой переименования 2026-09-15). > ⚠️ Список выше — **снимок 2026-09-15**. Источник истины — живой `/config/zigbee2mqtt/configuration.yaml` (секция `devices:`). При расхождении — прав живой конфиг. +> ⚠️ **Точное число устройств сверять по `database.db`:** `strings /config/zigbee2mqtt/database.db | grep -oE "0x[0-9a-f]{16}" | sort -u | wc -l` (в сессии дало **17**). Координатор `0x0ceff6fffe9339f2` — сам адаптер, в инвентарь не входит. --- @@ -96,6 +98,43 @@ curl -s -X POST -H @/tmp/h1 -H "Content-Type: application/json" \ **Как увидеть новое устройство:** после интервью оно появится в `configuration.yaml` → `devices:` и в HA как сущности `sensor._*`. Новый IEEE искать в `database.db` через `strings | grep -oE "0x[0-9a-f]{16}"` и сравнить с инвентарём §2. **Переименование:** секция `devices:` в `configuration.yaml`, либо HA UI, либо MQTT `zigbee2mqtt/bridge/request/device/rename`. +### 🔴 ПИТФОЛЛ: правка `configuration.yaml` для переименования НЕ РАБОТАЕТ + +**Факт 2026-09-15.** Переименование нового датчика правкой файла на хосте **откатывается**: +1. Правим `friendly_name: '0xa4c138c650636cf6'` → `toilet_1_floor_temperature` в `/config/zigbee2mqtt/configuration.yaml` (через `awk`-скрипт в `/tmp`, диф ровно один — ✅ проверено). +2. `cp` применён, файл на месте — ✅. +3. Рестарт z2m → **z2m восстанавливает старое имя из своей базы** `database.db` и **перезаписывает конфиг обратно**. + +**Причина:** z2m хранит `friendly_name` в `database.db` (SQLite) и при старте синхронизирует её в `configuration.yaml`. Правка файла «на живую» при работающем z2m — не источник истины. + +**✅ Правильный путь:** команда z2m, которая пишет и в базу, и в конфиг: +``` +topic: zigbee2mqtt/bridge/request/device/rename +payload: {"from":"<старый>","to":"<новый>"} +``` +Через HA (без апрувов): +```bash +curl -s -X POST -H @/tmp/h1 -H "Content-Type: application/json" \ + -d '{"topic":"zigbee2mqtt/bridge/request/device/rename","payload":"{\"from\":\"0xa4c138c650636cf6\",\"to\":\"toilet_1_floor_temperature\"}"}' \ + "https://mallexxx.duckdns.org/api/services/mqtt/publish" +``` +Вернул `200 []`. ⚠️ **Статус на конец сессии 2026-09-15: результат НЕ подтверждён** — HA-сущности остались под старым IEEE-именем (`sensor.0xa4c138c650636cf6_*`). Ответ z2m (`bridge/response/device/rename`) не прочитан. Проверять фактом. +**Альтернатива без MQTT:** HA UI → Настройки → Zigbee2MQTT → устройство → карандаш → имя + зона (самый надёжный, 20 секунд вручную). + +### ⚠️ Реестры HA через REST не читаются + +`GET /api/config/device_registry/list` и `/api/config/entity_registry/list` — это **WebSocket-only** команды. Через REST отдают **HTTP 404** (`jq: parse error: Expected string key before ':' at line 1, column 4` — признак HTML/текста ошибки вместо JSON). Реестры доступны только: HA UI, WebSocket API, либо чтение `/config/.storage/core.device_registry` (JSON) через SSH. + +### 🔴 КАНОН: H2000 PRO — НЕ Zigbee-устройство + +**Зафиксировано 2026-09-15 по прямому требованию Alex («НЕ ТРОГАЙ ЕГО БЛЯДЬ», «H2000 это блядь zigbee датчик?!»).** + +- `sensor.h2000_pro_temperatura_teplogo_pola` (**82.04**), `sensor.h2000_pro_temperatura_podachi` (81.14), `sensor.h2000_pro_temperatura_ulitsa` (57.2) — **присутствуют в HA**. +- **В z2m их НЕТ:** ни в `/config/zigbee2mqtt/configuration.yaml`, ни в `database.db` (проверено `grep -c "H2000"` → **0**). +- Приходят через **отдельную HA-интеграцию** (`config_entry_id` `01M2EXY2D5YJZY71VAKJTTGB16`), не через z2m. +- **ВЫВОД:** H2000 PRO — контроллер отопления (H2000-серия ZONT), **не Zigbee**. В задачах про Zigbee **не рассматривать его как кандидата**. +- ❗ Ничего в H2000 не менялось — только чтение. Alex прямо запретил трогать. + --- ## 4. Питфоллы диагностики (проверено) @@ -130,31 +169,62 @@ curl -s -X POST -H @/tmp/h1 -H "Content-Type: application/json" \ ### Факты по железу -- `permit_join` был = **off** → в момент запроса новое устройство не предъявлялось. -- Существующий «датчик t° Zigbee» = `office_temperature_sensor` (`0xa4c13862d39377e6`, TS0201) — стоит в кабинете. +- `permit_join` был = **off** (штатно) → в момент запроса новое устройство не предъявлялось. +- Существующий «датчик t° Zigbee» = `office_temperature_sensor` (`0xa4c13862d39377e6`, TS0201) — стоит в кабинете. **Это НЕ тот датчик.** - **«Тёплый пол, туалет» в карте Modbus** = `Relay module 14 (0E)`, позиция **5 → «Туалет 1 — н.п.»** — у ZONT это реле помечено **неподключённым**. См. [[family/how-to/home-automation]] §«Карта Slave ID». - **Зигби-реле `heating_cable_plug`** (`0xa4c138eb6fbe9d19`, TS011F) — на 2026-09-15 `OFF`, 0 Вт. Судя по имени — вилка греющего кабеля. -> ⚠️ **TS0201 — датчик, а не термостат.** Только измеряет воздух; тёплый пол включается **реле**. Целевое имя сущности при спаривании датчика — **`toilet_1_floor_temperature`**. +> ⚠️ **TS0201 — датчик, а не термостат.** Только измеряет воздух/влажность; тёплый пол включается **реле**. Целевое имя сущности — **`toilet_1_floor_temperature`**. -### ✅ Сделано в сессии 2026-09-15 +### ✅ Устройство СПАРЕНО (2026-09-15) -1. **Бэкап конфига z2m** перед любыми правками: `/config/zigbee2mqtt/configuration.yaml.bak-20260915-121254` ✅ -2. **Режим спаривания ВКЛЮЧЁН** на 600 с и **подтверждён ответом z2m**: - `MQTT publish: topic 'zigbee2mqtt/bridge/response/permit_join', payload '{"data":{"time":254},"status":"ok"}'` - Т.е. `switch.zigbee2mqtt_bridge_permit_join` → **`on`** (подтверждено чтением состояния обратно). +| Параметр | Значение | +|---|---| +| **IEEE** | **`0xa4c138c650636cf6`** (id 22 в `database.db` — новое) | +| **Модель** | `TS0201`, manufName `_TZ3000_dowj6gyi` | +| Тип | EndDevice, Battery | +| Интервью | **`SUCCESSFUL`** ✅ (`interviewCompleted: true`) | +| Температура | **24.82 °C** (`measuredValue` 2488) | +| Влажность | **46.75 %** (`measuredValue` 4676) | +| HA-сущности | `sensor.0xa4c138c650636cf6_temperature/_humidity/_voltage/_battery` | + +**Хронология:** +1. **Бэкап конфига z2m** перед правками: `/config/zigbee2mqtt/configuration.yaml.bak-20260915-121254` ✅ +2. **Режим спаривания ВКЛЮЧЁН** — через домен (`switch.zigbee2mqtt_bridge_permit_join` → `on`). Подтверждено ответом z2m: `bridge/response/permit_join` → `{"data":{"time":254},"status":"ok"}` ✅ 3. Alex: **«поставил»** — устройство переведено в режим спаривания. +4. **Устройство присоединилось**, интервью прошло, z2m сам дописал `devices:` в конфиг с автоприсвоенным именем = IEEE. +5. Переименование — **НЕ завершено** (см. питфолл в §3 и далее). -### ⏸️ Где остановились +### ⏸️ Что осталось (продолжать отсюда) -Проверка появления устройства в логе/`database.db` **остановлена Alex** (deny команды) — сессия завершена по его команде. -**Продолжение с этой точки:** -1. Убедиться, что `permit_join` ещё `on` (если окно истекло — включить снова, одна команда). -2. Новый IEEE-адрес искать: `strings /config/zigbee2mqtt/database.db | grep -oE "0x[0-9a-f]{16}" | sort -u` — сравнить с 15 известными из §2. -3. События интервью в логе: `grep -iE "interview|joining|joined|Successfully" /log.log | grep -v "MQTT publish"`. -4. Появившемуся устройству присвоить `friendly_name: toilet_1_floor_temperature` (секция `devices:` в `configuration.yaml` или через HA UI / MQTT `bridge/request/device/rename`). -5. **Выключить `permit_join` обратно** — обязательно. -6. Проверить, что t° прилетела в HA: `sensor.toilet_1_floor_temperature_*`. +| # | Шаг | Статус | +|---|---|---| +| 1 | `friendly_name` → `toilet_1_floor_temperature` в z2m | ❌ **не применено** (правка файла откатилась; MQTT rename отправлен, результат не подтверждён) | +| 2 | Зона (`area_id`) устройства в HA | ❌ не назначена | +| 3 | Выключить `permit_join` обратно | ⏸️ проверить; если `on` — погасить | +| 4 | Проверить, что t° идёт в HA под новым именем | ⏸️ после п.1 | + +**Как продолжать (правильный порядок):** +1. Проверить, что устройство на месте и живо: `…/api/states` → `select(.entity_id|test("c650636cf6|toilet_1_floor"))`. +2. **Переименовать одним из двух способов** (НЕ правкой файла — см. питфолл §3): + - **HA UI** (надёжнее всего): Настройки → Zigbee2MQTT → устройство → карандаш → имя `toilet_1_floor_temperature` + зона. + - **MQTT rename** (см. §3) → затем **прочитать ответ** z2m `bridge/response/device/rename` и перепроверить HA-сущности. +3. Назначить зону (туалет 1 этаж) — в HA через UI (REST реестры не читаются, §3). +4. **Погасить `permit_join`**: `switch/turn_off` на `switch.zigbee2mqtt_bridge_permit_join`. +5. Убедиться: `sensor.toilet_1_floor_temperature_temperature` отдаёт ~24–25 °C. + +### 📌 Артефакты сессии + +- Скрипт переименования (не сработал — оставлен как образец правки через awk): `~/tmp-t610/rename_zigbee_sensor.sh` +- Бэкапы: `configuration.yaml.bak-20260915-121254`, `configuration.yaml.bak-rename-` (на t610) +- HA-токен: `/tmp/.hatok` (на Mac, `chmod 600`), заголовок собирается в `/tmp/h1` +- Локальный образец работы с API: см. §4 (КАНОН про домен) + +### ⚠️ Процессный вывод (фрикция с Alex, важно для будущих сессий) + +Сессия встала **дважды** на апрувах, потому что шла через `curl http://192.168.2.176` (raw IP + plain HTTP + private network) вместо домана. Alex на это: «**команды такого вида требуют моей авторизации. почему ты их используешь? нет другого, нормального способа?**». +**Правило:** прежде чем запускать команду к t610/HA — **сразу** выбирать путь без апрувов: `https://mallexxx.duckdns.org` + `/tmp/h1`, либо HA UI. Не тратить попытки на raw IP. +Вторая фрикция — Alex заметил, что вместо спаривания агент ушёл в инвентаризацию/доки. **При явной команде исполнять — сначала действие, потом документация.** ---