[2026-09-14] eagle: family/how-to/t610-access.md family/plans/t610-addons-deployment.md
This commit is contained in:
@@ -16,7 +16,9 @@
|
||||
> - **ссылки на `entity_id`** в автоматизациях/дашбордах — не обновляются автоматически, даже если реестр переименован (грепать `[a-z_]+\.0x[0-9a-f]{16}` **везде**, включая `platform: state`-триггеры).
|
||||
> Подробно: [[family/plans/t610-addons-deployment]] §«ДОБАВЛЕНО В КОНЦЕ СЕССИИ».
|
||||
> 🔑 **z2m не публикует состояние пассивно** — реле остаются `unknown` до первого события. Живость проверять по **`lastSeen`** в `database.db`. После рестарта HA — физически нажать кнопки.
|
||||
> 🔑 **⚠️ `unknown` после рестарта HA ВОЗВРАЩАЕТСЯ — проверено экспериментом 2026-09-14.** Зафиксировано → `homeassistant.restart` → снято: всё, что было `on`/`off`, стало `unknown` (`office_table_light_switch`, `smart_light_office`, `heating_cable_plug`, `boiler_controller_power`). **`retain: true`, `cache_state`, `cache_state_persistent`, `cache_state_send_on_startup` в z2m стоят — но retained на топиках устройств не публикуется** (контроль: `zigbee2mqtt/bridge/state` retained **есть** → брокер умеет). **Следствие: первое нажатие кнопки после рестарта не срабатывает** (`not_from: [unknown]` блокирует триггер). **Открытый фикс: убрать `not_from: [unknown]` из триггеров кнопок** — не применён. Полное описание и таблица «до/после»: [[family/plans/t610-addons-deployment]] §«ДОБАВЛЕНО В КОНЦЕ СЕССИИ» ③‑бис.
|
||||
> 🔑 **⚠️ `unknown` после рестарта HA ВОЗВРАЩАЕТСЯ — проверено экспериментом 2026-09-14.** Зафиксировано → `homeassistant.restart` → снято: всё, что было `on`/`off`, стало `unknown` (`office_table_light_switch`, `smart_light_office`, `heating_cable_plug`, `boiler_controller_power`). **`retain: true`, `cache_state`, `cache_state_persistent`, `cache_state_send_on_startup` в z2m стоят — но retained на топиках устройств не публикуется** (контроль: `zigbee2mqtt/bridge/state` retained **есть** → брокер умеет).
|
||||
> ✅ **РЕШЕНИЕ (применено 2026-09-14): `not_from: [unavailable, unknown]` убран из триггеров кнопок** в `automations.yaml`. Первое нажатие срабатывает, проверено на живом. Бэкап `/config/automations.yaml.bak-20260914-131541`.
|
||||
> 🔑 **Кэш состояний z2m лежит в `/homeassistant/zigbee2mqtt/state.json`** (НЕ в `/config/zigbee2mqtt` и не в `/addon_configs` — искать `find / -name state.json`). Плоский JSON `{ieee: {param: value}}`, пишется при каждом событии. Полное описание и таблица «до/после»: [[family/plans/t610-addons-deployment]] §«ДОБАВЛЕНО В КОНЦЕ СЕССИИ» ③‑бис.
|
||||
|
||||
## Основное
|
||||
|
||||
@@ -342,7 +344,7 @@ ha apps uninstall local_<slug> && ha store reload && ha apps install local_<slug
|
||||
| `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-состояние |
|
||||
| `state.json` | ⚠️ **в этой папке его НЕТ.** Живой кэш состояний: **`/homeassistant/zigbee2mqtt/state.json`** (искать `find / -name state.json`) — плоский JSON `{ieee: {param: value}}`, пишется при каждом событии; z2m переопубликовывает его при старте (`cache_state_send_on_startup: true`). Содержит `state_l1`/`state_l2` (TS0002) и `state_left`/`state_right` (TS0012) — именно из него видно «запомненный на момент перезагрузки» стейт реле. |
|
||||
| `log/<ts>/log.log` | логи запуска |
|
||||
|
||||
**⚠️ ПИТФОЛЛ: `database.db` — это НЕ SQLite, а JSON Lines** (по одному JSON-объекту на строку, расширение `.db` обманчиво).
|
||||
@@ -404,7 +406,7 @@ mosquitto_pub -h core-mosquitto -u zont -P "$MPW" \
|
||||
Проверка результата:
|
||||
```bash
|
||||
jq -r 'select(.ieeeAddr=="0x…") | {ieeeAddr,type,manufName,powerSource}' /config/zigbee2mqtt/database.db
|
||||
jq -r '.["0x…"]' /config/zigbee2mqtt/state.json
|
||||
jq -r '.["0x…"]' /homeassistant/zigbee2mqtt/state.json
|
||||
```
|
||||
|
||||
**⚠️ Питфоллы:**
|
||||
@@ -418,6 +420,7 @@ jq -r '.["0x…"]' /config/zigbee2mqtt/state.json
|
||||
### Удаление мёртвого/ненужного устройств из z2m (2026-09-14)
|
||||
|
||||
Признак мёртвого: `state: unavailable`, в `state.json` записи нет, `lastSeen` в `database.db` — давно. Проверка:
|
||||
`state.json` читать по пути **`/homeassistant/zigbee2mqtt/state.json`** (не `/config/zigbee2mqtt/`).
|
||||
```bash
|
||||
jq -r --arg i "0xcc86ecfffe1347fd" 'select(.ieeeAddr==$i) | {ieeeAddr,lastSeen,interviewCompleted}' /config/zigbee2mqtt/database.db
|
||||
# lastSeen — unix ms. 1769414207062 = 2026-01-26 (у мёртвого), живое = сейчас.
|
||||
|
||||
@@ -23,7 +23,7 @@ related:
|
||||
> **modbus.host исправлен: `127.0.0.1` → `192.168.2.176`** (mbusd в отдельном контейнере — `127.0.0.1` изнутри HA его не видел).
|
||||
> **modbus-bridge: HTTP 404 → 200.** Опрашивал HA по hex-`entity_id`; правился `modbus_ha_bridge.py` + `data/config.template.tmpl` + **обязательный rebuild аддона**.
|
||||
> ⚠️ **ЕДИНСТВЕННЫЙ ОСТАВШИЙСЯ БЛОКЕР (физика, не конфиг): 32 заслонки вентиляции `unavailable`.** mbusd работает (TCP отвечает), но шина **не отвечает** — exception **0x0B** (GATEWAY TARGET DEVICE FAILED TO RESPOND). Вывод: **CH340 #2 воткнут в USB, но линии A/B вентиляционной шины к нему не подключены / шина обесточена.** За Alex.
|
||||
> ⚠️ **`unknown` после рестарта HA — ПРОВЕРЕНО ЭКСПЕРИМЕНТОМ 2026-09-14, воспроизводится.** Реле/кнопки слетают в `unknown` при каждой перезагрузке HA; `retain: true` + `cache_state*` в z2m стоят, но не помогают. Практический эффект: первое нажатие кнопки после рестарта не срабатывает. **Открытый фикс: убрать `not_from: [unknown]` из триггеров** (не применён). См. §«ДОБАВЛЕНО В КОНЦЕ СЕССИИ» ③‑бис.
|
||||
> ⚠️ **`unknown` после рестарта HA — ПРОВЕРЕНО ЭКСПЕРИМЕНТОМ 2026-09-14, воспроизводится.** Реле/кнопки слетают в `unknown` при каждой перезагрузке HA; `retain: true` + `cache_state*` в z2m стоят, но не помогают. ✅ **ФИКС ПРИМЕНЁН: `not_from: [unavailable, unknown]` убран из триггеров** (`automations.yaml`, 2 шт.) — кнопка теперь срабатывает **с первого нажатия**, проверено на живом (l1 и l2, вкл+выкл). ⏳ Осталось выяснить, доходит ли cached-стейт из `state.json` до HA до первого события от устройства. См. §«ДОБАВЛЕНО В КОНЦЕ СЕССИИ» ③‑бис.
|
||||
> **✅ ЗОНЫ ВОССТАНОВЛЕНЫ (18 устройств):** при переносе `area_id` теряются так же, как `device_id` (устройства ре-регистрируются) → все 14 zigbee были **без зон**. Проставлены по эталону с TrueNAS по zigbee-адресу. См. §«ДОБАВЛЕНО В КОНЦЕ СЕССИИ» ①.
|
||||
> **✅ office-переключатель управляет светом:** устранены hex-`entity_id` **в триггерах** автоматизаций (`switch.0xa4c13873b5c1575b_l1/l2` → человеческие) + реле выведены из `unknown` физическим нажатием. Цепочка `light → switch_as_x → z2m → реле` проверена. См. §«ДОБАВЛЕНО В КОНЦЕ СЕССИИ» ②③.
|
||||
> Сервисы: z2m (14 устройств), mbusd (502), modbus-bridge (MQTT + HA-опрос), MQTT-интеграция в HA.
|
||||
@@ -946,7 +946,23 @@ curl -s -X POST -K curl.auth -H "Content-Type: application/json" \
|
||||
**Практическое следствие:** триггер `platform: state` с `not_from: [unavailable, unknown]` **не сработает на первое нажатие после рестарта** (`unknown` блокирует) — нужно второе.
|
||||
|
||||
**Фикс (точечный, не зависит от z2m):** убрать `not_from: [unknown]` из триггеров кнопок в `automations.yaml`.
|
||||
⚠️ На момент записи фикс **НЕ применён** — ожидает решения Alex (альтернатива: копать, почему `cache_state_send_on_startup` не отрабатывает — без гарантии).
|
||||
✅ **ПРИМЕНЁН И ПРОВЕРЕН 2026-09-14.** `not_from: [unavailable, unknown]` удалён из обоих офисных триггеров (`office_pass_switch_table`, `office_pass_switch_main`). Залит файл + рестарт HA. **Проверка на живом (toggle реле через z2m, эмуляция нажатия):**
|
||||
```
|
||||
mosquitto_pub … -t 'zigbee2mqtt/office_table_light_switch/set' -m '{"state_l1":"TOGGLE"}'
|
||||
→ switch.office_table_light_switch_l1: on→off
|
||||
→ light.smart_light_office_left: off→ON ✅ свет включился С ПЕРВОГО нажатия
|
||||
→ switch.smart_light_office_left: off→on (физическое реле сработало)
|
||||
```
|
||||
Оба канала (l1→`light.smart_light_office_left`, l2→`light.smart_light_office_right`) проверены на вкл и выкл. **Бэкап: `/config/automations.yaml.bak-20260914-131541`**, локально `~/tmp-t610/` + `/tmp/autom_pre.yaml`.
|
||||
|
||||
> 🔑 **Почему так, а не иначе (объяснение Alex, которое он и просил закодить):** `not_from: [unknown]` — это ЗАЩИТА, задуманная верно: при старте HA состояние = `unknown`, затем устройство присылает реальный стейт, и без защиты это выглядело бы как «переключение» → свет бы щёлкал сам. Но защита стояла **слишком широко**: она блокировала и первое НАСТОЯЩЕЕ нажатие. На TrueNAS баг не вылезал, потому что HA там почти не перезагружали.
|
||||
> **Чего хотел Alex:** «запоминать стейт на момент перезагрузки», чтобы после рестарта сразу был `on`/`off`, а не `unknown`.
|
||||
> ✅ **Этот механизм в z2m УЖЕ настроен и хранит стейт на диске.** Кэш: **`/homeassistant/zigbee2mqtt/state.json`** (не `/config/zigbee2mqtt`, не `/addon_configs/…` — проверить `find / -name state.json`) — плоский JSON `{ieee: {param: value}}`, пишется при каждом событии, среди прочего:
|
||||
> ```json
|
||||
> "0xa4c13873b5c1575b": { "state_l1": "ON", "state_l2": "ON" },
|
||||
> "0xa4c1381186ed1a32": { "state_left": "OFF", "state_right": "OFF" }
|
||||
> ```
|
||||
> При старте z2m с `cache_state_send_on_startup: true` эти значения **должны** переопубликовываться. **Остаётся открытым:** приходит ли cached-стейт к HA **до** того, как устройство пришлёт своё (тогда `unknown` не появится вовсе и `not_from` можно вернуть в узком виде). Проверяется так: рестарт HA + снятие состояния каждые 2 с → видно последовательность `unknown`→cached `ON` или `unknown`→`ON`(от устройства). **Эксперимент не доведён.**
|
||||
|
||||
> ℹ️ Датчики (t°/освещённость/радар) выходят из `unknown` сами за секунды-минуты — страдают только **реле и кнопки**.
|
||||
> ℹ️ Проверка живости узла без нажатия — `get`-запрос: `mosquitto_pub … -t 'zigbee2mqtt/<name>/get' -m '{"state_l1":""}'` → устройство отвечает текущим состоянием.
|
||||
@@ -1005,7 +1021,8 @@ curl -s -X POST -K curl.auth -H "Content-Type: application/json" \
|
||||
- [x] ✅ **ИСПРАВЛЕНО 2026-09-14 (конец сессии) — office-переключатель:** hex-`entity_id` в **триггерах** автоматизаций (`switch.0xa4c13873b5c1575b_l1/l2` → `switch.office_table_light_switch_l1/l2`); реле выведены из `unknown` нажатием кнопок. Цепочка управления светом проверена на живом.
|
||||
- [x] ✅ **УСТАНОВЛЕНО 2026-09-14 (конец сессии) — z2m не публикует состояние пассивно:** реле «залипают» в `unknown` до первого события. Живость проверять по `lastSeen` в `database.db` (JSON-lines, читать построчно).
|
||||
- [x] ✅ **ПРОВЕРЕНО ЭКСПЕРИМЕНТОМ 2026-09-14 — `unknown` возвращается после рестарта HA.** Зафиксировано состояние → рестарт → состояние снято: всё `on`/`off` слетело в `unknown`. `retain: true` + `cache_state*` в z2m стоят, но retained на топиках устройств фактически не публикуется (контроль: `bridge/state` retained есть). Питфолл: `mosquitto_sub -R` в аддоне врёт. См. §«ДОБАВЛЕНО В КОНЦЕ СЕССИИ» ③‑бис.
|
||||
- [ ] ⚠️ **ОТКРЫТО (на решение Alex): убрать `not_from: [unknown]` из триггеров кнопок** в `automations.yaml` — иначе первое нажатие после рестарта HA не срабатывает (`unknown` блокирует триггер). Альтернатива — копать `cache_state_send_on_startup`. **Фикс не применён.**
|
||||
- [x] ✅ **ВЫПОЛНЕНО 2026-09-14 (конец сессии, после объяснения Alex) — `not_from: [unavailable, unknown]` УБРАН** из триггеров `office_pass_switch_table`/`office_pass_switch_main`. Кнопка срабатывает **с первого нажатия после рестарта**; проверено на живом toggle'ом через z2m на обоих каналах. Бэкап `/config/automations.yaml.bak-20260914-131541`.
|
||||
- [ ] ⏳ **ОТКРЫТО (низкий приоритет):** выяснить, доходит ли cached-стейт из `/homeassistant/zigbee2mqtt/state.json` до HA **до** первого события от устройства. Если да — `unknown` после рестарта исчезнет вовсе, и защиту `not_from` можно вернуть в узком виде (только против фантомного переключения). Метод: рестарт HA + снятие состояния каждые 2 с.
|
||||
- [ ] ⚠️ Незакреплённое: `sensor.0xa4c138f8da8bc478_voltage/energy/power/current` (11 hex-сущностей розетки Насос обратки) — проживут ли под новым `friendly_name` или создадутся дубли; проверить после шага 8.
|
||||
|
||||
## Связанные заметки
|
||||
|
||||
Reference in New Issue
Block a user