diff --git a/family/how-to/t610-access.md b/family/how-to/t610-access.md index 6bea8c10..04e87610 100644 --- a/family/how-to/t610-access.md +++ b/family/how-to/t610-access.md @@ -4,7 +4,7 @@ > План переноса: [[family/plans/home-automation-migration-t610]] > Развёртывание сервисов: [[family/plans/t610-addons-deployment]] -> ✅ **Состояние на 2026-09-14 (Этап 2 закрыт):** z2m (16 устройств), mbusd (порт 502), modbus-bridge (MQTT + HA-опрос) — все развёрнуты аддонами и **работают**. В HA добавлена **MQTT-интеграция** (её не было → z2m/bridge не создавали сущности; стало 104 сущности, 69 Zigbee). Далее — Этап 3 (перенос HA-конфига с TrueNAS). +> ✅ **Состояние на 2026-09-14 (Этап 2 закрыт, Этап 3 в работе):** z2m (16 устройств), mbusd (порт 502), modbus-bridge (MQTT + HA-опрос) — все развёрнуты аддонами и **работают**. В HA добавлена **MQTT-интеграция** (её не было → z2m/bridge не создавали сущности; стало 104 сущности, 69 Zigbee). Этап 3 — перенос HA-конфига с TrueNAS (разведка выполнена, решения приняты, ждём ответа Alex по HACS / схеме Zigbee-имён). ## Основное @@ -298,6 +298,61 @@ ha apps uninstall local_ && ha store reload && ha apps install local_ 📌 В HA 2026.x аддоны в UI называются **Settings → Apps** (не «Add-ons»). Пункта «Add-ons» в меню больше нет. +## Работа с данными z2m на t610 (2026-09-14) + +**Файлы в `/config/zigbee2mqtt/`:** + +| Файл | Что это | +|---|---| +| `database.db` | база z2m (устройства, endpoints, keys) | +| `configuration.yaml` | конфиг z2m: `network_key`, `pan_id`, `ext_pan_id`, `channel`, `serial`, `mqtt`, **секция `devices:` с `friendly_name`** | +| `coordinator_backup.json` | бэкап координатора | +| `state.json` | runtime-состояние | +| `log//log.log` | логи запуска | + +**⚠️ ПИТФОЛЛ: `database.db` — это НЕ SQLite, а JSON Lines** (по одному JSON-объекту на строку, расширение `.db` обманчиво). +- `sqlite3 database.db "SELECT ..."` → **`Error: in prepare, file is not a database (26)`** — не тратить на это время. +- Читать через `jq` построчно (каждый объект = устройство): +```bash +scp root@192.168.2.176:/config/zigbee2mqtt/database.db /Users/admin/tmp-t610/z2m-live.db +jq -r 'select(.type!="Coordinator") | [.ieeeAddr, .type, (.manufName // "-")] | @tsv' /Users/admin/tmp-t610/z2m-live.db +# .ieeeAddr, .type (EndDevice/Router/Coordinator), .manufName (модель Tuya, напр. _TZ3000_gjnozsaz) +``` +- В SSH-аддоне **нет `sqlite3`** — базу копировать на Mac (`scp`) и разбирать там. + +> 📌 **`modelID` в `database.db` пустой** (не заполнился при переносе базы 1:1), но `manufName` даёт модель Tuya — по ней определяется тип устройства. + +> ⚠️ **`friendly_name` устройств z2m = hex-адрес.** Все 16 устройств в `configuration.yaml → devices:` имеют `friendly_name: '0xa4c138...'` — это состояние с TrueNAS. Отсюда технические `entity_id` в HA (`sensor.0xa4c138..._temperature`). Исправление — Этап 3, [[family/plans/t610-addons-deployment]] §«Zigbee friendly_name». + +## HA-конфиг: что где лежит (TrueNAS → t610, разведка 2026-09-14) + +**На TrueNAS** конфиг HA: `/mnt/RED_2TB/docker/ha/` (доступ: `ssh truenas_admin@mallexxx.duckdns.org`). + +**Состав (для переноса в Этапе 3):** +- `configuration.yaml` (~30 КБ), `automations.yaml`, `scripts.yaml` (~30 КБ), `secrets.yaml` +- `www/` — `card-mod.js` + `floorplan/floor1_ha.svg`, `floor2_ha.svg` +- `.storage/` — **35 файлов**, переносить **выборочно** ⚠️ +- `custom_components/` — `hacs` (2.0.5, репо пусто), `localtuya` (5.2.3, **используется**), `tuya_local` (2026.7.2, не используется) +- `home-assistant_v2.db` — 142 МБ, **не переносится** (решение: история с нуля) + +**⚠️ `.storage/` НЕ копировать целиком** — смешаны системные файлы t610 и контентные TrueNAS: +- ❌ **НЕ трогать:** `core.uuid` (подменит `instance_id`), `auth`, `auth_provider.homeassistant` (сломает логин), `http`, `http.auth`, `onboarding`, `core.config`, `core.config_entries` +- ✅ **Переносить:** `core.entity_registry` (критично!), `core.device_registry`, `core.area_registry`, `core.floor_registry`, `core.restore_state`, `lovelace.home_plan`, `lovelace_dashboards`, `lovelace_resources`, `person`, `zone` + +**Порядок критичен:** сначала реестры, **потом** (после старта HA) правка `friendly_name` в z2m и `entity_id` в HA. Переименование до переноса реестров пропадёт — HA перезапишет реестр. + +**Полезные команды разведки конфига (из SSH-аддона на t610):** +```bash +ls -la /config/ # состав HA-конфига +ls /config/.storage/ | wc -l # число файлов реестра +jq -r '.data.entries[].domain' /config/.storage/core.config_entries | sort | uniq -c # какие интеграции подключены +jq -r '.data.entities | length' /config/.storage/core.entity_registry # число сущностей +cat /config/.HA_VERSION # версия HA +``` +На TrueNAS аналогично, путь `/mnt/RED_2TB/docker/ha/` (читать под `truenas_admin`). + +> 📌 **Как узнать, используется ли интеграция:** `jq -r '.data.entries[].domain' core.config_entries` — если домена нет, компонент не подключён (напр. `tuya_local` стоял в файлах, но config entry отсутствовал → не использовался). + ## Связанные заметки - [[family/plans/home-automation-migration-t610]] — план миграции (родительский) - [[family/plans/t610-addons-deployment]] — развёртывание аддонов diff --git a/family/plans/home-automation-migration-t610.md b/family/plans/home-automation-migration-t610.md index 83c24546..4c37d4d2 100644 --- a/family/plans/home-automation-migration-t610.md +++ b/family/plans/home-automation-migration-t610.md @@ -19,7 +19,7 @@ related: --- # Перенос домашней автоматизации на HP t610 -> **Статус: В ПРОЦЕССЕ. Этап 1 ✅. Этап 2 ✅ ПОЛНОСТЬЮ ВЫПОЛНЕН (z2m — 16 устройств, mbusd — порт 502, modbus-bridge — MQTT + HA-опрос, MQTT-интеграция в HA добавлена). Следующий шаг — Этап 3 (перенос HA-конфига + `.storage/`).** +> **Статус: В ПРОЦЕССЕ. Этап 1 ✅. Этап 2 ✅ ПОЛНОСТЬЮ ВЫПОЛНЕН (z2m — 16 устройств, mbusd — порт 502, modbus-bridge — MQTT + HA-опрос, MQTT-интеграция в HA добавлена). Этап 3 (перенос HA-конфига + `.storage/`) 🔄 В РАБОТЕ — разведка выполнена, решения приняты (БД с нуля, реестры заменить, HACS на согласовании, Zigbee-имена чистить); ждём ответа Alex.** > Цель: убрать всю домашнюю автоматизацию с TrueNAS (он перегружен — 17/21 ГБ RAM) на выделенный HP t610, с бэкапом конфигов на TrueNAS и в git. > > **Прогресс 2026-09-14 (вечер) — Этап 2 ЗАКРЫТ, Modbus-сервисы работают:** @@ -320,7 +320,8 @@ services: restart: unless-stopped ``` > ⚠️ `HA_TOKEN` — long-lived token. **После переноса HA на t610 — сгенерировать НОВЫЙ токен** в HA (Профиль → Security → Long-lived tokens), т.к. старый привязан к прежней инсталляции. -> 📌 **Подтверждено на практике 2026-09-14:** токен, выпущенный другим инстансом, отвергается с **401** — HA сверяет `iss` в JWT с `instance_id` (см. [[family/plans/t610-addons-deployment]] §«ПИТФОЛЛ: HA-токен с чужим iss»). +> ✅ **Проверка токена — только по HTTP-коду:** `curl -o /dev/null -w '%{http_code}' -H "Authorization: Bearer $T" http://192.168.2.176/api/` → **200** ок, **401** негодный. +> ❌ **ЛОЖНЫЙ СЛЕД (не повторять, 2026-09-14):** версия «HA сверяет `iss` в JWT с `instance_id`» — **НЕВЕРНА**. У рабочего токена `iss=e75d1d6f…`, `core.uuid=d3b24dad…` — не совпадают, и это норма. Токен, выпущенный другим инстансом, даёт 401 по другой причине; единственный надёжный критерий — HTTP-код на `/api/`. Детали: [[family/plans/t610-addons-deployment]] §«HA MQTT-интеграция + `ha.url`». ### 5.6 Home Assistant config diff --git a/family/plans/t610-addons-deployment.md b/family/plans/t610-addons-deployment.md index 8bfe7193..5f5db175 100644 --- a/family/plans/t610-addons-deployment.md +++ b/family/plans/t610-addons-deployment.md @@ -16,7 +16,7 @@ related: --- # t610 — развёртывание через HA-аддоны -> **Статус (2026-09-14): Этап 1 ✅. Этап 2 ✅ ПОЛНОСТЬЮ (все 3 USB подключены, привязка by-path + `uart: true`, z2m работает — 16 устройств, mbusd работает — порт 502, modbus-bridge работает — MQTT + HA-опрос, в HA добавлена MQTT-интеграция). Следующий шаг — Этап 3 (перенос HA-конфига).** +> **Статус (2026-09-14): Этап 1 ✅. Этап 2 ✅ ПОЛНОСТЬЮ (все 3 USB подключены, привязка by-path + `uart: true`, z2m работает — 16 устройств, mbusd работает — порт 502, modbus-bridge работает — MQTT + HA-опрос, в HA добавлена MQTT-интеграция). Этап 3 🔄 В РАБОТЕ — разведка выполнена, решения приняты (БД с нуля, реестры заменить, HACS на согласовании, Zigbee-имена чистить), ждём ответа Alex по 3 вопросам (HACS / схема имён / порядок).** > Родительский план: [[family/plans/home-automation-migration-t610]] (Шаг 3 в нём заменяется на этот документ). > Доступ к хосту, CLI и питфоллы: [[family/how-to/t610-access]]. @@ -245,10 +245,86 @@ curl -s -X POST -H "Authorization: Bearer $T" -H "Content-Type: application/json **Рабочий рецепт диагностики сборки:** `ha apps install ` → при ошибке `ha supervisor logs | tail -60` (там полный вывод docker build). -### Этап 3 — перенос HA-конфига -15. [ ] Перенести `configuration.yaml`, `automations.yaml`, `scripts.yaml`, `secrets.yaml`, `www/` -16. [ ] Перенести `.storage/` (критично: `core.entity_registry`, `lovelace.home_plan`) — см. родительский план §5.6 -17. [ ] Поправить `modbus.host` → `127.0.0.1` (mbusd теперь локальный) +### Этап 3 — перенос HA-конфига — 🔄 В РАБОТЕ (разведка 2026-09-14, решения приняты) + +**Решения Alex (2026-09-14):** +- **История БД (`home-assistant_v2.db`, 142 МБ) — НЕ переносить**, начинаем с нуля. +- **Реестры `.storage` — ЗАМЕНИТЬ** (вариант B: взять реестры TrueNAS целиком, а не сливать). Zigbee-сущности пересоздадутся z2m автоматически по `database.db` + discovery. Минус: переименования `entity_id`, сделанные в UI на TrueNAS, потеряются. +- **HACS и custom_components — на согласование** (см. §«Инвентарь custom_components»). +- **Zigbee generic-имена — привести к единому виду, пока реестр чистый** (см. §«Zigbee friendly_name»). + +#### Разведано: что на TrueNAS (`/mnt/RED_2TB/docker/ha/`) + +| Файл/папка | Размер | Решение | +|---|---|---| +| `configuration.yaml` | 29 954 б (~30КБ) | ✅ переносить + правка `modbus.host` | +| `automations.yaml` | 7 045 б | ✅ переносить | +| `scripts.yaml` | 30 728 б | ✅ переносить | +| `secrets.yaml` | 161 б | ✅ переносить | +| `scenes.yaml` | 0 б | пусто, можно не тащить | +| `www/card-mod.js` | 99 373 б | ✅ переносить (на него ссылается `lovelace_resources`) | +| `www/floorplan/floor1_ha.svg`, `floor2_ha.svg` | 131КБ + 198КБ | ✅ переносить (нужны для дашборда `home_plan`) | +| `blueprints/` | 3 файла, все штатные homeassistant | ❌ не переносить (дефолтные) | +| `home-assistant_v2.db` | 142 МБ (+`-wal` 1.9МБ) | ❌ **не переносить** (решение: с нуля) | +| `home-assistant_v2.db.corrupt.2026-04-30*` | 152 МБ | ❌ не переносить | +| `.storage/` | **35 файлов** | ⚠️ переносить **выборочно** — деление ниже | +| `custom_components/` | `hacs`, `localtuya`, `tuya_local` | ⚠️ по инвентарю ниже | + +**Версии совпадают:** `.HA_VERSION` на TrueNAS и на t610 = **2026.9** (t610: `2026.9.2`) → миграция реестров допустима. + +#### `.storage` — что НЕЛЬЗЯ перезаписывать + +⚠️ **Копировать `.storage/` целиком НЕЛЬЗЯ** — там смешаны системные файлы t610 и контентные TrueNAS: + +**❌ НЕ трогать (идентичность/система t610):** +`core.uuid` (подменит `instance_id`), `auth`, `auth_provider.homeassistant` (сломает логин `ha_admin`), `http`, `http.auth`, `onboarding`, `core.config`, `homeassistant.exposed_entities`, `core.config_entries` (там уже правильная MQTT-интеграция t610). + +**✅ Переносить (контент):** +- **`core.entity_registry` — КРИТИЧНО** (без него `entity_id` не совпадут с `configuration.yaml`) +- `core.device_registry`, `core.area_registry`, `core.floor_registry`, `core.restore_state` +- `lovelace.home_plan` (+ `.bak`, `.bak2`), `lovelace_dashboards`, `lovelace_resources` +- `hacs.*` (если HACS переносим), `person`, `zone` + +#### Инвентарь `custom_components` (на согласование) + +| Компонент | Версия | Config entry | Решение | +|---|---|---|---| +| `localtuya` | 5.2.3 | ✅ **есть** (Tuya-облако: client_id/secret, devices, region, user_id) | ✅ **переносить обязательно** | +| `hacs` | 2.0.5 | ✅ есть, но **репозиториев НЕТ** (`hacs.repositories` пуст) | ⚠️ на согласование | +| `tuya_local` | 2026.7.2 | ❌ нет | ❌ не переносить | + +**`localtuya` ставился вручную** (не через HACS — репо HACS пусто). Он реально используется → перенос обязателен, иначе потеряются Tuya-устройства. + +#### Порядок работ Этапа 3 (важно — не перепутать) + +1. **Бэкап** текущего `/config` t610 → Mac (`~/tmp-t610/config-t610-backup-<дата>/`) +2. **Бэкап** нужного с TrueNAS → Mac +3. `ha core stop` (иначе HA перезапишет `.storage` при выходе) +4. Перенести реестры `.storage` (замена, выборочно по списку выше) +5. Перенести `configuration.yaml` + правка `modbus.host` → `127.0.0.1` +6. Перенести `automations.yaml`, `scripts.yaml`, `secrets.yaml`, `www/` +7. Перенести `custom_components/` (по согласованию) +8. Старт HA, проверка: конфиг валиден, сущности на месте, автоматизации, дашборд `home_plan` +9. **ТОЛЬКО ПОСЛЕ этого** — правка `friendly_name` в z2m + чистка `entity_id` в HA + +> ⚠️ Порядок шагов 4 → 9 критичен: если переименовать z2m до переноса реестров, работа пропадёт (HA перезапишет реестр). + +#### ✅ Zigbee `friendly_name` — корень generic-имён (разведка 2026-09-14) + +**Найден корень:** в z2m **ВСЕ 16 устройств имеют `friendly_name` = свой hex-адрес** (`0xa4c13862d39377e6` и т.д.). Это состояние приехало с TrueNAS — HA их так не называл. + +- Проверено в `/config/zigbee2mqtt/configuration.yaml` (секция `devices:`) — у всех 16 `friendly_name: ''`. +- В `core.entity_registry` на TrueNAS: `entity_id` вида `sensor.0xa4c13862d39377e6_temperature`, но `original_name`/`name` **уже человеческие** («Температура», «Влажность»). +- Отдельная категория — вообще без имени: `switch.0xa4c138f8da8bc478` (`original_name` пусто), `switch.0xcc86ecfffe1347fd`, `switch.0x84fd27fffed9e137`, `update.0xa4c138f8da8bc478`, `light.0xa4c13882a4b42db0`. + +**Корневой механизм:** `entity_id` в HA формируется при **первом появлении** сущности и от `friendly_name` z2m. Уже созданные `entity_id` в реестре **НЕ переименовываются автоматически** при смене `friendly_name`. Поэтому нужны **две операции**: (а) `friendly_name` в z2m, (б) переименование `entity_id` в `core.entity_registry` HA. + +**Модели (из `database.db`, JSON-lines — НЕ sqlite):** `modelID` пуст, но `manufName` даёт модель Tuya: `_TZ3000_akqdg6g7`, `_TZ3000_gjnozsaz`, `_TZ3000_3a9beq8a`, `_TZ3000_hy6ncvmw`, `_TZE200_crq3r3la`, `_TZ3000_0e6uvexf`, `_TZ3000_5gey1ohx`, `_TZ3000_odzoiovu`, `_TZ3000_kvwrdf47`, `_TZ3210_nhqka112`, `_TZ3000_kccru4oi`, `_TZ3000_ooc8illt`, `_TZE204_qasjif9e`, `Zbeacon` (протечка). + +> 📌 **Питфолл:** база z2m `database.db` — это **JSON Lines** (объект на строку), НЕ SQLite. `sqlite3 database.db` → `file is not a database`. Читать: `jq -r 'select(.type!="Coordinator") | [.ieeeAddr,.type,.manufName] | @tsv' z2m-live.db`. +> Также в SSH-аддоне **нет `sqlite3`** — базу копировать на Mac (`scp` → `/Users/admin/tmp-t610/z2m-live.db`). + +**Предлагаемая схема имён (на согласование с Alex):** `room_device` в латинице snake_case (напр. `dining_co2`, `kids_motion`, `bedroom_temp`) — кириллица в `entity_id` нежелательна. **Ждём подтверждения схемы от Alex перед переименованием.** ### Этап 4 — проверка и отключение TrueNAS 18. [ ] Чек-лист из родительского плана §6