diff options
Diffstat (limited to 'blueprints/automation/lights/knob-sound-multi-bulb-control.yaml')
-rw-r--r-- | blueprints/automation/lights/knob-sound-multi-bulb-control.yaml | 338 |
1 files changed, 338 insertions, 0 deletions
diff --git a/blueprints/automation/lights/knob-sound-multi-bulb-control.yaml b/blueprints/automation/lights/knob-sound-multi-bulb-control.yaml new file mode 100644 index 0000000..843b25e --- /dev/null +++ b/blueprints/automation/lights/knob-sound-multi-bulb-control.yaml @@ -0,0 +1,338 @@ +blueprint: + name: Knob Sound & Multi-Bulb Control + description: Knob (clicking/rotating) to control bulb (or LED band) brightness, color temperature, and hue + domain: automation + input: + knob: + name: knob + description: controller (select _action entity) + selector: + entity: + domain: sensor + lights: + name: Bulb + description: smart bulb or power socket + selector: + entity: + multiple: true + domain: light + media_player: + name: Media Player + description: "Media Player" + selector: + entity: + domain: media_player + + toggle_actions: + name: Toggle Actions + description: Script to run on clicking knob button (e.g. turn-of bulb power on/off), first action if bulb1 active, second if bulb2 active, etc. (use e.g. choose for grouping) + default: + - choose: [] + default: [] + selector: + action: + + name: + name: name + description: Name of variables tracking bulb parameters (should include ***_current, ***_brighness0, ***_temperature0, ***_hue0 + default: knob_office + + hue_delay: + name: Hue Delay + description: Delay between hue changes + default: 500 + selector: + number: + min: 100 + max: 10000 + + inactivity_delay: + name: Inactivity Delay + description: Reset to first deveice if no actions (seconds), use 0 to have no inactivity timeout + default: 900 + selector: + number: + min: 0 + max: 7200 + + volume_steps: + name: Hue Delay + description: Delay between hue changes + default: 4 + selector: + number: + min: 1 + max: 10 + +trigger: + - platform: state + id: knob + entity_id: !input "knob" + to: + - "toggle" + - "brightness_step_up" + - "brightness_step_down" + - "color_temperature_step_up" + - "color_temperature_step_down" + - "hue_move" + +variables: + name: !input name + + inactivity_delay: !input inactivity_delay + last_trigger: '{{ now().timestamp() - as_timestamp(this.attributes.last_triggered) }}' + + current: 'input_number.{{ name + "_current" }}' + current_num: '{{ (states(current) | int - 1) if ((inactivity_delay == 0) or (inactivity_delay>last_trigger)) else -1 }}' + + lights: !input lights + brightness: 'input_number.{{ name + "_brightness" }}{{ current_num }}' + temperature: 'input_number.{{ name + "_temperature" }}{{ current_num }}' + hue: 'input_number.{{ name + "_hue" }}{{ current_num }}' + + hue_delay: !input hue_delay + volume_steps: !input volume_steps + +# We can't use 'queued/restart' if we need to tackle 'double-click' +#mode: queued +mode: single + +action: +- if: + - condition: template + value_template: '{{ last_trigger > inactivity_delay }}' + then: + - service: input_number.set_value + data: + value: 0 + target: + entity_id: '{{ current }}' + + +- choose: + - conditions: + - condition: trigger + id: knob + sequence: + - choose: + +# Sounds control + - conditions: + - condition: template + value_template: '{{ trigger.to_state.state == "brightness_step_up" }}' + - condition: template + value_template: '{{ current_num < 0 }}' + sequence: + - repeat: + count: '{{ volume_steps }}' + sequence: + - service: media_player.volume_up + target: + entity_id: !input media_player + - conditions: + - condition: template + value_template: '{{ trigger.to_state.state == "brightness_step_down" }}' + - condition: template + value_template: '{{ current_num < 0 }}' + sequence: + - repeat: + count: '{{ volume_steps }}' + sequence: + - service: media_player.volume_down + target: + entity_id: !input media_player + - conditions: + - condition: template + value_template: '{{ trigger.to_state.state == "color_temperature_step_up" }}' + - condition: template + value_template: '{{ current_num < 0 }}' + - condition: template + value_template: '{{ last_trigger > 2 }}' + sequence: + - service: media_player.media_next_track + target: + entity_id: !input media_player + - conditions: + - condition: template + value_template: '{{ trigger.to_state.state == "color_temperature_step_down" }}' + - condition: template + value_template: '{{ current_num < 0 }}' + - condition: template + value_template: '{{ last_trigger > 2 }}' + sequence: + - service: media_player.media_previous_track + target: + entity_id: !input media_player + - conditions: + - condition: template + value_template: '{{ trigger.to_state.state == "hue_move" }}' + - condition: template + value_template: '{{ current_num < 0 }}' + - condition: template + value_template: '{{ last_trigger > 2 }}' + sequence: + - service: script.play_playlist + data: + media_player: !input media_player + playlist: darksoft + +# Light control + - conditions: + - condition: template + value_template: '{{ trigger.to_state.state == "brightness_step_up" }}' + - condition: template + value_template: '{{ current_num >= 0 }}' + sequence: + - service: input_number.increment + target: + entity_id: '{{ brightness }}' + - service: light.turn_on + data: + brightness: '{{ states(brightness) }}' + target: + entity_id: '{{ lights[current_num] }}' + + - conditions: + - condition: template + value_template: '{{ trigger.to_state.state == "brightness_step_down" }}' + - condition: template + value_template: '{{ current_num >= 0 }}' + sequence: + - service: input_number.decrement + data: {} + target: + entity_id: '{{ brightness }}' + - service: light.turn_on + data: + brightness: '{{ states(brightness) }}' + target: + entity_id: '{{ lights[current_num] }}' + + - conditions: + - condition: template + value_template: '{{ trigger.to_state.state == "color_temperature_step_up" }}' + - condition: template + value_template: '{{ current_num >= 0 }}' + sequence: + - service: input_number.increment + target: + entity_id: '{{ temperature }}' + - service: light.turn_on + data: + kelvin: '{{ states(temperature) }}' + target: + entity_id: '{{ lights[current_num] }}' + + - conditions: + - condition: template + value_template: '{{ trigger.to_state.state == "color_temperature_step_down" }}' + - condition: template + value_template: '{{ current_num >= 0 }}' + sequence: + - service: input_number.decrement + target: + entity_id: '{{ temperature }}' + - service: light.turn_on + data: + kelvin: '{{ states(temperature) }}' + target: + entity_id: '{{ lights[current_num] }}' + + - conditions: + - condition: template + value_template: '{{ trigger.to_state.state == "hue_move" }}' + - condition: template + value_template: '{{ current_num >= 0 }}' + sequence: + - repeat: + until: + - condition: template + value_template: '{{ wait.trigger != None }}' + sequence: + - if: + - condition: template + value_template: '{{ states(hue) | float < 359 }}' + then: + - service: input_number.increment + data: {} + target: + entity_id: '{{ hue }}' + else: + - service: input_number.set_value + data: + value: 0 + target: + entity_id: '{{ hue }}' + - service: light.turn_on + data: + hs_color: '{{ states(hue) }}, 100' + target: + entity_id: '{{ lights[current_num] }}' + - wait_for_trigger: + - platform: state + entity_id: !input knob + to: 'hue_stop' + timeout: + milliseconds: !input hue_delay + continue_on_timeout: true + + - conditions: + - condition: template + value_template: '{{ trigger.to_state.state == "toggle" }}' + - condition: template + value_template: '{{ last_trigger > 2 }}' + sequence: + - wait_for_trigger: + - platform: state + entity_id: !input knob + to: + - "toggle" + timeout: '2' + continue_on_timeout: true + - if: + - condition: template + value_template: '{{ wait.trigger == None }}' + then: + - if: + - condition: template + value_template: '{{ current_num < 0 }}' + then: + - service: media_player.media_play_pause + target: + entity_id: !input media_player + + - choose: [] + default: !input toggle_actions + else: + - service: input_number.increment + target: + entity_id: '{{ current }}' + - if: + - condition: template + value_template: '{{ states(current) | float > (lights | length) }}' + then: + - service: input_number.set_value + data: + value: 0 + target: + entity_id: '{{ current }}' + else: + - service: light.turn_on + target: + entity_id: '{{ lights[(states(current) | int) - 1] }}' + data: + brightness: 255 + - delay: + seconds: 1 + - service: light.turn_off + target: + entity_id: '{{ lights[(states(current) | int) - 1] }}' + - delay: + seconds: 1 + - service: light.turn_on + data: + kelvin: '{{ states("input_number." + name + "_temperature" + (((states(current) | int) - 1) | string)) }}' + brightness: '{{ states("input_number." + name + "_brightness" + (((states(current) | int) - 1) | string)) }}' +# hs_color: '{{ states("input_number." + name + "_hue" + (((states(current) | int) - 1) | string)) }}, 100' + target: + entity_id: '{{ lights[(states(current) | int) - 1] }}' |