summaryrefslogtreecommitdiffstats
path: root/blueprints/automation/lights/knob-sound-multi-bulb-control.yaml
diff options
context:
space:
mode:
Diffstat (limited to 'blueprints/automation/lights/knob-sound-multi-bulb-control.yaml')
-rw-r--r--blueprints/automation/lights/knob-sound-multi-bulb-control.yaml338
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] }}'