From f5c2b9d6e147d45c2407a2808aa0a6a59a134d75 Mon Sep 17 00:00:00 2001 From: Damien Date: Fri, 20 Dec 2024 14:34:04 +0100 Subject: [PATCH] feat: smoothen transition when dimming light (#9) * feat: add transition when dimming light * chore: add sections to simplify the blueprint * chore: hardcode source_url * feat: rework dimming down mechanism * chore: add CODEOWNERS --- .github/CODEOWNERS | 1 + ..._E2201-E2213_ZHA-Z2M_control-anything.yaml | 135 ++++++++++-------- ikea_E2201-E2213_ZHA-Z2M_control-light.yaml | 68 +++++---- 3 files changed, 113 insertions(+), 91 deletions(-) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..2f61c46 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +@damru \ No newline at end of file diff --git a/ikea_E2201-E2213_ZHA-Z2M_control-anything.yaml b/ikea_E2201-E2213_ZHA-Z2M_control-anything.yaml index 874dad1..83e827e 100644 --- a/ikea_E2201-E2213_ZHA-Z2M_control-anything.yaml +++ b/ikea_E2201-E2213_ZHA-Z2M_control-anything.yaml @@ -20,7 +20,8 @@ blueprint: - Double press **on/off** (Rodret, _Optional_) **1 dot/2 dots** (Somrig) - Hold **on/off** (Rodret) **1 dot/2 dots** (Somrig). - Actions will be executed every **Helper - Hold delay**, but maximum **Helper - Max number of loops** times. + Actions will be executed every **Hold delay**, but maximum **Max number of loops** times. + source_url: https://github.com/damru/ha-blueprints/blob/main/ikea_E2201-E2213_ZHA-Z2M_control-anything.yaml input: remote_device: name: Remote @@ -44,97 +45,109 @@ blueprint: model: SOMRIG shortcut button (E2213) multiple: false on_press_action: - name: Single press action (on / 1 dot) + name: Press "on / 1 dot" action description: Choose action(s) to run when **on** (Rodret) or **1 dot** (Somrig) button is **pressed**. default: [] selector: action: {} off_press_action: - name: Single press action (off / 2 dots) + name: Press "off / 2 dots" action description: Choose action(s) to run when **off** (Rodret) or **2 dots** (Somrig) button is **pressed**. default: [] selector: action: {} on_hold_action: - name: Hold action (on / 1 dot) + name: Hold "on / 1 dot" action description: Choose action(s) to run when **on** (Rodret) or **1 dot** (Somrig) button is **held**. default: [] selector: action: {} off_hold_action: - name: Hold action (off / 2 dots) + name: Hold "off / 2 dots" action description: Choose action(s) to run when **off** (Rodret) or **2 dots** (Somrig) button is **held**. default: [] selector: action: {} on_double_press_action: - name: Double press action (on / 1 dot) + name: Double press "on / 1 dot" action description: > Choose action(s) to run when the **on** (Rodret) or **1 dot** (Somrig) button is **pressed twice**. - (**_NB for Rodret only_**: **Double press event (on)** must be exposed and **Helper - Double press delay** interval is used as a timeout.) + + **_NB for Rodret only_**: **Double press event (on)** must be exposed and **Double press delay** interval is used as a timeout. default: [] selector: action: {} off_double_press_action: - name: Double press action (off / 2 dots) + name: Double press "off / 2 dots" action description: > Choose action(s) to run when the **off** (Rodret) or **2 dots** (Rodret) button is **pressed twice**. - (**_NB for Rodret only_**: **Double press event (off)** must be exposed and **Helper - Double press delay** interval is used as a timeout.) + + **_NB for Rodret only_**: **Double press event (off)** must be exposed and **Double press delay** interval is used as a timeout. default: [] selector: action: {} - helper_hold_delay: - name: Helper - Hold delay - description: Delay between the execution of the **Hold** action(s). - default: 250 - selector: - number: - unit_of_measurement: milliseconds - min: 100.0 - max: 5000.0 - step: 10.0 - mode: slider - helper_max_loops: - name: Helper - Max number of loops - description: Maximum number of loops when holding down a button. - default: 20 - selector: - number: - min: 1.0 - max: 1000.0 - step: 1.0 - mode: slider - on_double_press_exposed: - name: (Rodret only) Double press event (on) - description: > - **_(Rodret only)_** Choose whether or not to expose the virtual **double press** event for the **on** button. - Turn this on if you are providing action(s) for the **Double press action (on / 1 dot)**. - default: false - selector: - boolean: {} - off_double_press_exposed: - name: (Rodret only) Double press event (off) - description: > - **_(Rodret only)_** Choose whether or not to expose the virtual **double press** event for the **off** button. - Turn this on if you are providing an action for the **Double press action (off / 2 dots)**. - default: false - selector: - boolean: {} - helper_double_press_delay: - name: (Rodret only) Helper - Double press delay - description: > - **(Rodret only)** Max delay between the first and the second button press for the - **Double press events**. Provide a value only if you are using a double press action. - Increase this value if you notice that the double press action is not triggered - properly. - default: 250 - selector: - number: - unit_of_measurement: milliseconds - min: 100.0 - max: 5000.0 - step: 10.0 - mode: slider + helper_section : + name: Helpers + icon: mdi:cog-outline + collapsed: true + input: + helper_hold_delay: + name: Hold delay + description: Delay between the execution of the **Hold** action(s). + default: 250 + selector: + number: + unit_of_measurement: milliseconds + min: 100.0 + max: 5000.0 + step: 10.0 + mode: slider + helper_max_loops: + name: Max number of loops + description: Maximum number of loops when holding down a button. + default: 20 + selector: + number: + min: 1.0 + max: 1000.0 + step: 1.0 + mode: slider + rodret_options_section: + name: Rodret options + icon: mdi:remote + collapsed: true + input: + on_double_press_exposed: + name: Expose virtual double press "on" event + description: > + Choose whether or not to expose the virtual **double press** event for the **on** button. + Turn this on if you are providing action(s) for the **Double press action (on / 1 dot)**. + default: false + selector: + boolean: {} + off_double_press_exposed: + name: Expose virtual double press "off" event + description: > + Choose whether or not to expose the virtual **double press** event for the **off** button. + Turn this on if you are providing an action for the **Double press action (off / 2 dots)**. + default: false + selector: + boolean: {} + helper_double_press_delay: + name: Double press delay + description: > + Max delay between the first and the second button press for the + **Double press events**. Provide a value only if you are using a double press action. + Increase this value if you notice that the double press action is not triggered + properly. + default: 250 + selector: + number: + unit_of_measurement: milliseconds + min: 100.0 + max: 5000.0 + step: 10.0 + mode: slider mode: single max_exceeded: silent triggers: diff --git a/ikea_E2201-E2213_ZHA-Z2M_control-light.yaml b/ikea_E2201-E2213_ZHA-Z2M_control-light.yaml index 08f79a3..5a40a4d 100644 --- a/ikea_E2201-E2213_ZHA-Z2M_control-light.yaml +++ b/ikea_E2201-E2213_ZHA-Z2M_control-light.yaml @@ -16,13 +16,14 @@ blueprint: Available controls: - Press **on** (Rodret) or **1 dot** (Somrig) to turn on the light - (Optional: set the target brightness by enabling **Helper - Force Brightness** and setting a **Helper - Brightness** value) + (Optional: set the target brightness by enabling **Force Brightness** and setting a **Brightness** value) - Press **off** (Rodret) or **2 dots** (Somrig) to turn off the light - Hold **on** (Rodret) or **1 dot** button to increase the brightness - Hold **off** (Rodret) or **2 dots** button to decrease the brightness down to 1% + source_url: https://github.com/damru/ha-blueprints/blob/main/ikea_E2201-E2213_ZHA-Z2M_control-light.yaml input: remote_device: name: Remote @@ -53,25 +54,30 @@ blueprint: filter: domain: light multiple: false - helper_force_brightness: - name: Helper - Force brightness - description: Force the brightness to **Helper - Brightness** value when light turns on. - default: false - selector: - boolean: {} - helper_brightness: - name: Helper - Brightness - description: - Target light brightness when turning on. Requires **Helper - Force brightness** - to be enabled. - default: 50 - selector: - number: - unit_of_measurement: "%" - min: 1.0 - max: 100.0 - step: 1.0 - mode: slider + brightness_section: + name: Brightness + icon: mdi:lightbulb-on-50 + collapsed: true + input: + helper_force_brightness: + name: Force brightness + description: Force the brightness to **Brightness** value when light turns on. + default: false + selector: + boolean: {} + helper_brightness: + name: Brightness + description: + Target light brightness when turning on. Requires **Force brightness** + to be enabled. + default: 50 + selector: + number: + unit_of_measurement: "%" + min: 1.0 + max: 100.0 + step: 1.0 + mode: slider mode: restart max_exceeded: silent triggers: @@ -258,7 +264,7 @@ actions: - variables: helper_force_brightness: !input helper_force_brightness helper_hold_delay: 0.1 - helper_hold_dim_step: 5 + helper_hold_dim_step: 4 light: !input light - choose: - conditions: @@ -317,6 +323,7 @@ actions: entity_id: !input light data: brightness_step_pct: "{{ helper_hold_dim_step }}" + transition: "{{ helper_hold_delay }}" - delay: "{{ helper_hold_delay }}" - conditions: - condition: trigger @@ -326,22 +333,23 @@ actions: - hold-dots2-zha-e2213 - hold-dots2-z2m-e2213 sequence: + - variables: + brightness_pct: "{{ iif(is_state(light, 'on'), state_attr(light, 'brightness'), 0) * 100 / 255 }}" + total_iterations_to_zero: "{{ (brightness_pct / helper_hold_dim_step) | round(0, 'ceil') }}" - repeat: - while: - - condition: template - value_template: - "{{ state_attr(light, 'brightness') | int / 255 > helper_hold_dim_step/100 - }}" + count: "{{ total_iterations_to_zero - 1 }}" sequence: - parallel: - action: light.turn_on - data: - brightness_step_pct: "{{ helper_hold_dim_step | int * -1 }}" target: entity_id: !input light + data: + brightness_step_pct: "{{ helper_hold_dim_step | int * -1 }}" + transition: "{{ helper_hold_delay }}" - delay: "{{ helper_hold_delay }}" - action: light.turn_on - data: - brightness_pct: 1 target: entity_id: !input light + data: + brightness_pct: 1 + transition: "{{ helper_hold_delay }}"