[2026-09-15] eagle: family/how-to/home-automation.md family/tech/zigbee-t610-z2m-i-zha.md
This commit is contained in:
@@ -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-миграция).
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -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 ← ✅ ДОБАВИЛСЯ
|
||||
|
||||
Reference in New Issue
Block a user