[2026-09-16] eagle: family/documents/home-automation-wishlist.md family/how-to/ha-automations.md family/how-to/home-automation.md family/tech/kitchen-hood-fan-template.md family/tech/zigbee-t610-z2m-i-zha.md

This commit is contained in:
Alexey Martemyanov
2026-09-16 07:45:12 +06:00
parent ff5cb4d0ee
commit 0b91f2985b
5 changed files with 141 additions and 75 deletions
+2 -2
View File
@@ -2,7 +2,7 @@
title: "🏡 Умный дом — хотелки и роадмап автоматизаций" title: "🏡 Умный дом — хотелки и роадмап автоматизаций"
aliases: [Умный дом, Умный дом хотелки, Home automation, Smart home, home-automation-wishlist] aliases: [Умный дом, Умный дом хотелки, Home automation, Smart home, home-automation-wishlist]
tags: [family, lists, smart-home, tech] tags: [family, lists, smart-home, tech]
updated: 2026-09-16 (H2000_PRO: единицы °F→°C; уточнение по `heating_cable_plug`; новый расчёт греющего кабеля; 🍳 вытяжка кухни — 3 × `light.*` вместо `fan`, разбор → [[family/tech/kitchen-hood-domain-conversion]]) updated: 2026-09-16 (H2000_PRO: единицы °F→°C; уточнение по `heating_cable_plug`; новый расчёт греющего кабеля; 🍳 вытяжка кухни выведена из `light` в 🌀 `fan.kitchen_hood` → [[family/tech/kitchen-hood-fan-template]])
related: related:
- "[[family/how-to/home-automation]]" - "[[family/how-to/home-automation]]"
- "[[family/how-to/ha-automations]]" - "[[family/how-to/ha-automations]]"
@@ -38,7 +38,7 @@ related:
### 1. ⭐ Вентиляция по CO₂ — доехать до конца ### 1. ⭐ Вентиляция по CO₂ — доехать до конца
Логика **уже написана** в Node-RED ([[family/how-to/home-automation]]): Demand Aggregator → Intake Allocation → Discretization → Damper Outputs → Exhaust Arbitration → Fans → Kitchen Hood. Логика **уже написана** в Node-RED ([[family/how-to/home-automation]]): Demand Aggregator → Intake Allocation → Discretization → Damper Outputs → Exhaust Arbitration → Fans → Kitchen Hood.
**Блокер:** `fan.fan_at2_1/2` и `switch.fan_3_*` (slave 10) — `unavailable`, блок закомментирован в `configuration.yaml`. **Блокер:** `fan.fan_at2_1/2` и `switch.fan_3_*` (slave 10) — `unavailable`, блок закомментирован в `configuration.yaml`.
> 🍳 **Отдельно по вытяжке кухни:** ZHA отдаёт её тремя `light.kitchen_hood_light*` (TS0003 = 3 реле). Узел «Kitchen Hood» в Node-RED ждёт **`fan`/`switch`**, а не `light`. Прямой смены домена в HA нет — нужен Template-fan/switch. Разбор и варианты — [[family/tech/kitchen-hood-domain-conversion]]. > **По вытяжке кухни — СДЕЛАНО 2026-09-16:** ZHA отдаёт её тремя `light.kitchen_hood_light*` (TS0003 = 3 реле), а узел «Kitchen Hood» в Node-RED ждёт **`fan`/`switch`**. Прямой смены домена в HA нет → создан Template-фан 🌀 **`fan.kitchen_hood`** (3 скорости, 33/66/100 %), три света скрыты. Узел в Node-RED теперь можно вешать на `fan.kitchen_hood`. Разбор — [[family/tech/kitchen-hood-fan-template]].
**Что нужно:** раскомментировать slave 10 и убедиться, что AT2 отвечает (в §5 доки плана зафиксировано: прямой `nc` на slave 10 даёт `OK`, значение 100 → железо живо). **Что нужно:** раскомментировать slave 10 и убедиться, что AT2 отвечает (в §5 доки плана зафиксировано: прямой `nc` на slave 10 даёт `OK`, значение 100 → железо живо).
**⚠️ Конфликт:** задача по slave 10 **снята Alex'ом 2026-09-14**. Если решаем не трогать — вентиляция остаётся ручной, и весь CO₂-алгоритм простаивает. **Требует решения.** **⚠️ Конфликт:** задача по slave 10 **снята Alex'ом 2026-09-14**. Если решаем не трогать — вентиляция остаётся ручной, и весь CO₂-алгоритм простаивает. **Требует решения.**
+1 -1
View File
@@ -18,7 +18,7 @@
> 1. **`device`-триггер батареи — тип `battery_level`, НЕ `battery`.** Иначе `Automation ... failed to setup triggers and has been disabled`. > 1. **`device`-триггер батареи — тип `battery_level`, НЕ `battery`.** Иначе `Automation ... failed to setup triggers and has been disabled`.
> 2. **`binary_sensor` «battery_low» в ZHA нет** — только numeric `sensor.*_battery`, порог через `below: 10`. > 2. **`binary_sensor` «battery_low» в ZHA нет** — только numeric `sensor.*_battery`, порог через `below: 10`.
> 3. **Домен `entity_id` не меняется переименованием:** `switch.office_table_light_switch_l1` → ZHA-имя `light.tz3000_5gey1ohx_ts0002_osveshchenie`. Автоматизации переписаны на `light.*`. > 3. **Домен `entity_id` не меняется переименованием:** `switch.office_table_light_switch_l1` → ZHA-имя `light.tz3000_5gey1ohx_ts0002_osveshchenie`. Автоматизации переписаны на `light.*`.
> 🍳 **Сменить домен у СУЩЕСТВУЮЩЕЙ сущности HA нельзя** (ни реестром, ни customize). Обход — Template-хелпер поверх исходной сущности. `switch_as_x` для этого не годится: принимает **только `switch`**, не `light`. Разбор — [[family/tech/kitchen-hood-domain-conversion]]. > 🍳 **Сменить домен у СУЩЕСТВУЮЩЕЙ сущности HA нельзя** (ни реестром, ни customize). Обход — Template-хелпер поверх исходной сущности. `switch_as_x` для этого не годится: принимает **только `switch`**, не `light`. ✅ Применено на вытяжке кухни: `fan.kitchen_hood`. Разбор — [[family/tech/kitchen-hood-fan-template]].
> 4. **`reload` — `POST /api/services/automation/reload`** с long-lived JWT, порт 80 (`http://172.30.32.1/api/`). Супервизорский токен → 401. > 4. **`reload` — `POST /api/services/automation/reload`** с long-lived JWT, порт 80 (`http://172.30.32.1/api/`). Супервизорский токен → 401.
## 1. Где живёт ## 1. Где живёт
+9 -2
View File
@@ -2,7 +2,7 @@
title: "🏠 Домашняя автоматизация" title: "🏠 Домашняя автоматизация"
aliases: [Умный дом, Home automation, HA, Zigbee, Modbus, вентиляция, t610, RCU stall, USB reset] aliases: [Умный дом, Home automation, HA, Zigbee, Modbus, вентиляция, t610, RCU stall, USB reset]
tags: [family, how-to, smarthome] tags: [family, how-to, smarthome]
updated: 2026-09-16 (доступ к API изнутри t610: `172.30.32.1` ОПРОВЕРГНУТ — `000`, аддон в своём netns, единственный путь `mallexxx.duckdns.org`; §2.1 — 4 ловушки написания скриптов для t610: маскировщик `Authorization`, base64-токен, BusyBox `date -v`, `jq` в `ssh`; §5 подсветка лестницы — разбор утреннего ВЫКЛ; 🍳 вытяжка кухни — 3 × `light.*`, смена домена → [[family/tech/kitchen-hood-domain-conversion]]) updated: 2026-09-16 (вытяжка кухни переведена в 🌀 `fan.kitchen_hood` Template-хелпером: домен `light.` сменить нельзя, `switch_as_x` берёт только `switch`; +7 питфоллов 46–52 про «создал сущность, а в UI нет» — зона Template-сущности, `hidden_by` vs storage-дашборды, `check_config` → `[]`; §2.1 — 4 ловушки написания скриптов для t610: маскировщик `Authorization`, base64-токен, BusyBox `date -v`, `jq` в `ssh`; §5 подсветка лестницы — разбор утреннего ВЫКЛ)
--- ---
# 🏠 Домашняя автоматизация # 🏠 Домашняя автоматизация
@@ -766,6 +766,13 @@ 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
| 42 | ⚠️ **Живой конфиг сниффа — НЕ в `/addons/modbus-bridge/config.yaml`** | `config.yaml` = только опции аддона (device/baud). Регистры и коррекции — в `data/config.template.tmpl``run.sh` рендерит из него `/app/config.yml` при старте | | 42 | ⚠️ **Живой конфиг сниффа — НЕ в `/addons/modbus-bridge/config.yaml`** | `config.yaml` = только опции аддона (device/baud). Регистры и коррекции — в `data/config.template.tmpl``run.sh` рендерит из него `/app/config.yml` при старте |
| 44 | 🔴 **`MemFree` читают как «сколько памяти всего/занято»** | Верные метрики: **`MemTotal`** (всего) и **`MemAvailable`** (доступно). `MemFree` падает из-за файлового кэша (Cached 2.3 ГБ) и в I/O-шторме. См. §3.9 | | 44 | 🔴 **`MemFree` читают как «сколько памяти всего/занято»** | Верные метрики: **`MemTotal`** (всего) и **`MemAvailable`** (доступно). `MemFree` падает из-за файлового кэша (Cached 2.3 ГБ) и в I/O-шторме. См. §3.9 |
| 45 | 🔴 **«BIOS 4096 МБ → HA видит 1.44 ГБ»** — ложная тревога | Реально usable **3.31 ГБ** (минус ~800 МБ ACPI NVS/data + reserved + iGPU). Проверять `head -3 /proc/meminfo` + `dmesg \| grep e820`. См. §3.9 | | 45 | 🔴 **«BIOS 4096 МБ → HA видит 1.44 ГБ»** — ложная тревога | Реально usable **3.31 ГБ** (минус ~800 МБ ACPI NVS/data + reserved + iGPU). Проверять `head -3 /proc/meminfo` + `dmesg \| grep e820`. См. §3.9 |
| 46 | 🔴 **Создал сущность → «в UI её нет»** | Проверять **4** вещи: (1) `/api/states/<e>` отвечает, (2) `area_id``null` в реестре, (3) диагностика устройства скрыта, (4) дашборды не ссылаются на мёртвые сущности. Разбор — [[family/tech/kitchen-hood-fan-template]] §6.1 |
| 47 | 🔴 **Template-сущность из YAML не получает `area_id`** | У неё нет `device_id` → зону назначать вручную WS `config/entity_registry/update` с `area_id`. Иначе «невидима» на дашбордах зон |
| 48 | 🔴 **`hidden_by: user` НЕ убирает сущность из storage-дашбордов и `area_entities()`** | Это два независимых механизма. Ссылки в `/config/.storage/lovelace.*` вписаны руками — править их отдельно (`jq`). Реально «выключить» — только `disabled_by` |
| 49 | 🔴 **Правки `.storage/*` (дашборды, реестры) не видны до перезагрузки страницы** | Hard-refresh **Cmd+Shift+R**; обычный F5 может отдать кэш |
| 50 | **`homeassistant.check_config` через сервис отдаёт `[]`** | Это **не** ошибка — сервис не возвращает тело. Проверять `GET /api/config``.state` (или `/api/template`) |
| 51 | **Локальный `yaml.safe_load` падает на `!include`/`!secret`** | Заглушка: `L.add_multi_constructor('!', lambda l,s,n: {})` — иначе конфиг локально не проверить |
| 52 | 🔴 **Новый `template:` блок требует `restart` ядра**, не `automation reload` | Диагностика мёртвых ссылок: `jq -r '.. \| objects \| select(.entity? != null) \| .entity' /config/.storage/lovelace.* \| sort -u` → сверить со `/api/states` |
--- ---
@@ -861,7 +868,7 @@ ssh root@192.168.2.176 'ha apps logs local_modbus-bridge | grep -E "Raw RTU|→
- ⚠️ **Осиротевший `/config/go2rtc.yaml`** (1085 байт) — go2rtc удалён, читать нечем. - ⚠️ **Осиротевший `/config/go2rtc.yaml`** (1085 байт) — go2rtc удалён, читать нечем.
- ⚠️ **Watchdog `local_ustreamer` не включён** (в отличие от остальных 6 аддонов, §3.7). - ⚠️ **Watchdog `local_ustreamer` не включён** (в отличие от остальных 6 аддонов, §3.7).
- ⚠️ **Свет кабинета мигает при перезагрузке HA** — `office_pass_switch_*` с `platform: state` без `to`. Разбор — [[family/how-to/ha-automations]] §3. - ⚠️ **Свет кабинета мигает при перезагрузке HA** — `office_pass_switch_*` с `platform: state` без `to`. Разбор — [[family/how-to/ha-automations]] §3.
- 🍳 **Вытяжка кухни отдаётся как 3 × `light.*` — Alex хочет вывести из категории «свет».** Прямой смены домена нет; рабочий путь — Template-fan/switch поверх `light.*`. Ждёт решения + уточнения маппинга «реле → скорость». Разбор — [[family/tech/kitchen-hood-domain-conversion]]. - **Вытяжка кухни — СДЕЛАНО 2026-09-16.** Была 3 × `light.*` (ZHA, TS0003) → теперь 🌀 **`fan.kitchen_hood`** (Template, `speed_count: 3`, 33/66/100 %). Три света + 13 сущностей диагностики скрыты (`hidden_by: user`), зона `kitchen`, карта этажей `home_plan` переведена с мёртвого `fan.fan_3`. **Прямой смены домена в HA НЕТ** (`switch_as_x` берёт только `switch`). ⚠️ Осталось: физическая проверка «реле → скорость». Док: [[family/tech/kitchen-hood-fan-template]]
- ⚠️ **Греющий кабель не проверен физически** — розетка ни разу не включалась. - ⚠️ **Греющий кабель не проверен физически** — розетка ни разу не включалась.
**Справочные факты:** **Справочные факты:**
+127 -68
View File
@@ -11,10 +11,10 @@ aliases:
- kitchen-hood-domain-conversion - kitchen-hood-domain-conversion
- kitchen-hood-fan-template - kitchen-hood-fan-template
created: '2026-09-16' created: '2026-09-16'
updated: '2026-09-16 — ✅ ВЫПОЛНЕНО: `fan.kitchen_hood` создан Template-хелпером поверх трёх Zigbee-реле ZHA, свет скрыт, проверено живым прогоном 33/66/100 %' updated: '2026-09-16 — ✅ ЗАКРЫТО полностью: `fan.kitchen_hood` создан, зона назначена, свет и диагностика скрыты, ссылка в карте этажей `home_plan` переведена с мёртвого `fan.fan_3` на `fan.kitchen_hood``'
type: tech type: tech
namespace: family namespace: family
status: 🟢 РАБОТАЕТ. `fan.kitchen_hood` (3 скорости, `speed_count: 3`) поверх `light.kitchen_hood_light[,_2,_3]`. Три света скрыты (`hidden_by: user`). Проверено фактом 2026-09-16. ⚠️ Порядок скоростей ждёт физической проверки — §6. status: 🟢 РАБОТАЕТ. `fan.kitchen_hood` (3 скорости, `speed_count: 3`) поверх `light.kitchen_hood_light[,_2,_3]`. Три света + 13 сущностей диагностики скрыты. План этажей починен. Проверено фактом 2026-09-16. ⚠️ Порядок скоростей ждёт физической проверки — §10.
tags: tags:
- family - family
- tech - tech
@@ -39,9 +39,11 @@ related:
> >
> **Единственная дока по вытяжке.** Раньше было две (`kitchen-hood-domain-conversion` — исследование, `kitchen-hood-fan-template` — реализация) — сведены сюда 2026-09-16. Оба имени оставлены в `aliases`. > **Единственная дока по вытяжке.** Раньше было две (`kitchen-hood-domain-conversion` — исследование, `kitchen-hood-fan-template` — реализация) — сведены сюда 2026-09-16. Оба имени оставлены в `aliases`.
---
## 1. Ответ на исходный вопрос: «никак нельзя» ## 1. Ответ на исходный вопрос: «никак нельзя»
**Прямого способа сменить домен `light.``switch.`/`fan.` у существующей сущности в HA НЕТ.** Проверено по всем трём путям: **Прямого способа сменить домен `light.``switch.`/`fan.` у существующей сущности в HA НЕТ.** Проверено по всем четырём путям:
| Путь | Результат | | Путь | Результат |
|---|---| |---|---|
@@ -49,7 +51,7 @@ related:
| **Реестр сущностей** (`config/entity_registry/update` + `new_entity_id`) | ❌ Домен менять нельзя, только имя внутри домена. ⚠️ Питфолл 4 в [[family/tech/zigbee-t610-z2m-i-zha]]: «Переименование `light.``switch.` запрещено HA» | | **Реестр сущностей** (`config/entity_registry/update` + `new_entity_id`) | ❌ Домен менять нельзя, только имя внутри домена. ⚠️ Питфолл 4 в [[family/tech/zigbee-t610-z2m-i-zha]]: «Переименование `light.``switch.` запрещено HA» |
| **`switch_as_x`** (офиц. хелпер «Change device type of a switch») | ❌ **Источник — только `switch`.** Конвертирует в Light/Cover/Fan/Lock/Siren/Valve, но `light` на вход НЕ принимает. Для ZHA-вытяжки бесполезен | | **`switch_as_x`** (офиц. хелпер «Change device type of a switch») | ❌ **Источник — только `switch`.** Конвертирует в Light/Cover/Fan/Lock/Siren/Valve, но `light` на вход НЕ принимает. Для ZHA-вытяжки бесполезен |
| **Кастомный quirk в `zhaquirks`** | ⚠️ Технически возможно (подменить Light-cluster на Switch), но ломается при каждом обновлении HA + переименование сущностей рвёт все ссылки. Отвергнуто | | **Кастомный quirk в `zhaquirks`** | ⚠️ Технически возможно (подменить Light-cluster на Switch), но ломается при каждом обновлении HA + переименование сущностей рвёт все ссылки. Отвергнуто |
| **`homeassistant: customize:`** (device_class/icon override) | ❌ Меняет только атрибуты, **не домен**. `light.` останется `light.` | | **`homeassistant: customize:`** | ❌ Меняет только атрибуты (device_class/icon), **не домен**. `light.` останется `light.` |
> 📄 `switch_as_x` — https://www.home-assistant.io/integrations/switch_as_x/ > 📄 `switch_as_x` — https://www.home-assistant.io/integrations/switch_as_x/
> Ключевая цитата доки: «lets you convert any Home Assistant **switch** into a Home Assistant Light, Cover, Fan, Lock, Siren, or Valve». > Ключевая цитата доки: «lets you convert any Home Assistant **switch** into a Home Assistant Light, Cover, Fan, Lock, Siren, or Valve».
@@ -66,6 +68,8 @@ related:
| **B** | Template `switch` (без `percentage`) | если скорость не нужна, нужен просто «не свет» | | **B** | Template `switch` (без `percentage`) | если скорость не нужна, нужен просто «не свет» |
| **C** | Три `fan`/`switch` + автоматизация взаимоблокировки / `input_select` | ⭐ **не понадобился**`set_percentage` с `choose` дал то же самое в одной сущности | | **C** | Три `fan`/`switch` + автоматизация взаимоблокировки / `input_select` | ⭐ **не понадобился**`set_percentage` с `choose` дал то же самое в одной сущности |
---
## 2. Железо и что отдаёт ZHA ## 2. Железо и что отдаёт ZHA
**Устройство:** `kitchen_hood` · IEEE `a4:c1:38:07:b6:4c:7f:d4` · `_TZ3000_odzoiovu` · **TS0003** (3-gang реле) · Router · зона `kitchen` · device_id `200ea4fb25daaa907279045e47a330b5` **Устройство:** `kitchen_hood` · IEEE `a4:c1:38:07:b6:4c:7f:d4` · `_TZ3000_odzoiovu` · **TS0003** (3-gang реле) · Router · зона `kitchen` · device_id `200ea4fb25daaa907279045e47a330b5`
@@ -82,13 +86,15 @@ related:
> 🔑 **`supported_features: 8` + `supported_color_modes: ["onoff"]` = чистое реле без яркости.** Именно поэтому HA-логика «это лампа» здесь ложная, а переклассификация в `fan` осмысленна. > 🔑 **`supported_features: 8` + `supported_color_modes: ["onoff"]` = чистое реле без яркости.** Именно поэтому HA-логика «это лампа» здесь ложная, а переклассификация в `fan` осмысленна.
**Прочие сущности того же устройства** (не тронуты): `select.kitchen_hood_indicator_mode` (`LightWhenOn`), `select.kitchen_hood_power_outage_memory` (`Off`), `sensor.kitchen_hood_power` / `_voltage` / `_current` / `_energy` (все `0.0`), `button.kitchen_hood_identify`, `update.kitchen_hood_firmware`, `sensor.kitchen_hood_lqi` / `_rssi`.
> 🔴 **`sensor.kitchen_hood_lqi` / `_rssi` → HTTP **404** через `/api/states`.** Это **норма**: `disabled_by: integration` — сущности в реестре есть, в runtime их нет. **Не считать поломкой.**
> 🔑 **Ключевое для понимания:** TS0003 — это **три независимых реле**, а «3 скорости вытяжки» на железе = три провода, из которых активен ровно один. Поэтому HA изначально показала их как три света, а не как одну вентиляционную сущность. Один `fan` с процентами склеивает их логически. > 🔑 **Ключевое для понимания:** TS0003 — это **три независимых реле**, а «3 скорости вытяжки» на железе = три провода, из которых активен ровно один. Поэтому HA изначально показала их как три света, а не как одну вентиляционную сущность. Один `fan` с процентами склеивает их логически.
## 3. Что сделано (2026-09-16) **Прочие сущности того же устройства** (позже скрыты, см. §8): `select.kitchen_hood_indicator_mode` (`LightWhenOn`), `select.kitchen_hood_power_outage_memory` (`Off`), `sensor.kitchen_hood_power` / `_voltage` / `_current` / `_energy` (все `0.0`), `button.kitchen_hood_identify`, `update.kitchen_hood_firmware`, `sensor.kitchen_hood_lqi` / `_rssi`.
> 🔴 **`sensor.kitchen_hood_lqi` / `_rssi` → HTTP 404 через `/api/states`.** Это **норма**: `disabled_by: integration` — сущности в реестре есть, в runtime их нет. **Не считать поломкой.**
---
## 3. Что сделано — шаг 1: Template-фан
### 3.1. Бэкап ### 3.1. Бэкап
@@ -160,15 +166,17 @@ related:
**Логика:** `set_percentage` сначала гасит **все три** реле, затем зажигает одно нужное → **взаимоисключение гарантировано**, состояние «две скорости одновременно» невозможно by design. **Логика:** `set_percentage` сначала гасит **все три** реле, затем зажигает одно нужное → **взаимоисключение гарантировано**, состояние «две скорости одновременно» невозможно by design.
> 🔴 **ИСПРАВЛЕНО 2026-09-16 (было ошибочно в первой версии доки):** ранняя версия утверждала, что «Template-fan с `percentage` не даст настоящую скорость — он включит одно реле». **Факт опроверг:** один Template-fan с `set_percentage` + `choose` **даёт полноценные 3 скорости** — 33/66/100 % выбирают нужное реле, `percentage` читается обратно из состояния. Взаимоблокировку обеспечивает `set_percentage` (гасит все три перед включением), отдельная автоматизация и `input_select` **не нужны**. Проверено живым прогоном — §4. > 🔴 **ИСПРАВЛЕНО 2026-09-16 (было ошибочно в первой версии доки):** ранняя версия утверждала, что «Template-fan с `percentage` не даст настоящую скорость — он включит одно реле». **Факт опроверг:** один Template-fan с `set_percentage` + `choose` **даёт полноценные 3 скорости** — 33/66/100 % выбирают нужное реле, `percentage` читается обратно из состояния. Взаимоблокировку обеспечивает `set_percentage`, отдельная автоматизация и `input_select` **не нужны**. Проверено живым прогоном — §4.
>
> TS0003 = **3 независимых реле**; «скорость 1/2/3» = три контакта, включаемых **по одному**. Именно поэтому один `fan` с процентами корректно склеивает их логически. **Порядок применения:** правка YAML → локальный парс → `scp` на t610 → `check_config`**`homeassistant.restart`** (не reload!) → `RUNNING`.
### 3.3. Скрытие света ### 3.3. Скрытие света
Три сущности скрыты через WS `config/entity_registry/update` с `hidden_by: "user"`. Три сущности скрыты через WS `config/entity_registry/update` с `hidden_by: "user"`.
Скрипт: `~/tmp-t610/hood_hide.py` (возврат — тот же скрипт с `--unhide`). Скрипт: `~/tmp-t610/hood_hide.py` (возврат — тот же скрипт с `--unhide`).
---
## 4. ✅ Проверка на живом железе ## 4. ✅ Проверка на живом железе
| Шаг | `fan.kitchen_hood` | light_1 | light_2 | light_3 | | Шаг | `fan.kitchen_hood` | light_1 | light_2 | light_3 |
@@ -183,53 +191,9 @@ related:
> `speed_count` **не отдаётся** как атрибут состояния — HA его не публикует. Шаги ползунка считаются из `percentage_step`. Это норма, не дефект. > `speed_count` **не отдаётся** как атрибут состояния — HA его не публикует. Шаги ползунка считаются из `percentage_step`. Это норма, не дефект.
## 5. Питфоллы
| # | Питфолл | Обход |
|---|---|---|
| 1 | **`switch_as_x` не принимает `light`** | Источник только `switch`. Для ZHA-light бесполезен — нужен Template |
| 2 | **Домен сущности сменить нельзя** | Только Template-хелпер рядом + скрыть оригинал |
| 3 | **`!include` ломает `yaml.safe_load`** при локальной проверке | Заглушка: `L.add_multi_constructor('!', ...)` — иначе проверка конфига локально невозможна |
| 4 | 🔴 **`check_config` через сервис отдаёт `[]`** | Это **не** ошибка — сервис не возвращает тело. Проверять `GET /api/config``.state` или `/api/template` |
| 5 | **`_1`/`_2`/`_3` ≠ порядок скоростей автоматически** | ZHA нумерует по endpoint'ам, не по физической скорости. ⚠️ **Требует физической проверки** — см. §6 |
| 6 | **Template `turn_on` без аргумента** | `fan.turn_on` без `percentage` → скорость 1 (33 %). Задано явно |
| 7 | 🔴 **Правка `configuration.yaml` требует `restart` HA Core** | `automation reload` тут **не** поможет — новый template-блок не подхватится |
| 8 | 🔴 **REST `POST` без `-H "Content-Type: application/json"` → пустой ответ** | Всегда ставить заголовок |
| 9 | 🔴 **Заголовок авторизации рвётся маскировщиком Hermes** в скриптах | Собирать по частям либо Python + `urllib` (пример — `hood_scan.py`, `hood_hide.py`) |
| 10 | **`sensor.kitchen_hood_lqi` / `_rssi` → 404 в `/api/states`** | `disabled_by: integration` — норма, не поломка |
## 6. ⚠️ ОТКРЫТО — требует проверки Alex
1. 🔴 **Порядок скоростей не подтверждён физически.** Принято как `_1`=33 / `_2`=66 / `_3`=100, но какое **реле** = какая **скорость** — не проверялось. Нужно встать у вытяжки: поставить 33 % и 100 %, убедиться что низкая/высокая. **Если перепутано — правка трёх строк** в `percentage` и `set_percentage`.
2. ⚠️ **`light.kitchen_hood_light` мог быть лампой подсветки, а не скоростью.** До работ он был `on` (горел), после рестарта HA стал `off`. Если это **лампа подсветки вытяжки** — вынести отдельно, фан её не должен гасить. Уточнить у Alex.
> 📌 **Проверка для будущей сессии (одной командой):** поставить `fan.set_percentage` на 33 и на 100 и сравнить, какое реле зажглось и **что физически слышно**. Маппинг в коде — три строки в `percentage` и три ветки `choose` в `set_percentage`.
## 6.1. Роадмап вентиляции
[[family/documents/home-automation-wishlist]] §2 п.1 ожидает **«Kitchen Hood»** как конечный узел алгоритма вентиляции по CO₂ (Node-RED: `Demand Aggregator → Intake Allocation → Discretization → Damper Outputs → Exhaust Arbitration → Fans → Kitchen Hood`). Ранее узел был мёртв вместе с контуром AT2 — теперь у вытяжки есть **рабочая сущность `fan.kitchen_hood`**, на которую можно вешать автоматику. Ждёт решения по slave 10 (AT2 снят Alex'ом).
## 7. Не тронуто
- **`fan.fan_3` «Вытяжка Кухня»** — существовавшая сущность (`unique_id: fan_3`, `default_entity_id: fan.fan_3`), источник — `switch.fan_3_low/medium/high` (slave 10, AT2/modbus). Эти свитчи **закомментированы** в `configuration.yaml` (строки 60–84) — контур AT2 отключён Alex'ом. Ссылается на несуществующий `script.set_fan_3_speed`. **Мёртвая, но оставлена как есть** по выбору Alex (вариант «Новый»).
## 8. Артефакты
| Файл | Назначение |
|---|---|
| `~/tmp-t610/configuration.yaml.current` | рабочая копия конфига (с новым блоком) |
| `~/tmp-t610/hood_scan.py` | read-only скан: devices + entities + device_class + show_as + area + states |
| `~/tmp-t610/hood_hide.py` | скрыть/показать три `light.*` (`--unhide`) |
## Связанные
- [[family/how-to/home-automation]] — топология, t610, Zigbee, команды, питфоллы
- [[family/tech/zigbee-t610-z2m-i-zha]] — ZHA, реестры, переименование, питфолл «домен менять нельзя»
- [[family/how-to/ha-automations]] — автоматизации, справочник
--- ---
## 7.1. 🔴 Доводка UI (2026-09-16, по факту «ничего не вижу») ## 5. 🔴 Шаг 2: доводка UI — «вижу показатели kitchen hood и нет нового вентилятора»
**Симптом Alex:** «Я в кухне до сих пор вижу показатели kitchen hood и нет нового вентилятора». **Симптом Alex:** «Я в кухне до сих пор вижу показатели kitchen hood и нет нового вентилятора».
@@ -253,13 +217,83 @@ related:
**Проверено чтением обратно:** все 13 → `hidden_by=user`; `fan.kitchen_hood``area=kitchen`, `hidden_by=None`. **Проверено чтением обратно:** все 13 → `hidden_by=user`; `fan.kitchen_hood``area=kitchen`, `hidden_by=None`.
> 🔑 **Урок 1:** Template-сущности из YAML **не получают зону автоматически**у них нет `device_id`. После создания такой сущности назначать зону вручную через WS `config/entity_registry/update` с `area_id`, иначе она «невидима» на дашбордах зон и в списке кухни. ---
> 🔑 **Урок 2:** `hidden_by: user` убирает сущность из автогенерируемых дашбордов и списков, но **не из карточки устройства** в UI. Реестр HA кэширует UI → после массовых правок реестра нужен hard-refresh (Cmd+Shift+R).
> 🔑 **Урок 3:** «Создал сущность» ≠ «видно в UI». Проверять **обе** вещи: (а) `/api/states/<entity>` отвечает, (б) в реестре есть `area_id`. Наличие в бэкенде без зоны выглядит для пользователя как «ничего не появилось». ## 6. 🔴 Шаг 3: настоящая причина «он не открыт» — карта этажей
**Симптом Alex:** «Нихуя он не открыт!» — на кухне в UI по-прежнему старая вытяжка, новый `fan.kitchen_hood` отсутствует.
**Причина — дашборд `home_plan` ссылался руками на мёртвую сущность.**
Дашборд `home_plan` (storage-mode, `/config/.storage/lovelace.home_plan`) содержит `picture-elements` с иконкой:
```json
{ "type": "state-icon", "entity": "fan.fan_3", "tap_action": {"action": "more-info"},
"style": {"top": "18.0%", "left": "86.3%"} }
```
`fan.fan_3` = мёртвый template-фан (источник `switch.fan_3_*` закомментирован, slave 10 офлайн). Иконка на кухне вела на него.
**Диагностика — как найти мёртвую ссылку:**
```bash
# все entity, на которые ссылается план
jq -r '.. | objects | select(.entity? != null) | .entity' /config/.storage/lovelace.home_plan | sort -u
# что из них реально живо — сверить со /api/states
```
> 🔴 **`hidden_by: user` НЕ влияет на дашборды со storage-mode.** Ссылки в `.storage/lovelace.*` вписаны руками — скрытие сущности их не трогает. Тот же класс проблемы, что питфолл «план этажей ссылался на снесённого призрака `light.smart_light_stairs_l1`» ([[family/tech/zigbee-t610-z2m-i-zha]] §13.3).
> 🔴 **Второе:** `hidden_by` не влияет и на `area_entities()` в шаблонах. `area_entities("kitchen")` продолжает отдавать скрытые сущности — это два независимых механизма. Если сущность нужна «невидимой» реально, её надо `disabled_by`, либо убрать ссылку из дашборда.
**Фикс — скрипт `~/tmp-t610/fix_plan_hood.py`** (dry-run по умолчанию, `--apply` для записи):
1. Рекурсивный обход JSON плана → замена `fan.fan_3``fan.kitchen_hood`
2. `assert` что `fan.fan_3` не осталось в выводе
3. Бэкап remote → `scp` на t610
**Результат:** заменено **1** вхождение (`.data.config.views[0].sections[0].cards[0].elements[6]`). Бэкап `lovelace.home_plan.bak-hoodfan-20260916-074008`.
**Проверено фактом на t610:** `fan.fan_3` в плане = **0**, `fan.kitchen_hood` = есть, `jq -e .` → JSON валиден.
> ⚠️ Дашборд читает `.storage` при загрузке страницы → нужен **hard-refresh (Cmd+Shift+R)**, обычный F5 может отдать кэш.
### 6.1. Итоговая цепочка причин (три штуки, каждая выглядела как «не работает»)
| # | Что было | Как выглядело | Фикс |
|---|---|---|---|
| 1 | `fan.kitchen_hood` без зоны (`area_id: null`) | «на кухне нет нового вентилятора» | WS `area_id: kitchen` |
| 2 | диагностика реле не скрыта | «вижу показатели kitchen hood» | 8 сущностей → `hidden_by: user` |
| 3 | **план этажей ссылался на `fan.fan_3`** | «старая вытяжка вместо новой» | `fix_plan_hood.py --apply` |
> 🔑 **ГЛАВНЫЙ УРОК:** «создал сущность» ≠ «пользователь её видит». Проверять **четыре** вещи:
> 1. `/api/states/<entity>` отвечает
> 2. `area_id` в реестре не `null` (Template-сущности из YAML зону **не получают** — нет `device_id` → назначать вручную WS `config/entity_registry/update` с `area_id`)
> 3. диагностика устройства скрыта (`hidden_by: user`)
> 4. **дашборды/план этажей не ссылаются на мёртвые сущности** (`jq` по `.storage/lovelace.*`)
--- ---
## 7.2. Итоговое состояние кухни (вытяжка) ## 7. Питфоллы
| # | Питфолл | Обход |
|---|---|---|
| 1 | **`switch_as_x` не принимает `light`** | Источник только `switch`. Для ZHA-light бесполезен — нужен Template |
| 2 | **Домен сущности сменить нельзя** | Только Template-хелпер рядом + скрыть оригинал |
| 3 | **`!include` ломает `yaml.safe_load`** при локальной проверке | Заглушка: `L.add_multi_constructor('!', ...)` — иначе проверка конфига локально невозможна |
| 4 | 🔴 **`check_config` через сервис отдаёт `[]`** | Это **не** ошибка — сервис не возвращает тело. Проверять `GET /api/config``.state` или `/api/template` |
| 5 | **`_1`/`_2`/`_3` ≠ порядок скоростей автоматически** | ZHA нумерует по endpoint'ам, не по физической скорости. ⚠️ Требует физической проверки — §10 |
| 6 | **Template `turn_on` без аргумента** | `fan.turn_on` без `percentage` → скорость 1 (33 %). Задано явно |
| 7 | 🔴 **Правка `configuration.yaml` требует `restart` HA Core** | `automation reload` здесь **не** поможет — новый template-блок не подхватится |
| 8 | 🔴 **REST `POST` без `-H "Content-Type: application/json"` → пустой ответ** | Всегда ставить заголовок |
| 9 | 🔴 **Заголовок авторизации рвётся маскировщиком Hermes** в скриптах | Собирать по частям либо Python + `urllib` (пример — `hood_scan.py`, `hood_hide.py`, `hood_cleanup.py`) |
| 10 | **`sensor.kitchen_hood_lqi` / `_rssi` → 404 в `/api/states`** | `disabled_by: integration` — норма, не поломка |
| 11 | 🔴 **Template-сущность из YAML не получает `area_id`** → «создал, а в UI нет» | Назначать зону вручную WS `config/entity_registry/update` |
| 12 | 🔴 **`hidden_by: user` не влияет на дашборды и `area_entities()`** | Правки кэширует UI → hard-refresh; ссылки в `.storage/lovelace.*` править руками |
| 13 | 🔴 **Правка `.storage/lovelace*` вступает в силу только при загрузке страницы** | Hard-refresh (Cmd+Shift+R), F5 может отдать кэш |
---
## 8. Итоговое состояние кухни (вытяжка)
| Видно пользователю | Скрыто (`hidden_by: user`) | | Видно пользователю | Скрыто (`hidden_by: user`) |
|---|---| |---|---|
@@ -270,22 +304,47 @@ related:
> `sensor.kitchen_hood_lqi` / `_rssi``disabled_by: integration`, не отображаются нигде (норма). > `sensor.kitchen_hood_lqi` / `_rssi``disabled_by: integration`, не отображаются нигде (норма).
## 8. Артефакты **Карта этажей `home_plan`:** иконка на кухне (`elements[6]`, 18 %/86.3 %) переведена на `fan.kitchen_hood`.
**`fan.fan_3` не удалён** — только скрыт. Возврат: `hood_cleanup.py --unhide`.
---
## 9. Роадмап вентиляции
[[family/documents/home-automation-wishlist]] §2 п.1 ожидает **«Kitchen Hood»** как конечный узел алгоритма вентиляции по CO₂ (Node-RED: `Demand Aggregator → Intake Allocation → Discretization → Damper Outputs → Exhaust Arbitration → Fans → Kitchen Hood`). Ранее узел был мёртв вместе с контуром AT2 — теперь у вытяжки есть **рабочая сущность `fan.kitchen_hood`**, на которую можно вешать автоматику. Ждёт решения по slave 10 (AT2 снят Alex'ом).
---
## 10. ⚠️ ОТКРЫТО — требует проверки Alex
1. 🔴 **Порядок скоростей не подтверждён физически.** Принято как `_1`=33 / `_2`=66 / `_3`=100, но какое **реле** = какая **скорость** — не проверялось. Нужно встать у вытяжки: поставить 33 % и 100 %, убедиться что низкая/высокая. **Если перепутано — правка трёх строк** в `percentage` и `set_percentage`.
2. ⚠️ **`light.kitchen_hood_light` мог быть лампой подсветки, а не скоростью.** До работ он был `on` (горел), после рестарта HA стал `off`. Если это **лампа подсветки вытяжки** — вынести отдельно, фан её не должен гасить.
> 📌 **Проверка для будущей сессии (одной командой):** поставить `fan.set_percentage` на 33 и на 100 и сравнить, какое реле зажглось и **что физически слышно**. Маппинг в коде — три строки в `percentage` и три ветки `choose` в `set_percentage`.
---
## 11. Артефакты
| Файл | Назначение | | Файл | Назначение |
|---|---| |---|---|
| `~/tmp-t610/configuration.yaml.current` | рабочая копия конфига (с новым блоком) | | `~/tmp-t610/configuration.yaml.current` | рабочая копия конфига (с новым блоком) |
| `~/tmp-t610/hood_scan.py` | скан сущностей/устройств вытяжки через WS+rest | | `~/tmp-t610/hood_scan.py` | read-only скан: devices + entities + device_class + area + states |
| `~/tmp-t610/hood_hide.py` | скрыть/показать три `light.*` (`--unhide`) | | `~/tmp-t610/hood_hide.py` | скрыть/показать три `light.*` (`--unhide`) |
| `~/tmp-t610/hood_cleanup.py` | зона + скрытие 13 сущностей (`--unhide`) | | `~/tmp-t610/hood_cleanup.py` | зона `kitchen` + скрытие 13 сущностей (`--unhide`) |
| `~/tmp-t610/fix_plan_hood.py` | правка ссылки в `home_plan` (dry-run / `--apply`) |
| `~/tmp-t610/home_plan.json` | локальная копия карты этажей |
## 9. ⚠️ ОТКРЫТО — требует проверки Alex **Бэкапы на t610:**
`configuration.yaml.bak-fanhood-20260916-081926` · `lovelace.home_plan.bak-hoodfan-20260916-074008`
1. 🔴 **Порядок скоростей не подтверждён физически.** Принято `_1`=33 / `_2`=66 / `_3`=100, но какое **реле** = какая **скорость** — не проверялось. Нужно встать у вытяжки: поставить 33 % и 100 %. Если перепутано — правка трёх строк в `percentage` и `set_percentage`. ---
2. ⚠️ **`light.kitchen_hood_light` мог быть лампой подсветки, а не скоростью.** До работ был `on`, после рестарта HA → `off`. Если это лампа вытяжки — вынести отдельно, фан её гасить не должен.
## Связанные ## Связанные
- [[family/how-to/home-automation]] — топология, t610, Zigbee, команды, питфоллы - [[family/how-to/home-automation]] — топология, t610, Zigbee, команды, питфоллы
- [[family/tech/zigbee-t610-z2m-i-zha]] — ZHA, реестры, переименование, питфолл «домен менять нельзя» - [[family/tech/zigbee-t610-z2m-i-zha]] — ZHA, реестры, переименование, питфолл «домен менять нельзя», §13.3 план этажей
- [[family/tech/ha-registry-operations]] — реестры HA: переименование, опции, призраки
- [[family/how-to/ha-automations]] — автоматизации, справочник - [[family/how-to/ha-automations]] — автоматизации, справочник
- [[family/documents/home-automation-wishlist]] — роадмап автоматизаций (Kitchen Hood как узел CO₂)
+2 -2
View File
@@ -1,7 +1,7 @@
--- ---
title: "Zigbee на t610 — ZHA (справочник)" title: "Zigbee на t610 — ZHA (справочник)"
created: '2026-09-15' created: '2026-09-15'
updated: '2026-09-16 (ночь: вычищены 185 призраков Z2M из архива реестра `deleted_entities` 360→175; план этажей починен — ссылка на снесённого `light.smart_light_stairs_l1``light.light_stairs_left`; H2000_PRO °F→°C сбросом `sensor.private` override; 🍳 `kitchen_hood` — ZHA отдаёт как 3 × `light.*`, разбор смены домена → [[family/tech/kitchen-hood-domain-conversion]])' updated: '2026-09-16 (ночь: вычищены 185 призраков Z2M из архива реестра `deleted_entities` 360→175; план этажей починен — ссылка на снесённого `light.smart_light_stairs_l1``light.light_stairs_left`; H2000_PRO °F→°C сбросом `sensor.private` override; 🍳 `kitchen_hood` — ZHA отдаёт как 3 × `light.*`; ✅ выведен в 🌀 `fan.kitchen_hood` Template-хелпером → [[family/tech/kitchen-hood-fan-template]])'
type: tech type: tech
namespace: family namespace: family
status: 🟢 РАБОТАЕТ. ZHA: 24 записи (23 устройства + координатор), `unavailable` = 0. Все устройства с читаемыми ID в едином виде, все в зонах. 24 автоматизации: 23 `on`, 1 `off` намеренно. Bridge: 9 Zigbee-температур отдаются ZONT'у (slave 100112). Призраки Z2M в архиве реестра вычищены; план этажей и H2000_PRO исправлены. `unavailable` всего 8 — вентиляция AT2 + `todo.shopping_list` (намеренно). status: 🟢 РАБОТАЕТ. ZHA: 24 записи (23 устройства + координатор), `unavailable` = 0. Все устройства с читаемыми ID в едином виде, все в зонах. 24 автоматизации: 23 `on`, 1 `off` намеренно. Bridge: 9 Zigbee-температур отдаются ZONT'у (slave 100112). Призраки Z2M в архиве реестра вычищены; план этажей и H2000_PRO исправлены. `unavailable` всего 8 — вентиляция AT2 + `todo.shopping_list` (намеренно).
@@ -78,7 +78,7 @@ related:
> 📌 **Координатор** `Inswift ZBP-MG21` — 45 диагностических сущностей, все `disabled_by: integration`. > 📌 **Координатор** `Inswift ZBP-MG21` — 45 диагностических сущностей, все `disabled_by: integration`.
> 🍳 **`kitchen_hood` (`a4c13807b64c7fd4`, `_TZ3000_odzoiovu`) отдаётся ZHA как ТРИ `light.*`, а не `switch.*`:** `light.kitchen_hood_light` / `_light_2` / `_light_3` (endpoint 1/2/3), все `supported_color_modes: ["onoff"]` — чистые реле без яркости. `device_id 200ea4fb25daaa907279045e47a330b5`. > 🍳 **`kitchen_hood` (`a4c13807b64c7fd4`, `_TZ3000_odzoiovu`) отдаётся ZHA как ТРИ `light.*`, а не `switch.*`:** `light.kitchen_hood_light` / `_light_2` / `_light_3` (endpoint 1/2/3), все `supported_color_modes: ["onoff"]` — чистые реле без яркости. `device_id 200ea4fb25daaa907279045e47a330b5`.
> **Alex хочет вывести вытяжку из категории «свет».** Прямой смены домена у сущности НЕТ; рабочий путь — Template-fan/switch поверх `light.*` (`switch_as_x` не годится: принимает только `switch`). Разбор, варианты, маппинг «3 реле = 3 скорости», что уточнить перед правкой — [[family/tech/kitchen-hood-domain-conversion]]. > **Вытяжка выведена из категории «свет» 2026-09-16.** Прямой смены домена у сущности НЕТ; сделан Template-фан 🌀 `fan.kitchen_hood` (3 скорости) поверх `light.kitchen_hood_light*`, свет скрыт (`switch_as_x` не годится: принимает только `switch`). Полный разбор, проверка живым прогоном и питфоллы — [[family/tech/kitchen-hood-fan-template]].
### 2.1. 🔴 Как переименовывать (проверенный рецепт 2026-09-15) ### 2.1. 🔴 Как переименовывать (проверенный рецепт 2026-09-15)