125 lines
8.6 KiB
Markdown
125 lines
8.6 KiB
Markdown
# ⚙️ HA — автоматизации
|
||
|
||
> **Справочник логики автоматизаций** (`automations.yaml` на t610). Топология/команды/Modbus — [[family/how-to/home-automation]].
|
||
|
||
## 1. Где живёт
|
||
|
||
- **Файл:** `/config/automations.yaml` в HA Core на t610.
|
||
- **Всего:** 16 автоматизаций (15 `on` / 1 `off` — `Ventilation automation on`).
|
||
- **Локальная копия:** `~/tmp-t610/automations/automations.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]] — роадмап идей и приоритетов
|