⏰ Alarm Light - Wake up with lights on before your phone alarm

Alarm Light :alarm_clock:

Wake up with lights that turn on before your phone alarm!

Open your Home Assistant instance and show the blueprint import dialog with a specific blueprint pre-filled.

Features

  • :alarm_clock: Alarm Integration - Syncs with your phone’s next alarm sensor
  • :light_bulb: Gradual Wake-up - Lights turn on 5-60 minutes before alarm
  • :house: Presence Aware - Only triggers when you’re home
  • :crescent_moon: Darkness Check - Only activates when it’s dark outside
  • :date: Day Selection - All days, weekdays only, or weekends only
  • :sparkles: Adjustable Brightness - Configure the perfect wake-up brightness

Requirements

  • Home Assistant 2025.12.0+
  • Next Alarm sensor (Android: built-in, iOS: requires Shortcuts workaround)
  • Person entity
  • Light entity

Android Setup

  1. Install Home Assistant Companion App
  2. Enable “Next Alarm” sensor in Companion App settings
  3. Sensor appears as sensor.phone_name_next_alarm

iOS Setup

iOS doesn’t natively expose alarm data. Use iOS Shortcuts to sync your alarm to an Input Datetime helper. See iOS guides in the README.

Configuration

Input Description Default
Alarm Sensor Next alarm timestamp sensor -
Person Person to check if home -
Lights Lights to turn on -
Offset Minutes before alarm 10 min
Brightness Light brightness 33%
Days All/Weekdays/Weekends All

Screenshot

GitHub

GitHub Repository

Donate Me

5 Likes

Thanks for this blueprints, I would like to know if it would be possible to add an extra options/conditions.
*Phone is charging/connected

If not could you please share partially the code for it.

Thanks again for your work.

you can do with the blueprint what you want, but if change the blueprint for you then anyone will do a request. and i don’t have the time to changes the bleuprint to everybody’s needs. sorry!

Ok no worries sorry for asking

“I’m using a custom version of your blueprint, it is for 2 persons, maybe someting to use voor youre next version”

input:
person1_alarm_sensor:
name: :alarm_clock: Persoon 1 - Next Alarm Sensor
selector:
entity:
filter:
- domain: sensor
device_class: timestamp

person1_entity:
  name: 👤 Persoon 1 - Person
  selector:
    entity:
      domain: person

person1_lights_target:
  name: 💡 Persoon 1 - Target Lights
  selector:
    target:
      entity:
        domain: light

person1_offset_before_alarm:
  name: ⏱️ Persoon 1 - Offset Before Alarm
  default: "-00:10:00"
  selector:
    select:
      options:
        - label: 5 minutes before
          value: "-00:05:00"
        - label: 10 minutes before
          value: "-00:10:00"
        - label: 15 minutes before
          value: "-00:15:00"
        - label: 20 minutes before
          value: "-00:20:00"
        - label: 30 minutes before
          value: "-00:30:00"
        - label: 45 minutes before
          value: "-00:45:00"
        - label: 60 minutes before
          value: "-01:00:00"
      mode: dropdown

person1_brightness_pct:
  name: ✨ Persoon 1 - End Brightness
  default: 33
  selector:
    number:
      min: 1
      max: 100
      step: 1
      unit_of_measurement: "%"
      mode: slider

person1_start_brightness_pct:
  name: 🌅 Persoon 1 - Start Brightness
  default: 1
  selector:
    number:
      min: 1
      max: 100
      step: 1
      unit_of_measurement: "%"
      mode: slider

person1_kelvin_start:
  name: 🔥 Persoon 1 - Start Kelvin
  description: Bijvoorbeeld 2000 voor extra warm
  default: 2000
  selector:
    number:
      min: 1500
      max: 6500
      step: 100
      unit_of_measurement: "K"
      mode: box

person1_kelvin_end:
  name: ☀️ Persoon 1 - End Kelvin
  description: Bijvoorbeeld 4000 voor neutraler wit
  default: 4000
  selector:
    number:
      min: 1500
      max: 6500
      step: 100
      unit_of_measurement: "K"
      mode: box

person1_weekday_selection:
  name: 📅 Persoon 1 - Active Days
  default: "all"
  selector:
    select:
      options:
        - label: All Days
          value: all
        - label: Weekdays Only (Mon-Fri)
          value: weekdays
        - label: Weekends Only (Sat-Sun)
          value: weekends
      mode: dropdown

person2_alarm_sensor:
  name: ⏰ Persoon 2 - Next Alarm Sensor
  selector:
    entity:
      filter:
        - domain: sensor
          device_class: timestamp

person2_entity:
  name: 👤 Persoon 2 - Person
  selector:
    entity:
      domain: person

person2_lights_target:
  name: 💡 Persoon 2 - Target Lights
  selector:
    target:
      entity:
        domain: light

