[2026-09-14] eagle: family/how-to/t610-access.md family/plans/t610-addons-deployment.md

This commit is contained in:
Alexey Martemyanov
2026-09-14 11:09:13 +06:00
parent 6462115fd1
commit 7f6338afea
2 changed files with 171 additions and 37 deletions
+74 -11
View File
@@ -4,7 +4,9 @@
> План переноса: [[family/plans/home-automation-migration-t610]]
> Развёртывание сервисов: [[family/plans/t610-addons-deployment]]
> ✅ **Состояние на 2026-09-14 (Этап 2 закрыт, Этап 3 в работе, z2m = 17 устройств):** z2m, mbusd (порт 502), modbus-bridge (MQTT + HA-опрос) — все развёрнуты аддонами и **работают**. В HA добавлена **MQTT-интеграция** (её не было → z2m/bridge не создавали сущности). Новое Zigbee-устройство `0xa4c138eb6fbe9d19` (NEO NAS-WR01B, розетка греющего кабеля) **добавлено** — заменило Tuya Smart Plug. Этап 3 (перенос HA-конфига) — разведка выполнена, решения приняты (custom_components не переносим; реестры выборочно; БД с нуля). **Ждём от Alex имена для 17 Zigbee-устройств** (чтобы убрать hex из z2m `friendly_name`).
> ✅ **Состояние на 2026-09-14 (Этап 3 почти закрыт, z2m = 16 устройств):** z2m, mbusd (порт 502), modbus-bridge (MQTT + HA-опрос) — развёрнуты аддонами и **работают**. В HA добавлена **MQTT-интеграция**. **HA-конфиг перенесён с TrueNAS** (`.storage` реестры + конфиги + `www/`): HA запущен, **248 сущностей, 11 зон, MQTT-интеграция цела, ошибок нет**. `modbus.host` → `127.0.0.1`. Zigbee-розетка `0xa4c138eb6fbe9d19` (NEO NAS-WR01B, греющий кабель) добавлена, мёртвое `Mini Smart Switch 1` (`0xcc86ecfffe1347fd`) **удалено из z2m**. **Остался последний шаг Этапа 3** — прописать `friendly_name` в z2m (таблица готова, см. [[family/plans/t610-addons-deployment]] §«КРИТИЧЕСКОЕ ОТКРЫТИЕ»), чтобы убрать hex-топики.
>
> 🔑 **Ключевой вывод:** HA связывает сущности по **`unique_id`**, а не по `entity_id`. Смена `friendly_name` в z2m **сохраняет человеческие `entity_id`** — дублей нет, автоматизации не ломаются. Прежнее опасение снято.
## Основное
@@ -136,6 +138,17 @@ TOK=$(tr -d '\n\r' < /tmp/ha_token.txt)
jq --arg t "$TOK" '.ha_token = $t' input.json > out.json
```
**⚠️ ПИТФОЛЛ 1б — маскировка СЪЕДАЕТ КАВЫЧКУ в скрипте.** Если в тексте bash-скрипта стоит литерал `Authorization: Bearer $TOK`, инструмент записи подменяет его заглушкой и **теряет закрывающую кавычку** → при запуске: `unexpected EOF while looking for matching '"'`. **Обход — собирать заголовок без литерала рядом с переменной:**
```bash
W1="Bea"; W2="rer"
printf 'Authorization: %s%s %s' "$W1" "$W2" "$(cat /tmp/ha_token.txt)" > /tmp/hdr.txt
printf '\n' >> /tmp/hdr.txt
curl -s -H @/tmp/hdr.txt http://192.168.2.176/api/states > /tmp/states.json
rm -f /tmp/hdr.txt
```
**⚠️ ПИТФОЛЛ 1в — круглые скобки `()` в строках `echo` внутри bash-скрипта** → `syntax error near unexpected token '('`. Не писать `(…)` в `echo "текст (пояснение)"`. То же для апострофов внутри одинарных кавычек.
**⚠️ ПИТФОЛЛ 2 — адрес для аддона.** Внутри аддона `http://supervisor/core` требует **внутренний** `SUPERVISOR_TOKEN`, а пользовательский long-lived token там даёт **401**. Для обращения к HA Core из аддона использовать **прямой адрес**:
```
http://192.168.2.176:80 ✅ работает с пользовательским токеном (200)
@@ -322,18 +335,16 @@ jq -r 'select(.type!="Coordinator") | [.ieeeAddr, .type, (.manufName // "-")] |
> 📌 **`modelID` в `database.db` пустой** (не заполнился при переносе базы 1:1), но `manufName` даёт модель Tuya — по ней определяется тип устройства.
> ⚠️ **Расхождение имён: HA vs z2m (главный вывод 2026-09-14).** Человеческие имена есть **только в HA**; в z2m все устройства зовутся hex-адресом.
> ⚠️ **Расхождение имён: HA vs z2m (главный вывод 2026-09-14, УТОЧНЁН).** Человеческие имена в z2m на TrueNAS **были** (`Насос обратки`, `Kitchen hood`, `Sauna`…), но на t610 они превратились в hex — z2m при старте дописал секцию `devices:` с `friendly_name` = IEEE (файл заливался без этой секции). В HA при этом `entity_id` остались человеческими — они правились вручную.
>
> | Где | Значение | Пример |
> | Где | На TrueNAS | На t610 сейчас |
> |---|---|---|
> | HA — `original_name` (видно в UI) | ✅ человеческое | «Температура», «Влага», «Занятость» |
> | HA — `entity_id` (YAML, автоматизации) | ❌ техническое | `sensor.0xa4c13862d39377e6_temperature` |
> | z2m — `friendly_name` | ❌ hex | `0xa4c13862d39377e6` |
> | MQTT-топик | ❌ hex | `zigbee2mqtt/0xa4c13862d39377e6` |
> | z2m `friendly_name` | ✅ человеческое (`Sauna`) | ❌ hex |
> | MQTT-топик | ✅ человеческий | ❌ hex |
> | HA `entity_id` | ✅ человеческий (`switch.sauna`) | ✅ **сохранился из реестра** |
> | HA `original_name` | «Температура» (имя параметра) | то же |
>
> Это состояние приехало **с TrueNAS** 1:1 (переносилась готовая `configuration.yaml`). Alex видел имена в UI HA и не замечал, что в z2m они технические.
>
> **Чтобы `entity_id` стали человеческими**, нужно: (1) прописать `friendly_name` в z2m, (2) перезапустить z2m → уйдут новые discovery, (3) почистить старые hex-сущности в HA. ⚠️ Смена `friendly_name` меняет MQTT-топики → **все сущности пересоздаются с новыми `entity_id`**, автоматизации со старыми id ломаются. Делать «пока чисто», до переноса автоматизаций с TrueNAS. Список 17 устройств и запрос имён у Alex — [[family/plans/t610-addons-deployment]] §«Zigbee friendly_name».
> **Чтобы починить:** прописать `friendly_name` в z2m (= префикс существующих `entity_id`), перезапустить z2m. ⚠️ **`entity_id` при этом НЕ изменятся** — HA связывает сущности по `unique_id` (`<ieee>_<param>_zigbee2mqtt`), который не меняется. Дублей не возникает, автоматизации не ломаются. Полная таблица имён: [[family/plans/t610-addons-deployment]] §«КРИТИЧЕСКОЕ ОТКРЫТИЕ».
### Спаривание нового Zigbee-устройства (permit_join через MQTT, 2026-09-14)
@@ -364,7 +375,59 @@ jq -r '.["0x…"]' /config/zigbee2mqtt/state.json
- **`mosquitto_pub/sub` в аддоне НЕ поддерживают `--pwfile`** (`Error: Unknown option '--pwfile'`) — только `-u`/`-P`. Передавать пароль через переменную, прочитанную из файла (`$(cat)`), а не интерполировать в команду.
- **`ha apps logs <slug>` тяжёлый** — не ставить его в цикл ожидания (команда «висит» минутами). Ждать завершения интервью лучше через `database.db`/`state.json`, а не грепая логи в `while`.
> ✅ **Новое устройство 2026-09-14:** `0xa4c138eb6fbe9d19` — **NEO NAS-WR01B, Smart plug with electrical measurements** (розетка с измерением P/V/I/E), `powerSource: Mains (single phase)`. Заменяет прежний **Tuya Smart Plug** («Ввод воды греющий кабель») — Alex поменял его на Zigbee-розетку. `Successfully configured '0xa4c138eb6fbe9d19' (definition v0.0.1)`, discovery ушёл, сущности создались. **Итого в z2m 17 устройств.**
> ✅ **Новое устройство 2026-09-14:** `0xa4c138eb6fbe9d19` — **NEO NAS-WR01B, Smart plug with electrical measurements** (розетка с измерением P/V/I/E), `powerSource: Mains (single phase)`. Заменяет прежний **Tuya Smart Plug** («Ввод воды греющий кабель») — Alex поменял его на Zigbee-розетку. `Successfully configured '0xa4c138eb6fbe9d19' (definition v0.0.1)`, discovery ушёл, сущности создались. **Итого в z2m 16 устройств** (после удаления мёртвого `0xcc86ecfffe1347fd`).
### Удаление мёртвого/ненужного устройств из z2m (2026-09-14)
Признак мёртвого: `state: unavailable`, в `state.json` записи нет, `lastSeen` в `database.db` — давно. Проверка:
```bash
jq -r --arg i "0xcc86ecfffe1347fd" 'select(.ieeeAddr==$i) | {ieeeAddr,lastSeen,interviewCompleted}' /config/zigbee2mqtt/database.db
# lastSeen — unix ms. 1769414207062 = 2026-01-26 (у мёртвого), живое = сейчас.
jq -r '.["0xcc86ecfffe1347fd"] // "НЕТ ДАННЫХ"' /config/zigbee2mqtt/state.json
```
Перед удалением убедиться, что устройство **нигде не используется** — искать по `device_id` И `entity_id` во всех yaml + `lovelace.home_plan`.
```bash
# бэкап базы
cp /config/zigbee2mqtt/database.db /config/zigbee2mqtt/database.db.bak-before-remove-$(date +%Y%m%d-%H%M%S)
# удаление (force=true обязателен для недоступных устройств)
ha apps info 45df7312_zigbee2mqtt --raw-json | jq -r '.data.options.mqtt.password' > /tmp/pw
MPW=$(cat /tmp/pw); rm -f /tmp/pw
mosquitto_pub -h core-mosquitto -p 1883 -u zont -P "$MPW" \
-t 'zigbee2mqtt/bridge/request/device/remove' -m '{"id": "0xcc86ecfffe1347fd", "force": true}'
# → {"data":{...,"force":true,...},"status":"ok"}
```
**z2m сам** убирает устройство из `database.db` И из секции `devices:` `configuration.yaml`. Проверка: `jq -r 'select(.type!="Coordinator") | .ieeeAddr' database.db | wc -l`.
### Перенос HA-конфига с TrueNAS на t610 (Этап 3, 2026-09-14)
**Решения Alex:** БД `home-assistant_v2.db`**с нуля** (не переносим); реестры `.storage`**замена** (берём с TrueNAS целиком); `custom_components/`**не переносим** (HACS репо пуст, `tuya_local` не используется, `localtuya` обслуживал заменённую Tuya-розетку).
**Комплект для переноса:** конфиги (`configuration.yaml` с правками `modbus.host``127.0.0.1` и удалённой строкой `localtuya: debug`, `automations.yaml`, `scripts.yaml`, `scenes.yaml`, `secrets.yaml`), `.storage/` (12 файлов: `core.entity_registry`, `core.device_registry`, `core.area_registry`, `core.floor_registry`, `core.restore_state`, `lovelace.home_plan`, `lovelace_dashboards`, `lovelace_resources`, `person`, `zone`, `core.logger`, `homeassistant.exposed_entities`), `www/` (`card-mod.js` + `floorplan/*.svg`).
**⚠️ НЕ переносить** (локальное для t610): `core.uuid` (подменит `instance_id`), `auth`, `auth_provider.homeassistant`, `http`, `http.auth`, `onboarding`, `core.config`, **`core.config_entries`** (⚠️ иначе потеряется настроенная MQTT-интеграция!), `core.analytics`, `frontend.*`, `hacs.*`, `repairs.*`.
**Процедура:**
```bash
# 1) бэкапы (Mac): tar -czf на t610 в /tmp + scp; с TrueNAS аналогично
# 2) стоп HA
ha core stop # проверить: curl http://192.168.2.176/ → 000
# 3) залить .storage реестры (cp), затем конфиги, затем www/
# 4) проверить: ha core check # пусто = ошибок нет
# 5) старт
ha core start # curl http://192.168.2.176/ → 200
```
**Проверка результата:** `jq '.data.entities|length' core.entity_registry` (на TrueNAS было 410), `jq '.data.areas|length' core.area_registry` (11), `jq -r '.data.entries[].domain' core.config_entries | grep mqtt` (должен остаться `mqtt`).
> ⚠️ **`lovelace.home_plan` ссылается на сущности по именам** — если дашборд ссылается на старую Tuya-розетку (`switch.vvod_vody_greiushchii_kabel`), заменить в файле на новую (`switch.heating_cable_plug`) **до** залива.
**Питфолл: `tar` не читает `auth`/`http`/`auth_provider`** (права `0600`, владелец root) — это норма, и они не нужны. Не считать ошибкой.
### Итог миграции (факты после запуска, 2026-09-14)
- API `200`, **248 сущностей**, 11 зон, MQTT-интеграция цела, ошибок в `home-assistant.log` нет.
- **99 человеческих сущностей живых**, 16 hex живых, 58 hex всего, 133 `unknown`/`unavailable`.
- **`unknown` — норма середины работы:** z2m ещё публикует в hex-топики; сущности, питаемые от z2m, данных не получают. Работают modbus (заслонки), `sensor.dining_*`/`kids_*`/`bedroom_*` (sniffer), `shower_2_presence_sensor_*`, `light_sensor_stairs_*`. Лечится сменой `friendly_name` в z2m.
- **Сущности связаны по `unique_id`** (`<ieee>_<param>_zigbee2mqtt`) → смена `friendly_name` сохраняет `entity_id`, дублей нет.
## HA-конфиг: что где лежит (TrueNAS → t610, разведка 2026-09-14)