[2026-09-14] eagle: family/how-to/t610-access.md family/plans/t610-addons-deployment.md
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user