Forked from dbuezas/zha_moes_smart_knob_lights.yaml
Last active
December 30, 2024 18:26
-
-
Save gymnae/7d4a2fa04b31a8d96ff32ef70268cf77 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
blueprint: | |
name: ZHA - Smart Knob for lights | |
source_url: https://gist.github.com/dbuezas/832d15a762488f2754c59bc9ca9632da | |
description: "Control lights with a Moes Smart Knob. | |
Rotating left/right will change the brightness smoothly of the selected light | |
and making use of step_size. | |
Press-Rotating left/right will change the color temperature (or hue). | |
Long press switches between color temperature and rgb modes. | |
Tripple click switches to the second mode where double click is available. | |
All functionality of the second mode just writes logs, adapt as necessary." | |
domain: automation | |
input: | |
remote: | |
name: Remote | |
description: Moes Knob to use | |
selector: | |
device: | |
integration: mqtt | |
multiple: false | |
light: | |
name: Light(s) | |
description: The light(s) to control | |
selector: | |
target: | |
entity: | |
- domain: | |
- light | |
mode: queued | |
max_exceeded: silent | |
trigger: | |
- platform: event | |
event_type: zha_event | |
event_data: | |
device_id: !input remote | |
action: | |
- variables: | |
entity: !input light | |
command: "{{ trigger.event.data.command }}" | |
step_mode: "{{ trigger.event.data.params.step_mode | default('') | string}}" | |
rotate_type: "{{ trigger.event.data.params.rotate_type | default('')}}" | |
press_type: "{{ trigger.event.data.params.press_type | default('')}}" | |
step_dir: "{{ 1 if step_mode == 'StepMode.Up' or rotate_type == 1 else -1}}" | |
step_size: "{{ trigger.event.data.params.step_size | default('')}}" | |
args_value: "{{ trigger.event.data.args.value | default('')}}" | |
- choose: | |
#----------------------- Toggle ----------------------------- | |
- conditions: | |
- "{{ command == 'toggle' }}" | |
sequence: | |
- service: light.toggle | |
target: !input light | |
data: | |
transition: 0.25 | |
#----------------------- Brightness ----------------------------- | |
- conditions: | |
- "{{ command == 'step' }}" | |
sequence: | |
- service: light.turn_on | |
target: !input light | |
data: | |
brightness_step_pct: "{{ step_size/4 * step_dir}}" | |
transition: 0.25 | |
#----------------------- Temperature ----------------------------- | |
- conditions: | |
- "{{ command == 'step_color_temp' }}" | |
- "{{ state_attr(entity.entity_id, 'color_mode') == 'color_temp'}}" | |
sequence: | |
- service: light.turn_on | |
target: !input light | |
data: | |
color_temp: "{{ state_attr(entity.entity_id, 'color_temp')|int - step_size * step_dir}}" | |
transition: 0.25 | |
#----------------------- RGB ----------------------------- | |
- conditions: | |
- "{{ command == 'step_color_temp' }}" | |
- "{{ state_attr(entity.entity_id, 'color_mode') == 'rgb'}}" | |
sequence: | |
- service: light.turn_on | |
target: !input light | |
data: | |
hs_color: | |
- "{{ (state_attr( entity.entity_id, 'hs_color')[0]|int + step_size/2*step_dir)%360}}" | |
- 100 | |
transition: 0.25 | |
#----------------------- to Temperature ----------------------------- | |
- conditions: | |
- "{{ command == 'move_saturation' }}" | |
- "{{ state_attr(entity.entity_id, 'color_mode') == 'rgb'}}" | |
sequence: | |
- service: light.turn_on | |
target: !input light | |
data: | |
color_temp: 300 | |
transition: 0.25 | |
#----------------------- to RGB ----------------------------- | |
- conditions: | |
- "{{ command == 'move_saturation' }}" | |
- "{{ state_attr(entity.entity_id, 'color_mode') == 'color_temp'}}" | |
sequence: | |
- service: light.turn_on | |
target: !input light | |
data: | |
hs_color: | |
- 0 | |
- 100 | |
#----------------------- mode 0 enter ----------------------------- | |
- conditions: | |
- "{{ command == 'attribute_updated' }}" | |
- "{{ args_value == 0 }}" | |
sequence: | |
- service: system_log.write | |
data: | |
message: "entered mode 0" | |
#----------------------- mode 1 enter ----------------------------- | |
- conditions: | |
- "{{ command == 'attribute_updated' }}" | |
- "{{ args_value == 0 }}" | |
sequence: | |
- service: system_log.write | |
data: | |
message: "entered mode 0" | |
#----------------------- mode 2 rotate ----------------------------- | |
- conditions: | |
- "{{ command == 'rotate_type' }}" | |
sequence: | |
- service: system_log.write | |
data: | |
message: "mode 1 rotate {{step_dir}}" | |
#----------------------- mode 2 click ----------------------------- | |
- conditions: | |
- "{{ command == 'press_type' }}" | |
- "{{ press_type == 0 }}" | |
sequence: | |
- service: system_log.write | |
data: | |
message: "mode 1 click " | |
#----------------------- mode 2 dblclick ----------------------------- | |
- conditions: | |
- "{{ command == 'press_type' }}" | |
- "{{ press_type == 1 }}" | |
sequence: | |
- service: system_log.write | |
data: | |
message: "mode 1 dblclick " | |
#----------------------- mode 2 long ----------------------------- | |
- conditions: | |
- "{{ command == 'press_type' }}" | |
- "{{ press_type == 2 }}" | |
sequence: | |
- service: system_log.write | |
data: | |
message: "mode 1 long click " | |
#----------------------- mode 1 Long Press ----------------------------- | |
- conditions: | |
- "{{ command == 'move_hue' }}" | |
sequence: | |
- repeat: | |
sequence: | |
- service: system_log.write | |
data: | |
message: "mode 0 pressed" | |
- wait_for_trigger: | |
platform: event | |
event_type: zha_event | |
event_data: | |
device_id: !input remote | |
timeout: | |
milliseconds: 500 | |
until: "{{ wait.trigger is not none or repeat.index >= 10 }}" | |
# ----------------------- mode 1 Long release ----------------------------- | |
- conditions: | |
- "{{ command == 'stop_move_step' }}" | |
sequence: | |
- service: system_log.write | |
data: | |
message: "mode 0 released" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment