ZHA - IKEA four button remote (Styrbar) for lights (E2001, E2002)

Hey there, this blueprint is for basic light control with the IKEA four button remote (the square ones), integrated via ZHA.

It extends @SwerveShot’s version (incomplete and hasn’t seen any recent activity) which is based on the work of @frenck with the five button version.

Pressing the up button will turn on the lights at the last set brightness (unless the force brightness is toggled on in the blueprint).

Pressing the down button will turn the lights off again.

Pressing and holding the up/down buttons will change the brightness smoothly and can be pressed and hold until the brightness is satisfactory.

The “left” and “right” buttons can be assigned to a short and long button press action. This allows you to assign, e.g., a scene or anything else. Use the left and right button events with care, as before the long press event is sent, the “on” event gets triggered.

Updates

2022-05-13: Reworked the blueprint to make the hold actions work again. Also added a slider to specify the time between the execution of brighter/darker actions.

This is what the Blueprint looks like from the UI:

Blueprint Code

Click the badge to import this Blueprint: (needs Home Assistant Core 2021.3 or higher)

Open your Home Assistant instance and show the blueprint import dialog with a specific blueprint pre-filled.

Or import this Blueprint by using the forum topic URL:

blueprint:
  name: ZHA - IKEA four button remote for lights
  description:
    'Control lights with an IKEA four button remote (the square ones),
    for use with [ZHA](https://www.home-assistant.io/integrations/zha/).


    Extends [SwerveShot](https://community.home-assistant.io/u/SwerveShot)''s [version](https://community.home-assistant.io/t/zha-ikea-four-button-remote-for-lights/347657)
    which is based on the work of [frenck](https://community.home-assistant.io/u/frenck)
    with the five button version.


    Pressing the up button will turn on the lights at the last set brightness (unless
    the force brightness is toggled on in the blueprint).


    Pressing the down button will turn the lights off again.


    Pressing and holding the up/down buttons will change the brightness smoothly and
    can be pressed and hold until the brightness is satisfactory.


    The "left" and "right" buttons can be assigned to a short and long button press
    action. This allows you to assign, e.g., a scene or anything else. Use the left
    and right button events with care, as before the long press event is sent, the
    "on" event gets triggered.

    '
  domain: automation
  input:
    remote:
      name: Remote
      description: IKEA remote to use
      selector:
        device:
          integration: zha
          manufacturer: IKEA of Sweden
          model: Remote Control N2
    light:
      name: Light(s)
      description: The light(s) to control
      selector:
        target:
          entity:
            domain: light
    force_brightness:
      name: Force turn on brightness
      description:
        Force the brightness to the set level below, when the "on" button
        on the remote is pushed and lights turn on.
      default: false
      selector:
        boolean: null
    brightness:
      name: Brightness
      description: Brightness of the light(s) when turning on
      default: 50
      selector:
        number:
          min: 0.0
          max: 100.0
          mode: slider
          step: 1.0
          unit_of_measurement: "%"
    hold_time:
      name: Hold Time
      description: Time between the execution of the brighter/darker actions when holding the brighter/darker button.
      default: 0.5
      selector:
        number:
          min: 0.1
          max: 2
          step: 0.1
          unit_of_measurement: seconds
    button_left_short:
      name: Left button - short press
      description: Action to run on short left button press
      default: []
      selector:
        action: null
    button_left_long:
      name: Left button - long press
      description:
        Action to run on long left button press. Use with care, as before
        the long press event is sent, the "on" event gets triggered.
      default: []
      selector:
        action: null
    button_right_short:
      name: Right button - short press
      description: Action to run on short right button press
      default: []
      selector:
        action: null
    button_right_long:
      name: Right button - long press
      description:
        Action to run on long right button press. Use with care, as before
        the long press event is sent, the "on" event gets triggered.
      default: []
      selector:
        action: null
  source_url: https://community.home-assistant.io/t/zha-ikea-four-button-remote-styrbar-for-lights-e2001-e2002/384482
mode: restart
max_exceeded: silent
variables:
  force_brightness: !input "force_brightness"
trigger:
  - platform: event
    event_type: zha_event
    event_data:
      device_id: !input "remote"
action:
  - variables:
      command: "{{ trigger.event.data.command }}"
      cluster_id: "{{ trigger.event.data.cluster_id }}"
      endpoint_id: "{{ trigger.event.data.endpoint_id }}"
      args: "{{ trigger.event.data.args }}"
  - choose:
      - conditions:
          - "{{ command == 'on' }}"
          - "{{ cluster_id == 6 }}"
          - "{{ endpoint_id == 1 }}"
        sequence:
          - choose:
              - conditions: "{{ force_brightness }}"
                sequence:
                  - service: light.turn_on
                    target: !input "light"
                    data:
                      transition: 1
                      brightness_pct: !input "brightness"
            default:
              - service: light.turn_on
                target: !input "light"
                data:
                  transition: 1
      - conditions:
          - "{{ command == 'off' }}"
          - "{{ cluster_id == 6 }}"
          - "{{ endpoint_id == 1 }}"
        sequence:
          - service: light.turn_off
            target: !input "light"
            data:
              transition: 1
      - conditions:
          - "{{ command == 'move_with_on_off' }}"
          - "{{ cluster_id == 8 }}"
          - "{{ endpoint_id == 1 }}"
        sequence:
          - repeat:
              count: 10
              sequence:
                - service: light.turn_on
                  target: !input "light"
                  data:
                    brightness_step_pct: 10
                    transition: 1
                - delay: !input "hold_time"
      - conditions:
          - "{{ command == 'move' }}"
          - "{{ cluster_id == 8 }}"
          - "{{ endpoint_id == 1 }}"
        sequence:
          - repeat:
              count: 10
              sequence:
                - service: light.turn_on
                  target: !input "light"
                  data:
                    brightness_step_pct: -10
                    transition: 1
                - delay: !input "hold_time"
      - conditions:
          - "{{ command == 'press' }}"
          - "{{ cluster_id == 5 }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ args == [257, 13, 0] }}"
        sequence: !input "button_left_short"
      - conditions:
          - "{{ command == 'hold' }}"
          - "{{ cluster_id == 5 }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ args == [3329, 0] }}"
        sequence: !input "button_left_long"
      - conditions:
          - "{{ command == 'press' }}"
          - "{{ cluster_id == 5 }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ args == [256, 13, 0] }}"
        sequence: !input "button_right_short"
      - conditions:
          - "{{ command == 'hold' }}"
          - "{{ cluster_id == 5 }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ args == [3328, 0] }}"
        sequence: !input "button_right_long"
4 Likes

Sweet! Nice job adding the brightness adjustment. I’ll import this blueprint asap.

Great work, thank you two for the coding.

I needed a version turning on and off switches as well, so I added a small fork:

1 Like

Does this blueprint still work? I can turn the light on and off with it, but holding them does not raise/lower the brightness.

1 Like

Same problem here

Yes you are absolutely right. For me it isn’t working either. I hope that in the next couple of days I’ll find the time to debug what change in HA made this blueprint not work properly anymore in that regard.
If anyone has any idea what it could be, help is always welcome :slight_smile:

4 Likes

I reworked the blueprints code. The hold actions should now work again. I even added a new slider which lets you pick the time in between brighter/darker actions are executed. Hope that this update fixes the issues that were present.

4 Likes

Seems like the long press actions are broken again. any ideas?

Update: Its working my bad

Is it possible to turn on the light on lowest brightness by pressing the “off” button?
So “on” would be: brightest setting (or force brightness), and “off” would be: turn on with lowest setting.

Yes, that would work for sure but not with my blueprint. I suggest you “fork” my code and make the changes necessary.

      - conditions:
          - "{{ command == 'off' }}"
          - "{{ cluster_id == 6 }}"
          - "{{ endpoint_id == 1 }}"
        sequence:
          - service: light.turn_on
            target: !input "light"
            data:
              transition: 1
              brightness_pct: 1

Above would be the condition that needs to be changed and I’d probably suggest that you make the percentage value an input variable so that you can adjust it via the UI because some lights won’t even turn on when they are set to 1 % brightness.

Hope that this helps :rocket:

I watched the button events in the developer tools. Seems as if this remote doesn’t support double click. So I would have to rewrite the parts for single click to only trigger if no second click appears.
For doubleclicks I’d have to do manual timing to catch the second click. Something like this:

only when the light is on and the second click is less than 0,2s old.

      - conditions:
          - "{{ command == 'off' }}"
          - "{{ cluster_id == 6 }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ is_state(!input 'light', 'on')}}"
          - "{{ utcnow() - states.light.{!input 'light'}.last_changed < timedelta(seconds=0.2)  }}"

but I don’t think this would compile :wink:
Is there a way to test these kind of templates? And how can I get one into HA without an URL?

working great for me thanks - would love to use the left and right buttons to cycle through some preset colours but no idea how ? is it doable