person2_offset_before_alarm:
  name: ⏱️ Persoon 2 - Offset Before Alarm
  default: "-00:10:00"
  selector:
    select:
      options:
        - label: 5 minutes before
          value: "-00:05:00"
        - label: 10 minutes before
          value: "-00:10:00"
        - label: 15 minutes before
          value: "-00:15:00"
        - label: 20 minutes before
          value: "-00:20:00"
        - label: 30 minutes before
          value: "-00:30:00"
        - label: 45 minutes before
          value: "-00:45:00"
        - label: 60 minutes before
          value: "-01:00:00"
      mode: dropdown

person2_brightness_pct:
  name: ✨ Persoon 2 - End Brightness
  default: 33
  selector:
    number:
      min: 1
      max: 100
      step: 1
      unit_of_measurement: "%"
      mode: slider

person2_start_brightness_pct:
  name: 🌅 Persoon 2 - Start Brightness
  default: 1
  selector:
    number:
      min: 1
      max: 100
      step: 1
      unit_of_measurement: "%"
      mode: slider

person2_kelvin_start:
  name: 🔥 Persoon 2 - Start Kelvin
  description: Bijvoorbeeld 2000 voor extra warm
  default: 2000
  selector:
    number:
      min: 1500
      max: 6500
      step: 100
      unit_of_measurement: "K"
      mode: box

person2_kelvin_end:
  name: ☀️ Persoon 2 - End Kelvin
  description: Bijvoorbeeld 4000 voor neutraler wit
  default: 4000
  selector:
    number:
      min: 1500
      max: 6500
      step: 100
      unit_of_measurement: "K"
      mode: box

person2_weekday_selection:
  name: 📅 Persoon 2 - Active Days
  default: "all"
  selector:
    select:
      options:
        - label: All Days
          value: all
        - label: Weekdays Only (Mon-Fri)
          value: weekdays
        - label: Weekends Only (Sat-Sun)
          value: weekends
      mode: dropdown

mode: parallel
max: 4
max_exceeded: silent

variables:
p1_weekday_choice: !input person1_weekday_selection
p2_weekday_choice: !input person2_weekday_selection
p1_offset: !input person1_offset_before_alarm
p2_offset: !input person2_offset_before_alarm

p1_transition_seconds: >
{% set s = as_timedelta(p1_offset).total_seconds() | int %}
{{ (s * -1) if s < 0 else s }}

p2_transition_seconds: >
{% set s = as_timedelta(p2_offset).total_seconds() | int %}
{{ (s * -1) if s < 0 else s }}

trigger:

  • platform: time
    id: person1
    at:
    entity_id: !input person1_alarm_sensor
    offset: !input person1_offset_before_alarm

  • platform: time
    id: person2
    at:
    entity_id: !input person2_alarm_sensor
    offset: !input person2_offset_before_alarm

condition:

  • condition: state
    entity_id: sun.sun
    state: below_horizon

action:

  • choose:
    • conditions:

      • condition: trigger
        id: person1

      • condition: state
        entity_id: !input person1_entity
        state: home

      • condition: template
        value_template: >
        {% set today = now().weekday() %}
        {% if p1_weekday_choice == ‘all’ %}
        true
        {% elif p1_weekday_choice == ‘weekdays’ %}
        {{ today < 5 }}
        {% elif p1_weekday_choice == ‘weekends’ %}
        {{ today >= 5 }}
        {% else %}
        true
        {% endif %}
        sequence:

      • service: light.turn_on
        target: !input person1_lights_target
        data:
        brightness_pct: !input person1_start_brightness_pct
        kelvin: !input person1_kelvin_start

      • delay:
        seconds: 1

      • service: light.turn_on
        target: !input person1_lights_target
        data:
        brightness_pct: !input person1_brightness_pct
        kelvin: !input person1_kelvin_end
        transition: “{{ p1_transition_seconds | int }}”

    • conditions:

      • condition: trigger
        id: person2

      • condition: state
        entity_id: !input person2_entity
        state: home

      • condition: template
        value_template: >
        {% set today = now().weekday() %}
        {% if p2_weekday_choice == ‘all’ %}
        true
        {% elif p2_weekday_choice == ‘weekdays’ %}
        {{ today < 5 }}
        {% elif p2_weekday_choice == ‘weekends’ %}
        {{ today >= 5 }}
        {% else %}
        true
        {% endif %}
        sequence:

      • service: light.turn_on
        target: !input person2_lights_target
        data:
        brightness_pct: !input person2_start_brightness_pct
        kelvin: !input person2_kelvin_start

      • delay:
        seconds: 1

      • service: light.turn_on
        target: !input person2_lights_target
        data:
        brightness_pct: !input person2_brightness_pct
        kelvin: !input person2_kelvin_end
        transition: “{{ p2_transition_seconds | int }}”

Hi

Thanks for using the blueprint an making it your own version,
my wife has an iphone and no alarm sensor, so i have no usecase for it.

but anybody is free to use the blueprint and making his own version of it.

1 Like