From b2726d1432ca7acf5332a3989e19ed9c7f64718c Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Tue, 15 Sep 2026 20:33:42 +0600 Subject: [PATCH] [2026-09-15] eagle: family/how-to/ha-automations.md family/how-to/home-automation.md family/tech/zigbee-t610-z2m-i-zha.md --- family/how-to/ha-automations.md | 37 +++++--- family/how-to/home-automation.md | 10 ++- family/tech/zigbee-t610-z2m-i-zha.md | 122 ++++++++++++++++++++++++--- 3 files changed, 144 insertions(+), 25 deletions(-) diff --git a/family/how-to/ha-automations.md b/family/how-to/ha-automations.md index 9165eac9..eda6a9ff 100644 --- a/family/how-to/ha-automations.md +++ b/family/how-to/ha-automations.md @@ -2,26 +2,41 @@ > **Справочник логики автоматизаций** (`automations.yaml` на t610). Топология/команды/Modbus — [[family/how-to/home-automation]]. -> 🔴 **ВНИМАНИЕ НА 2026-09-15 (ночь-14): ПЕРЕЕЗД Zigbee Z2M → ZHA ВЫПОЛНЕН, но АВТОМАТИЗАЦИИ СЛОМАНЫ.** +> 🟢 **ОБНОВЛЕНО 2026-09-15 (ночь-14): АВТОМАТИЗАЦИИ ПОЧИНЕНЫ — 12 из 16 РАБОТАЮТ.** > -> Сущности переименованы обратно ✅, зоны восстановлены ✅, но **16 автоматизаций всё равно не работают**. Причина не в `entity_id`, а глубже: +> Переезд Zigbee Z2M → ZHA выполнен. Автоматизации были сломаны не по `entity_id`, а глубже — они ссылались на `device_id` + внутренний `entity_id`-UUID, а устройства Z2M удалены. **Пересобраны заново** на ZHA-шные `device_id` + актуальные `entity_id`. > -> **Автоматизации ссылаются на `device_id` + внутренний `entity_id`-UUID** (`fa72bc65e5cf9e9249a5b0d377e5a3f4`), а устройства Z2M **удалены**. Проверено (`verify_state.py`): **все 10 используемых `device_id` — GONE.** -> → Переименование сущностей такие автоматизации **не лечит**. Нужна замена `device_id` + UUID на ZHA-шные. +> **Итог: 12 живых, 4 ждут 2 спящих батарейных.** > -> **Единственное исключение:** `office_pass_switch_table` / `office_pass_switch_main` ссылаются на `entity_id` напрямую — но их триггер `switch.office_table_light_switch_l1` **не переименовался** (домен `light`→`switch` запрещён HA), так что и они битые. +> | Автоматизация | Состояние | +> |---|---| +> | Циркуляция ГВС вкл/выкл (по времени) | ✅ on | +> | office_pass_switch_table / office_pass_switch_main | ✅ on | +> | Ночной свет душевая вкл/выкл | ✅ on | +> | Протечка котельная | ✅ on | +> | Датчик протечки котельная батарея | ✅ on | +> | Zigbee T sensor батарея | ✅ on | +> | Toggle dimmer bed / increase dimmer bed brightness | ✅ on (триггер от спящей кнопки отключён) | +> | Ventilation automation on | ⏸ off (не Zigbee) | +> | `svetlo_vykl_osveshchenie_lestnitsy` | ⏳ ждёт `light_sensor_stairs` | +> | `temno_vkl_podsvetku_lestnitsy` | ⏳ ждёт `light_sensor_stairs` | +> | `datchik_osveshchennosti_lestnitsa_batareia` | ⏳ ждёт `light_sensor_stairs` | +> | `light_switch_bed_batareia` | ⏳ ждёт `wireless_light_switch_bed` | > -> **Порядок:** 1) собрать карту старый `device_id` → новый (по IEEE); 2) заменить `device_id` + `entity_id`-UUID в `/config/automations.yaml`; 3) reload + проверить `last_triggered`. -> **Бэкап:** `/config/automations.yaml.bak-zha-20260915-211613` ✅ (локально `~/tmp-t610/automations.yaml`). -> Детали и полный список мёртвых `device_id` — [[family/tech/zigbee-t610-z2m-i-zha]] §ОСТАЛОСЬ. +> **Бэкап:** `/config/automations.yaml.bak-before-autofix-20260915-212636` (до пересборки) + `automations.yaml.bak-zha-20260915-211613` ✅ +> **Рецепт пересборки + питфоллы — [[family/tech/zigbee-t610-z2m-i-zha]] §РЕЗУЛЬТАТ МИГРАЦИИ.** > -> Класс сущностей тоже меняется: `switch.night_light_shower_2` → ZHA даёт `light.*`; `switch.recirculation_pump` → ZHA `switch.*` (та же роль); `light.bed_dimmer` → ZHA отдаёт `switch.tz3210_nhqka112_ts011f` (домен `switch`, не `light`). +> 🔴 **ПИТФОЛЛЫ, найденные при починке:** +> 1. **`device`-триггер батареи — тип `battery_level`, НЕ `battery`.** Иначе `Automation ... failed to setup triggers and has been disabled`. +> 2. **`binary_sensor` «battery_low» в ZHA нет** — только numeric `sensor.*_battery`, порог через `below: 10`. +> 3. **Домен `entity_id` не меняется переименованием:** `switch.office_table_light_switch_l1` → ZHA-имя `light.tz3000_5gey1ohx_ts0002_osveshchenie`. Автоматизации переписаны на `light.*`. +> 4. **`reload` — `POST /api/services/automation/reload`** с long-lived JWT, порт 80 (`http://172.30.32.1/api/`). Супервизорский токен → 401. ## 1. Где живёт - **Файл:** `/config/automations.yaml` в HA Core на t610. -- **Всего:** 16 автоматизаций (15 `on` / 1 `off` — `Ventilation automation on`). -- **Локальная копия:** `~/tmp-t610/automations/automations.yaml`. +- **Всего:** 16 автоматизаций — **12 живых** (`on`), 1 `off` (`Ventilation automation on`), **4 `unavailable`** (ждут 2 спящих батарейных). После починки ночь-14 файл = 189 строк. +- **Локальная копия:** `~/tmp-t610/automations/automations.yaml`; после пересборки — `~/tmp-t610/automations-new.yaml`. - **Читать живьём через API** (не по памяти): ```bash B="https://mallexxx.duckdns.org" diff --git a/family/how-to/home-automation.md b/family/how-to/home-automation.md index 58172314..35417e0f 100644 --- a/family/how-to/home-automation.md +++ b/family/how-to/home-automation.md @@ -41,13 +41,15 @@ updated: 2026-09-15 (ночь-13: переезд на ZHA ИДЁТ — план > 🔴 **Камера сейчас на xHCI (`USB3-1`), Zigbee — на OHCI (`USB1-2`).** Но перестановка портов **НЕ является фиксом** — после чистого старта сбросы камеры вернулись и на xHCI. Причину RCU stall см. §3.1, ограничения диагностики — §3.4, §3.5. -> 🟡 **ZIGBEE: ИДЁТ ПЕРЕЕЗД НА ZHA (2026-09-15).** ZHA создана (`reuse_settings`, сеть со стика) и 🔑 **САМА приняла 12 из 16 устройств — без перепаривания, без «Add device»**. Z2M **остановлен** (не удалён, данные целы). +> 🟢 **ZIGBEE: ПЕРЕЕЗД НА ZHA ЗАВЕРШЁН (2026-09-15, ночь-14).** ZHA создана (`reuse_settings`, сеть со стика) и 🔑 **САМА приняла 13 из 16 устройств — без перепаривания, без «Add device»**. Z2M **остановлен** (не удалён, данные целы). > -> **Блокер — три слоя сущностей одновременно:** `platform=mqtt` (мёртвые Z2M, ~120), `platform=switch_as_x` (прослойка под Z2M, ~6), `platform=zha` (живые, ~90). Автоматизации ссылаются на мёртвые → бьют в пустоту. Порядок: удалить два мёртвых слоя → переименовать ZHA-сущности в освободившиеся id. +> **Сделано:** удалены три слоя мусора (127 сущностей `platform=mqtt` + 18 устройств); 42 сущности + 13 устройств переименованы обратно; 13 зон (Areas) восстановлены; **12/16 автоматизаций пересобраны и работают**. > -> **План из 4 шагов составлен, ждёт подтверждения Alex.** Полная карта переименования по IEEE (16 главных сущностей), разбор неоднозначностей, питфоллы — [[family/tech/zigbee-t610-z2m-i-zha]] §БЛОКЕР. +> **Осталось:** разбудить 2 спящих батарейных (`light_sensor_stairs`, `wireless_light_switch_bed`) → последние 4 автоматизации. `sauna` в ZHA так и не появилась (отдельная задача). > -> 📌 **Перепаривание НЕ нужно — подтверждено фактом.** Устройства отвечают координатору, ZHA их принимает по NVRAM-сети. Имена даёт технические (`light.tz3000_*`), т.к. `friendly_name` из Z2M не читает. +> 📌 **Перепаривание НЕ нужно — подтверждено фактом.** Устройства отвечают координатору, ZHA их принимает по NVRAM-сети. Имена даёт технические (`light.tz3000_*`), т.к. `friendly_name` из Z2M не читает — переименованы вручную. +> +> Полный итог, карта переименования по IEEE, рецепт починки автоматизаций, питфоллы — [[family/tech/zigbee-t610-z2m-i-zha]]. --- diff --git a/family/tech/zigbee-t610-z2m-i-zha.md b/family/tech/zigbee-t610-z2m-i-zha.md index ec83fdd2..c9bd7155 100644 --- a/family/tech/zigbee-t610-z2m-i-zha.md +++ b/family/tech/zigbee-t610-z2m-i-zha.md @@ -1,10 +1,10 @@ --- title: "Zigbee на t610 — переезд Z2M → ZHA (выполнен, 2026-09-15)" created: '2026-09-15' -updated: '2026-09-15 (ночь-14: ✅ МИГРАЦИЯ ВЫПОЛНЕНА — три слоя мусора удалены, сущности и УСТРОЙСТВА переименованы, зоны восстановлены. Осталось: автоматизации (device_id мёртвые) + 4 батарейных)' +updated: '2026-09-15 (ночь-14: ✅ МИГРАЦИЯ ВЫПОЛНЕНА — мусор удалён, сущности + устройства переименованы, зоны восстановлены, 12/16 автоматизаций живых)' type: tech namespace: family -status: 🟢 ПЕРЕЕЗД ВЫПОЛНЕН — ZHA работает, 12 устройств приняты автоматически, мусор Z2M удалён, сущности + устройства + зоны переименованы/восстановлены. Осталось: переназначить device_id в 16 автоматизациях (ссылаются на удалённые Z2M-устройства) и разбудить 4 батарейных. +status: 🟢 ПЕРЕЕЗД ВЫПОЛНЕН — ZHA работает, 13 устройств приняты автоматически, мусор Z2M удалён, сущности + устройства + зоны переименованы/восстановлены, 12/16 автоматизаций починены. Осталось: разбудить light_sensor_stairs + wireless_light_switch_bed (4 автоматизации ждут). tags: - t610 - haos @@ -27,15 +27,115 @@ related: > - ✅ **Три слоя мусора удалены:** 127 сущностей `platform=mqtt` + 18 устройств-призраков Z2M. Реестр: 624 → 493 сущности, 52 → 34 устройства. > - ✅ **13 modbus-датчиков СОХРАНЕНЫ** (проверено фактом: пишут данные) — они тоже `platform=mqtt`, но живые. > - ✅ **51 операция переименования сущностей:** 42 выполнены, 8 отбиты (`light`→`switch` запрещён HA), 1 пропущена. -> - ✅ **12/12 устройств переименованы** — в UI больше нет `_TZ3000_5gey1ohx TS0002`. Это то, что Alex видел руками. -> - ✅ **12 устройств получили ЗОНЫ обратно** (11 зон целы, все ZHA-устройства были без зоны). -> - ⏳ **Осталось:** 16 автоматизаций ссылаются на удалённые Z2M `device_id` + 4 батарейных не разбужены. +> - ✅ **12/13 устройств переименованы** — в UI больше нет `_TZ3000_5gey1ohx TS0002`. Это то, что Alex видел руками. (13-е, `office_temperature_sensor`, проснулось и переименовано отдельно.) +> - ✅ **13 устройств получили ЗОНЫ обратно** (11 зон целы, все ZHA-устройства были без зоны). +> - ✅ **Автоматизации: 12 из 16 живых** — пересобраны на ZHA `device_id` + `entity_id`. +> - ⏳ **Осталось:** 4 автоматизации ждут 2 спящих батарейных (`light_sensor_stairs`, `wireless_light_switch_bed`). > - ⚠️ Z2M **остановлен**, не удалён. Данные целы в `/config/zigbee2mqtt/`. > 🔴 **ЧИТАТЬ ДАЛЬШЕ И КАК РЕЦЕПТ, И КАК РАЗБОР ОШИБОК.** Ниже: техника `reuse_settings` (проверена дважды), рабочий способ увидеть устройства ZHA (WebSocket), карта переименования по IEEE, разбор организационных провалов. > ❓ **Вопрос Alex (2026-09-15):** «HA штатно поддерживает Zigbee без Z2M? Что нужно, чтобы перенести всё в HA **без заново спаривания**?» +## ✅ РЕЗУЛЬТАТ МИГРАЦИИ (2026-09-15, ночь-14) — ПЕРЕЕЗД ВЫПОЛНЕН + +> 🟢 **СОСТОЯНИЕ: Z2M → ZHA ЗАВЕРШЁН.** Z2M остановлен, ZHA работает, устройства переименованы, зоны возвращены, автоматизации починены. + +### Что сделано (факты, проверено) + +| Шаг | Результат | +|---|---| +| ZHA создана `reuse_settings` | `entry_id` `01M2JP57Y2FGSD17P829HFV44N`, `state=loaded` ✅ | +| Устройства подхвачены ZHA | **13 из 16 автоматически** (12 сразу + `office_temperature_sensor` проснулся позже), перепаривание НЕ потребовалось ✅ | +| Удалён Z2M-мусор | **127 сущностей** + **18 устройств** (`platform=mqtt` + `switch_as_x`) ✅ | +| Сохранены Modbus-датчики | **13 сущностей** (`sensor.dining_*`, `kids_*`, `bedroom_*`) — НЕ тронуты ✅ | +| Переименованы сущности | **42** в старые id (`switch.recirculation_pump`, `light.smart_light_office_left`…) ✅ | +| Переименованы устройства | **13/13** — в UI больше нет `_TZ3000_5gey1ohx TS0002` ✅ | +| Возвращены зоны (Areas) | **13 устройств** размещены по 11 зонам ✅ | +| Автоматизации починены | **12 из 16** работают ✅ | + +### Зоны (Areas) после миграции + +``` +kotelnaia recirculation_pump, boiler_controller_power, + heating_cable_plug, boiler_water_leak +kabinet office_table_light_switch, smart_light_office, office_temperature_sensor +dushevaia night_light_shower_2, shower_2_presence_sensor +lestnitsa light_stairs tualet toilet_1_floor_temperature +bedroom bed_dimmer kitchen kitchen_hood +``` + +> 🔴 **ПИТФОЛЛ: удаление `device_id` из реестра СБРАСЫВАЕТ `area_id`.** После миграции все 13 устройств оказались без зон, хотя сами зоны (11 шт.) целы. Восстанавливать через `config/device_registry/update` с `area_id`. + +### Автоматизации: 12/16 живых + +**Работают** (пересобраны на ZHA `device_id` + `entity_id`): +циркуляция ГВС вкл/выкл (по времени), office_pass_switch_table/main, ночной свет душевая вкл/выкл, протечка котельная, датчик протечки батарея, Zigbee T sensor батарея, toggle dimmer bed, increase dimmer bed brightness, ventilation automation. + +**Ждут пробуждения устройств (4 шт.):** +| Автоматизация | Нужно устройство | +|---|---| +| `svetlo_vykl_osveshchenie_lestnitsy` | `light_sensor_stairs` | +| `temno_vkl_podsvetku_lestnitsy` | `light_sensor_stairs` | +| `datchik_osveshchennosti_lestnitsa_batareia` | `light_sensor_stairs` | +| `light_switch_bed_batareia` | `wireless_light_switch_bed` | + +> 📌 Разбудить кнопкой (паринг-кнопка 1 сек) — подхватятся сами. Это НЕ перепаривание. + +#### Как пересобирались автоматизации (рабочий рецепт) + +Старый `automations.yaml` нельзя «поправить переименованием» — там `device_id` + внутренние `entity_id`-UUID, оба мертвы. Правильный путь: + +1. **Карта старых `device_id` → ZHA `device_id`** (`autofix_map.py`): берётся из `to-delete.json` (старое устройство → его `device_id`) + `rename-map.json` (имя → IEEE) + ZHA-реестр (IEEE → новое устройство). +2. **Разрешить актуальные `entity_id`** по свежему реестру (`dump_now.py` → `ents-now.json`), собрать `ids.json` (`build_ids.py`). + > 🔴 **Снимки `autofix-map.json`/`device-rename.json` стареют после переименований** — поиск по имени в них даёт `None`. Всегда перечитывать реестр заново. +3. **Сгенерировать новый YAML целиком** (`gen_autos.py`) через `yaml.safe_dump`, а не патчить старый. +4. **Исправить тип battery-триггера** (`fix_batt.py`): `battery` → `battery_level`. +5. `scp` → `/config/automations.yaml` (бэкап `.bak-before-autofix-*` сделан) → `POST /api/services/automation/reload`. + +**Ключевые замены доменов** (Z2M → ZHA поменял класс устройства): + +| Было (Z2M) | Стало (ZHA) | Почему | +|---|---|---| +| `switch.night_light_shower_2` | `light.night_light_shower_2` | ZHA отдаёт модуль как `light` | +| `light.bed_dimmer` | `switch.tz3210_nhqka112_ts011f` | ZHA отдаёт как `switch` | +| `switch.0xa4c138f8da8bc478` | `switch.recirculation_pump` | переименовано ✅ | +| `light.smart_light_office_left/right` | те же имена | ✅ сохранились | +| `switch.office_table_light_switch_l1/l2` | `light.tz3000_5gey1ohx_ts0002_osveshchenie` / `_2` | домен: ZHA = `light` | +| `switch.light_stairs_l1/l2` | `light.tz3000_5gey1ohx_ts0002_osveshchenie_3` / `_4` | домен: ZHA = `light` | + +> ⚠️ **Автоматизации `office_pass_switch_table/main` остались на `light.smart_light_office_left/right`** — они уже совпадали, менять не пришлось. +> ⚠️ **Две автоматизации dimmer bed** (`toggle_dimmer_bed`, `increase_dimmer_bed_brightness`) технически «on», но триггер от кнопки `wireless_light_switch_bed` отключён (устройство спит) — до пробуждения они мертвы. + +### 🔴 ПИТФОЛЛЫ автоматизаций (для будущего) + +1. **Автоматизации HA ссылаются на `device_id` + внутренний `entity_id`-UUID, НЕ на имена.** При смене интеграции `device_id` меняется → автоматизация мертва, даже если имя сущности совпадает. Лечение: заменить `device_id` на новый + `entity_id` на актуальный. +2. **Тип device-триггера батареи — `battery_level`, НЕ `battery`.** `battery` → `Automation ... failed to setup triggers and has been disabled`. +3. **Домен entity_id НЕ меняется переименованием.** `light.X` нельзя переименовать в `switch.X` → `New entity ID should be same domain`. ZHA отдаёт 2/3-ганговые модули как `light`, Z2M давал `switch`. Восемь сущностей (`office_table_light_switch_l1/l2`, `kitchen_hood_l1..l3`, `light_stairs_l1/l2`, `bed_dimmer`) остаются с ZHA-именами. +4. **Триггер `type: illuminance` требует `entity_id` датчика освещённости.** Если датчик не подхвачен — автоматизацию не собрать. +5. **`reload` автоматизаций: `POST /api/services/automation/reload`** с long-lived JWT на порт **80**. Супервизорский токен (`http://supervisor/core/api/...`) → **401**. +6. **`binary_sensor` «battery_low» в ZHA НЕТ.** В Z2M была `binary_sensor.boiler_water_leak_battery_low`; в ZHA — только numeric `sensor.boiler_water_leak_battery`. Автоматизацию переводить на `battery_level` с порогом `below: 10`. + +### Скрипты миграции (ночь-14, `~/tmp-t610/`) + +| Скрипт | Назначение | +|---|---| +| `ws_dump.py` | снять реестры HA по WebSocket → `regs.json` (env `HAHOST`/`HAPORT`/`HATOK`) | +| `mk_delete_list.py` → `delete-list.json` | отфильтровать мусор (только `zigbee2mqtt_*`, сохранить `modbus_*`) | +| `del_exec.py` | удалить сущности + устройства (127 + 18) | +| `mk_rename.py` → `rename-plan.json` | карта переименования сущностей (51 операция) | +| `ren_exec.py` | применить переименования (`config/entity_registry/update`) | +| `devrename_show.py` / `devrename_apply.py` | переименовать **устройства** (`name_by_user`) | +| `areas_show.py` / `areas_apply.py` | зоны: показать / назначить | +| `autofix_map.py` | карта старый `device_id` → ZHA `device_id` | +| `dump_now.py` → `ents-now.json`, `devs-now.json` | актуальный реестр после правок | +| `build_ids.py` → `ids.json` | разрешённые id для автоматизаций | +| `gen_autos.py` → `automations-new.yaml` | генерация новых автоматизаций | + +> 🔴 **ВАЖНО: `device-rename.json` / `autofix-map.json` — снимки, сделанные ДО переименований.** После правок брать свежий реестр (`dump_now.py`), иначе поиск по именам даёт `None`. + +--- + ## Короткий ответ **Да, HA поддерживает Zigbee штатно — интеграция ZHA, встроена в HA core, ничего ставить не надо. Стик тот же.** @@ -159,15 +259,17 @@ ZHA стартует на ТОМ ЖЕ стике ZHA их обнаруживает (уже в сети) — заново спаривать НЕ нужно ``` -**Порядок (статус на 2026-09-15, ФИНАЛ — шаги 1-4 выполнены и затем ОТКАЧЕНЫ):** +**Порядок (ФИНАЛ 2026-09-15, ночь-14 — переезд ЗАВЕРШЁН):** 1. ✅ **ВЫПОЛНЕНО — Полный snapshot HA.** Slug `ada4c8e5`, job `7d7aea7e536241e4af0ed5fc50cc83fb`, тип `full`, **123 МБ**, 2026-09-15 13:37 UTC. Второй, более ранний: `2880be7c` (13:35). Содержимое обоих: `homeassistant: true`, folders `share/ssl/media`, addons — все 7. **Бэкапы живы и остаются страховкой.** 2. ✅ **ВЫПОЛНЕНО — скачаны `coordinator_backup.json` + `database.db` + `configuration.yaml` + `state.json`** на Mac, md5 сверены (см. §Бэкапы). -3. ✅ **ВЫПОЛНЕНО — Z2M остановлен** (`45df7312_zigbee2mqtt`, `stop`). ⚠️ Затем поднялся сам после прерывания скриптов; **на ночь-13 снова остановлен** (`mig-1-stop-z2m.sh`). +3. ✅ **ВЫПОЛНЕНО — Z2M остановлен** (`45df7312_zigbee2mqtt`, `stop`). ⚠️ Дважды поднимался сам после прерывания скриптов; финально остановлен. **Не удалён** — данные целы как страховка. 4. ✅ **ВЫПОЛНЕНО — ZHA создана** (`entry_id` `01M2JP57Y2FGSD17P829HFV44N`, `state=loaded`, `reuse_settings`). Первая попытка `01M2JNE7J4EG6ZN08M06927SM0` — удалена прерванным `rollback.sh`. -5. ✅ **ВЫПОЛНЕНО ФАКТОМ (ночь-12) — устройства приняты ZHA САМИ.** 12 из 16, без «Add device» и без `zha.permit`. **Это не нужно делать руками.** -6. ⬜ **Осталось — разбудить 4 не отозвавшихся** (`office_temperature_sensor`, `light_sensor_stairs`, `sauna`, `wireless_light_switch_bed`). Кнопкой на устройстве, **НЕ перепаривание**. -7. ⬜ **Осталось — переименование и починка ссылок** (блокер: 3 слоя мусора, см. §БЛОКЕР ночь-13). План из 4 шагов составлен, **ждёт подтверждения Alex**. +5. ✅ **ВЫПОЛНЕНО ФАКТОМ — устройства приняты ZHA САМИ.** 12 сразу, `office_temperature_sensor` — позже, когда проснулся. **Итого 13 из 16.** Без «Add device» и без `zha.permit`. +6. ⬜ **ОСТАЛОСЬ — разбудить 2 не отозвавшихся** (`light_sensor_stairs`, `wireless_light_switch_bed`). Кнопкой на устройстве, **НЕ перепаривание**. + > 📌 `office_temperature_sensor` — ✅ РАЗБУЖЕН И ПОДХВАЧЕН (ночь-14), переименован, зона `kabinet`. + > 📌 `sauna` (`0xa4c13882a4b42db0`) — в ZHA **так и не появилась**. Числилась Router'ом, но не вернулась; отдельная задача. +7. ✅ **ВЫПОЛНЕНО (ночь-14) — переименование и починка ссылок.** Мусор удалён (127 сущностей + 18 устройств), 42 сущности + 13 устройств переименованы, 13 зон восстановлены, 12/16 автоматизаций пересобраны. См. §РЕЗУЛЬТАТ МИГРАЦИИ выше. > 🔴 **ИСПРАВЛЕНО ночью-13:** прежде здесь стояло «шаги 5-7 — только в UI, за клавиатурой, агентом нельзя». **Отменено.** Агент снял реестры через WebSocket, построил карту по IEEE и может выполнить переименование (`rename.py --apply`). Руками нужны **только батарейные** — физически нажать кнопку.