mirror of
https://github.com/CeeWeasel/fresh-home.git
synced 2026-08-10 02:50:12 -04:00
Refactor code structure for improved readability and maintainability
This commit is contained in:
@@ -0,0 +1,442 @@
|
||||
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 }}'
|
||||
Reference in New Issue
Block a user