461 lines
21 KiB
YAML
461 lines
21 KiB
YAML
# yaml-language-server: $schema=null
|
|
###############################################################################
|
|
# PACKAGE: Lounge scenes controller
|
|
#
|
|
# PURPOSE:
|
|
# - Provides selectable lounge lighting scenes from Home Assistant.
|
|
# - Scenes are selected via input_select.lounge_scene.
|
|
# - The selector resets back to "Select Scene:" after each scene is applied, so
|
|
# the same scene can be selected repeatedly.
|
|
# - Scenes are delta-only: only entities listed in a scene are changed.
|
|
# - Manual override can block automatic scene changes.
|
|
# - Last remembered scene is tracked so TV automations can avoid changing lights
|
|
# when the lounge was deliberately set to All Off.
|
|
#
|
|
# SUPPORTED SCENE VALUE TYPES:
|
|
# - light.*:
|
|
# 0 = turn off
|
|
# 1-100 = turn on at brightness percentage
|
|
# "on" = turn on
|
|
# "off" = turn off
|
|
# "toggle" = toggle on/off, using 100 percent when turning on
|
|
# "toggle_75" = if on, turn off; if off, turn on at 75 percent
|
|
#
|
|
# - switch.*:
|
|
# "on" = turn on
|
|
# "off" = turn off
|
|
# "toggle" = toggle on/off
|
|
#
|
|
# - number.*:
|
|
# numeric value is sent using number.set_value
|
|
#
|
|
# - input_number.*:
|
|
# numeric value is sent using input_number.set_value
|
|
# Example: input_number.openhasp_1_backlight_level: 180
|
|
#
|
|
# NOTES:
|
|
# - Keep on/off/toggle values quoted for clarity.
|
|
# - Numeric values can be left unquoted.
|
|
# - Only scenes not listed in excluded_scenes update input_text.lounge_last_scene.
|
|
###############################################################################
|
|
|
|
input_select:
|
|
lounge_scene:
|
|
name: Lounge Scene
|
|
options:
|
|
- "Select Scene:"
|
|
- Bright
|
|
- TV General
|
|
- Balanced
|
|
- Movie
|
|
- Reading On/Off
|
|
- Dining On/Off
|
|
- Night Light
|
|
- Warm Cozy
|
|
- All Off
|
|
initial: "Select Scene:"
|
|
|
|
input_boolean:
|
|
lounge_manual_override:
|
|
name: Lounge Lighting Scene Manual Override
|
|
initial: off
|
|
|
|
input_text:
|
|
lounge_last_scene:
|
|
name: Lounge Last Scene
|
|
initial: "All Off"
|
|
max: 40
|
|
|
|
timer:
|
|
lounge_override_timer:
|
|
name: Lounge Lighting Scene Override Timer
|
|
duration: "02:00:00"
|
|
|
|
###############################################################################
|
|
# SCRIPTS
|
|
###############################################################################
|
|
script:
|
|
lounge_set_scene:
|
|
alias: "Lounge: Set scene by name"
|
|
mode: restart
|
|
fields:
|
|
scene_name:
|
|
description: One of the options from input_select.lounge_scene
|
|
sequence:
|
|
- service: input_select.select_option
|
|
target: { entity_id: input_select.lounge_scene }
|
|
data:
|
|
option: "{{ scene_name }}"
|
|
|
|
# Wait briefly for HA to commit the new state before reading it.
|
|
- wait_template: "{{ states('input_select.lounge_scene') == scene_name }}"
|
|
timeout: "00:00:02"
|
|
continue_on_timeout: true
|
|
|
|
- service: script.lounge_apply_and_reset
|
|
|
|
lounge_apply_scene:
|
|
alias: "Lounge: Apply current scene"
|
|
mode: restart
|
|
sequence:
|
|
- variables:
|
|
sel: "{{ states('input_select.lounge_scene') }}"
|
|
|
|
#####################################################################
|
|
# EXCLUDED SCENES
|
|
# These are temporary/action scenes and are not remembered as last.
|
|
#####################################################################
|
|
excluded_scenes:
|
|
- "Select Scene:"
|
|
- "Reading On/Off"
|
|
- "Dining On/Off"
|
|
#- "Night Light"
|
|
|
|
#####################################################################
|
|
# SCENE SETTINGS
|
|
# Delta only - only list entities you want to change.
|
|
#####################################################################
|
|
scene_settings:
|
|
Bright:
|
|
light.esp_lounge6chdimmer_couch_spots_left: 0
|
|
light.esp_lounge6chdimmer_couch_spots_right: 0
|
|
#light.esp_lounge6chdimmer_dining_table_light: 100
|
|
light.esp_lounge6chdimmer_lounge_downlights_centre: 100
|
|
light.esp_lounge6chdimmer_lounge_downlights_south: 100
|
|
light.esp_lounge6chdimmer_lounge_rafter_buttons: 100
|
|
#switch.esp_loungemiddleswitch_relay_3_downlights_north: "on"
|
|
switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "on" # non dimmable pair
|
|
light.esp_breakfastbarleds_breakfast_bar_leds: 90
|
|
light.esp_loungecabinetleds_lounge_cabinet_leds: 90
|
|
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 90
|
|
switch.lounge_cupboard_dual_usb_xus09_l2: "on"
|
|
switch.esp_loungesouthleftswitch_relay_1_wall_washer_left: "on"
|
|
switch.esp_loungesouthrightswitch_relay_2_wall_washer_right: "on"
|
|
#switch.tasmo_ks811t_0702_lounge_3c: "on"
|
|
#switch.esp_loungenorthswitch_relay_1_main_lights: "on"
|
|
number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 100
|
|
number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 100
|
|
input_number.openhasp_1_backlight_level: 100
|
|
number.lounge_nspanel_touchscreen_display_brightness: 100
|
|
|
|
TV General:
|
|
light.esp_lounge6chdimmer_couch_spots_left: 60
|
|
light.esp_lounge6chdimmer_couch_spots_right: 60
|
|
#light.esp_lounge6chdimmer_dining_table_light: 100
|
|
light.esp_lounge6chdimmer_lounge_downlights_centre: 60
|
|
light.esp_lounge6chdimmer_lounge_downlights_south: 60
|
|
light.esp_lounge6chdimmer_lounge_rafter_buttons: 40
|
|
light.esp_breakfastbarleds_breakfast_bar_leds: 60
|
|
light.esp_loungecabinetleds_lounge_cabinet_leds: 60
|
|
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 60
|
|
#switch.esp_loungemiddleswitch_relay_3_downlights_north: "off" # non-dimmable pair
|
|
switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair
|
|
switch.lounge_cupboard_dual_usb_xus09_l2: "on"
|
|
switch.esp_loungesouthleftswitch_relay_1_wall_washer_left: "off"
|
|
switch.esp_loungesouthrightswitch_relay_2_wall_washer_right: "off"
|
|
#switch.esp_loungenorthswitch_relay_1_main_lights: "on"
|
|
number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 60
|
|
number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 60
|
|
input_number.openhasp_1_backlight_level: 30
|
|
number.lounge_nspanel_touchscreen_display_brightness: 210
|
|
|
|
Balanced:
|
|
light.esp_lounge6chdimmer_couch_spots_left: 40
|
|
light.esp_lounge6chdimmer_couch_spots_right: 40
|
|
#light.esp_lounge6chdimmer_dining_table_light: 100
|
|
light.esp_lounge6chdimmer_lounge_downlights_centre: 40
|
|
light.esp_lounge6chdimmer_lounge_downlights_south: 40
|
|
light.esp_lounge6chdimmer_lounge_rafter_buttons: 30
|
|
light.esp_breakfastbarleds_breakfast_bar_leds: 50
|
|
light.esp_loungecabinetleds_lounge_cabinet_leds: 50
|
|
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 50
|
|
#switch.esp_loungemiddleswitch_relay_3_downlights_north: "off" # non-dimmable pair
|
|
switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair
|
|
switch.lounge_cupboard_dual_usb_xus09_l2: "on"
|
|
switch.esp_loungesouthleftswitch_relay_1_wall_washer_left: "off"
|
|
switch.esp_loungesouthrightswitch_relay_2_wall_washer_right: "off"
|
|
#switch.esp_loungenorthswitch_relay_1_main_lights: "on"
|
|
number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 50
|
|
number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 50
|
|
input_number.openhasp_1_backlight_level: 30
|
|
number.lounge_nspanel_touchscreen_display_brightness: 80
|
|
|
|
Movie:
|
|
light.esp_lounge6chdimmer_couch_spots_left: 20
|
|
light.esp_lounge6chdimmer_couch_spots_right: 20
|
|
#light.esp_lounge6chdimmer_dining_table_light: 100
|
|
light.esp_lounge6chdimmer_lounge_downlights_centre: 10
|
|
light.esp_lounge6chdimmer_lounge_downlights_south: 30
|
|
light.esp_lounge6chdimmer_lounge_rafter_buttons: 0
|
|
light.esp_breakfastbarleds_breakfast_bar_leds: 40
|
|
light.esp_loungecabinetleds_lounge_cabinet_leds: 40
|
|
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 40
|
|
#switch.esp_loungemiddleswitch_relay_3_downlights_north: "off"
|
|
switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair
|
|
switch.lounge_cupboard_dual_usb_xus09_l2: "on"
|
|
switch.esp_loungesouthleftswitch_relay_1_wall_washer_left: "off"
|
|
switch.esp_loungesouthrightswitch_relay_2_wall_washer_right: "off"
|
|
#switch.esp_loungenorthswitch_relay_1_main_lights: "on"
|
|
number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 40
|
|
number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 40
|
|
input_number.openhasp_1_backlight_level: 10
|
|
switch.esp_mainkitchenlights_relay_1_main_lights: "off"
|
|
switch.esp_mainkitchenlights_relay_2_benchtop_lights: "off"
|
|
number.lounge_nspanel_touchscreen_display_brightness: 40
|
|
|
|
Dining On/Off:
|
|
light.esp_lounge6chdimmer_dining_table_light: "toggle_100"
|
|
#light.esp_lounge6chdimmer_dining_table_light: 60
|
|
#light.esp_lounge6chdimmer_lounge_downlights_centre: 45
|
|
#light.esp_lounge6chdimmer_lounge_downlights_south: 35
|
|
#light.esp_lounge6chdimmer_lounge_rafter_buttons: 20
|
|
#switch.tasmo_ks811t_0702_lounge_3c: "on"
|
|
|
|
Reading On/Off:
|
|
light.esp_lounge6chdimmer_couch_spots_left: "toggle_75"
|
|
light.esp_lounge6chdimmer_couch_spots_right: "toggle_75"
|
|
#light.esp_lounge6chdimmer_dining_table_light: 60
|
|
#light.esp_lounge6chdimmer_lounge_downlights_centre: 45
|
|
#light.esp_lounge6chdimmer_lounge_downlights_south: 35
|
|
#light.esp_lounge6chdimmer_lounge_rafter_buttons: 20
|
|
#switch.tasmo_ks811t_0702_lounge_3c: "on"
|
|
|
|
Night Light:
|
|
#light.esp_lounge6chdimmer_couch_spots_left: 20
|
|
#light.esp_lounge6chdimmer_couch_spots_right: 20
|
|
#light.esp_lounge6chdimmer_dining_table_light: 100
|
|
light.esp_lounge6chdimmer_lounge_downlights_centre: 0
|
|
light.esp_lounge6chdimmer_lounge_downlights_south: 0
|
|
light.esp_lounge6chdimmer_lounge_rafter_buttons: 0
|
|
light.esp_breakfastbarleds_breakfast_bar_leds: 5
|
|
light.esp_loungecabinetleds_lounge_cabinet_leds: 5
|
|
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 5
|
|
#switch.esp_loungemiddleswitch_relay_3_downlights_north: "off"
|
|
switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair
|
|
switch.lounge_cupboard_dual_usb_xus09_l2: "off"
|
|
switch.esp_loungesouthleftswitch_relay_1_wall_washer_left: "off"
|
|
switch.esp_loungesouthrightswitch_relay_2_wall_washer_right: "off"
|
|
#switch.esp_loungenorthswitch_relay_1_main_lights: "on"
|
|
number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 5
|
|
number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 5
|
|
input_number.openhasp_1_backlight_level: 6
|
|
number.lounge_nspanel_touchscreen_display_brightness: 30
|
|
|
|
Warm Cozy:
|
|
light.esp_lounge6chdimmer_couch_spots_left: 20
|
|
light.esp_lounge6chdimmer_couch_spots_right: 20
|
|
light.esp_lounge6chdimmer_lounge_rafter_buttons: 15
|
|
light.esp_breakfastbarleds_breakfast_bar_leds: 25
|
|
light.esp_loungecabinetleds_lounge_cabinet_leds: 30
|
|
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 30
|
|
#light.tasmo_h801_loungeled1_6180_a: 25
|
|
#light.tasmo_h801_loungeled1_6180_b: 25
|
|
switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair
|
|
switch.lounge_cupboard_dual_usb_xus09_l2: "on"
|
|
switch.esp_loungesouthleftswitch_relay_1_wall_washer_left: "on"
|
|
switch.esp_loungesouthrightswitch_relay_2_wall_washer_right: "on"
|
|
#switch.esp_loungenorthswitch_relay_1_main_lights: "on"
|
|
number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 20
|
|
number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 20
|
|
input_number.openhasp_1_backlight_level: 12
|
|
number.lounge_nspanel_touchscreen_display_brightness: 40
|
|
|
|
All Off:
|
|
light.esp_lounge6chdimmer_couch_spots_left: 0
|
|
light.esp_lounge6chdimmer_couch_spots_right: 0
|
|
light.esp_lounge6chdimmer_dining_table_light: 0
|
|
light.esp_lounge6chdimmer_lounge_downlights_centre: 0
|
|
light.esp_lounge6chdimmer_lounge_downlights_south: 0
|
|
light.esp_lounge6chdimmer_lounge_rafter_buttons: 0
|
|
#switch.esp_loungemiddleswitch_relay_3_downlights_north: "off"
|
|
switch.lounge_nspanel_touchscreen_lounge_stair_downlights: "off" # non dimmable pair
|
|
light.esp_breakfastbarleds_breakfast_bar_leds: 0
|
|
light.esp_loungecabinetleds_lounge_cabinet_leds: 0
|
|
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 0
|
|
switch.lounge_cupboard_dual_usb_xus09_l2: "off"
|
|
switch.esp_loungesouthleftswitch_relay_1_wall_washer_left: "off"
|
|
switch.esp_loungesouthrightswitch_relay_2_wall_washer_right: "off"
|
|
#switch.esp_loungenorthswitch_relay_1_main_lights: "on"
|
|
number.esp_loungepelmetleds2_lounge_pelmet_leds_a_output_set_0_100: 0
|
|
number.esp_loungepelmetleds2_lounge_pelmet_leds_b_output_set_0_100: 0
|
|
input_number.openhasp_1_backlight_level: 60
|
|
#switch.esp_mainkitchenlights_relay_1_main_lights: "off"
|
|
#switch.esp_mainkitchenlights_relay_2_benchtop_lights: "off"
|
|
number.lounge_nspanel_touchscreen_display_brightness: 80
|
|
|
|
#########################################################################
|
|
# REMEMBER LAST SCENE
|
|
#########################################################################
|
|
- choose:
|
|
- conditions: "{{ sel not in excluded_scenes }}"
|
|
sequence:
|
|
- service: input_text.set_value
|
|
target: { entity_id: input_text.lounge_last_scene }
|
|
data:
|
|
value: "{{ sel }}"
|
|
|
|
#########################################################################
|
|
# APPLY SELECTED SCENE
|
|
#########################################################################
|
|
- repeat:
|
|
for_each: "{{ (scene_settings.get(sel, {})).keys() | list }}"
|
|
sequence:
|
|
- variables:
|
|
ent: "{{ repeat.item }}"
|
|
val: "{{ (scene_settings.get(sel, {}))[ent] }}"
|
|
is_light: "{{ ent.startswith('light.') }}"
|
|
is_switch: "{{ ent.startswith('switch.') }}"
|
|
is_number_ent: "{{ ent.startswith('number.') }}"
|
|
is_input_number_ent: "{{ ent.startswith('input_number.') }}"
|
|
is_num: "{{ val is number }}"
|
|
vstr: "{{ (val|string) if not is_num else '' }}"
|
|
is_toggle: "{{ (not is_num) and (vstr|lower).startswith('toggle') }}"
|
|
toggle_pct: "{{ (vstr.split('_')|last)|int if ('_' in vstr) else 100 }}"
|
|
currently_on: "{{ is_state(ent, 'on') }}"
|
|
|
|
- choose:
|
|
# 0a) Numbers: set numeric value
|
|
- conditions: "{{ is_number_ent and is_num }}"
|
|
sequence:
|
|
- service: number.set_value
|
|
data:
|
|
entity_id: "{{ ent }}"
|
|
value: "{{ val|float }}"
|
|
|
|
# 0b) Input numbers: set numeric value
|
|
- conditions: "{{ is_input_number_ent and is_num }}"
|
|
sequence:
|
|
- service: input_number.set_value
|
|
data:
|
|
entity_id: "{{ ent }}"
|
|
value: "{{ val|float }}"
|
|
|
|
# 1) Lights: toggle[_NN] -> if on turn off, else turn on to NN
|
|
- conditions: "{{ is_light and is_toggle }}"
|
|
sequence:
|
|
- choose:
|
|
- conditions: "{{ currently_on }}"
|
|
sequence:
|
|
- service: light.turn_off
|
|
data:
|
|
entity_id: "{{ ent }}"
|
|
default:
|
|
- service: light.turn_on
|
|
data:
|
|
entity_id: "{{ ent }}"
|
|
brightness_pct: "{{ toggle_pct }}"
|
|
|
|
# 2) Switches: toggle -> flip state
|
|
- conditions: "{{ is_switch and is_toggle }}"
|
|
sequence:
|
|
- service: switch.toggle
|
|
data:
|
|
entity_id: "{{ ent }}"
|
|
|
|
# 3) Lights: numeric brightness, where 0 = off
|
|
- conditions: "{{ is_light and is_num and (val|int) > 0 }}"
|
|
sequence:
|
|
- service: light.turn_on
|
|
data:
|
|
entity_id: "{{ ent }}"
|
|
brightness_pct: "{{ val|int }}"
|
|
|
|
- conditions: "{{ is_light and is_num and (val|int) == 0 }}"
|
|
sequence:
|
|
- service: light.turn_off
|
|
data:
|
|
entity_id: "{{ ent }}"
|
|
|
|
# 4) Lights: textual/boolean on/off
|
|
- conditions: "{{ is_light and not is_num and (val in [true, 'on', 'On', 'ON']) }}"
|
|
sequence:
|
|
- service: light.turn_on
|
|
data:
|
|
entity_id: "{{ ent }}"
|
|
|
|
- conditions: "{{ is_light and not is_num and (val in [false, 'off', 'Off', 'OFF']) }}"
|
|
sequence:
|
|
- service: light.turn_off
|
|
data:
|
|
entity_id: "{{ ent }}"
|
|
|
|
# 5) Switches: textual/boolean on/off
|
|
- conditions: "{{ is_switch and (val in [true, 'on', 'On', 'ON']) }}"
|
|
sequence:
|
|
- service: switch.turn_on
|
|
data:
|
|
entity_id: "{{ ent }}"
|
|
|
|
- conditions: "{{ is_switch and (val in [false, 'off', 'Off', 'OFF']) }}"
|
|
sequence:
|
|
- service: switch.turn_off
|
|
data:
|
|
entity_id: "{{ ent }}"
|
|
|
|
lounge_apply_and_reset:
|
|
alias: "Lounge: Apply scene + reset selector"
|
|
mode: restart
|
|
sequence:
|
|
- service: script.lounge_apply_scene
|
|
- delay: "00:00:05"
|
|
- service: input_select.select_option
|
|
target: { entity_id: input_select.lounge_scene }
|
|
data:
|
|
option: "Select Scene:"
|
|
|
|
###############################################################################
|
|
# AUTOMATIONS
|
|
###############################################################################
|
|
automation:
|
|
- id: lounge_apply_on_selector_change
|
|
alias: "Lounge - Apply when selector changes"
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_select.lounge_scene
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.lounge_manual_override
|
|
state: "off"
|
|
- condition: template
|
|
value_template: "{{ trigger.to_state.state != 'Select Scene:' }}"
|
|
action:
|
|
- service: script.turn_on
|
|
target:
|
|
entity_id: script.lounge_apply_and_reset
|
|
|
|
- id: lounge_tv_on_sets_tv_bias
|
|
alias: "Lounge - TV on sets TV General (unless override)"
|
|
trigger:
|
|
- platform: state
|
|
entity_id: remote.lounge_tv
|
|
to: "on"
|
|
for: "00:00:02"
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.lounge_manual_override
|
|
state: "off"
|
|
- condition: template
|
|
value_template: "{{ states('input_text.lounge_last_scene') != 'All Off' }}"
|
|
action:
|
|
- service: script.lounge_set_scene
|
|
data:
|
|
scene_name: "TV General"
|
|
|
|
- id: lounge_tv_off_sets_bright
|
|
alias: "Lounge - TV off sets Bright (unless override)"
|
|
trigger:
|
|
- platform: state
|
|
entity_id: remote.lounge_tv
|
|
to: "off"
|
|
for: "00:00:02"
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.lounge_manual_override
|
|
state: "off"
|
|
- condition: template
|
|
value_template: "{{ states('input_text.lounge_last_scene') != 'All Off' }}"
|
|
action:
|
|
- service: script.lounge_set_scene
|
|
data:
|
|
scene_name: "Bright"
|