Files
zorruno-homeassistant/packages/lounge_lighting_scenes.yaml
T
2025-12-21 20:55:54 +13:00

354 lines
16 KiB
YAML

# yaml-language-server: $schema=null
###############################################################################
# PACKAGE: Lounge scenes (delta-only settings) + manual override
###############################################################################
input_select:
lounge_scene:
name: Lounge Scene
options:
- "Select Scene:"
- Bright
- TV General
- Movie
- Reading 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 }}"
# NEW: Wait briefly for HA to commit the new state (avoids race)
- 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 temp scenes, not remembered as last)
#####################################################################
excluded_scenes:
- "Select Scene:"
- "Reading 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"
light.esp_breakfastbarleds_breakfast_bar_leds: 90
light.esp_loungecabinetleds2_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
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_loungecabinetleds2_lounge_cabinet_leds: 60
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 60
switch.esp_loungemiddleswitch_relay_3_downlights_north: "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
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_loungecabinetleds2_lounge_cabinet_leds: 40
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 40
switch.esp_loungemiddleswitch_relay_3_downlights_north: "off"
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
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_loungecabinetleds2_lounge_cabinet_leds: 5
light.esp_loungebookshelfleds_lounge_bookshelf_leds: 5
switch.esp_loungemiddleswitch_relay_3_downlights_north: "off"
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
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_loungecabinetleds2_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_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
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"
light.esp_breakfastbarleds_breakfast_bar_leds: 0
light.esp_loungecabinetleds2_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
#####################################################################
#####################################################################
#####################################################################
# Only remember scenes that are not excluded
- choose:
- conditions: "{{ sel not in excluded_scenes }}"
sequence:
- service: input_text.set_value
target: { entity_id: input_text.lounge_last_scene }
data:
value: "{{ sel }}"
- 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_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') }}"
is_number_ent: "{{ ent.startswith('number.') }}" # 🔹 NEW
- choose:
# 0) Numbers: set numeric value (e.g. 0..100)
- conditions: "{{ is_number_ent and is_num }}" # 🔹 NEW
sequence:
- service: number.set_value
data:
entity_id: "{{ ent }}"
value: "{{ val|float }}"
# 1) Lights: toggle[_NN] -> if on turn off, else turn on to NN (default 100)
- 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 (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" #small debounce
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" #small debounce
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"