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

156 lines
12 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.
# ⚙️ HA — автоматизации
> **Справочник логики автоматизаций** (`automations.yaml` на t610). Топология/команды/Modbus — [[family/how-to/home-automation]].
> 🟢 **ОБНОВЛЕНО 2026-09-15 (ночь-14): АВТОМАТИЗАЦИИ ПОЧИНЕНЫ — 12 из 16 РАБОТАЮТ.**
>
> Переезд Zigbee Z2M → ZHA выполнен. Автоматизации были сломаны не по `entity_id`, а глубже — они ссылались на `device_id` + внутренний `entity_id`-UUID, а устройства Z2M удалены. **Пересобраны заново** на ZHA-шные `device_id` + актуальные `entity_id`.
>
> **Итог: 12 живых, 4 ждут 2 спящих батарейных.**
>
> | Автоматизация | Состояние |
> |---|---|
> | Циркуляция ГВС вкл/выкл (по времени) | ✅ on |
> | office_pass_switch_table / office_pass_switch_main | ✅ on |
> | Ночной свет душевая вкл/выкл | ✅ on |
> | Протечка котельная | ✅ on |
> | Датчик протечки котельная батарея | ✅ on |
> | Zigbee T sensor батарея | ✅ on |
> | Toggle dimmer bed / increase dimmer bed brightness | ✅ on (триггер от спящей кнопки отключён) |
> | Ventilation automation on | ⏸ off (не Zigbee) |
> | `svetlo_vykl_osveshchenie_lestnitsy` | ⏳ ждёт `light_sensor_stairs` |
> | `temno_vkl_podsvetku_lestnitsy` | ⏳ ждёт `light_sensor_stairs` |
> | `datchik_osveshchennosti_lestnitsa_batareia` | ⏳ ждёт `light_sensor_stairs` |
> | `light_switch_bed_batareia` | ⏳ ждёт `wireless_light_switch_bed` |
>
> **Бэкап:** `/config/automations.yaml.bak-before-autofix-20260915-212636` (до пересборки) + `automations.yaml.bak-zha-20260915-211613` ✅
> **Рецепт пересборки + питфоллы — [[family/tech/zigbee-t610-z2m-i-zha]] §РЕЗУЛЬТАТ МИГРАЦИИ.**
>
> 🔴 **ПИТФОЛЛЫ, найденные при починке:**
> 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`.
> 3. **Домен `entity_id` не меняется переименованием:** `switch.office_table_light_switch_l1` → ZHA-имя `light.tz3000_5gey1ohx_ts0002_osveshchenie`. Автоматизации переписаны на `light.*`.
> 4. **`reload` — `POST /api/services/automation/reload`** с long-lived JWT, порт 80 (`http://172.30.32.1/api/`). Супервизорский токен → 401.
## 1. Где живёт
- **Файл:** `/config/automations.yaml` в HA Core на t610.
- **Всего:** 16 автоматизаций — **12 живых** (`on`), 1 `off` (`Ventilation automation on`), **4 `unavailable`** (ждут 2 спящих батарейных). После починки ночь-14 файл = 189 строк.
- **Локальная копия:** `~/tmp-t610/automations/automations.yaml`; после пересборки — `~/tmp-t610/automations-new.yaml`.
- **Читать живьём через API** (не по памяти):
```bash
B="https://mallexxx.duckdns.org"
curl -s -H @/tmp/h1 "$B/api/config/automation/config/<ID>"
```
### 🔴 ПИТФОЛЛ (стоил пустой заливки)
REST `GET/POST /api/config/automation/config/<id>` использует поля **во множественном числе — `triggers` / `conditions` / `actions`** (в файле `automations.yaml` — `trigger`/`condition`/`action`).
Правка по единственному числу **молча уходит в пустые пути**: POST → `200 {"result":"ok"}`, значения НЕ меняются.
→ **ВСЕГДА читать конфиг обратно и сверять фактические значения.**
**Бэкап перед правкой:** `cp ~/tmp-t610/automations/automations.yaml{,.bak-$(date +%Y%m%d-%H%M%S)}`
---
## 2. Карта автоматизаций
| 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` *(off)* |
| `5735cb9f855e462dbdbdf680d0d6a66f` | **office_pass_switch_table** | кнопка L1 → toggle `light.smart_light_office_left` ⚠️ |
| `45b96f6f38f6488ba70266fa5da665f5` | **office_pass_switch_main** | кнопка L2 → 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` | **Вкл. ночной свет душевая** | присутствие + темно → `switch.night_light_shower_2` on |
| `1771997918348` | **Выкл. ночной свет душевая** | нет присутствия / светло → off |
| `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`). Брать как эталон.
---
## 3. 🔴 ДЕФЕКТ: свет кабинета мигает при перезагрузке HA
**Симптом:** при каждом рестарте HA свет в кабинете мигает.
**Первопричина:** триггеры `office_pass_switch_table` / `office_pass_switch_main` используют `platform: state` **без `to`/`from`** → срабатывают на **любую** смену состояния сущности кнопки.
При старте HA кнопки проходят `unavailable → unknown → on` — каждый переход дёргает `light.toggle`. Подтверждено историей: `switch.office_table_light_switch_l1` сменил состояние 3 раза в течение 5 минут в момент рестартов HA (`05:16:36 → unavailable`, `05:16:40 → on`, `05:18:39 → unavailable`, `05:18:46 → unknown`, `05:19:20 → on`).
**Текущий конфиг (сырой):**
```json
{
"alias": "office_pass_switch_table",
"mode": "restart",
"trigger": [{"platform": "state", "entity_id": ["switch.office_table_light_switch_l1"]}],
"action": [{"service": "light.toggle", "target": {"entity_id": "light.smart_light_office_left"}}]
}
```
**Направление фикса:** привязать триггер к конкретному состоянию (`to:`) ИЛИ заменить на триггер по событию нажатия. Требует определить фактическое поведение кнопки при физическом нажатии (сейчас кнопки в `on` — это состояние после старта, не нажатие).
**Статус:** ⚠️ **НЕ ИСПРАВЛЕНО.** Требует замера поведения кнопки при нажатии.
---
## 4. Ночной свет душевой 2
**Сущности** (device_id `4095e7c3b47b9dc9640cfb8c3aeff022` = радар, `4d6e55505ff7dbad13d2674cdcb18d5a` = лампа):
- `sensor.shower_2_presence_sensor_illuminance` — освещённость, lx
- `binary_sensor.shower_2_presence_sensor_presence` — занятость
- `switch.night_light_shower_2` — **само реле** (его дёргает автоматизация)
- `light.night_light_shower_2` — хелпер `switch_as_x` поверх того же реле
> ⚠️ **Две сущности = одно реле.** Управлять надо `switch.` — той, к которой привязана автоматика, иначе состояние «расходится» в UI.
**Автоматизации:**
| | id | Триггер | Условие |
|---|---|---|---|
| ВКЛ | `1771997851260` | `illuminance below: 6` + `occupied` | `below: 6` + `is_occupied` |
| ВЫКЛ | `1771997918348` | `not_occupied` + `illuminance above: 6` | ⚠️ **`conditions: []`** — пусто |
**История правки (2026-09-15):** порог `8 → 6`. Порог `8` лежал ровно в центре дребезга датчика (**7 ↔ 12**), рабочий диапазон датчика всего **0…15 lx** → ВКЛ/ВЫКЛ хлопали по кругу.
**⚠️ Остаточный риск (принят Alex):** при **2 lx** (покой) ВЫКЛ ждёт `above: 6` и может не наступить → свет залипнет. Гистерезис сознательно не сделан.
**Если залипнет — варианты:** ① гистерезис `вкл below 4 / выкл above 10`; ② гасить по факту включения основной лампы (**блокер: сущность основного освещения верхней душевой неизвестна**); ③ калибровка `illuminance_calibration` радара.
**Параметры радара:** `fading_time` = 10 с, `maximum_range` = 2.85 м — проверять, покрывает ли зона всю душевую.
---
## 5. Диагностика
```bash
# История значения (доказательство дребезга)
T=$(date -u -v-3H '+%Y-%m-%dT%H:%M:%S')
curl -s -H @/tmp/h1 "$B/api/history/period/$T+00:00?filter_entity_id=<entity>&minimal_response&no_attributes" \
| jq -r '.[0][] | "\(.last_changed) -> \(.state)"'
# Состояния сущностей устройства (через шаблон)
curl -s -X POST -H @/tmp/h1 -H "Content-Type: application/json" \
-d '{"template":"{% set dev = device_id(\"sensor.x\") %}{% for e in device_entities(dev) %}{{ e }} = {{ states(e) }}\n{% endfor %}"}' \
"$B/api/template"
```
**Артефакты:** `~/tmp-t610/fix_shower_light_threshold.sh` (образец правки порога), `~/tmp-t610/ha_ws.py` (WS-реестры).
**Бэкап:** `~/tmp-t610/automations/automations.yaml.bak-20260915-105455`.
---
## Связанные
- [[family/how-to/home-automation]] — единый справочник: топология, железо, Zigbee, Modbus, команды, сценарии, питфоллы
- [[family/documents/home-automation-wishlist]] — роадмап идей и приоритетов
- [[family/how-to/vault-sync-pipeline]] — правки в vault не доедут до телефона без прогона sync-петли