Create cycle_color_on_light.yaml
This commit is contained in:
parent
00c6719901
commit
5fd9ea779c
255
home_assistant/blueprints/scripts/cycle_color_on_light.yaml
Normal file
255
home_assistant/blueprints/scripts/cycle_color_on_light.yaml
Normal file
@ -0,0 +1,255 @@
|
||||
# This script will step through (forwards or backwards) a list of assigned colors for an RGB light entity
|
||||
# Credit: https://gist.github.com/mdolnik/7147b5df4b08f7979afad02a5dd137a2
|
||||
# Credit: https://community.home-assistant.io/t/trying-to-cycle-through-colors-on-a-hue-bulb-each-time-a-button-is-pressed/493249/3
|
||||
|
||||
blueprint:
|
||||
name: Cycle color on a light
|
||||
description: >-
|
||||
A script that increments or decrements a color on a light.
|
||||
domain: script
|
||||
source_url: https://github.com/nwithan8/configs/blob/main/home_assistant/blueprints/scripts/cycle_color_on_light.yaml
|
||||
input:
|
||||
light:
|
||||
name: Light
|
||||
description: "The Light entity or Light Group entity to loop through the colors chosen below."
|
||||
selector:
|
||||
entity:
|
||||
domain:
|
||||
- light
|
||||
- group
|
||||
multiple: false
|
||||
color_tracker:
|
||||
name: Color state helper
|
||||
description: An input number helper to store the current color in
|
||||
selector:
|
||||
entity:
|
||||
domain: input_number
|
||||
color_1:
|
||||
name: Color 1
|
||||
description: "Set to black to omit this color."
|
||||
default:
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
selector:
|
||||
color_rgb: {}
|
||||
color_2:
|
||||
name: Color 2
|
||||
description: "Set to black to omit this color"
|
||||
default:
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
selector:
|
||||
color_rgb: {}
|
||||
color_3:
|
||||
name: Color 3
|
||||
description: "Set to black to omit this color"
|
||||
default:
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
selector:
|
||||
color_rgb: {}
|
||||
color_4:
|
||||
name: Color 4
|
||||
description: "Set to black to omit this color"
|
||||
default:
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
selector:
|
||||
color_rgb: {}
|
||||
color_5:
|
||||
name: Color 5
|
||||
description: "Set to black to omit this color"
|
||||
default:
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
selector:
|
||||
color_rgb: {}
|
||||
color_6:
|
||||
name: Color 6
|
||||
description: "Set to black to omit this color"
|
||||
default:
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
selector:
|
||||
color_rgb: {}
|
||||
color_7:
|
||||
name: Color 7
|
||||
description: "Set to black to omit this color"
|
||||
default:
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
selector:
|
||||
color_rgb: {}
|
||||
color_8:
|
||||
name: Color 8
|
||||
description: "Set to black to omit this color"
|
||||
default:
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
selector:
|
||||
color_rgb: {}
|
||||
color_9:
|
||||
name: Color 9
|
||||
description: "Set to black to omit this color"
|
||||
default:
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
selector:
|
||||
color_rgb: {}
|
||||
color_10:
|
||||
name: Color 10
|
||||
description: "Set to black to omit this color"
|
||||
default:
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
selector:
|
||||
color_rgb: {}
|
||||
color_11:
|
||||
name: Color 11
|
||||
description: "Set to black to omit this color"
|
||||
default:
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
selector:
|
||||
color_rgb: {}
|
||||
color_12:
|
||||
name: Color 12
|
||||
description: "Set to black to omit this color"
|
||||
default:
|
||||
- 0
|
||||
- 0
|
||||
- 0
|
||||
selector:
|
||||
color_rgb: {}
|
||||
|
||||
# Only single, otherwise could flood with attempts
|
||||
mode: single
|
||||
|
||||
fields:
|
||||
transition:
|
||||
name: Transition Time
|
||||
description: "Choose the time it takes to move to the next color."
|
||||
selector:
|
||||
duration: {}
|
||||
default:
|
||||
hours: 0
|
||||
minutes: 0
|
||||
seconds: 1
|
||||
decrement:
|
||||
name: Decrement
|
||||
description: Go backwards instead of forward in the color list
|
||||
required: true
|
||||
selector:
|
||||
boolean:
|
||||
|
||||
variables:
|
||||
light: !input "light"
|
||||
color_tracker: !input "color_tracker"
|
||||
transition_seconds: "{{ ((transition.hours)*60*60) + ((transition.minutes)*60)
|
||||
+ transition.seconds }}"
|
||||
color_rgbs:
|
||||
- !input "color_1"
|
||||
- !input "color_2"
|
||||
- !input "color_3"
|
||||
- !input "color_4"
|
||||
- !input "color_5"
|
||||
- !input "color_6"
|
||||
- !input "color_7"
|
||||
- !input "color_8"
|
||||
- !input "color_9"
|
||||
- !input "color_10"
|
||||
- !input "color_11"
|
||||
- !input "color_12"
|
||||
# Convert the array of RGB colors to a comma separated list of HSV values.
|
||||
# Exclude any colors set to black.
|
||||
# https://community.home-assistant.io/t/using-hsv-hsb-to-set-colored-lights/15472
|
||||
# https://github.com/home-assistant/core/issues/33678#issuecomment-609424851
|
||||
# https://stackoverflow.com/a/56141280/4147996
|
||||
color_hsv_list_csv: >-
|
||||
{%- set data = namespace(entries=[]) -%}
|
||||
{%- for color_rgb in color_rgbs -%}
|
||||
{%- if color_rgb != [0,0,0] -%}
|
||||
{%- set r = (color_rgb[0]/255) -%}
|
||||
{%- set g = (color_rgb[1]/255) -%}
|
||||
{%- set b = (color_rgb[2]/255) -%}
|
||||
{%- set maxRGB = max(r,g,b) -%}
|
||||
{%- set minRGB = min(r,g,b) -%}
|
||||
{%- set chroma = maxRGB - minRGB -%}
|
||||
{%- if chroma == 0 -%}
|
||||
{%- set h = 0 -%}
|
||||
{%- set s = 0 -%}
|
||||
{%- set v = maxRGB -%}
|
||||
{%- else -%}
|
||||
{%- if r == minRGB -%}
|
||||
{%- set h = 3-((g-b)/chroma) -%}
|
||||
{%- elif b == minRGB -%}
|
||||
{%- set h = 1-((r-g)/chroma) -%}
|
||||
{%- else -%}
|
||||
{%- set h = 5-((b-r)/chroma) -%}
|
||||
{%- endif -%}
|
||||
{%- set h = 60 * h -%}
|
||||
{%- set s = chroma / maxRGB -%}
|
||||
{%- set v = maxRGB -%}
|
||||
{%- endif -%}
|
||||
{%- set h = h|round(2)|string -%}
|
||||
{%- set s = s|round(2)|string -%}
|
||||
{%- set v = v|round(2)|string -%}
|
||||
{%- set comma_sep = h + "|" + s + "|" + v -%}
|
||||
{%- set data.entries = data.entries + [comma_sep] -%}
|
||||
{%- endif -%}
|
||||
{%- endfor -%}
|
||||
{{ data.entries | join(",") }}
|
||||
color_hsv_list: '{{ color_hsv_list_csv.split(",") }}'
|
||||
color_count: "{{ color_hsv_list | length | int - 1}}"
|
||||
|
||||
sequence:
|
||||
- variables:
|
||||
# Next color index to change to.
|
||||
i_next: >
|
||||
{% set idx = 0 %}
|
||||
{% if decrement %}
|
||||
{% set idx = states(color_tracker) | int - 1 %}
|
||||
{% if idx < 0 %}
|
||||
{% set idx = color_count %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% set idx = states(color_tracker) | int + 1 %}
|
||||
{% if idx > color_count %}
|
||||
{% set idx = 0 %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{{ idx }}
|
||||
# Get the H/S of next colors.
|
||||
hsv_next_csv: "{{ color_hsv_list[i_next] }}"
|
||||
hue_next: '{{ hsv_next_csv.split("|")[0] }}'
|
||||
sat_next: '{{ (hsv_next_csv.split("|")[1])|float * 100 }}'
|
||||
# Light to interact with
|
||||
lights_to_change: "{{
|
||||
expand(light)
|
||||
| selectattr('domain', 'eq', 'light')
|
||||
| map(attribute='entity_id')
|
||||
| list
|
||||
}}"
|
||||
|
||||
- service: light.turn_on
|
||||
target:
|
||||
entity_id: "{{ lights_to_change }}"
|
||||
data:
|
||||
hs_color: "{{ [hue_next, sat_next] }}"
|
||||
transition: "{{ transition_seconds }}"
|
||||
|
||||
- service: input_number.set_value
|
||||
entity_id: !input "color_tracker"
|
||||
data:
|
||||
value: "{{ i_next | int }}"
|
Loading…
Reference in New Issue
Block a user