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

17 KiB
Raw Blame History

title, aliases, tags, updated, related
title aliases tags updated related
⚙️ HA — автоматизации (automations.yaml)
HA automations
Автоматизации HA
automations.yaml
Ночной свет душевая
family
how-to
smarthome
home-assistant
automation
2026-09-15
family/plans/t610-home-automation
family/how-to/home-automation
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
0c7a0eb6d60e852b447266da69a7785e (entity-хелпер, см. mapping)

Сущности радара душевой 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', «Вкл. ночной свет душевая»

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', «Выкл. ночной свет душевая»

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.yamltrigger/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:00fan.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 Протечка котельная moistnotify.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.

Связанные заметки