Skip to content

Instantly share code, notes, and snippets.

@smirnowegor
Last active November 25, 2025 11:23
Show Gist options
  • Select an option

  • Save smirnowegor/9f056c2a7edd5dec416cfd34dceced1a to your computer and use it in GitHub Desktop.

Select an option

Save smirnowegor/9f056c2a7edd5dec416cfd34dceced1a to your computer and use it in GitHub Desktop.
blueprint:
name: "Умная Вытяжка Pro Max: Динамика, Таймер, Условия"
description: >
**Профессиональная и отказоустойчивая автоматизация для ванной комнаты.**
Эта логика решает главную проблему: она не ждет фиксированного порога влажности (например, 70%), а постоянно сравнивает влажность в помещении с **динамической нормой** (эталоном/медианой дома).
### 💡 Ключевые особенности
1. **Динамическое сравнение:** Работает корректно и зимой (когда влажность в доме низкая), и летом (когда влажность везде высокая).
2. **Умный Гистерезис:** Выключение происходит не после достижения абсолютной нормы, а когда влажность упала на половину критической разницы. Это экономит энергию и ресурс.
3. **Ручной режим:** Если включить вытяжку кнопкой, она отработает заданный таймер проветривания (например, 15 мин) и не будет зависеть от влажности.
4. **Защита (Safety Timeout):** Аварийный таймер принудительно выключит вытяжку, если влажность не падает слишком долго.
5. **Блокирующие Условия (v2):** Возможность запретить авто-запуск, если открыто окно или включен ночной режим.
6. **Пост-Действия (v2):** Выполнение дополнительных команд после выключения (например, выключить свет, отправить уведомление).
</details>
**Контакты автора:**
- [Telegram канал про автоматизацию домов](https://t.me/u2smart4home)
- [YouTube: Удобный дом](https://www.youtube.com/@udobni_dom)
- [Яндекс.Дзен: Мой профиль](https://dzen.ru/id/5e32d0969929ba40059b5892)
- [Teletype](https://teletype.in/@godisblind)
domain: automation
input:
humidity_sensor:
name: "Датчик влажности (Целевой)"
description: "Основной сенсор в ванной/туалете. Его показания мы сравниваем с эталоном."
selector:
entity:
domain: sensor
device_class: humidity
reference_humidity_sensor:
name: "Эталонная Влажность (Референс)"
description: >
**КЛЮЧЕВОЙ ПАРАМЕТР:** Это датчик нормы. Рекомендуется использовать:
1. Сенсор медианной влажности (Helper).
2. Сенсор в стабильно сухой комнате (например, спальня).
Мы используем его, чтобы вытяжка включалась, только когда влажность *резко* превышает норму для всего дома. Это предотвращает ложные срабатывания в дождливую погоду.
selector:
entity:
domain: sensor
diff_threshold:
name: "Порог срабатывания (%)"
description: "На сколько процентов влажность в ванной должна стать выше Эталонной, чтобы запустить вытяжку. Определяет чувствительность системы. (Пример: 8-12%)."
selector:
entity:
domain: input_number
fan_entity:
name: "Вытяжка (Вентилятор)"
description: "Сама сущность вентилятора (обязательно домен fan)."
selector:
entity:
domain: fan
timer_entity:
name: "Системный Таймер (Helper)"
description: "Обязательно создайте таймер в 'Помощниках'. Нужен для сохранения времени работы при перезагрузке HA."
selector:
entity:
domain: timer
safety_timeout:
name: "Аварийный Таймер (мин)"
description: "Максимальное время работы вытяжки при высоком уровне влажности. Срабатывает как защита, если влажность не падает."
selector:
entity:
domain: input_number
manual_timeout:
name: "Таймер Ручного Режима (мин)"
description: "Время, которое вытяжка будет работать после того, как вы включили ее кнопкой (для проветривания)."
selector:
entity:
domain: input_number
# --- НОВЫЕ БЛОКИ v2 ---
global_conditions:
name: "Глобальные Условия (Блокировка)"
description: "Если эти условия НЕ выполняются, авто-запуск блокируется. (Пример: 'Окно закрыто' ИЛИ 'Сейчас не Ночь')."
default: []
selector:
condition: {}
completion_actions:
name: "Действия при Завершении"
description: "Что сделать ПОСЛЕ выключения вытяжки? (Пример: Отправить уведомление, Выключить свет)."
default: []
selector:
action: {}
mode: restart
trigger_variables:
var_hum_sensor: !input humidity_sensor
var_ref_sensor: !input reference_humidity_sensor
var_diff: !input diff_threshold
var_fan: !input fan_entity
var_timer: !input timer_entity
variables:
t_safe: !input safety_timeout
t_manual: !input manual_timeout
hum_sensor: !input humidity_sensor
ref_sensor: !input reference_humidity_sensor
diff_sensor: !input diff_threshold
trigger:
# 1. Авто-старт
- platform: template
id: high
value_template: >-
{% set c = states(var_hum_sensor) | float(0) %}
{% set m = states(var_ref_sensor) | float(0) %}
{% set d = states(var_diff) | float(0) %}
{{ c > (m + d) }}
# 2. Авто-стоп (Гистерезис)
- platform: template
id: low
value_template: >-
{% set c = states(var_hum_sensor) | float(0) %}
{% set m = states(var_ref_sensor) | float(0) %}
{% set d = states(var_diff) | float(0) %}
{{ c <= (m + (d * 0.5)) }}
# 3. Ручной старт
- platform: state
entity_id: !input fan_entity
to: "on"
id: manual_on
# 4. Таймер истек
- platform: event
event_type: timer.finished
event_data:
entity_id: !input timer_entity
id: timer_end
action:
- choose:
# ------------------------------------------------
# СЦЕНАРИЙ А: Высокая влажность (Авто)
# ------------------------------------------------
- conditions:
- condition: trigger
id: high
- condition: and
conditions: !input global_conditions
sequence:
- action: fan.turn_on
target:
entity_id: !input fan_entity
- action: timer.start
target:
entity_id: !input timer_entity
data:
duration: "{{ (states(t_safe) | float(60) * 60) | int }}"
# ------------------------------------------------
# СЦЕНАРИЙ Б: Влажность упала (Стоп)
# ------------------------------------------------
- conditions:
- condition: trigger
id: low
- condition: state
entity_id: !input fan_entity
state: "on"
sequence:
- action: fan.turn_off
target:
entity_id: !input fan_entity
- action: timer.cancel
target:
entity_id: !input timer_entity
- choose: []
default: !input completion_actions # Выполнение пост-действий
# ------------------------------------------------
# СЦЕНАРИЙ В: Ручное включение
# ------------------------------------------------
- conditions:
- condition: trigger
id: manual_on
- condition: template
value_template: >-
{% set c = states(hum_sensor) | float(0) %}
{% set m = states(ref_sensor) | float(0) %}
{% set d = states(diff_sensor) | float(0) %}
{{ c <= (m + d) }}
sequence:
- action: timer.start
target:
entity_id: !input timer_entity
data:
duration: "{{ (states(t_manual) | float(15) * 60) | int }}"
# ------------------------------------------------
# СЦЕНАРИЙ Г: Таймер истек (Стоп)
# ------------------------------------------------
- conditions:
- condition: trigger
id: timer_end
sequence:
- action: fan.turn_off
target:
entity_id: !input fan_entity
- choose: []
default: !input completion_actions # Выполнение пост-действий
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment