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

12 KiB
Raw Blame History

⚙️ HA — автоматизации

Справочник логики автоматизаций (automations.yaml на t610). Топология/команды/Modbus — family/how-to/home-automation.

🟢 АКТУАЛЬНО 2026-09-15: 14 АВТОМАТИЗАЦИЙ — 13 on, 1 off (Ventilation automation on, намеренно), unavailable = 0. Zigbee работает на ZHA.

Переезд Zigbee Z2M → ZHA выполнен. Автоматизации были сломаны не по entity_id, а глубже — они ссылались на device_id + внутренний entity_id-UUID, а устройства Z2M удалены. Пересобраны заново на ZHA-шные device_id + актуальные entity_id.

Что доделано после первичной пересборки:

  • 4 «призрака»-автоматизации УДАЛЕНЫ из core.entity_registry (тела не существовало: GET /api/config/automation/config/<id> → 404). Файл: 12 блоков vs 16 сущностей.
  • 2 сценария подсветки лестницы ПЕРЕСОЗДАНЫ на sensor.light_sensor_stairs_illuminance (light.light_stairs_left/_right), оба on.
  • Toggle Dimmer bed / Dimmer bed cycle — залиты и on: триггер от кнопки, действия на light.bed_dimmer (было — реле сауны).
  • ⚠️ Кнопка спальни: события remote_button_short_press идут только после zha/devices/reconfigure. Дамп кластеров ДО reconfigure вводит в заблуждение.

Итог: 14 автоматизаций, unavailable = 0.

Бэкап: /config/automations.yaml.bak-dimmer-fix (последняя правка) + .bak-before-autofix-20260915-212636 + .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. reloadPOST /api/services/automation/reload с long-lived JWT, порт 80 (http://172.30.32.1/api/). Супервизорский токен → 401.

1. Где живёт

  • Файл: /config/automations.yaml в HA Core на t610.
  • Всего: 14 автоматизаций — 13 on, 1 off (Ventilation automation on, намеренно, last_triggered 12 марта), unavailable = 0. Файл = 189 строк.
  • Удалены 4 «призрака» (записи в реестре без тела): svetlo_vykl_osveshchenie_lestnitsy, temno_vkl_podsvetku_lestnitsy, datchik_osveshchennosti_lestnitsa_batareia, light_switch_bed_batareia. Тела не было (config/automation/config/<id> → 404) — лестничные сценарии пересозданы заново с теми же id.
  • Локальная копия: ~/tmp-t610/automations/automations.yaml; после пересборки — ~/tmp-t610/automations-new.yaml, ~/tmp-t610/automations-fixed.yaml.
  • Читать живьём через API (не по памяти):
    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.yamltrigger/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:00fan.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 Темно: вкл. подсветку лестницы illuminance below: 20light.light_stairs_left+_right turn_on
1771466955010 Светло: выкл. подсветку лестницы illuminance above: 60light.light_stairs_left+_right turn_off
1771683420621 Toggle Dimmer bed кнопка remote_button_short_presslight.toggle light.bed_dimmer
1771683677259 Dimmer bed cycle кнопка long_presslight.turn_on brightness 50 % на light.bed_dimmer
1771997851260 Вкл. ночной свет душевая присутствие + темно → switch.night_light_shower_2 on
1771997918348 Выкл. ночной свет душевая нет присутствия / светло → off
1773451257968 Протечка котельная moistnotify.notify
1773451323415 Датчик протечки котельная батарея bat_low → notify
1773459663218 Zigbee T sensor батарея battery_level below 10 → notify

⚠️ Два сценария подсветки лестницы (id 1771466806839 / 1771466955010) удалены как «призраки» и ПЕРЕСОЗДАНЫ с теми же id на sensor.light_sensor_stairs_illuminance. Пороги 20/60. 🗑 Удалённые «призраки», которых в файле НЕТ: automation.svetlo_vykl_osveshchenie_lestnitsy, automation.temno_vkl_podsvetku_lestnitsy, automation.datchik_osveshchennosti_lestnitsa_batareia, automation.light_switch_bed_batareia.

Образец правильной защиты от дребезга: «Темно/Светло подсветка лестницы» использует гистерезис (below: 20 / above: 60). Брать как эталон.


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).

Текущий конфиг (сырой):

{
  "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. Диагностика

# История значения (доказательство дребезга)
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.


Связанные