Skip to content

Instantly share code, notes, and snippets.

@artem-schander
Created July 31, 2025 07:46
Show Gist options
  • Save artem-schander/e1dc2bdf1eb12284c0ea7c0b2a98da66 to your computer and use it in GitHub Desktop.
Save artem-schander/e1dc2bdf1eb12284c0ea7c0b2a98da66 to your computer and use it in GitHub Desktop.
Home Assistant RGBCCT Sunset script
input_number:
bedroom_sunset_led1:
name: Bedroom Sunset LED1
min: 0
max: 255
step: 1
script:
bedroom_sunset_led1_smooth:
alias: Bedroom Sunset LED1 Smooth
mode: single
fields:
level:
description: Sunset level 0–255
example: 128
sequence:
- variables:
lv: "{{ level | float }}"
lv_norm: "{{ (lv / 255) | float }}"
# === ADJUSTABLE PARAMETERS ===
# Red curve parameters
red_orange_transition: 0.15 # When the orange transition starts (0.0-1.0)
red_fade_start: 0.35 # When red starts to fade strongly
red_max_intensity: 180 # Maximum red intensity
# Green curve parameters
green_peak_position: 0.18 # Position of the green peak (lower = more orange)
green_curve_width: 0.06 # Width of the green curve (lower = narrower)
green_max_intensity: 40 # Maximum green intensity
# Warm white parameters
warm_full_at: 0.35 # When warm white is at 100%
warm_max_intensity: 255 # Maximum warm white intensity
# Cold white parameters
cold_start_at: 204 # At which value (0-255) cold white starts
cold_max_intensity: 255 # Maximum cold white intensity
# === CALCULATIONS ===
# --- RED: Earlier orange transition ---
red: >-
{% set red_orange = red_orange_transition %}
{% set red_fade = red_fade_start %}
{% set max_red = red_max_intensity %}
{% if lv_norm < 0.75 %}
{% if lv_norm < red_orange %}
{# Initially full red #}
{{ max_red }}
{% elif lv_norm < red_fade %}
{# Smooth transition to orange (less red) #}
{% set fade_factor = 1 - ((lv_norm - red_orange) / (red_fade - red_orange)) * 0.3 %}
{{ (max_red * fade_factor) | round(0) }}
{% else %}
{# Strong drop after the orange area #}
{{ (max_red * (1 - lv_norm) * 0.8) | round(0) }}
{% endif %}
{% else %}
0
{% endif %}
# --- GREEN: Small amount for orange effect ---
green: >-
{% set peak = green_peak_position %}
{% set width = green_curve_width %}
{% set max_green = green_max_intensity %}
{% set dist = (lv_norm - peak) | abs %}
{% if dist < width * 2 %}
{% set intensity = (1 - (dist / width)) %}
{% if intensity > 0 %}
{{ (max_green * intensity * intensity) | round(0) }}
{% else %}
0
{% endif %}
{% else %}
0
{% endif %}
# --- WARM WHITE: Dominates after orange phase ---
warm: >-
{% set warm_threshold = warm_full_at %}
{% set max_warm = warm_max_intensity %}
{% if lv_norm < warm_threshold %}
{% set ease = (lv_norm / warm_threshold) * (lv_norm / warm_threshold) %}
{{ (max_warm * ease) | round(0) }}
{% else %}
{{ max_warm }}
{% endif %}
# --- COLD WHITE: Only at the end for bright white ---
cold: >-
{% set cold_start = cold_start_at %}
{% set max_cold = cold_max_intensity %}
{% if lv > cold_start %}
{% set x = (lv - cold_start) / (255 - cold_start) %}
{% set rise = 1 - (1-x)*(1-x)*(1-x) %}
{{ (max_cold * rise) | round(0) }}
{% else %}
0
{% endif %}
brightness: "{{ lv | round(0) }}"
- service: light.turn_on
target:
entity_id: light.elternschlafzimmer_bettlicht_links
data:
brightness: "{{ brightness | int }}"
rgbww_color:
- "{{ red | int }}"
- "{{ green | int }}"
- 0
- "{{ cold | int }}"
- "{{ warm | int }}"
transition: 1
automation:
- id: bedroom_sunset_led1_apply
alias: Bedroom Sunset LED1 Apply
mode: single
trigger:
- platform: state
entity_id: input_number.bedroom_sunset_led1
action:
- service: script.bedroom_sunset_led1_smooth
data:
level: "{{ states('input_number.bedroom_sunset_led1') | float }}"
- id: bedroom_knob1_zigbee2mqtt_command
alias: Bedroom Knob 1 controls Sunset LED1 (command mode, normalized)
mode: restart
trigger:
- platform: mqtt
topic: "zigbee2mqtt/01. Drehknopf"
condition:
- condition: template
value_template: >
{{ trigger.payload_json.action in ['brightness_step_up', 'brightness_step_down'] }}
variables:
current: "{{ states('input_number.bedroom_sunset_led1') | float(0) }}"
step: 2
action:
- choose:
- conditions: "{{ trigger.payload_json.action == 'brightness_step_up' }}"
sequence:
- service: input_number.set_value
data:
entity_id: input_number.bedroom_sunset_led1
value: "{{ [current + step, 255] | min }}"
- conditions: "{{ trigger.payload_json.action == 'brightness_step_down' }}"
sequence:
- service: input_number.set_value
data:
entity_id: input_number.bedroom_sunset_led1
value: "{{ [current - step, 0] | max }}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment