diff --git a/family/how-to/home-automation.md b/family/how-to/home-automation.md index cded2090..9f0adbbb 100644 --- a/family/how-to/home-automation.md +++ b/family/how-to/home-automation.md @@ -136,7 +136,7 @@ ssh -i ~/.ssh/id_rsa root@192.168.2.176 '<команда>' # аддон core_ > 💡 **Диагностический признак:** аддон в `state: error`, но в логе `Service exited with code 256 (by signal 15)` → это **нормальная остановка**, а `error` — финальный статус. Читать лог, а не только `state`. -> 🧭 **Про Zigbee и возможный переезд Z2M → ZHA — отдельная дока:** [[family/tech/zigbee-t610-z2m-i-zha.md]]. Кратко: HA штатно Zigbee поддерживает (ZHA встроена, стик тот же), **но `coordinator_backup.json` у ember-адаптера ВСЕГДА пуст** — перенос «без спаривания» держится на NVRAM стика, а не на файле; при переезде теряются 16 friendly_name и ломается `modbus-bridge`. Решение 2026-09-15: **Z2M остаётся**. +> 🧭 **Про Zigbee и переезд Z2M → ZHA — отдельная дока:** [[family/tech/zigbee-t610-z2m-i-zha.md]]. Кратко: HA штатно Zigbee поддерживает (ZHA встроена, стик тот же), **но `coordinator_backup.json` у ember-адаптера ВСЕГДА пуст** — перенос «без спаривания» держится на **NVRAM стика**, а не на файле; при переезде теряются 16 friendly_name и ломается `modbus-bridge`. **Решение 2026-09-15 (ночь): ПЕРЕЕЗЖАЕМ НА ZHA** — snapshot HA сделан (`ada4c8e5`, 123 МБ), следующий шаг: остановить `45df7312_zigbee2mqtt`. **Опции аддонов** меняются только через Supervisor API (не `ha apps`, который умеет лишь start/stop/rebuild). Для PATCH нужен **ПОЛНЫЙ набор опций**, иначе 400. diff --git a/family/tech/zigbee-t610-z2m-i-zha.md b/family/tech/zigbee-t610-z2m-i-zha.md index 555d950a..62e5d286 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)" +title: "Zigbee на t610 — переезд Z2M → ZHA (в работе, 2026-09-15)" created: '2026-09-15' -updated: '2026-09-15 (ночь-8: разбор переноса Z2M → ZHA; главный факт — coordinator_backup.json у ember-адаптера ВСЕГДА пуст, устройства живут в database.db)' +updated: '2026-09-15 (ночь-9: ✅ РЕШЕНИЕ ПРИНЯТО — переезжаем на ZHA; snapshot HA сделан, следующий шаг — остановить Z2M)' type: tech namespace: family -status: research — перенос НЕ выполнен, Z2M работает +status: 🔄 В РАБОТЕ — решение о переезде принято, snapshot готов, Z2M ещё работает tags: - t610 - haos @@ -21,15 +21,20 @@ related: - '[[family/plans/t610-backup-to-truenas]]' --- -# Zigbee на t610 — Z2M / перенос в ZHA +# Zigbee на t610 — переезд Z2M → ZHA (В РАБОТЕ) + +> 🚦 **СОСТОЯНИЕ (2026-09-15 ночь):** решение принято, **переезжаем на ZHA**. Snapshot HA сделан (`ada4c8e5`, 123 МБ). Файлы Z2M скачаны на Mac. **Z2M ещё работает** — остановка не выполнена. +> ▶️ **СЛЕДУЮЩИЙ ШАГ: остановить аддон `45df7312_zigbee2mqtt`** (`stop`, НЕ удалять), затем добавить интеграцию ZHA на порт `/dev/serial/by-id/usb-Inswift_Zigbee_ZBP-MG21_535A000001-if00`, тип EZSP/ember. > ❓ **Вопрос Alex (2026-09-15):** «HA штатно поддерживает Zigbee без Z2M? Что нужно, чтобы перенести всё в HA **без заново спаривания**?» ## Короткий ответ -**Да, HA поддерживает Zigbee штатно — интеграция ZHA, встроена в HA core, ничего ставить не надо. Стик тот же (`/dev/ttyACM0`).** +**Да, HA поддерживает Zigbee штатно — интеграция ZHA, встроена в HA core, ничего ставить не надо. Стик тот же.** -**НО перенос «без спаривания» через `coordinator_backup.json` у тебя НЕ сработает** — этот файл у ember/EZSP-адаптера **всегда пуст** (`"devices": []`). Это **не поломка** и **не устаревший файл**: так работает ember у Zigbee2MQTT. +**Перенос без перепаривания работает — но НЕ через `coordinator_backup.json`**, а потому что **сеть живёт в NVRAM стика**. У ember/EZSP-адаптера этот файл **всегда пуст** (`"devices": []`) — это **не поломка** и **не устаревший файл**: так работает ember у Zigbee2MQTT. + +> 🔴 **ГЛАВНАЯ ПУТАНИЦА ЭТОЙ СЕССИИ (чтобы не повторить):** увидев `devices: []`, я объявил «перенос отменяется». **Это была ошибка.** Для переезда TrueNAS → t610 файл был **единственным носителем** сети (менялся хост). Для Z2M → ZHA хост **тот же**, стик **тот же** — носитель сети это сам стик, файл не участвует вообще. Более простой случай, не более сложный. --- @@ -146,16 +151,30 @@ ZHA стартует на ТОМ ЖЕ стике ZHA их обнаруживает (уже в сети) — заново спаривать НЕ нужно ``` -**Порядок (если решимся):** +**Порядок (ВЫПОЛНЯЕТСЯ — статус на 2026-09-15 ночь):** -1. **Полный snapshot HA** — обязательно, до всего. -2. Скачать `coordinator_backup.json` (ключ/PAN/канал) + `database.db` (инвентарь) — на случай отката. -3. **Остановить Z2M** (`stop`, не удалять) — стик освободить. -4. HA → Настройки → Устройства → **Добавить интеграцию → ZHA** → порт +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`, **не удалять**) — освободить стик. +4. ⬜ HA → Настройки → Устройства → **Добавить интеграцию → ZHA** → порт `/dev/serial/by-id/usb-Inswift_Zigbee_ZBP-MG21_535A000001-if00` → тип **EZSP/ember**. -5. При запросе — восстановить `coordinator_backup.json` (ZHA возьмёт параметры сети). -6. ZHA поднимает сеть. Устройства уже в ней — идут сами. **Батарейные (`EndDevice`) спят** — их надо разбудить кнопкой, но это **не перепаривание**. -7. Переназначить `modbus-bridge` (он завязан на `switch.0xa4c138f8da8bc478`). +5. ⬜ При запросе — восстановить `coordinator_backup.json` (ZHA возьмёт параметры сети: ключ/PAN/канал). +6. ⬜ ZHA поднимает сеть. Устройства уже в ней — идут сами. **Батарейные (`EndDevice`) спят** — их надо разбудить кнопкой, но это **не перепаривание**. +7. ⬜ Переназначить `modbus-bridge` (он завязан на `switch.0xa4c138f8da8bc478`). + +### Рабочий рецепт: создание snapshot через Supervisor API + +```bash +HDR="Authorization: Bearer ${SUPERVISOR_TOKEN}" # заголовок собирать В РАНТАЙМЕ на t610 +curl -s -X POST -H "$HDR" -H "Content-Type: application/json" \ + -d '{"name":"pre-zha-migration-20260915"}' \ + http://supervisor/backups/new/full +# → {"result":"ok","data":{"job_id":"7d7a…","slug":"ada4c8e5"}} +``` + +> 🔴 **ПИТФОЛЛ: `-d '{"type":"full"}'` → ошибка `extra keys not allowed @ data['type']`.** Эндпоинт `/backups/new/full` **уже** подразумевает full — ключ `type` лишний. +> 🔴 **ПИТФОЛЛ: список бэкапов — `GET /backups`** (не `/backups/`, не с trailing slash + piped jq в одном `curl`). Правильно: `curl -s -H "$HDR" http://supervisor/backups | jq …`. +> 🔴 **ПИТФОЛЛ: `jq: parse error: Expected string key before ':' at line 1, column 4`** — токен **не доехал** в переменную (пустой `$HDR`), curl вернул текст ошибки, jq подавился. Причина — фильтр секретов съел строку с токеном. **Фикс: собирать заголовок на самой t610 из `$SUPERVISOR_TOKEN`, не передавать значение через SSH-строку.** --- @@ -167,13 +186,17 @@ ZHA их обнаруживает (уже в сети) — заново спар | 2 | **Все автоматизации с `switch.0xa4c138f8da8bc478` и подобными** | `entity_id` в ZHA будут другие → переписать все ссылки | | 3 | **`modbus-bridge`** | жёстко завязан на Zigbee-сущность `switch.0xa4c138f8da8bc478` (relay slave 104) — сломается | -**Почему Z2M сейчас остаётся (решение 2026-09-15):** -- 16 устройств уже спарены и работают (проверено: 19 сущностей online, `presence`, `illuminance`, `state` живые) -- `modbus-bridge` висит на Z2M-сущность — переезд немедленно ломает мост на ZONT -- ZHA и Z2M **не уживаются на одном стике** — второго нет -- Выигрыш от переезда = 0. HA «штатно поддерживает Zigbee» — правда, но у Alex не «поставить интеграцию», а «перенести построенную сеть + переписать автоматизации» +**Решение 2026-09-15 (НОЧЬ, ФИНАЛЬНОЕ): ПЕРЕЕЗЖАЕМ НА ZHA.** Alex подтвердил задачу прямо: «заменить Z2M на ZHA, устройства не спаривать заново». -> 📌 Формулировка для будущего: **вопрос не в возможностях ZHA, а в том, что сеть уже построена и завязана на неё.** +> 🔴 **Отменено прежнее решение «Z2M остаётся, выигрыш 0»** (записано ранее в этой же доке). Alex настоял — переезд нужен, несмотря на цену. Причина: HA штатно поддерживает Zigbee, и Alex хочет убрать Z2M как отдельный слой. + +**Цена переезда (принята осознанно):** +- 16 friendly names задать заново (ZHA их не читает из `database.db`) +- Все автоматизации со ссылками на `switch.0xa4c138f8da8bc478` и подобными — переписать +- `modbus-bridge` сломается и требует переназначения (relay slave 104) +- Батарейные `EndDevice` спят — разбудить кнопкой (это НЕ перепаривание) + +> 📌 Формулировка: **вопрос не в возможностях ZHA, а в том, что переезд = сменить программу-управитель, а не перенести сеть.** Сеть остаётся в стике. --- @@ -213,9 +236,10 @@ database.db MD5 3292d64bf1455d4b3d50a93c0950d0b4 state.json MD5 20bfb775cbab002e59d1be31a15db9e6 ``` -Скрипты на Mac (`~/tmp-t610/`): `z2m-backup-request.sh` (первая версия, `localhost` — падает), `z2m-backup-request2.sh` (`core-mosquitto` — работает), `z2m-get-backup.sh` (полный цикл + распаковка), `z2m-check-adapter.sh` (диагностика адаптера). +Скрипты на Mac (`~/tmp-t610/`): `z2m-backup-request.sh` (первая версия, `localhost` — падает), `z2m-backup-request2.sh` (`core-mosquitto` — работает), `z2m-get-backup.sh` (полный цикл + распаковка), `z2m-check-adapter.sh` (диагностика адаптера), `zha-step1d-snapshot.sh` (✅ рабочий snapshot через Supervisor API), `zha-check.sh` (список бэкапов). > ⚠️ **Правило:** скрипты писать на Mac → `scp` → выполнить. Не инлайнить `mosquitto_sub` с паролем в одну ssh-строку — `$` в пароле `mqtt1z3$` ломается в двойных кавычках. +> ⚠️ **Проверять скрипт на диске через `od -c`/`grep`, а не глазами в чате** — фильтр секретов маскирует строку с токеном в выводе, но файл на диске целый. Ложная тревога «скрипт побит» уже случалась. ---