plex-configs/home_assistant/blueprints/scripts/cycle_color_on_light.yaml

256 lines
6.7 KiB
YAML
Raw Normal View History

2023-07-18 03:13:29 +00:00
# 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 }}"