ha_cercadian_alarm/parabolic_alarm_script.yaml
2024-09-24 11:32:09 -04:00

139 lines
4.2 KiB
YAML

blueprint:
name: Light Sunrise
author: steriku
description: >
Campanion Script to the parabolic alarm automation blueprint.
source_url: https://github.com/steku/ha_cercadian_alarm/blob/main/blueprint_parabolic_alarm_script.yaml
domain: script
homeassistant:
min_version: 2024.9.0
fields:
target_kelvin:
description: Coldest Kelvin value. This is the end value - most white
selector:
color_temp:
unit: kelvin
default: 6500
name: Coldest Kelvin
start_kelvin:
description: >-
This is the start value. If the light is on the current value from the
state of the light will be used and this will be ignored.
selector:
color_temp:
unit: kelvin
min: 2500
max: 6500
default: 2500
name: Warmest Kelvin
max_brightness_pct:
description: Maximum brightness in percent to reach by the end of the script
selector:
number:
min: 1
max: 100
default: 80
name: Max brightness
alarm_length:
description: >-
This is the start to finish time. Take this into account when setting up
the automation this script is called by.
selector:
number:
min: 1
max: 60
default: 10
name: Alarm Length
steps_per_minute:
description: How many steps per minute
selector:
number:
min: 1
max: 12
default: 12
name: Steps Per minute
target_light:
description: A single light or group
selector:
entity:
filter:
domain: light
name: Target Light
light_timeout:
description: >-
Minutes to delay after Max Brightness has been reached to turn the light
back off. Value of 0 disables the timeout
selector:
number:
min: 0
max: 60
default: 5
name: Light Timeout
variables:
steps: "{{ alarm_length * steps_per_minute }}"
min_brightness: |-
{% if states(target_light) == 'off' %}
3
{% else %}
{{ state_attr(target_light, 'brightness') }}
{% endif %}
max_brightness: "{{ max_brightness_pct * 2.55 }}"
kelvin_step: "{{ (target_kelvin - start_kelvin) / steps }}"
bright_step: "{{ (max_brightness - min_brightness) / steps }}"
start_time: "{{ as_timestamp(now()) }}"
individual_step: "{{ 60 / steps_per_minute }}"
sequence:
- repeat:
until:
- condition: or
conditions:
- condition: template
value_template: "{{ is_state(target_light, 'off') }}"
- condition: template
value_template: "{{ state_attr(target_light, 'brightness') >= max_brightness }}"
- condition: template
value_template: >-
{{ state_attr(target_light, 'color_temp_kelvin') >=
target_kelvin }}
- condition: template
value_template: >-
{{ (((as_timestamp(now()) - start_time) / individual_step) |
round(0, "ceil")) > steps }}
sequence:
- variables:
steps_to_now: |-
{{ ((as_timestamp(now()) - start_time) / individual_step) |
round(0, "ceil") }}
brightness: >-
{{ min_brightness + (bright_step * steps_to_now) | round(0,
'ceil') }}
kelvin: "{{ start_kelvin + (kelvin_step * steps_to_now) }}"
- delay:
seconds: "{{ individual_step }}"
- if:
- condition: template
value_template: "{{ is_state(target_light, 'on') }}"
then:
- data:
brightness: "{{ brightness }}"
color_temp_kelvin: "{{ kelvin }}"
transition: "{{ individual_step - 1 }}"
target:
entity_id: "{{ target_light }}"
action: light.turn_on
- if:
- condition: and
conditions:
- condition: template
value_template: "{{ light_timeout != 0 }}"
- condition: template
value_template: "{{ is_state(target_light, 'on') }}"
then:
- delay:
minutes: "{{ light_timeout }}"
- data: {}
target:
entity_id: "{{ target_light }}"
action: light.turn_off
mode: parallel