[2026-09-15] eagle: family/how-to/home-automation.md family/tech/zigbee-t610-z2m-i-zha.md

This commit is contained in:
Alexey Martemyanov
2026-09-15 19:42:34 +06:00
parent 02fb635ccb
commit 2616d9bb99
2 changed files with 46 additions and 22 deletions
+1 -1
View File
@@ -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.
+45 -21
View File
@@ -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`, а не глазами в чате** — фильтр секретов маскирует строку с токеном в выводе, но файл на диске целый. Ложная тревога «скрипт побит» уже случалась.
---