mirror of
https://github.com/CeeWeasel/fresh-home.git
synced 2026-08-09 10:30:14 -04:00
443 lines
19 KiB
YAML
443 lines
19 KiB
YAML
blueprint:
|
||
name: Party Lights
|
||
author: AntonH
|
||
homeassistant:
|
||
min_version: 2024.10.0
|
||
description: '**Version 3.2**
|
||
|
||
|
||
Lights go to party mode (color loops or fade-in-and-out)
|
||
|
||
|
||
⚠️ **NOTE:** ⚠️
|
||
|
||
*This automation is triggered by the status of a switch or an input_boolean entity.*
|
||
|
||
*You can create this input_boolean by going to Settings > Devices & services >
|
||
Helpers*
|
||
|
||
*There you click on ''Create helper and choose ''Toggle''.*
|
||
|
||
'
|
||
source_url: https://gist.github.com/Twanne/fe33ab8466f9a4e94b3f8e21f745a377
|
||
domain: automation
|
||
input:
|
||
party_mode_trigger:
|
||
name: Party mode trigger
|
||
description: "The trigger you want to use to turn the party mode on.\nThe automation
|
||
will keep running until this is turned off.\nSupported entity types:\n -
|
||
input_boolean\n - switch\n"
|
||
default: []
|
||
selector:
|
||
entity:
|
||
filter:
|
||
- domain:
|
||
- input_boolean
|
||
- switch
|
||
reorder: false
|
||
multiple: false
|
||
target_lights:
|
||
name: Target lights
|
||
description: Which lights do you want to control?
|
||
selector:
|
||
entity:
|
||
multiple: true
|
||
filter:
|
||
- domain:
|
||
- light
|
||
reorder: false
|
||
input_sync_lights:
|
||
name: Synchronize lights
|
||
description: 'If more than 1 target light is selected, choose if they will all
|
||
change to the same state or if they each get their own random values.
|
||
|
||
`ℹ️ Light groups will be seen an a single entity.`
|
||
|
||
'
|
||
default: true
|
||
selector:
|
||
boolean: {}
|
||
time_between_changes:
|
||
name: Time between changes
|
||
description: Change the lights setting after this duration
|
||
default:
|
||
hours: 0
|
||
minutes: 0
|
||
seconds: 0
|
||
milliseconds: 0
|
||
selector:
|
||
duration:
|
||
enable_millisecond: true
|
||
transition_time:
|
||
name: Transition time
|
||
description: 'The time it takes for the light to transition to the assigned
|
||
value when it''s triggered.
|
||
|
||
`⚠️ This value should not be greater than the time between changes!`
|
||
|
||
'
|
||
default: 0
|
||
selector:
|
||
number:
|
||
min: 0.0
|
||
max: 300.0
|
||
step: 1.0
|
||
unit_of_measurement: s
|
||
mode: slider
|
||
color_mode:
|
||
name: Color mode
|
||
description: "Select how the lights need to change\n \n 1. ⬛ **NO COLOR CHANGE:**\n
|
||
\ Don't change colors.\n 2. \U0001F500 **RANDOM COLOR MODE:**\n Change all
|
||
RGB values randomly.\n 3. \U0001F308 **SATURATED COLOR MODE**\n Random,
|
||
but deeply saturated, colors only.\n 4. \U0001F384 **CHRISTMAS COLORS:**\n
|
||
\ Change only between Christmas colors.\n 5. \U0001F6A8 **POLICE LIGHTS**\n
|
||
\ Change between red and blue.\n `⚠️ Lights will be synchronized!`\n 6.
|
||
\U0001F7E5 **REDS ONLY MODE:**\n Change only red value randomly.\n 7. \U0001F7E9
|
||
**GREENS ONLY MODE:**\n Change only green value randomly.\n 8. \U0001F7E6
|
||
**BLUES ONLY MODE:**\n Change only blue value randomly.\n 9. \U0001F7E6
|
||
**TEALS ONLY MODE:**\n Change only teal shades randomly.\n 10. \U0001F338
|
||
**PINKS ONLY MODE:**\n Change only pink shades randomly.\n 11. \U0001F7E8
|
||
**YELLOWS ONLY MODE:**\n Change only yellow shades randomly.\n"
|
||
default: no_color_change
|
||
selector:
|
||
select:
|
||
mode: dropdown
|
||
options:
|
||
- label: NO COLOR CHANGE
|
||
value: no_color_change
|
||
- label: RANDOM COLOR MODE
|
||
value: random
|
||
- label: SATURATED COLOR MODE
|
||
value: deep
|
||
- label: CHRISTMAS COLORS
|
||
value: christmas
|
||
- label: POLICE LIGHTS
|
||
value: police
|
||
- label: REDS ONLY MODE
|
||
value: red
|
||
- label: GREENS ONLY MODE
|
||
value: green
|
||
- label: BLUES ONLY MODE
|
||
value: blue
|
||
- label: TEALS ONLY MODE
|
||
value: teal
|
||
- label: PINKS ONLY MODE
|
||
value: pink
|
||
- label: YELLOWS ONLY MODE
|
||
value: yellow
|
||
multiple: false
|
||
custom_value: false
|
||
sort: false
|
||
brightness_mode:
|
||
name: Brightness mode
|
||
description: "Select how the lights need to change\n 1. **RANDOM BRIGHTNESS:**\n
|
||
\ Change the brightness randomly within a set range\n \n 2. **FIXED BRIGHTNESS:**\n
|
||
\ Keep the light at a user defined brightness\n"
|
||
default: random
|
||
selector:
|
||
select:
|
||
mode: dropdown
|
||
options:
|
||
- label: RANDOM BRIGHTNESS
|
||
value: random
|
||
- label: FIXED BRIGHTNESS
|
||
value: fixed
|
||
multiple: false
|
||
custom_value: false
|
||
sort: false
|
||
random_brightness_section:
|
||
name: Settings for RANDOM BRIGHTNESS
|
||
icon: mdi:brightness-auto
|
||
collapsed: true
|
||
input:
|
||
min_brightness_pct:
|
||
name: Minimum brightness (RANDOM BRIGHTNESS MODE)
|
||
description: Don't set the brightness of the light below this value
|
||
default: 0
|
||
selector:
|
||
number:
|
||
min: 0.0
|
||
max: 100.0
|
||
step: 1.0
|
||
mode: slider
|
||
unit_of_measurement: '%'
|
||
max_brightness_pct:
|
||
name: Maximum brightness (RANDOM BRIGHTNESS MODE)
|
||
description: Don't set the brightness of the light above this value
|
||
default: 100
|
||
selector:
|
||
number:
|
||
min: 0.0
|
||
max: 100.0
|
||
step: 1.0
|
||
mode: slider
|
||
unit_of_measurement: '%'
|
||
fixed_brightness_section:
|
||
name: Settings for FIXED BRIGHTNESS
|
||
icon: mdi:brightness-percent
|
||
collapsed: true
|
||
input:
|
||
fixed_brightness_pct:
|
||
name: Brightness (FIXED BRIGHTNESS MODE)
|
||
description: Keep the light at this percentage (color changes might affect
|
||
this somewhat)
|
||
default: 0
|
||
selector:
|
||
number:
|
||
min: 0.0
|
||
max: 100.0
|
||
step: 1.0
|
||
mode: slider
|
||
unit_of_measurement: '%'
|
||
light_effects_section:
|
||
name: Light Effects
|
||
icon: mdi:creation-outline
|
||
collapsed: true
|
||
input:
|
||
light_effect:
|
||
name: Effects (All modes)
|
||
description: 'Which light effect do you want to run?
|
||
|
||
`ℹ️ Recommended to set the time between changes long enough for the effects
|
||
to loop at least once.`
|
||
|
||
'
|
||
default: ''
|
||
selector:
|
||
text:
|
||
multiple: false
|
||
multiline: false
|
||
turn_off_settings_section:
|
||
name: Turn off settings
|
||
icon: mdi:cog-stop-outline
|
||
collapsed: true
|
||
input:
|
||
turn_off_delay:
|
||
name: Turn off delay
|
||
description: 'The time to wait before the automation is turned off and the
|
||
After Party State becomes active.
|
||
|
||
'
|
||
default:
|
||
hours: 0
|
||
minutes: 0
|
||
seconds: 0
|
||
selector:
|
||
duration: {}
|
||
after_party_state:
|
||
name: After party state
|
||
description: "What state should the lights have when the party mode is turned
|
||
off.\n \n 1. **NO CHANGE:**\n Keep the lights in the state they are
|
||
at the end of the party.\n 2. **TURN OFF:**\n Turn the lights off.\n
|
||
\ 3. **RETURN TO PREVIOUS STATE:**\n Return the lights to the state they
|
||
were before the party began.\n 4. **USER DEFINED SCENE:**\n Activate
|
||
a scene that determines the state of the lights after the party.\n 5.
|
||
**SCENE THEN OFF**\n Set the lights to a specific setting by activating
|
||
the user defined scene, then turn them off.\n"
|
||
default: return_to_previous
|
||
selector:
|
||
select:
|
||
mode: dropdown
|
||
options:
|
||
- label: NO CHANGE
|
||
value: no_change
|
||
- label: LIGHTS OFF
|
||
value: lights_off
|
||
- label: RETURN TO PREVIOUS STATE
|
||
value: return_to_previous
|
||
- label: USER DEFINED SCENE
|
||
value: user_defined_scene
|
||
- label: SCENE THEN OFF
|
||
value: scene_then_off
|
||
multiple: false
|
||
custom_value: false
|
||
sort: false
|
||
after_party_scene:
|
||
name: After party scene
|
||
description: 'User defined scene that can be activated after the party mode
|
||
is turned off.
|
||
|
||
'
|
||
default: []
|
||
selector:
|
||
entity:
|
||
filter:
|
||
- domain:
|
||
- scene
|
||
reorder: false
|
||
multiple: false
|
||
mode: restart
|
||
variables:
|
||
party_mode_trigger: !input party_mode_trigger
|
||
target_lights: !input target_lights
|
||
time_between_changes: !input time_between_changes
|
||
transition_time: !input transition_time
|
||
color_mode: !input color_mode
|
||
brightness_mode: !input brightness_mode
|
||
min_brightness_pct: !input min_brightness_pct
|
||
max_brightness_pct: !input max_brightness_pct
|
||
fixed_brightness_pct: !input fixed_brightness_pct
|
||
light_effect: !input light_effect
|
||
after_party_state: !input after_party_state
|
||
after_party_scene: !input after_party_scene
|
||
turn_off_delay: !input turn_off_delay
|
||
input_sync_lights: !input input_sync_lights
|
||
sync_lights: '{{ true if color_mode == "police" else input_sync_lights }}
|
||
|
||
'
|
||
triggers:
|
||
- trigger: state
|
||
entity_id: !input party_mode_trigger
|
||
to: 'on'
|
||
actions:
|
||
- action: scene.create
|
||
metadata: {}
|
||
data:
|
||
scene_id: before_state
|
||
snapshot_entities: '{{ target_lights }}'
|
||
- repeat:
|
||
sequence:
|
||
- choose:
|
||
- conditions: '{{ sync_lights is true }}'
|
||
sequence:
|
||
- variables:
|
||
brightness_value: "{% if brightness_mode == \"random\" %}\n {{ range(min_brightness_pct,
|
||
max_brightness_pct) | random }}\n{% else %}\n {{ fixed_brightness_pct
|
||
}}\n{% endif %}\n"
|
||
rgb_value: "{% if color_mode == \"random\" %}\n {{ range(256) | random,
|
||
range(256) | random, range(256) | random }}\n{% elif color_mode == \"deep\"
|
||
%}\n {% set r = range(256) |random %}\n {% set g = range(256) |random
|
||
%}\n {% set b = range(256) |random %}\n {# check if all values aren't
|
||
too high. This will mute the colors as they will go towards white. #}\n
|
||
\ {% if ( r >= 200 and g >= 200 and b >= 200) %}\n {% set rgb_changer
|
||
= range(3) | random %}\n \n {% if rgb_changer == 0 %}\n {{
|
||
(r - 100), g, b }}\n {% elif rgb_changer == 1 %}\n {{ r, (g
|
||
- 100), b }}\n {% elif rgb_changer == 2 %}\n {{ r, g, (b - 100)
|
||
}}\n {% endif %} \n \n {# check if all values aren't too close
|
||
together. This will mute the colors because they will form a grey color.
|
||
#}\n {% elif ( (r - g)|abs <= 100 and (g - b)|abs <= 100 and (b - r)|abs
|
||
<= 100 ) %}\n {% set rgb_changer = range(3) | random %}\n {%
|
||
if rgb_changer == 0 %}\n {{ (r / 2)|int , g, b }}\n {% elif
|
||
rgb_changer == 1 %}\n {{ r, (g / 2)|int, b }}\n {% elif rgb_changer
|
||
== 2 %}\n {{ r, g, (b / 2)|int }}\n {% endif %}\n {% else %}\n
|
||
\ {{ r, g, b }}\n {% endif %}\n{% elif color_mode == \"christmas\"
|
||
%} \n {% macro random_rgb_component(max) %}\n {{ range(256) | random
|
||
}}\n {% endmacro %}\n {% macro get_color(color_key) %}\n {% if
|
||
color_key == 1 %}\n [{{ random_rgb_component(256) }}, 0, 0]\n {%
|
||
elif color_key == 2 %}\n [0, {{ random_rgb_component(256) }}, 0]\n
|
||
\ {% elif color_key == 3 %}\n [0, 0, {{ random_rgb_component(256)
|
||
}}]\n {% elif color_key == 4 %}\n [255, 255, {{ random_rgb_component(50)
|
||
}}]\n {% endif %}\n {% endmacro %}\n {% set color_key = range(1,
|
||
5) | random %}\n {% set random_color = get_color(color_key) %}\n {{
|
||
random_color }} \n{% elif color_mode == \"police\" %}\n {% if state_attr(
|
||
target_lights[0], 'rgb_color') | string == '(255, 0, 0)' %}\n [ 0,
|
||
0, 255 ]\n {% else %}\n [ 255, 0, 0 ]\n {% endif %}\n{% elif color_mode
|
||
== \"red\" %}\n {{ range(256) | random, 0, 0 }}\n{% elif color_mode
|
||
== \"green\" %}\n {{ 0, range(256) | random, 0 }}\n{% elif color_mode
|
||
== \"blue\" %}\n {{ 0, 0, range(256) | random }}\n{% elif color_mode
|
||
== \"teal\" %}\n {{ range(256) | random, 255, 255 }}\n{% elif color_mode
|
||
== \"pink\" %}\n {{ 255, range(256) | random, 255 }}\n{% elif color_mode
|
||
== \"yellow\" %}\n {{ 255, 255, range(256) | random }}\n{% else %}\n
|
||
\ {{ 255, 255, 255 }}\n{% endif %}\n"
|
||
- action: light.turn_on
|
||
data: "{% if light_effect == \"\" %}\n {% if color_mode == \"no_color_change\"
|
||
%}\n {{ { \"transition\": transition_time, \"brightness_pct\": brightness_value
|
||
} }}\n {% else %}\n {{ { \"transition\": transition_time, \"brightness_pct\":
|
||
brightness_value, \"rgb_color\": rgb_value } }}\n {% endif %}\n{% else
|
||
%}\n {% if color_mode == \"no_color_change\" %}\n {{ { \"transition\":
|
||
transition_time, \"brightness_pct\": brightness_value, \"effect\": light_effect
|
||
\ } }}\n {% else %}\n {{ { \"transition\": transition_time, \"brightness_pct\":
|
||
brightness_value, \"rgb_color\": rgb_value, \"effect\": light_effect }
|
||
}}\n {% endif %}\n{% endif %}\n"
|
||
target:
|
||
entity_id: '{{ target_lights }}'
|
||
- conditions: '{{ sync_lights is false }}'
|
||
sequence:
|
||
- repeat:
|
||
for_each: '{{ target_lights }}'
|
||
sequence:
|
||
- variables:
|
||
brightness_value: "{% if brightness_mode == \"random\" %}\n {{ range(min_brightness_pct,
|
||
max_brightness_pct) | random }}\n{% else %}\n {{ fixed_brightness_pct
|
||
}}\n{% endif %}\n"
|
||
rgb_value: "{% if color_mode == \"random\" %}\n {{ range(256) | random,
|
||
range(256) | random, range(256) | random }}\n{% elif color_mode
|
||
== \"deep\" %}\n {% set r = range(256) |random %}\n {% set g =
|
||
range(256) |random %}\n {% set b = range(256) |random %}\n {#
|
||
check if all values aren't too high. This will mute the colors as
|
||
they will go towards white. #}\n {% if ( r >= 200 and g >= 200
|
||
and b >= 200) %}\n {% set rgb_changer = range(3) | random %}\n
|
||
\ \n {% if rgb_changer == 0 %}\n {{ (r - 100), g, b }}\n
|
||
\ {% elif rgb_changer == 1 %}\n {{ r, (g - 100), b }}\n {%
|
||
elif rgb_changer == 2 %}\n {{ r, g, (b - 100) }}\n {% endif
|
||
%} \n \n {# check if all values aren't too close together.
|
||
This will mute the colors because they will form a grey color. #}\n
|
||
\ {% elif ( (r - g)|abs <= 100 and (g - b)|abs <= 100 and (b - r)|abs
|
||
<= 100 ) %}\n {% set rgb_changer = range(3) | random %}\n {%
|
||
if rgb_changer == 0 %}\n {{ (r / 2)|int , g, b }}\n {% elif
|
||
rgb_changer == 1 %}\n {{ r, (g / 2)|int, b }}\n {% elif
|
||
rgb_changer == 2 %}\n {{ r, g, (b / 2)|int }}\n {% endif
|
||
%}\n {% else %}\n {{ r, g, b }}\n {% endif %}\n{% elif color_mode
|
||
== \"christmas\" %} \n {% macro random_rgb_component(max) %}\n
|
||
\ {{ range(0, max) | random }}\n {% endmacro %}\n {% macro get_color(color_key)
|
||
%}\n {% if color_key == 1 %}\n [{{ random_rgb_component(256)
|
||
}}, 0, 0]\n {% elif color_key == 2 %}\n [0, {{ random_rgb_component(256)
|
||
}}, 0]\n {% elif color_key == 3 %}\n [0, 0, {{ random_rgb_component(256)
|
||
}}]\n {% elif color_key == 4 %}\n [255, 255, {{ random_rgb_component(50)
|
||
}}]\n {% endif %}\n {% endmacro %}\n {% set color_key = range(1,
|
||
5) | random %}\n {% set random_color = get_color(color_key) %}\n
|
||
\ {{ random_color }}\n{% elif color_mode == \"red\" %}\n {{ range(256)
|
||
| random, 0, 0 }}\n{% elif color_mode == \"green\" %}\n {{ 0, range(256)
|
||
| random, 0 }}\n{% elif color_mode == \"blue\" %}\n {{ 0, 0, range(256)
|
||
| random }}\n{% elif color_mode == \"teal\" %}\n {{ range(256)
|
||
| random, 255, 255 }}\n{% elif color_mode == \"pink\" %}\n {{ 255,
|
||
range(256) | random, 255 }}\n{% elif color_mode == \"yellow\" %}\n
|
||
\ {{ 255, 255, range(256) | random }}\n{% else %}\n {{ 255, 255,
|
||
255 }}\n{% endif %}\n"
|
||
- action: light.turn_on
|
||
data: "{% if light_effect == \"\" %}\n {% if color_mode == \"no_color_change\"
|
||
%}\n {{ { \"transition\": transition_time, \"brightness_pct\":
|
||
brightness_value } }}\n {% else %}\n {{ { \"transition\": transition_time,
|
||
\"brightness_pct\": brightness_value, \"rgb_color\": rgb_value } }}\n
|
||
\ {% endif %}\n{% else %}\n {% if color_mode == \"no_color_change\"
|
||
%}\n {{ { \"transition\": transition_time, \"brightness_pct\":
|
||
brightness_value, \"effect\": light_effect } }}\n {% else %}\n {{
|
||
{ \"transition\": transition_time, \"brightness_pct\": brightness_value,
|
||
\"rgb_color\": rgb_value, \"effect\": light_effect } }}\n {% endif
|
||
%}\n{% endif %}\n"
|
||
target:
|
||
entity_id: '{{ repeat.item }}'
|
||
- delay: !input time_between_changes
|
||
until:
|
||
- condition: state
|
||
entity_id: !input party_mode_trigger
|
||
state: 'off'
|
||
- delay: !input turn_off_delay
|
||
- choose:
|
||
- conditions: '{{ "lights_off" in after_party_state }}'
|
||
sequence:
|
||
- action: light.turn_off
|
||
target:
|
||
entity_id: '{{ target_lights }}'
|
||
- conditions: '{{ "return_to_previous" in after_party_state }}'
|
||
sequence:
|
||
- action: scene.turn_on
|
||
metadata: {}
|
||
target:
|
||
entity_id: scene.before_state
|
||
- conditions: '{{ "user_defined_scene" in after_party_state }}'
|
||
sequence:
|
||
- action: scene.turn_on
|
||
metadata: {}
|
||
target:
|
||
entity_id: '{{ after_party_scene }}'
|
||
- conditions: '{{ "scene_then_off" in after_party_state }}'
|
||
sequence:
|
||
- action: scene.turn_on
|
||
metadata: {}
|
||
target:
|
||
entity_id: '{{ after_party_scene }}'
|
||
- action: light.turn_off
|
||
target:
|
||
entity_id: '{{ target_lights }}'
|