Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save peltsippi/6c9031e6e5e71143efa1245ff9547b50 to your computer and use it in GitHub Desktop.
Save peltsippi/6c9031e6e5e71143efa1245ff9547b50 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: Requires date_time_iso sensor in configuration, 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
max_mired:
name: Maximum color temperature
description: 'The maximum color temperature. (999: highest supported)'
default: 999
selector:
number:
min: 300
max: 999
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/peltsippi/6c9031e6e5e71143efa1245ff9547b50
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'
min_lamp_mired: '{{state_attr(light_entity, ''min_mireds'')|int(0)}}
max_lamp_mired: '{{state_attr(light_entity, ''max_mireds''))|int(0)}}
start_mired: '{% if min_mired < min_lamp_mired %} {{min_lamp_mired}} {% else %} {{min_mired}} {% endif %}'
end_mired: '{% if max_mired > max_lamp_mired %} {{max_lamp_mired}} {% else %} {{max_mired}} {% endif %}'
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: '{{ }}'
#- 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(states(''sensor.date_time_iso'')) <= float(seconds) and states(check_entity)
# in [''unknown'', ''on'', ''home'']}}'
-condition: template
value_template: '{{ ((now().timestamp() - sunrise_duration *60)| timestamp_custom('%a %h %d %H:%M %Z %Y')) <= ((state_attr('sensor.nokia_6_1_next_alarm', 'Time in Milliseconds') | int / 1000)| timestamp_custom('%a %h %d %H:%M %Z %Y')) }}'
- choose:
- conditions:
- '{{min_lamp_mired != None}}'
sequence:
- service: light.turn_on
data:
brightness: '{{start_brightness}}'
color_temp: '{{start_mired}}'
entity_id: {{light_entity}}
default:
- service: light.turn_on
data:
brightness: '{{start_brightness}}'
entity_id: {{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(states(''sensor.date_time_iso'')) <= float(seconds)}}'
- '{{ now - delay <= TODO ADD STUF HERE WHEN YOU GET TIME FOR IT
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 states(''sensor.date'')
~ '' '' ~ manual_time) - as_timestamp(states(''sensor.date_time_iso'')) <= 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 states(''sensor.date'')
~ '' '' ~ manual_time) - as_timestamp(states(''sensor.date_time_iso''))) / float(seconds)))
| int(0)}}'
color_temp: '{% if use_kelvins %}
{{(1000000/(float(end_mired) + (float(start_mired) - float(end_mired))
* ((as_timestamp(states(sensor) if sensor != ''none'' else states(''sensor.date'')
~ '' '' ~ manual_time) - as_timestamp(now())) / float(seconds)))) | int(0)}}
{% else %}
{{(float(end_mired) + (float(start_mired) - float(end_mired))
* ((as_timestamp(states(sensor) if sensor != ''none'' else states(''sensor.date'')
~ '' '' ~ manual_time) - as_timestamp(states(''sensor.date_time_iso''))) / float(seconds)))
| int(0)}}
{% endif %}'
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(states(''sensor.date_time_iso''))) / float(seconds))) | int(0)}}'
entity_id: !input 'light_entity'
- choose: []
default: !input 'post_sunrise_actions'
mode: single
max_exceeded: silent
@peltsippi
Copy link
Author

I will make a major rewrite here starting now. FYI

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