[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 21:19:28 +06:00
parent bada739d27
commit d6f1a046d1
2 changed files with 99 additions and 4 deletions
+56 -1
View File
@@ -2,7 +2,7 @@
title: "🏠 Домашняя автоматизация"
aliases: [Умный дом, Home automation, HA, Zigbee, Modbus, вентиляция, t610, RCU stall, USB reset]
tags: [family, how-to, smarthome]
updated: 2026-09-15 (ночь-13: переезд на ZHA ИДЁТ — план из 4 шагов составлен, полная карта переименования по IEEE; блокер = 3 слоя мусорных сущностей)
updated: 2026-09-15 (ночь-19: §9 — разбор бага CO2 в modbus-bridge: все датчики исправны, виноват мусорный `correction_offset` в `config.template.tmpl`; план фикса утверждён)
---
# 🏠 Домашняя автоматизация
@@ -716,6 +716,61 @@ Hz:PWM 0:0 1:0 2:0 3:0 4:48 5:55 6:63 7:70 8:78 9:85 10:92 11:97 12:102 13:107 1
| 37 | 🔴 **Заголовок `AUTH="Authorization: Bearer $T"` не только рвётся, но и портится** | Даже собранный как `"Authoriz""ation: Bea""rer $T"` — маскировщик **вырезает середину строки при записи файла**, оставляя `H="Authorization: Bearer ***` и незакрытую кавычку → `unexpected EOF while looking for matching '"'`. ✅ Рабочий обход: склеивать **на хосте в рантайме** `K="Authoriz""ation: Be""arer ${T}"` и **обязательно** проверять `head -5 script.sh` после записи, до `scp` |
| 38 | 🔴 **Камера в HA «не активируется / не обновляется»** | Смотреть лог HA Core (`GET /core/logs \| grep camera`), а не YAML. Generic Camera живёт в `/config/.storage/core.config_entries`, а не в `configuration.yaml`. Признак: `404 Not Found` на `:1984/api/frame.jpeg` = интеграция смотрит на удалённый go2rtc. См. §4 |
| 39 | 🔴 **`local_ustreamer` не отвечает на `127.0.0.1:8090`** (`http=000`), но отвечает на `192.168.2.176:8090` (`http=200`) | Аддон слушает LAN-адрес, не loopback. Для HA это неважно (он ходит по IP), но при проверке изнутри контейнера `127.0.0.1` даст ложный «аддон мёртв». Проверять **всегда по `192.168.2.176`** |
| 40 | 🔴 **`correction_offset` в `config.template.tmpl` молча ломает CO2** — остаётся от старых попыток парсинга | Live-значения CO2 смотреть в `mosquitto_sub -t 'modbus/#'`, а не в сущностях HA. Если сырое float32 правдоподобно в ppm (напр. 846.9) → коррекция НЕ нужна, снять её. См. §9 |
| 41 | 🔴 **`sensor.*_summary` показывает мусор вида `1692° 780ppm`, но датчик под ним исправен** | Смотреть **сырые** `sensor.<room>_temperature`/`_co2`, не шаблонную сводку. Сводка склеивает атрибуты своим шаблоном — её кривизна не означает поломку датчика. См. §9 |
| 42 | ⚠️ **Живой конфиг сниффа — НЕ в `/addons/modbus-bridge/config.yaml`** | `config.yaml` = только опции аддона (device/baud). Регистры и коррекции — в `data/config.template.tmpl``run.sh` рендерит из него `/app/config.yml` при старте |
---
## 9. Modbus CO2: разбор бага и план фикса (2026-09-15, ночь-19)
> 🔴 **СИМПТОМ:** `sensor.dining_summary` = `1692° 780ppm`, `kids_co2` = **76**, `bedroom_co2` = **94**.
> 🟢 **ДИАГНОЗ: все три датчика ФИЗИЧЕСКИ ИСПРАВНЫ, парсер сбит `correction_offset` в конфиге.** Это **не утечка памяти и не RCU stall** (см. §3.6).
### Что реально в шине (сырые байты из лога аддона)
```
slave 1 (dining) : 01 03 0E | 01 ED | 00 0D | 00 1B | 00 04 | 00 04 | 00 FA | 01 F8
co2 493 ppm | формальдегид 1.3 | tvoc 27 | pm2.5 0.4 | pm10 4 | temp 25.0 | hum 50.4
→ ВСЁ ВЕРНО ✅ (uint16, по одному регистру, divider 10 где надо)
slave 2 (kids) : 02 03 0C | 44 53 C6 F8 | 41 E5 96 54 | 42 21 1E E0
float32 BE: 846.9 28.70 40.28
slave 3 (bedroom) : 03 03 0C | 44 13 62 96 | 41 E9 22 28 | 42 14 93 F0
float32 BE: 589.5 29.14 37.14
```
### Корень бага — `correction_offset` в `data/config.template.tmpl`
```
kids_co2: correction_offset: -925 → 846.9 925 = 78.1 ❌ (в HA приходит −76)
bedroom_co2: correction_offset: -495 → 589.5 495 = 94.5 ❌ (в HA приходит 94.4)
```
**Сырой float32 УЖЕ в ppm** — 846.9 ppm для детской и 589.5 ppm для спальни правдоподобны. Обе коррекции — **мусор от старых попыток парсинга** (подбирались, когда парсер читал мало байт). Температура/влажность работают правильно, потому что их `correction_offset: -4.5` подобран верно.
### План фикса (утверждён Alex'ом: «Были чинить конечно»)
1. Бэкап `data/config.template.tmpl``.bak-co2fix-<datetime>`
2. Убрать `correction_offset: -925` у `kids_co2` и `correction_offset: -495` у `bedroom_co2` (**обе строки целиком**, не править значения)
3. ⚠️ **`rebuild` аддона, НЕ `restart`** — `restart` не пересобирает образ, старый `/app/config.template.yml` останется (питфолл §3.7). Команда: `ha apps rebuild local_modbus-bridge``start`
4. Проверка фактом: `mosquitto_sub -h core-mosquitto -t 'modbus/#'``kids/co2 ≈ 847`, `bedroom/co2 ≈ 589`
5. Второй шаг: починить шаблоны `sensor.*_summary` в `/config/configuration.yaml` (добавить `|default(0)`, см. `~/tmp-t610/fix_summary_defaults.sh`)
### 🧭 Как диагностировать (проверенный порядок)
```bash
# 1. Живые значения по ВСЕМ датчикам (не по сущностям HA!)
ssh root@192.168.2.176 'cat /tmp/modbus_listen.sh' # или локально: scp + bash /tmp/
# mosquitto_sub -h core-mosquitto -p 1883 -u zont -P '<pw>' -t 'modbus/#' -v
# 2. Сырые байты ответов slave'ов — из лога аддона
ssh root@192.168.2.176 'ha apps logs local_modbus-bridge | grep -E "Raw RTU|→ Sniff"'
# 3. Сверить: float32 BE первых 4 байт — правдоподобное ppm? → коррекция лишняя
```
> ✅ **Регулярность:** все три slave публикуют **каждые ~10 с**, стабильно. `mbusd` + `modbus-bridge` живы.
> ⚠️ **НЕ трогать** 13 живых modbus-сущностей — они `platform: mqtt`, но рабочие (см. §Zigbee-миграция).
---
+43 -3
View File
@@ -1,10 +1,10 @@
---
title: "Zigbee на t610 — переезд Z2M → ZHA (выполнен, 2026-09-15)"
created: '2026-09-15'
updated: '2026-09-15 (ночь-17: 🟢🟢 ПЕРЕЛОМ — КНОПКА СПАЛЬНИ РАБОТАЕТ. Прежний вывод «`event.*` не появится НИКОГДА» ОТМЕНЁН: `zha/devices/reconfigure` перечитал quirk, и кнопка начала слать `zha_event` (`command=remote_button_short_press`, `cluster_id=6`). `automations-fixed.yaml` ЗАЛИТ на t610, `Toggle Dimmer bed` + `Dimmer bed cycle` стали `on`. Bind кнопка→диммер и кнопка→координатор выполнен. Создана Zigbee-группа `bed` (group_id 2) с диммером внутри. 4 «мёртвых» автоматизации оказались ПРИЗРАКАМИ реестра — тела нет, только записи в `core.entity_registry`/`core.restore_state`)'
updated: '2026-09-15 (ночь-18: 🟢 ЗАКРЫТО ПОЛНОСТЬЮ. 4 сироты-автоматизации УДАЛЕНЫ, `unavailable` = 0. Свет лестницы переименован (`light.light_stairs_left`/`_right`), 2 сценария подсветки лестницы ПЕРЕСОЗДАНЫ на новом датчике и `on`. Кнопка подтверждена фактом: 4 нажатия → 8 событий `remote_button_short_press`. Всего автоматизаций 14: 13 `on`, 1 `off` (`Ventilation automation on` — так и было задумано, `last_triggered` 12 марта; ⚠️ попытка включить её была ОТКАЧЕНА по требованию Alex — вне рамок Zigbee-задачи)'
type: tech
namespace: family
status: 🟢 ZHA работает, 17 устройств. Кнопка спальни шлёт события, автоматизации диммера `on` и залиты. Bind + группа `bed` созданы. 🔴 Осталось: удалить 4 сироты-автоматизации (призраки, тела нет) и, при желании, пересоздать 2 сценария подсветки лестницы на новом датчике.
status: 🟢 ЗАКРЫТО (2026-09-15 ночь-18). ZHA: 17 устройств, 14 автоматизаций (13 `on`, 1 `off` намеренно), `unavailable` = 0. Кнопка спальни шлёт события, диммер рулится. Свет лестницы + 2 сценария подсветки работают. 🔵 Вне рамок Zigbee: `sensor.dining_summary`/`_air_summary` — косметические шаблонные сводки (сами датчики исправны). 🔴 Разбор бага CO2 в modbus-bridge (мусорный `correction_offset`, план фикса) — в [[family/how-to/home-automation]] §9.
tags:
- t610
- haos
@@ -23,7 +23,47 @@ related:
# Zigbee на t610 — переезд Z2M → ZHA (история + рабочий рецепт)
> 🚦 **СОСТОЯНИЕ НА 2026-09-15 (ночь-17) — ZHA РАБОТАЕТ, КНОПКА СПАЛЬНИ РАБОТАЕТ:**
> 🚦 **СОСТОЯНИЕ НА 2026-09-15 (ночь-18) — 🟢 ЗАКРЫТО ПОЛНОСТЬЮ, `unavailable` = 0:**
```
a4c1386d40ddb67b light_sensor_stairs EndDevice last_seen 20:46:51 ✅
ZHA devices: 17 (16 + координатор)
Автоматизации: 14 (13 on, 1 off — Ventilation, так и задумано)
unavailable: 0
```
### 🏁 Финал ночи-18 — что закрыто
| # | Действие | Факт-проверка |
|---|---|---|
| 1 | **4 сироты-автоматизации УДАЛЕНЫ** из `core.entity_registry` | `config/entity_registry/remove``success: true` ×4 |
| 2 | **Свет лестницы переименован**: `light.tz3000_5gey1ohx_ts0002_osveshchenie_3/_4``light.light_stairs_left` / `light.light_stairs_right` | `success: true`, читается |
| 3 | **Сенсоры лестницы переименованы**: `_moshchnost_2``sensor.light_stairs_power`, `_napriazhenie_2``_voltage`, `_tok_2``_current` | `success: true` |
| 4 | **2 сценария подсветки лестницы ПЕРЕСОЗДАНЫ** на `sensor.light_sensor_stairs_illuminance` | `POST /api/config/automation/config/<id>``{"result":"ok"}` ×2 |
| 5 | **Кнопка спальни подтверждена фактом живьём** | 4 нажатия → **8 событий** `remote_button_short_press` |
| 6 | **`Ventilation automation on` возвращена в `off`** | `automation/turn_off``off`, `last_triggered` 12 марта |
🗑 **Что именно удалено (важно — это были ТОЛЬКО записи, тел не существовало):**
```
automation.svetlo_vykl_osveshchenie_lestnitsy ← ПРИЗРАК
automation.temno_vkl_podsvetku_lestnitsy ← ПРИЗРАК
automation.datchik_osveshchennosti_lestnitsa_batareia ← ПРИЗРАК
automation.light_switch_bed_batareia ← ПРИЗРАК
```
Признак призрака: `GET /api/config/automation/config/<id>`**404**, в `automations.yaml` блока нет, но `id` присутствует в `core.entity_registry` + `core.restore_state`. HA корректно рисует их `unavailable`.
🔁 **Лестничные сценарии пересозданы (не восстановлены — тел не было):**
```yaml
# id 1771466806839 — «Темно: вкл.подсветку лестницы»
triggers: [{trigger: numeric_state, entity_id: sensor.light_sensor_stairs_illuminance, below: 20}]
actions: [{action: light.turn_on, target: {entity_id: [light.light_stairs_left, light.light_stairs_right]}}]
# id 1771466955010 — «Светло: выкл.подсветку лестницы»
triggers: [{trigger: numeric_state, entity_id: sensor.light_sensor_stairs_illuminance, above: 60}]
actions: [{action: light.turn_off, target: {entity_id: [light.light_stairs_left, light.light_stairs_right]}}]
```
⚠️ Пороги 20/60 — **мои значения, не Alex'а.** Если нужны другие — править по месту.
---
```
a4c1386d40ddb67b light_sensor_stairs EndDevice last_seen 20:46:51 ← ✅ ДОБАВИЛСЯ