-
-
Save lnlyssg/65e47876a767385e331300d440404a31 to your computer and use it in GitHub Desktop.
blueprint: | |
name: My own wake-up light alarm with sunrise effect | |
author: lnlyssg | |
description: | |
"A wake-up light alarm with a brightness and color temperature sunrise | |
effect. Note: not manually executable!" | |
domain: automation | |
input: | |
light_entity: | |
name: Wake-up light entity | |
description: | |
The light to control. Turning it off during the sunrise will keep | |
it off. Color temperature range is auto-detected. | |
selector: | |
entity: | |
domain: light | |
timestamp_sensor: | |
name: Alarm timestamp sensor | |
description: | |
"Datetime helper with timestamp of next alarm or set to 'none' for manual alarm time" | |
default: none | |
selector: | |
entity: | |
filter: | |
- domain: | |
- input_datetime | |
manual_time: | |
name: Manual alarm time | |
description: | |
Time to trigger alarm every day if timestamp sensor is not set. | |
Settings at or shortly after midnight will not work as expected! | |
default: none | |
selector: | |
time: {} | |
check_entity: | |
name: Additional entity to check before sunrise is triggered | |
description: | |
If set, checks if entity is 'on' or 'home' before triggering. Use | |
e.g. a (workday) sensor, device_tracker or person entity. | |
default: none | |
selector: | |
entity: {} | |
check_person: | |
name: Additional person check before sunrise is triggered | |
description: | |
If set, checks if person is 'home' before triggering. Uses a person entity. | |
default: none | |
selector: | |
entity: | |
filter: | |
- domain: | |
- person | |
sunrise_duration: | |
name: Sunrise duration | |
description: | |
The sunrise will start the configured number of minutes before | |
the timestamp. | |
default: 25 | |
selector: | |
number: | |
min: 5.0 | |
max: 60.0 | |
step: 5.0 | |
unit_of_measurement: min | |
mode: slider | |
start_brightness: | |
name: Minimum brightness | |
description: | |
The brightness to start with. Some lights ignore very low values | |
and may turn on with full brightness instead! | |
default: 1 | |
selector: | |
number: | |
min: 1.0 | |
max: 255.0 | |
step: 1.0 | |
mode: slider | |
end_brightness: | |
name: Maximum brightness | |
description: | |
The brightness will be transitioned from the minimum to the configured | |
value. | |
default: 255 | |
selector: | |
number: | |
min: 5.0 | |
max: 255.0 | |
step: 1.0 | |
mode: slider | |
min_mired: | |
name: Minimum color temperature | |
description: "The minimum color temperature to use. (0: lowest supported)" | |
default: 0 | |
selector: | |
number: | |
min: 0.0 | |
max: 500.0 | |
step: 5.0 | |
mode: slider | |
unit_of_measurement: mired | |
pre_sunrise_actions: | |
name: Pre-sunrise actions | |
description: Optional actions to run before sunrise starts. | |
default: [] | |
selector: | |
action: {} | |
post_sunrise_actions: | |
name: Post-sunrise actions | |
description: Optional actions to run after sunrise ends (around the alarm time). | |
default: [] | |
selector: | |
action: {} | |
source_url: https://gist.github.com/triplepoint/1b9006ddec208a07fc0100a2a30110eb | |
variables: | |
light_entity: !input "light_entity" | |
sensor: !input "timestamp_sensor" | |
sunrise_duration: !input "sunrise_duration" | |
start_brightness: !input "start_brightness" | |
end_brightness: !input "end_brightness" | |
range_brightness: "{{ float(end_brightness)-float(start_brightness) }}" | |
manual_time: !input "manual_time" | |
seconds: "{{ float(sunrise_duration) * 60 }}" | |
min_mired: !input "min_mired" | |
start_mired: "{{ state_attr(light_entity, 'max_mireds') }}" | |
end_mired: "{{ [state_attr(light_entity, 'min_mireds')|int(0), min_mired|int(0)]|max }}" | |
tick_time: "{{ float(seconds) / float(range_brightness) }}" | |
check_entity: !input "check_entity" | |
check_person: !input "check_person" | |
trigger: | |
- platform: time_pattern | |
minutes: "*" | |
condition: [] | |
action: | |
- wait_template: "{{ sensor == 'none' or as_timestamp(states(sensor), None) != None }}" | |
- wait_template: "{{ 0 < | |
as_timestamp(states(sensor) if sensor != 'none' else today_at(manual_time)) - as_timestamp(now()) | |
<= float(seconds) | |
and states(check_entity) in ['unknown', 'on', 'home'] and states(check_person) in ['unknown', 'on', 'home'] }}" | |
- choose: [] | |
default: !input "pre_sunrise_actions" | |
- condition: template | |
value_template: "{{ sensor == 'none' or as_timestamp(states(sensor), None) != None }}" | |
- condition: template | |
value_template: "{{ 0 < | |
as_timestamp(states(sensor) if sensor != 'none' else today_at(manual_time)) - as_timestamp(now()) | |
<= float(seconds) | |
and states(check_entity) in ['unknown', 'on', 'home'] and states(check_person) in ['unknown', 'on', 'home'] }}" | |
- choose: | |
- conditions: | |
- "{{ state_attr(light_entity, 'min_mireds') != None }}" | |
sequence: | |
- service: light.turn_on | |
data: | |
brightness: "{{ start_brightness }}" | |
color_temp_kelvin: "{{ start_mired }}" | |
entity_id: !input "light_entity" | |
default: | |
- service: light.turn_on | |
data: | |
brightness: "{{ start_brightness }}" | |
entity_id: !input "light_entity" | |
- repeat: | |
while: | |
- "{{ sensor == 'none' or as_timestamp(states(sensor), None) != None }}" | |
- "{{ 0 < | |
as_timestamp(states(sensor) if sensor != 'none' else today_at(manual_time)) - as_timestamp(now()) | |
<= float(seconds) }}" | |
sequence: | |
- delay: "{{ tick_time }}" | |
- choose: | |
- conditions: | |
- "{{ 0 < state_attr(light_entity, 'brightness') | int(0) < end_brightness | int }}" | |
- "{{ sensor == 'none' or as_timestamp(states(sensor), None) != None }}" | |
- "{{ 0 < | |
as_timestamp(states(sensor) if sensor != 'none' else today_at(manual_time)) - as_timestamp(now()) | |
<= float(seconds) }}" | |
sequence: | |
- choose: | |
- conditions: | |
- "{{ state_attr(light_entity, 'min_mireds') != None }}" | |
sequence: | |
- service: light.turn_on | |
data: | |
brightness: | |
"{{ (float(end_brightness) - (float(range_brightness) * | |
(as_timestamp(states(sensor) if sensor != 'none' else today_at(manual_time)) - as_timestamp(now())) / float(seconds))) | |
| int(0) }}" | |
color_temp_kelvin: | |
"{{ (float(end_mired) + (float(start_mired) - float(end_mired)) | |
* ((as_timestamp(states(sensor) if sensor != 'none' else today_at(manual_time)) - as_timestamp(now())) / float(seconds))) | |
| int(0) }}" | |
entity_id: !input "light_entity" | |
default: | |
- service: light.turn_on | |
data: | |
brightness: | |
"{{ (float(end_brightness) - (float(range_brightness) * (as_timestamp(states(sensor) | |
if sensor != 'none' else today_at(manual_time)) | |
- as_timestamp(now())) / float(seconds))) | int(0) }}" | |
entity_id: !input "light_entity" | |
- choose: [] | |
default: !input "post_sunrise_actions" | |
mode: single | |
max_exceeded: silent |
Does your input_datetime helper contain just a time or a time and date? If it's just a time it may not work as this isn't how I'm using it currently (I'm syncing my iOS wake-up alarm over and including the date too).
Im only using the time on the input_datetime helper. I tested it with an input which serves time and date, this works. Do you know how to convert the input_datetime (time) helper to a time{} format, which is use at the manual input?
A quick and dirty version would be to just copy the manual time section of the code and adapt it for a datetime helper. A more elegant solution would be to run a bunch of checks and conversions on the datetime helper to see if there's a date or not but I suspect that could get complicated....
Im giving it a try when i have spare time :)
Thanks for sharing the file. I imported it into my home assistant. Sadly it isnt working. If i work with the manual time, the script is triggered.