Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save triplepoint/1b9006ddec208a07fc0100a2a30110eb to your computer and use it in GitHub Desktop.
Save triplepoint/1b9006ddec208a07fc0100a2a30110eb to your computer and use it in GitHub Desktop.
Home Assistant Blueprint: Wake-up light alarm with sunrise effect
blueprint:
name: Wake-up light alarm with sunrise effect
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:
"Sensor with timestamp of next alarm with device_class: timestamp
(set to 'none' for manual alarm time)"
default: none
selector:
entity:
device_class: timestamp
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: "7:00:00"
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: {}
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: 254
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"
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'] }}"
- 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'] }}"
- choose:
- conditions:
- "{{ state_attr(light_entity, 'min_mireds') != None }}"
sequence:
- service: light.turn_on
data:
brightness: "{{ start_brightness }}"
color_temp: "{{ 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:
"{{ (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
@WhatMeansGithub
Copy link

Mate, you fixed my issue with the original blueprint. Well done!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment