372 lines
11 KiB
YAML
372 lines
11 KiB
YAML
blueprint:
|
|
name: "Custom: Climate Device Control"
|
|
description: >
|
|
Controls device based on window/door sensors with decay duration
|
|
and current_valueerature threshold.
|
|
domain: automation
|
|
input:
|
|
primary_group:
|
|
name: "General"
|
|
collapsed: false
|
|
input:
|
|
device_switch:
|
|
name: Device Switch
|
|
description: Switch associated with device
|
|
selector:
|
|
entity:
|
|
domain: switch
|
|
|
|
control_switch:
|
|
name: Control Switch
|
|
description: Controls if the device can work or not
|
|
selector:
|
|
entity:
|
|
domain:
|
|
- binary_sensor
|
|
- input_boolean
|
|
|
|
doors_group:
|
|
name: "Doors & Windows"
|
|
collapsed: false
|
|
input:
|
|
house_windows:
|
|
name: House Window Sensors
|
|
description: Sensors of whole house
|
|
default: []
|
|
selector:
|
|
entity:
|
|
domain: binary_sensor
|
|
multiple: true
|
|
|
|
room_windows:
|
|
name: Room Window Sensors
|
|
description: Window sensors of the device room
|
|
default: []
|
|
selector:
|
|
entity:
|
|
domain: binary_sensor
|
|
multiple: true
|
|
|
|
room_doors:
|
|
name: Room Door Sensors
|
|
description: Door sensors of the device room
|
|
default: []
|
|
selector:
|
|
entity:
|
|
domain: binary_sensor
|
|
multiple: true
|
|
|
|
decay_duration:
|
|
name: Decay Duration (seconds)
|
|
default: 3
|
|
selector:
|
|
number:
|
|
min: 0
|
|
max: 600
|
|
unit_of_measurement: seconds
|
|
mode: slider
|
|
|
|
env_group:
|
|
name: "Environment"
|
|
collapsed: false
|
|
input:
|
|
env_sensors:
|
|
name: Room Value Sensors
|
|
description: Sensors that controls room value
|
|
default: []
|
|
selector:
|
|
entity:
|
|
domain: sensor
|
|
multiple: true
|
|
|
|
target_value_entity:
|
|
name: Target Value Entity
|
|
description: Entity (e.g. input_number) that defines target value dynamically.
|
|
selector:
|
|
entity:
|
|
domain: input_number
|
|
|
|
value_threshold:
|
|
name: Value Threshold
|
|
description: If value falls below the threshold then device will be turned on (not taking into account other conditions)
|
|
default: 0
|
|
selector:
|
|
number:
|
|
min: 0
|
|
max: 100
|
|
mode: slider
|
|
|
|
value_is_low_entity:
|
|
name: "Low Value Entity (optional)"
|
|
description: The entity will contain state of low value
|
|
default: null
|
|
selector:
|
|
entity:
|
|
domain:
|
|
- input_boolean
|
|
|
|
schedule_group:
|
|
name: "Schedules"
|
|
collapsed: false
|
|
input:
|
|
schedule_entities:
|
|
name: Schedules (optional)
|
|
description: One or more schedule entities that define when device may run. Leave empty for always.
|
|
default: []
|
|
selector:
|
|
entity:
|
|
domain: schedule
|
|
multiple: true
|
|
|
|
power_group:
|
|
name: "Power"
|
|
collapsed: false
|
|
input:
|
|
power_sensor:
|
|
name: Power Sensor
|
|
description: Sensor reporting device power usage (W)
|
|
selector:
|
|
entity:
|
|
domain: sensor
|
|
|
|
power_threshold:
|
|
name: Power Threshold (W)
|
|
description: Below this value, device is considered as problematic
|
|
default: 10
|
|
selector:
|
|
number:
|
|
min: 0
|
|
max: 50
|
|
unit_of_measurement: "W"
|
|
|
|
power_decay_duration:
|
|
name: Power Decay Duration (s)
|
|
description: Time to wait after power is changed before entering problematic power mode.
|
|
default: 10
|
|
selector:
|
|
number:
|
|
min: 1
|
|
max: 50
|
|
unit_of_measurement: "s"
|
|
|
|
power_problematic_indicator_entity:
|
|
name: Indicator Entity (optional)
|
|
description: "If step then the automation with toggle the entity whenever the device enters power problematic state"
|
|
default: null
|
|
selector:
|
|
entity:
|
|
domain: input_boolean
|
|
|
|
mode: single
|
|
|
|
trigger:
|
|
# Control switch
|
|
- platform: state
|
|
entity_id: !input control_switch
|
|
|
|
# House window
|
|
- platform: state
|
|
entity_id: !input house_windows
|
|
for:
|
|
seconds: !input decay_duration
|
|
|
|
# Room window
|
|
- platform: state
|
|
entity_id: !input room_windows
|
|
for:
|
|
seconds: !input decay_duration
|
|
|
|
# Room door
|
|
- platform: state
|
|
entity_id: !input room_doors
|
|
for:
|
|
seconds: !input decay_duration
|
|
|
|
# Target value entity
|
|
- platform: state
|
|
entity_id: !input target_value_entity
|
|
|
|
# Room env sensor
|
|
- platform: state
|
|
entity_id: !input env_sensors
|
|
|
|
# Power sensor
|
|
- platform: numeric_state
|
|
entity_id: !input power_sensor
|
|
below: !input power_threshold
|
|
for:
|
|
seconds: !input power_decay_duration
|
|
|
|
condition: []
|
|
|
|
action:
|
|
- variables:
|
|
env_sensors: !input env_sensors
|
|
control_switch: !input control_switch
|
|
device_switch: !input device_switch
|
|
threshold: !input value_threshold
|
|
value_is_low_entity: !input value_is_low_entity
|
|
|
|
# Target value.
|
|
target_value_entity: !input target_value_entity
|
|
target_value: "{{ states(target_value_entity) | int }}"
|
|
|
|
# Values/threshold
|
|
value_stats: >
|
|
{% set result = [] %}
|
|
{% if env_sensors | length > 0 %}
|
|
{% set values = expand(env_sensors) | map(attribute='state') | map('float') | list %}
|
|
{% if threshold != 0 %}
|
|
{% set result = result + [values | select('lt', threshold) | list | count] %}
|
|
{% else %}
|
|
{% set result = result + [0] %}
|
|
{% endif %}
|
|
|
|
{% if target_value != 0 %}
|
|
{% set result = result + [values | select('lt', target_value) | list | count] %}
|
|
{% else %}
|
|
{% set result = result + [0] %}
|
|
{% endif %}
|
|
|
|
{% else %}
|
|
{% set result = [0, 0] %}
|
|
{% endif %}
|
|
{{ result }}
|
|
is_value_below_threshold: "{{ (value_stats[0] | int) > 0 }}"
|
|
is_value_below_target_value: "{{ (value_stats[1] | int) > 0 }}"
|
|
|
|
# Power
|
|
power_threshold: !input power_threshold
|
|
power_sensor: !input power_sensor
|
|
power_problematic_indicator_entity: !input power_problematic_indicator_entity
|
|
power_decay_duration: !input power_decay_duration
|
|
power: "{{ states(power_sensor) | float(0) }}"
|
|
is_power_not_ok: "{{ (power > 0 and power < power_threshold) if power_threshold != 0 else false }}"
|
|
|
|
# doors/windows
|
|
house_windows: !input house_windows
|
|
room_windows: !input room_windows
|
|
room_doors: !input room_doors
|
|
decay: !input decay_duration
|
|
house_closed: >
|
|
{% set ns = namespace(res = true) %}
|
|
{% for i in range(house_windows | count) %}
|
|
{% set it = house_windows[i] %}
|
|
{% set ns.res = ns.res and (is_state(it, 'off') and (now() - states[it].last_changed).total_seconds() > decay) %}
|
|
{% endfor %}
|
|
{{ ns.res }}
|
|
room_closed: >
|
|
{% if (room_windows | count) or (room_doors | count) == 0 %}
|
|
{{ false }}
|
|
{% else %}
|
|
{% set ns = namespace(res = true) %}
|
|
{% for i in range(room_windows | count) %}
|
|
{% set it = room_windows[i] %}
|
|
{% set ns.res = ns.res and (is_state(it, 'off') and (now() - states[it].last_changed).total_seconds() > decay) %}
|
|
{% endfor %}
|
|
{% for i in range(room_doors | count) %}
|
|
{% set it = room_doors[i] %}
|
|
{% set ns.res = ns.res and (is_state(it, 'off') and (now() - states[it].last_changed).total_seconds() > decay) %}
|
|
{% endfor %}
|
|
{{ ns.res }}
|
|
{% endif %}
|
|
|
|
# Schedules
|
|
schedule_entities: !input schedule_entities
|
|
schedule_active: >
|
|
{% if schedule_entities | length > 0 %}
|
|
{{ schedule_entities | select('is_state','on') | list | length > 0 }}
|
|
{% else %}
|
|
true
|
|
{% endif %}
|
|
|
|
is_debug: false
|
|
|
|
# Debug message
|
|
- choose:
|
|
- conditions: "{{ is_debug }}"
|
|
sequence:
|
|
- service: persistent_notification.create
|
|
data:
|
|
title: "Climate (debug)"
|
|
message: >
|
|
room_closed = {{ room_closed }},
|
|
house_closed = {{ house_closed }}
|
|
|
|
# Power problematic.
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: "{{ is_state(device_switch, 'on') and power_problematic_indicator_entity is not none }}"
|
|
sequence:
|
|
- variables:
|
|
timeout_elapsed: >
|
|
{% set last = as_timestamp(states[power_sensor].last_changed) %}
|
|
{{ (as_timestamp(now()) - last) > power_decay_duration }}
|
|
|
|
- condition: template
|
|
value_template: "{{ timeout_elapsed }}"
|
|
|
|
- choose:
|
|
- conditions: "{{ is_power_not_ok }}"
|
|
sequence:
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: "{{ power_problematic_indicator_entity }}"
|
|
default:
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: "{{ power_problematic_indicator_entity }}"
|
|
|
|
# `value_is_low_entity` entity control
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: "{{ value_is_low_entity is not none }}"
|
|
sequence:
|
|
- choose:
|
|
- conditions:
|
|
- condition: template
|
|
value_template: "{{ is_value_below_threshold }}"
|
|
sequence:
|
|
- service: input_boolean.turn_on
|
|
target:
|
|
entity_id: !input value_is_low_entity
|
|
default:
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: !input value_is_low_entity
|
|
|
|
- choose:
|
|
# Value is not ok override
|
|
- conditions:
|
|
- condition: template
|
|
value_template: "{{ is_value_below_threshold }}"
|
|
sequence:
|
|
- service: switch.turn_on
|
|
target:
|
|
entity_id: !input device_switch
|
|
|
|
# Control is not enabled
|
|
- conditions:
|
|
- condition: template
|
|
value_template: "{{ is_state(control_switch, 'off') }}"
|
|
sequence:
|
|
- service: switch.turn_off
|
|
target:
|
|
entity_id: !input device_switch
|
|
|
|
# Windows/doors closed with decay
|
|
- conditions:
|
|
- condition: template
|
|
value_template: "{{ (house_closed or room_closed) and schedule_active and is_value_below_target_value }}"
|
|
sequence:
|
|
- service: switch.turn_on
|
|
target:
|
|
entity_id: !input device_switch
|
|
|
|
default:
|
|
- service: switch.turn_off
|
|
target:
|
|
entity_id: !input device_switch
|