From cd5508e81db92b98d1705d3636ad1a98912b9f02 Mon Sep 17 00:00:00 2001 From: hiperman Date: Fri, 9 Jan 2026 12:55:59 -0500 Subject: [PATCH] add script blueprint --- README.md | 6 +- sunrise-alarm.yaml | 140 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 1 deletion(-) create mode 100644 sunrise-alarm.yaml diff --git a/README.md b/README.md index 389cfff..1486583 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,7 @@ # ha-sunrise-alarm -A HomeAssistant blueprint that turns your smart lights into a natural alarm clock. \ No newline at end of file +A HomeAssistant blueprint that turns your smart lights into a natural alarm clock. + + + Open your Home Assistant instance and show the blueprint import dialog + \ No newline at end of file diff --git a/sunrise-alarm.yaml b/sunrise-alarm.yaml new file mode 100644 index 0000000..46cde5d --- /dev/null +++ b/sunrise-alarm.yaml @@ -0,0 +1,140 @@ +blueprint: + name: "Simulated Sunrise Alarm" + description: "Smoothly increase light brightness with configurable steps" + domain: script + + input: + target_lights: + name: Target Light(s) + description: Light(s) to control + selector: + target: + entity: + domain: light + reversed: + name: "Simulate sunset instead of sunrise" + description: If true, reverses the direction (simulates sunset instead of sunrise) + selector: + boolean: + default: false + + steps: + name: Number of Steps + description: How many brightness steps in the curve + default: 20 + selector: + number: + min: 5 + max: 100 + step: 1 + + total_duration: + name: Total Duration + description: Total time to complete the brightness ramp + default: 30 + selector: + number: + min: 1 + max: 120 + unit_of_measurement: minutes + + start_brightness: + name: Starting Brightness + description: Initial brightness percentage (0-100) + default: 1 + selector: + number: + min: 0 + max: 100 + step: 1 + + end_brightness: + name: Ending Brightness + description: Final brightness percentage (0-100) + default: 100 + selector: + number: + min: 1 + max: 100 + step: 1 + + start_temp: + name: Starting Color Temperature + description: Final color temperature in Kelvin + default: 2000 + selector: + color_temp: + min: 2000 + unit: kelvin + + end_temp: + name: Ending Color Temperature + description: Final color temperature in Kelvin + default: 5500 + selector: + color_temp: + unit: kelvin + + curve_type: + name: Curve Type + default: "parabolic" + description: “linear”, "parabolic" (quadratic), or “sigmoid” (an S-curve/logistic curve) + selector: + select: + options: + - "linear" + - "sigmoidal" + - "parabolic" + +variables: + lights: !input target_lights + start_temp: !input start_temp + end_temp: !input end_temp + curve_type: !input curve_type + total_duration: !input total_duration + num_steps: !input steps + step_delay: "{{ (total_duration * 60 / num_steps) | round(0) }}" + start_bright: !input start_brightness + end_bright: !input end_brightness + reversed: !input reversed + +# Loop through each step of the curve +sequence: + - repeat: + count: "{{ num_steps }}" + sequence: + - variables: + # Calculate current step (0 to 1 range) + x: "{{ (repeat.index - 1) / (num_steps - 1) }}" + + # Reflects the curve in the y-axis if reversed is true + - choose: + - conditions: + - condition: template + value_template: "{{ reversed }}" + sequence: + - variables: + x: "{{ 1 - x }}" + + - variables: + curve_func: > + {%- if curve_type == 'linear' -%} + {{ x }} + {%- elif curve_type == 'sigmoidal' -%} + {{ 1 / (1 + (2.71828 ** (-12 * (x - 0.5)))) }} + {%- elif curve_type == 'parabolic' -%} + {{ x ** 2 }} + {%- endif -%} + + # Map result to brightness range and color temperature range respectively + current_brightness: "{{ (start_bright + (end_bright - start_bright) * curve_func | float) | round(0) }}" + current_color_temp: "{{ (start_temp + (end_temp - start_temp) * curve_func | float) | round(0) }}" + + - service: light.turn_on + target: !input target_lights + data: + brightness_pct: "{{ current_brightness }}" + kelvin: "{{ current_color_temp }}" + transition: "{{ step_delay }}" + + - delay: "{{ step_delay }}" \ No newline at end of file