Prerequisites:
- A hue bridge (I use diyHue). Must have at least one room configured with a scene saved to the bridge.
- HA Hue integration connected to that bridge. Hue scenes should already exist within your HA instance.
- These dependencies from HACS: card-mod, fold-entity-row. auto-entities, template-entity-row
Installation
- Add the following to your configuration.yaml:
homeassistant:
packages:
hue_scene_selector: !include hue_scene_selector.yaml
- Create a new file named hue-scene-selector.yaml, with the following contents:
input_select:
# need at least 1 option for the config check, which will be overwritten during startup
hue_group:
name: Select Hue group
options:
- Alarm
# initial: Alarm
hue_dynamic_scene:
name: Hue Dynamic scene
options:
- 'Alarm - Tyrell'
input_number:
hue_dynamic_scene_speed:
name: Hue scene speed
min: 0
max: 100
step: 10
hue_dynamic_scene_brightness:
name: Hue scene brightness
min: 0
max: 255
step: 10
template:
binary_sensor:
- unique_id: selected_hue_group_active_scene
name: Selected Hue group active scene
state: >
{% set select = states('input_select.hue_group')|slugify %}
{% set group ='light.' + select %}
{{is_state_attr(group,'dynamics',true)}}
- unique_id: selected_hue_group_has_active_scenes_available
name: Selected Hue group has active scenes available
state: >
{% set hue_group = states('input_select.hue_group') %}
{{states.scene
|selectattr('attributes.group_name','eq',hue_group)
|selectattr('attributes.is_dynamic','eq',true)|list|length != 0}}
- unique_id: hue_groups_dynamic_scening
name: Hue groups dynamic scening
state: >
{{states.light|selectattr('attributes.dynamics','eq',true)|list|length != 0}}
# {% set select = states('input_select.hue_group') %}
# {% set group = states.light
# |selectattr('attributes.friendly_name','eq',select)
# |map(attribute='entity_id')|join %}
# {{is_state_attr(group,'dynamics',true)}}
script:
activate_hue_dynamic_scene:
alias: Activate Hue dynamic scene
mode: restart
icon: mdi:power
sequence:
- condition: >
{{is_state('binary_sensor.selected_hue_group_active_scene','off')}}
# first record current state of lights in the selected group
- service: scene.create
data:
scene_id: before_dynamic_scene
snapshot_entities:
- >
{% set select = states('input_select.hue_group')|slugify %}
{% set group ='light.' + select %}
{{group}}
- service: hue.activate_scene
data:
dynamic: true
speed: >
{{states('input_number.hue_dynamic_scene_speed')|int}}
brightness: >
{{states('input_number.hue_dynamic_scene_brightness')|int}}
target:
entity_id: >
{% set select = states('input_select.hue_dynamic_scene')|slugify %}
{{'scene.' + select}}
# {% set select = states('input_select.hue_dynamic_scene')%}
# {{states.scene
# |selectattr('attributes.friendly_name','eq',select)
# |map(attribute='entity_id')|join}}
deactivate_hue_dynamic_scene:
alias: Deactivate Hue dynamic scene
mode: restart
icon: mdi:power-off
sequence:
- condition: >
{{is_state('binary_sensor.selected_hue_group_active_scene','on')}}
- service: hue.activate_scene
data:
dynamic: false
target:
entity_id: >
{% set select = states('input_select.hue_dynamic_scene')|slugify %}
{{'scene.' + select}}
# reset the lights to the state before the dynamic scene activation
- service: scene.turn_on
target:
entity_id: scene.before_dynamic_scene
automation:
- alias: Auto populate Hue group input select
id: Auto populate Hue group input select
mode: restart
trigger:
platform: event
event_type: delayed_homeassistant_start
action:
service: input_select.set_options
target:
entity_id: input_select.hue_group
data:
options: >
{{states.light
|selectattr('attributes.is_hue_group','eq',true)
|map(attribute='name')|list}}
- alias: Auto populate Hue dynamic scene input select
id: Auto populate Hue dynamic scene input select
mode: restart
trigger:
- platform: event
event_type: delayed_homeassistant_start
- platform: state
entity_id: input_select.hue_group
action:
service: input_select.set_options
target:
entity_id: input_select.hue_dynamic_scene
data:
options: >
{% set hue_group = states('input_select.hue_group') %}
{{states.scene
|selectattr('attributes.group_name','eq',hue_group)
|selectattr('attributes.is_dynamic','eq',true)
|map(attribute='name')|list}}
- Add a card to any dashboard, choose the “Manual” card type with the following contents:
type: entities
title: Set Hue scenes
show_header_toggle: false
card_mod:
style: |
.card-header {
background-color: var(--background-color-off);
color: var(--text-color-off);
padding-top: 0px;
padding-bottom: 0px;
margin: 0px 0px 16px 0px;
}
ha-card {
margin: 0px 0px 16px 0px; /* create space before next card in view*/
}
entities:
- input_select.hue_group
- type: custom:fold-entity-row
card_mod:
style: |
#measure {
max-height: 300px;
overflow-x: hidden;
overflow-y: scroll;
}
head:
type: section
label: Regular scenes
card_mod:
style: |
.label {
margin-left: 0px;
}
padding: 0
no_animation: true
entities:
- type: custom:auto-entities
card:
type: entities
card_mod:
style: |
ha-card {
box-shadow: none;
margin: 0px -16px;
}
show_empty: false
filter:
template: |
{% set hue_group = states('input_select.hue_group') %}
{% set ns = namespace(scenes=[]) %}
{%- for s in states.scene
if hue_group == s.attributes.group_name and
s.attributes.is_dynamic != true %}
{% set ns.scenes = ns.scenes + [{'entity':s.entity_id,
'name': s.object_id.split(hue_group|slugify +'_')[1]|capitalize|replace('_',' ') }] %}
{%- endfor %}
{{ns.scenes}}
- type: conditional
conditions:
- entity: binary_sensor.selected_hue_group_has_active_scenes_available
state: 'on'
row:
type: custom:fold-entity-row
head:
type: section
label: Dynamic scenes
card_mod:
style: |
.label {
margin-left: 0px;
}
padding: 0
no_animation: true
entities:
- type: custom:auto-entities
card:
type: entities
card_mod:
style: |
ha-card {
box-shadow: none;
margin: 0px -16px;
}
.card-content {
max-height: 250px;
overflow-y: scroll;
}
filter:
template: |
{% set hue_group = states('input_select.hue_group') %}
{% set ns = namespace(scenes=[]) %}
{%- for s in states.scene
if hue_group == s.attributes.group_name and
s.attributes.is_dynamic == true %}
{% set ns.scenes = ns.scenes + [{'entity':s.entity_id,
'name': s.object_id.split(hue_group|slugify +'_')[1]|capitalize|replace('_',' ') }] %}
{%- endfor %}
{{ns.scenes}}
- input_select.hue_dynamic_scene
- input_number.hue_dynamic_scene_speed
- input_number.hue_dynamic_scene_brightness
- type: conditional
conditions:
- entity: binary_sensor.selected_hue_group_active_scene
state: 'off'
row:
entity: script.activate_hue_dynamic_scene
icon: mdi:play
action_name: play
- type: conditional
conditions:
- entity: binary_sensor.selected_hue_group_active_scene
state: 'on'
row:
entity: script.deactivate_hue_dynamic_scene
icon: mdi:stop
action_name: stop
- type: conditional
conditions:
- entity: binary_sensor.hue_groups_dynamic_scening
state: 'on'
row:
type: custom:fold-entity-row
head:
type: section
label: Currently scening group
card_mod:
style: |
.label {
margin-left: 0px;
}
padding: 0
no_animation: true
entities:
- type: custom:auto-entities
card:
type: entities
card_mod:
style: |
ha-card {
box-shadow: none;
margin: 0px -16px;
}
show_empty: false
filter:
include:
- attributes:
dynamics: true
- type: conditional
conditions:
- entity: binary_sensor.hue_groups_dynamic_scening
state: 'on'
row:
type: custom:fold-entity-row
head:
type: section
label: Currently scening lights
card_mod:
style: |
.label {
margin-left: 0px;
}
padding: 0
no_animation: true
entities:
- type: custom:auto-entities
card:
type: entities
card_mod:
style: |
ha-card {
box-shadow: none;
margin: 0px -16px;
}
show_empty: false
filter:
include:
- attributes:
dynamics: dynamic_palette
- type: custom:template-entity-row
entity: |
light.{{states('input_select.hue_group')|slugify}}
secondary: >
{% set x = ['unknown','unavailable'] %} {% if
states('input_select.hue_group') not in x %} {% set object =
states('input_select.hue_group')|slugify %} {% set group = 'light.' +
object %}
{% set bri = state_attr(group,'brightness') %}
{% set rgb = state_attr(group,'rgb_color') %}
{% if states(group) == 'on' %} Bri: {{bri}}, Rgb: {{rgb}}
{% else %} Off
{% endif %} since {{relative_time(states[group].last_changed) if (states[group]
and states[group].last_changed not in x) else 'Initializing....'}}
{% else %} Not yet set {% endif %}
toggle: true
- type: custom:fold-entity-row
head:
type: section
label: Automations
card_mod:
style: |
.label {
margin-left: 0px;
}
padding: 0
no_animation: true
entities:
- entity: automation.auto_populate_hue_group_input_select
secondary_info: last-triggered
- entity: automation.auto_populate_hue_dynamic_scene_input_select
secondary_info: last-triggered
- Go to Settings → Automations and run the two automations to populate the front end lists.
If you want the scene icons from the hue app like in this post by @Mariusthvdb, then:
- Create a new directory within www named “hue_scene_icons”
- Download the scene icons and put them in there
- Append the following to your hue_scene_selector.yaml:
homeassistant:
customize_glob:
scene.*adrift:
entity_picture: /local/hue_scene_icons/adrift.png
scene.*amber_bloom:
entity_picture: /local/hue_scene_icons/amber_bloom.png
scene.*amethyst_valley:
entity_picture: /local/hue_scene_icons/amethyst_valley.png
scene.*arctic_aurora:
entity_picture: /local/hue_scene_icons/arctic_aurora.png
scene.*autumn_gold:
entity_picture: /local/hue_scene_icons/autumn_gold.png
scene.*beginnings:
entity_picture: /local/hue_scene_icons/beginnings.png
scene.*blood_moon:
entity_picture: /local/hue_scene_icons/blood_moon.png
scene.*blossom:
entity_picture: /local/hue_scene_icons/blossom.png
scene.*blue_lagoon:
entity_picture: /local/hue_scene_icons/blue_lagoon.png
scene.*blue_planet:
entity_picture: /local/hue_scene_icons/blue_planet.png
scene.*bright:
entity_picture: /local/hue_scene_icons/bright.png
scene.*cancun:
entity_picture: /local/hue_scene_icons/cancun.png
scene.*chinatown:
entity_picture: /local/hue_scene_icons/chinatown.png
scene.*concentrate:
entity_picture: /local/hue_scene_icons/concentrate.png
scene.*cool_bright:
entity_picture: /local/hue_scene_icons/cool_bright.png
scene.*crocus:
entity_picture: /local/hue_scene_icons/crocus.png
scene.*dimmed:
entity_picture: /local/hue_scene_icons/dimmed.png
scene.*disturbia:
entity_picture: /local/hue_scene_icons/disturbia.png
scene.*dreamy_dusk:
entity_picture: /local/hue_scene_icons/dreamy_dusk.png
scene.*emerald_flutter:
entity_picture: /local/hue_scene_icons/emerald_flutter.png
scene.*emerald_isle:
entity_picture: /local/hue_scene_icons/emerald_isle.png
scene.*energize:
entity_picture: /local/hue_scene_icons/energize.png
scene.*fairfax:
entity_picture: /local/hue_scene_icons/fairfax.png
scene.*first_light:
entity_picture: /local/hue_scene_icons/first_light.png
scene.*forest_adventure:
entity_picture: /local/hue_scene_icons/forest_adventure.png
scene.*frosty_dawn:
entity_picture: /local/hue_scene_icons/frosty_dawn.png
scene.*galaxy:
entity_picture: /local/hue_scene_icons/galaxy.png
scene.*golden_pond:
entity_picture: /local/hue_scene_icons/golden_pond.png
scene.*hal:
entity_picture: /local/hue_scene_icons/hal.png
scene.*hazy_days:
entity_picture: /local/hue_scene_icons/hazy_days.png
scene.*honolulu:
entity_picture: /local/hue_scene_icons/honolulu.png
scene.*horizon:
entity_picture: /local/hue_scene_icons/horizon.png
scene.*ibiza:
entity_picture: /local/hue_scene_icons/ibiza.png
scene.*lake_mist:
entity_picture: /local/hue_scene_icons/lake_mist.png
scene.*lake_placid:
entity_picture: /local/hue_scene_icons/lake_placid.png
scene.*lily:
entity_picture: /local/hue_scene_icons/lily.png
scene.*magneto:
entity_picture: /local/hue_scene_icons/magento.png
scene.*majestic_morning:
entity_picture: /local/hue_scene_icons/majestic_morning.png
scene.*memento:
entity_picture: /local/hue_scene_icons/memento.png
scene.*meriete:
entity_picture: /local/hue_scene_icons/meriete.png
scene.*miami:
entity_picture: /local/hue_scene_icons/miami.png
scene.*midsummer_sun:
entity_picture: /local/hue_scene_icons/midsummer_sun.png
scene.*midwinter:
entity_picture: /local/hue_scene_icons/midwinter.png
scene.*misty_ridge:
entity_picture: /local/hue_scene_icons/misty_ridge.png
scene.*moonlight:
entity_picture: /local/hue_scene_icons/moonlight.png
scene.*motown:
entity_picture: /local/hue_scene_icons/motown.png
scene.*mountain_breeze:
entity_picture: /local/hue_scene_icons/mountain_breeze.png
scene.*narcissa:
entity_picture: /local/hue_scene_icons/narcissa.png
scene.*nebula:
entity_picture: /local/hue_scene_icons/nebula.png
scene.*nightlight:
entity_picture: /local/hue_scene_icons/nightlight.png
scene.*ocean_dawn:
entity_picture: /local/hue_scene_icons/ocean_dawn.png
scene.*orange_fields:
entity_picture: /local/hue_scene_icons/orange_fields.png
scene.*osaka:
entity_picture: /local/hue_scene_icons/osaka.png
scene.*painted_sky:
entity_picture: /local/hue_scene_icons/painted_sky.png
scene.*palm_beach:
entity_picture: /local/hue_scene_icons/palm_beach.png
scene.*pensive:
entity_picture: /local/hue_scene_icons/pensive.png
scene.*precious:
entity_picture: /local/hue_scene_icons/precious.png
scene.*read:
entity_picture: /local/hue_scene_icons/read.png
scene.*relax:
entity_picture: /local/hue_scene_icons/relax.png
scene.*resplendant:
entity_picture: /local/hue_scene_icons/resplendant.png
scene.*rest:
entity_picture: /local/hue_scene_icons/rest.png
scene.*rio:
entity_picture: /local/hue_scene_icons/rio.png
scene.*rolling_hills:
entity_picture: /local/hue_scene_icons/rolling_hills.png
scene.*ruby_glow:
entity_picture: /local/hue_scene_icons/ruby_glow.png
scene.*savanna_sunset:
entity_picture: /local/hue_scene_icons/savanna_sunset.png
scene.*scarlet_dream:
entity_picture: /local/hue_scene_icons/scarlet_dream.png
scene.*soho:
entity_picture: /local/hue_scene_icons/soho.png
scene.*spring_blossom:
entity_picture: /local/hue_scene_icons/spring_blossom.png
scene.*spring_lake:
entity_picture: /local/hue_scene_icons/spring_lake.png
scene.*starlight:
entity_picture: /local/hue_scene_icons/starlight.png
scene.*still_waters:
entity_picture: /local/hue_scene_icons/still_waters.png
scene.*sunday_morning:
entity_picture: /local/hue_scene_icons/sunday_morning.png
scene.*sundown:
entity_picture: /local/hue_scene_icons/sundown.png
scene.*sunflare:
entity_picture: /local/hue_scene_icons/sunflare.png
scene.*tokyo:
entity_picture: /local/hue_scene_icons/tokyo.png
scene.*tropical_twilight:
entity_picture: /local/hue_scene_icons/tropical_twilight.png
scene.*tyrell:
entity_picture: /local/hue_scene_icons/tyrell.png
scene.*valley_dawn:
entity_picture: /local/hue_scene_icons/valley_dawn.png
scene.*vapor_wave:
entity_picture: /local/hue_scene_icons/vapor_wave.png
scene.*warm_embrace:
entity_picture: /local/hue_scene_icons/warm_embrace.png
scene.*winter_beauty:
entity_picture: /local/hue_scene_icons/winter_beauty.png
scene.*winter_mountain:
entity_picture: /local/hue_scene_icons/winter_mountain.png