Files
obsidian-vault/family/how-to/ha-automations.md
T

195 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "⚙️ HA — автоматизации (automations.yaml)"
aliases: [HA automations, Автоматизации HA, automations.yaml, Ночной свет душевая]
tags: [family, how-to, smarthome, home-assistant, automation]
updated: 2026-09-15
related:
- "[[family/plans/t610-home-automation]]"
- "[[family/how-to/home-automation]]"
- "[[family/how-to/zigbee2mqtt-t610]]"
- "[[family/documents/home-automation-wishlist]]"
---
> **📌 Текущий статус (2026-09-15):** дефект «ночной свет душевой» — **порог исправлен** `8 → 6` (по решению Alex), применено через REST и подтверждено. **Открытый хвост:** у ВЫКЛ-автоматизации по-прежнему `conditions: []` — нет связи с основным освещением; при 2 lx свет может залипать. Ждём факта: залипнет или нет.
# ⚙️ HA — автоматизации (`automations.yaml`)
> **Назначение документа:** разбор логики автоматизаций Home Assistant на t610, карта «устройство ↔ entity_id ↔ device_id», найденные дефекты. Карта железа/Modbus — [[family/how-to/home-automation]]. Хост/аддоны/доступ — [[family/plans/t610-home-automation]].
## 1. Где живёт
- **Файл:** `/config/automations.yaml` в HA Core на t610.
- **Локальная копия-эталон (проверено 2026-09-15):** `~/tmp-t610/automations/automations.yaml` (208 строк, 16 автоматизаций) и `~/tmp-t610/etap3-fix/automations.yaml` (версия после правки зон, 2026-09-14).
- **Итого автоматизаций:** **16** (15 `on` / 1 `off`).
- ⚠️ **Живой конфиг читать через REST API**, а не по памяти: `GET /api/config/automation/config/<id>`. Готовый скрипт-образец — `~/tmp-t610/check_aut_dushev.sh`.
## 2. Карта device_id ↔ entity_id (из `~/tmp-t610/etap3-fix/devid_mapping.json`)
| device_id | Устройство / назначение |
|---|---|
| `4095e7c3b47b9dc9640cfb8c3aeff022` | **`shower_2_presence_sensor`** — радар присутствия душевой 2 (Tuya `ZY-M100-S_2` / TS0601) |
| `4d6e55505ff7dbad13d2674cdcb18d5a` | **`night_light_shower_2`** — ночная подсветка душевой 2 (Tuya `TS0001`, Zigbee-реле) |
| `1ea8bbc2612dde303e4279bc5fbad57a` | `light_sensor_stairs` — датчик освещённости лестницы (TS0222) |
| `028b7d9f489c87bdc9e563473a1d61e8` | подсветка лестницы (`switch`) |
| `5cd5d9d2d289b5e470bbeaac0eb7905c` | кнопка/диммер спальни (TS0043-подобная) |
| `098a641cb1d30f08f1ae293e00d9885b` | `light.bed_dimmer` (TS0052) |
| `16d2c6f64ec399e5261c89b35c1e75c6` | розетка циркуляции ГВС |
| `b9d384a51b780a7924ed9504eddec12e` | `boiler_water_leak` — датчик протечки котельной (TS0207) |
| `bcf47eeae909877978bdaf6c705210f8` | датчик t° Zigbee = `office_temperature_sensor` (`0xa4c13862d39377e6`, TS0201, кабинет). Уточнено 2026-09-15 |
| *(новый, device_id не зафиксирован)* | **`0xa4c138c650636cf6`** (TS0201, `_TZ3000_dowj6gyi`) — Zigbee-датчик t°/влажности, спарен 2026-09-15, назначается как `toilet_1_floor_temperature`. См. [[family/how-to/zigbee2mqtt-t610]] §5 |
| `0c7a0eb6d60e852b447266da69a7785e` | *(entity-хелпер, см. mapping)* |
> ⚠️ **H2000 PRO не в этой карте и не Zigbee.** `sensor.h2000_pro_*` приходят отдельной интеграцией (`config_entry 01M2EXY2D5YJZY71VAKJTTGB16`), не через z2m/Modbus. **Не трогать** (Alex 2026-09-15).
**Сущности радара душевой 2** (`device_id 4095e7c3…`, платформа `mqtt`):
- `sensor.shower_2_presence_sensor_illuminance` — «Освещенность», lx
- `binary_sensor.shower_2_presence_sensor_presence` — «Занятость», on/off
- `sensor.shower_2_presence_sensor_target_distance` — Target distance, м
- `number.shower_2_presence_sensor_radar_sensitivity` — 0..9
- `number.shower_2_presence_sensor_minimum_range` / `maximum_range` — 0..9.5 м, шаг 0.15
- `number.shower_2_presence_sensor_detection_delay` — 0..10 с
- `number.shower_2_presence_sensor_fading_time` — 0.5..1500 с
- `sensor.shower_2_presence_sensor_linkquality`
**Сущности ночной подсветки душевой 2** (`device_id 4d6e5550…`):
- `switch.night_light_shower_2`**само реле** (его и дёргает автоматизация)
- `light.night_light_shower_2` — хелпер `switch_as_x` поверх того же реле (`config_entry 01KKC78ZM7QRJQY36Q4D27KGCD`, `target_domain: light`, `invert: false`). **Один и тот же физический релей — управлять надо `switch.`-сущностью, к которой привязана автоматика.**
- `number.night_light_shower_2_countdown`, `select..._power_on_behavior`, `select..._switch_type`, `sensor..._linkquality`
## 3. Ночной свет душевой — две автоматизации
**ВКЛ — `id: '1771997851260'`, «Вкл. ночной свет душевая»**
```yaml
triggers:
- platform: device
type: occupied # binary_sensor.shower_2_presence_sensor_presence
device_id: 4095e7c3b47b9dc9640cfb8c3aeff022
entity_id: b4a50e16942064f9c00d0d86501a667e
- platform: device
type: illuminance # sensor.shower_2_presence_sensor_illuminance
device_id: 4095e7c3b47b9dc9640cfb8c3aeff022
entity_id: df9fe40b9d96de3b1bdeeb62707a7cab
below: 6 # ✅ применено 2026-09-15 (было 8)
conditions:
- condition: device
type: is_illuminance ... below: 6
- condition: device
type: is_occupied
actions: # turn_on
- type: turn_on domain: switch entity_id: fa72bc65e5cf9e9249a5b0d377e5a3f4
# = switch.night_light_shower_2
mode: single
```
**ВЫКЛ — `id: '1771997918348'`, «Выкл. ночной свет душевая»**
```yaml
triggers:
- type: not_occupied # присутствие пропало
- type: illuminance ... above: 6 # ✅ применено 2026-09-15 (было 8)
conditions: [] # ⚠️ ПУСТО — нет ни одного условия
actions: # turn_off switch.night_light_shower_2
mode: single
```
### 🔴 Дефект (диагностирован 2026-09-15)
**Симптом:** ночной свет горит при включённом основном освещении; датчик присутствия при этом ничего не нарушает.
**Первопричина — асимметрия логики, а НЕ датчик:**
1. **Нет связи «основное освещение включено → ночной свет не нужен».** В ВЫКЛ-автоматизации `conditions: []` — она ничего не проверяет про основной свет. Гасит только по `not_occupied` или `above: 8`.
2. **Порог `8 lx` стоял ровно в центре дребезга датчика.** Факт-замер 2026-09-15: покой = **2 lx**, а при движении/свете значение металось **7 ↔ 12** (см. §3 «Обоснование цифрой»). Порог `8` попадал в мёртвую середину → ВКЛ и ВЫКЛ срабатывали по кругу. Триггер `above: 8` **срабатывал**, но нестабильно.
3. **`mode: single` + `occupied` держится** → человек в душевой, темно по показаниям → ночной свет горит поверх основного.
**❌ Отвергнутые версии (не повторять):**
- «датчик присутствия не видит порог / виноват датчик» — **неверно**: `binary_sensor..._presence` работает штатно (observed `on`/`off` в 04:49:15).
- «порог просто надо чуть поднять» — **частично верно, и это и сделано**: порог `8` действительно лежал в центре дребезга (7↔12), поэтому его и сдвинули на `6`. Но **корень** — отсутствие условия по основному свету: порогом это не лечится (потолок датчика ~15 lx, он не отличает ночной свет от основного).
**✅ Факт-замер (2026-09-15, 04:4804:49 UTC):**
| Сущность | Значение |
|---|---|
| `sensor.shower_2_presence_sensor_illuminance` | 2 lx |
| `binary_sensor.shower_2_presence_sensor_presence` | off |
| `switch.night_light_shower_2` | off |
| `number..._fading_time` | 10 с |
| `number..._maximum_range` | 2.85 м |
### ✅ Применённая правка (2026-09-15) — порог 8 → 6
**Решение Alex (дословно): «ставь 6».** Применено через REST API и **подтверждено чтением конфига обратно**:
| Автоматизация | Триггер | Условие |
|---|---|---|
| ВКЛ `1771997851260` | `illuminance below: 6` | `below: 6` + `is_occupied` |
| ВЫКЛ `1771997918348` | `illuminance above: 6` | — (по-прежнему пусто) |
**📊 Обоснование цифрой (ключевой замер).** История `sensor.shower_2_presence_sensor_illuminance`:
- **За 10 минут до правки (2026-09-15, 04:2704:48 UTC):** `7 → 12 → 7 → 12 → 7 → 12 → 7` — метание **7 ↔ 12**.
- **2026-09-14 днём:** `15↔8`, `13↔8`, `5↔0` — тот же дребезг вокруг 8.
- **Рабочий диапазон датчика в этой точке — всего 0…15 lx.** Порог `8` стоял ровно в центре метания → ВКЛ/ВЫКЛ хлопали туда-сюда.
**⚠️ Остаточный риск (предупреждён Alex, принят осознанно):** при **2 lx** (покой) ВЫКЛ ждёт `above: 6` и может не наступить → ночной свет залипнет. Гистерезис **сознательно не сделан** по прямому указанию Alex.
**Если залипнет — варианты (по возрастанию):** ① гистерезис `вкл below 4 / выкл above 10`; ② гасить ночной свет по факту включения основной лампы (**блокер: сущность основного освещения верхней душевой неизвестна** — среди `light.*`/`switch.*` душевой есть только `night_light_shower_2`); ③ калибровка `illuminance_calibration` радара.
**Артефакты:**
- Скрипт-образец: `~/tmp-t610/fix_shower_light_threshold.sh` (читает конфиг → правит только `.below`/`.above` == 8 → POST → читает обратно).
- Бэкап файла: `~/tmp-t610/automations/automations.yaml.bak-20260915-105455`.
**🔴 ПИТФОЛЛ (стоил одной пустой заливки):** REST `GET/POST /api/config/automation/config/<id>` отдаёт и принимает поля **во МНОЖЕСТВЕННОМ числе — `triggers` / `conditions`** (в файле `automations.yaml``trigger`/`condition`). Правка по единственному числу через API **молча уходит в пустые пути**: `POST` возвращает `200 {"result":"ok"}`, но значения НЕ меняются. → **ВСЕГДА читать конфиг обратно и сверять фактические значения.**
### Прочие наблюдения (не правки)
- `fading_time` = 10 с, `maximum_range` = **2.85 м** — проверить, покрывает ли зона всю душевую.
- Калибровка `illuminance_calibration` радара: 2 lx при выключенном свете в закрытой душевой — правдоподобно, но потолок 15 lx подозрительно низок.
- **Луковичный вывод:** потолок датчика ~15 lx означает, что он **не отличает ночной свет от основного** — оба выше его шкалы. Поэтому порогом задача «гасить ночной при включении основного» **не решается в принципе**, нужен триггер по основной лампе (см. блокер выше).
## 4. Прочие содержательные автоматизации
| id | alias | Логика |
|---|---|---|
| `1768585827761` | Выключить циркуляцию ГВС | `time 23:00` → turn_off |
| `1768585922970` | Включить циркуляцию ГВС | `time 09:30` → turn_on |
| `1770404069135` | Ventilation automation on | `time 05:00``fan.turn_on fan.automation` |
| `5735cb9f855e462dbdbdf680d0d6a66f` | office_pass_switch_table | `switch.office_table_light_switch_l1` change → toggle `light.smart_light_office_left` |
| `45b96f6f38f6488ba70266fa5da665f5` | office_pass_switch_main | `switch.office_table_light_switch_l2` change → toggle `light.smart_light_office_right` |
| `1771466806839` | Светло: выкл. подсветку лестницы | lever `illuminance above: 150` → turn_off |
| `1771466955010` | Темно: вкл. подсветку лестницы | lever `illuminance below: 130` → turn_on |
| `1771683420621` | Toggle Dimmer bed | кнопка `single` → toggle `light.bed_dimmer` |
| `1771683677259` | Dimmer bed cycle | кнопка `double` → цикл яркости 20/40/60/80/100 % |
| `1771997851260` | **Вкл. ночной свет душевая** | см. §3 🔴 |
| `1771997918348` | **Выкл. ночной свет душевая** | см. §3 🔴 |
| `1773451257968` | Протечка котельная | `moist``notify.notify` «Протечка котельная» |
| `1773451323415` | Датчик протечки котельная батарея | `bat_low` → notify |
| `1773459513601` | Датчик освещенности лестница батарея | `battery_level below 10` → notify |
| `1773459606336` | Light switch bed батарея | `battery_level below 10` → notify |
| `1773459663218` | Zigbee T sensor батарея | `battery_level below 10` → notify |
> **⚠️ Наблюдение:** «Светло/Темно подсветка лестницы» использует **гистерезис** (below 130 / above 150) — это единственная пара с правильной защитой от дребезга. Паттерн годится как образец для правки душевой.
## 5. Питфоллы диагностики
- **Секрет-маскировщик Hermes** подменяет `Bearer $(cat ...)` на `***` → собирать заголовок через `printf` в файл, затем `curl -H @/tmp/hdr.txt`. Рабочий `/tmp/.hatok` уже есть на Mac.
- `ha apps logs <slug>` обрезает вывод и отдаёт старый буфер → живой лог только через API.
- Запросы к `http://192.168.2.176` (raw IP, plain HTTP, private network) **требуют апрува** в Hermes — предупреждать Alex заранее, не ретраить вслепую.
- **🔴 Форма полей через REST — МНОЖЕСТВЕННОЕ число:** `GET/POST /api/config/automation/config/<id>` использует `triggers` / `conditions` (в файле — `trigger` / `condition`). Правка по единственному числу **молча уходит в пустые пути**: `POST` отдаёт `200 {"result":"ok"}`, значения НЕ меняются. **Всегда читать обратно и сверять.**
- **История значения (для доказательства дребезга) — эндпоинт истории:**
```
GET /api/history/period/<ISO-TS>?filter_entity_id=<entity>&minimal_response&no_attributes
```
Возвращает список списков; брать `.[0]`, печатать `last_changed` + `state`. Пример (последние 25 мин):
```
curl -s -H @/tmp/hdr.txt "http://192.168.2.176/api/history/period/$(date -u -v-25M '+%Y-%m-%dT%H:%M:%S')+00:00?filter_entity_id=sensor.shower_2_presence_sensor_illuminance&minimal_response&no_attributes"
```
Именно этим способом доказано метание 7↔12 вокруг порога 8.
- **Две сущности = одно реле:** `switch.night_light_shower_2` и `light.night_light_shower_2` — один и тот же физический реле (`switch_as_x`). Управлять надо той, к которой привязана автоматизация (`switch.`), иначе состояние «расходится» в UI.
## Связанные заметки
- [[family/plans/t610-home-automation]] — единственный рабочий документ по техчасти (хост, доступ, аддоны, Modbus, Zigbee)
- [[family/how-to/home-automation]] — карта железа: AT2 (параметры/PWM), Slave ID, регистры заслонок/реле, ZONT relays
- [[family/documents/home-automation-wishlist]] — роадмап автоматизаций, приоритеты
- [[family/how-to/nodered-ventilation]] — алгоритм вентиляции по CO₂ (Node-RED)