ZHA - Ikea Symfonisk sound controller GEN2 (the square one) with dot-button support for new firmware

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

The new Symfonisk gen2 sound remote is pretty cool. Full media control with six extra controls using the two extra buttons with dots on them. I personally call them dot-buttons, so that is what I am talking about in the title. However, mine came with a firmware version that does not create an event in ZHA for these buttons. This was firmware version 0x00010012. As of 11th of April there is a newer firmware version available (0x01000035). For anyone interested, you can find the updates on this webpage: RELEASE NOTES.
I followed this excellent guide (ZHA OTA Firmware Update / Upgrade) by user victorigualada on how to update the firmware if you donā€™t know how.

Using the ZHA blueprint by James Crook (ZHA - Ikea Symfonisk sound controller GEN2 (the square one)) as the base and the naming convention from the Z2M blueprint (Z2M - IKEA Symfonisk Gen2 [E2123] Media Control), now I only had to figure out which events to listen to. After figuring out which events were called throught the event listerener, I just had to make sure I use the ones that make sense and avoid double triggering. So this is the resulting blueprint:

blueprint:
# Needs the updated firmware: version 0x01000035 (mine came with version 0x00010012)
# Added dot-button support by Atlantis_One
# Based on https://gist.github.com/cooljimy84/f1f2da3a6b214879b82bf06a68d89264 by James Crook
  name: ZHA - IKEA Symfonisk sound controller GEN2 for media and dot-buttons control
  description: 'Control media with an IKEA Symfonisk sound controller GEN2 (Square one).
    Full media control with the media buttons (play/pause, volume up/down and skip/previous track).
    Fully customisable dot-buttons, with options for single, double and long press for each one.'
  domain: automation
  input:
    remote:
      name: Remote
      description: IKEA Symfonisk controller GEN2 to use
      selector:
        device:
          integration: zha
          manufacturer: IKEA of Sweden
          model: SYMFONISK sound remote gen2
          multiple: false
    media_player:
      name: Media Player
      description: The media player to control
      selector:
        target:
          entity:
            domain: media_player
    single_dot_single_press:
      name: Single dot (Single press)
      description: Action to run on single dot press
      default: []
      selector:
        action: {}
    single_dot_double_press:
      name: Single dot (Double press)
      description: Action to run on single dot double press
      default: []
      selector:
        action: {}
    single_dot_long_press:
      name: Single dot (Long press)
      description: Action to run on single dot long press
      default: []
      selector: 
        action: {}
    double_dot_single_press:
      name: Double dot (Single press)
      description: Action to run on double dot press
      default: []
      selector:
        action: {}
    double_dot_double_press:
      name: Double dot (Double press)
      description: Action to run on double dot double press
      default: []
      selector:
        action: {}
    double_dot_long_press:
      name: Double dot (Long press)
      description: Action to run on double dot long press
      default: []
      selector:
        action: {}
  source_url: https://community.home-assistant.io/t/zha-ikea-symfonisk-sound-controller-gen2-the-square-one-with-dot-button-support-for-new-firmware/573802
mode: single
max_exceeded: silent
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 == ''toggle'' }}'
    - '{{ cluster_id == 6 }}'
    - '{{ endpoint_id == 1 }}'
    sequence:
    - service: media_player.media_play_pause
      target: !input media_player
  - conditions:
    - '{{ command == ''move_with_on_off'' }}'
    - '{{ cluster_id == 8 }}'
    - '{{ endpoint_id == 1 }}'
    - '{{ trigger.event.data.params.move_mode == 0}}'
    sequence:
    - service: media_player.volume_up
      target: !input media_player
    - delay: 0.1
  - conditions:
    - '{{ command == ''move_with_on_off'' }}'
    - '{{ cluster_id == 8 }}'
    - '{{ endpoint_id == 1 }}'
    - '{{ trigger.event.data.params.move_mode == 1 }}'
    sequence:
    - service: media_player.volume_down
      target: !input media_player
    - delay: 0.1
  - conditions:
    - '{{ command == ''step'' }}'
    - '{{ cluster_id == 8 }}'
    - '{{ endpoint_id == 1 }}'
    - '{{ trigger.event.data.params.step_mode == 0 }}'
    sequence:
    - service: media_player.media_next_track
      target: !input media_player
  - conditions:
    - '{{ command == ''step'' }}'
    - '{{ cluster_id == 8 }}'
    - '{{ endpoint_id == 1 }}'
    - '{{ trigger.event.data.params.step_mode == 1 }}'
    sequence:
    - service: media_player.media_previous_track
      target: !input media_player
  - conditions:
    - '{{ command == ''short_release'' }}'
    - '{{ endpoint_id == 2 }}'
    sequence: !input single_dot_single_press
  - conditions:
    - '{{ command == ''multi_press_complete'' }}'
    - '{{ endpoint_id == 2 }}'
    sequence: !input single_dot_double_press
  - conditions:
    - '{{ command == ''long_press'' }}'
    - '{{ endpoint_id == 2 }}'
    sequence: !input single_dot_long_press
  - conditions:
    - '{{ command == ''short_release'' }}'
    - '{{ endpoint_id == 3 }}'
    sequence: !input double_dot_single_press
  - conditions:
    - '{{ command == ''multi_press_complete'' }}'
    - '{{ endpoint_id == 3 }}'
    sequence: !input double_dot_double_press
  - conditions:
    - '{{ command == ''long_press'' }}'
    - '{{ endpoint_id == 3 }}'
    sequence: !input double_dot_long_press

This the first time creating a blueprint based on events myself, so while I did test it, I cannot guarantee it works perfectly. So please let me know if you have any problems or feedback.

Enjoy!

10 Likes

Thanks, totally forgot about this as I copyied in that zha files myself as it was working !

Good job.

Please forgive my noobiness, Iā€™m just getting started with HA and I donā€™t understand all the concepts.

I bought 2 TRADFRI GU10 color bulbs (345lm), and one symfonisk gen2 remote.

My goal is to control everything in the living room with that remote (lights, computer, AV receiver, TV).

Is it doable ?

Hereā€™s what I achieved so far :

  1. Pair the remote and the light bulbs to ZHA using a skyconnect usb key
  2. Update the remote to the latest FW version (took more than 1 hour !).
  3. Added @Atlantis_One blueprint and configured the dot buttons to switch the tradfri lights on/off
  4. Nothing happens when I press the buttons :frowning:

Is there a log where I can check whatā€™s going on ? Can I control several devices with a single remote ? (this blueprint seems to only allow pairing media buttons with a media playerā€¦is it so ?)

Hey Atlantis One, I have a question. So far I love your blueprint, but I was wondering if it could be expanded.

For the round controllers that I already had, I found the following blueprint:

https://gist.github.com/erkr/a437ebcb98a2b5ba2deebabd02f5ffae

Here you can adjust the increments in volume. For some speakers that I have linked the chrome cast audio to, the 10% increment is too much, the lowest setting is either too loud or you zero. So with this one I can devide it into 20 passes or even more if I would like to. This way the volume, especially the lower volume, can be regulated more precisely to a comfortable level.

Would it be possible to implement this as well in your blueprint?

Have a great day.

2 Likes

Hi Joelynn,

Did you manage to fix it?
If not, Home Assistant does have a Logbook (should be on the tabs on the left), but you can also go to the device itself (Settings ā†’ Devices & Services ā†’ Devices (Top row tabs) and click on the Symfonisk device you connected). It should have a device logbook on the right side. This way you can check if the button presses are being registered on Home Assistant. If not, the problem is on the connection between the device and HA, otherwise it is with the translation from event to action.

If you are still having this issue, can you let me know what you are seeing in the logbook when pressing the buttons?

As for the question if you can control everything with one remote, I designed it to have the media control buttons control a single media player and have full choice of what to do with the dot buttons. As for controlling multiple devices with one remote, it is possible but you would have to think of how it works. What should it do if the devices have different volumes? Change both, make them the same? And if they are not all media players, the actions have to be adjusted accordingly. This is hard to make into a blueprint that can be used easily by everyone. Iā€™m willing to look into it if you have a good idea on how to deal with those kind of situations.

Let me know if you still need help, Iā€™ll try to check in quicker this time!

Hi Ben,

I had the same idea myself when creating the blueprint, however I was not sure on how to implement it. You have to know the volume level in order to set it and I did not know how. As my devices go up and down with 5%, it worked for me and I left it like it is. However, I think the addition is great and with the example you linked I think I can include something similar. I will see if I can make some time coming week(end) to sit down and work on it. Iā€™ll be sure to let you know when I do!

1 Like

Hi

My dot buttons didnā€™t work either. I removed the device in ZHA and add the device again and now all buttons works as expected.

My dot buttons donā€™t work either with this blueprintā€¦ even after deleted/adding the symfonisk and restarting HAā€¦
They work however with manual configurationā€¦
@Atlantis_One Here is what I get in the logbook when I press the 1-dot button, once and twice:

IKEA of Sweden SYMFONISK sound remote gen2 Remote Button Short Press - Button 1 event was fired with parameters: {'shortcut_button': 1, 'shortcut_event': 1}
IKEA of Sweden SYMFONISK sound remote gen2 Remote Button Double Press - Button 1 event was fired with parameters: {'shortcut_button': 1, 'shortcut_event': 2}

I had the same issue, and updated the blueprint accordingly (@Atlantis_One: it should remain compatible with your remote/set-up):

blueprint:
  name: ZHA - IKEA Symfonisk sound controller GEN2 for media and dot-buttons control
  description:
    Control media with an IKEA Symfonisk sound controller GEN2 (Square
    one). Full media control with the media buttons (play/pause, volume up/down and
    skip/previous track). Fully customisable dot-buttons, with options for single,
    double and long press for each one.
  domain: automation
  input:
    remote:
      name: Remote
      description: IKEA Symfonisk controller GEN2 to use
      selector:
        device:
          integration: zha
          manufacturer: IKEA of Sweden
          model: SYMFONISK sound remote gen2
          multiple: false
    media_player:
      name: Media Player
      description: The media player to control
      selector:
        target:
          entity:
            - domain:
                - media_player
    single_dot_single_press:
      name: Single dot (Single press)
      description: Action to run on single dot press
      default: []
      selector:
        action: {}
    single_dot_double_press:
      name: Single dot (Double press)
      description: Action to run on single dot double press
      default: []
      selector:
        action: {}
    single_dot_long_press:
      name: Single dot (Long press)
      description: Action to run on single dot long press
      default: []
      selector:
        action: {}
    double_dot_single_press:
      name: Double dot (Single press)
      description: Action to run on double dot press
      default: []
      selector:
        action: {}
    double_dot_double_press:
      name: Double dot (Double press)
      description: Action to run on double dot double press
      default: []
      selector:
        action: {}
    double_dot_long_press:
      name: Double dot (Long press)
      description: Action to run on double dot long press
      default: []
      selector:
        action: {}
  source_url: https://community.home-assistant.io/t/zha-ikea-symfonisk-sound-controller-gen2-the-square-one-with-dot-button-support-for-new-firmware/573802
mode: single
max_exceeded: silent
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 == 'toggle' }}"
          - "{{ cluster_id == 6 }}"
          - "{{ endpoint_id == 1 }}"
        sequence:
          - service: media_player.media_play_pause
            target: !input media_player
      - conditions:
          - "{{ command == 'move_with_on_off' }}"
          - "{{ cluster_id == 8 }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.move_mode == 0}}"
        sequence:
          - service: media_player.volume_up
            target: !input media_player
          - delay: 0.1
      - conditions:
          - "{{ command == 'move_with_on_off' }}"
          - "{{ cluster_id == 8 }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.move_mode == 1 }}"
        sequence:
          - service: media_player.volume_down
            target: !input media_player
          - delay: 0.1
      - conditions:
          - "{{ command == 'step' }}"
          - "{{ cluster_id == 8 }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.step_mode == 0 }}"
        sequence:
          - service: media_player.media_next_track
            target: !input media_player
      - conditions:
          - "{{ command == 'step' }}"
          - "{{ cluster_id == 8 }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.step_mode == 1 }}"
        sequence:
          - service: media_player.media_previous_track
            target: !input media_player
      - conditions:
          - "{{ command == 'shortcut_v1_events' }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.shortcut_button == 1 }}"
          - "{{ trigger.event.data.params.shortcut_event == 1 }}"
        sequence: !input single_dot_single_press
      - conditions:
          - '{{ command == ''shortcut_event'' }}'
          - '{{ endpoint_id == 1 }}'
        sequence: !input single_dot_single_press
      - conditions:
          - "{{ command == 'shortcut_v1_events' }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.shortcut_button == 1 }}"
          - "{{ trigger.event.data.params.shortcut_event == 2 }}"
        sequence: !input single_dot_double_press
      - conditions:
          - '{{ command == ''multi_press_complete'' }}'
          - '{{ endpoint_id == 2 }}'
        sequence: !input single_dot_double_press
      - conditions:
          - "{{ command == 'shortcut_v1_events' }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.shortcut_button == 1 }}"
          - "{{ trigger.event.data.params.shortcut_event == 3 }}"
        sequence: !input single_dot_long_press
      - conditions:
          - "{{ command == 'long_press' }}"
          - "{{ endpoint_id == 2 }}"
        sequence: !input single_dot_long_press
      - conditions:
          - "{{ command == 'shortcut_v1_events' }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.shortcut_button == 2 }}"
          - "{{ trigger.event.data.params.shortcut_event == 1 }}"
        sequence: !input double_dot_single_press
      - conditions:
          - "{{ command == 'short_release' }}"
          - "{{ endpoint_id == 3 }}"
        sequence: !input double_dot_single_press
      - conditions:
          - "{{ command == 'shortcut_v1_events' }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.shortcut_button == 2 }}"
          - "{{ trigger.event.data.params.shortcut_event == 2 }}"
        sequence: !input double_dot_double_press
      - conditions:
          - "{{ command == 'multi_press_complete' }}"
          - "{{ endpoint_id == 3 }}"
        sequence: !input double_dot_double_press
      - conditions:
          - "{{ command == 'shortcut_v1_events' }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.shortcut_button == 2 }}"
          - "{{ trigger.event.data.params.shortcut_event == 3 }}"
        sequence: !input double_dot_long_press
      - conditions:
          - "{{ command == 'long_press' }}"
          - "{{ endpoint_id == 3 }}"
        sequence: !input double_dot_long_press
1 Like

@Vektor Thank you so much ! your blueprint works for me :slight_smile:

Thanks, my remote has the firmware versio ā€˜0x00010012ā€™ on it, but it creates events in ZHA now (maybe a ZHA update?). :slight_smile: Made multiple automations for the buttons, but now I can transfer them to this blueprint. Thatā€™s a lot cleaner!

Nevermind, after updating the firmware it broke, re-added the remote after the ota (0x01000035) and now everything works. Thanks, I hope youā€™ll be able to come up with a solution for the 5% volume steps. :slight_smile:

1 Like

I needed to make a small change to get the single dot single press to work for me. Maybe a bug - or maybe a zha change:

      - conditions:
          - '{{ command == ''short_release'' }}'
          - '{{ endpoint_id == 2 }}'
        sequence: !input single_dot_single_press

Complete version here in case it helps others:

blueprint:
  name: ZHA - IKEA Symfonisk sound controller GEN2 for media and dot-buttons control
  description:
    Control media with an IKEA Symfonisk sound controller GEN2 (Square
    one). Full media control with the media buttons (play/pause, volume up/down and
    skip/previous track). Fully customisable dot-buttons, with options for single,
    double and long press for each one.
  domain: automation
  input:
    remote:
      name: Remote
      description: IKEA Symfonisk controller GEN2 to use
      selector:
        device:
          integration: zha
          manufacturer: IKEA of Sweden
          model: SYMFONISK sound remote gen2
          multiple: false
    media_player:
      name: Media Player
      description: The media player to control
      selector:
        target:
          entity:
            - domain:
                - media_player
    single_dot_single_press:
      name: Single dot (Single press)
      description: Action to run on single dot press
      default: []
      selector:
        action: {}
    single_dot_double_press:
      name: Single dot (Double press)
      description: Action to run on single dot double press
      default: []
      selector:
        action: {}
    single_dot_long_press:
      name: Single dot (Long press)
      description: Action to run on single dot long press
      default: []
      selector:
        action: {}
    double_dot_single_press:
      name: Double dot (Single press)
      description: Action to run on double dot press
      default: []
      selector:
        action: {}
    double_dot_double_press:
      name: Double dot (Double press)
      description: Action to run on double dot double press
      default: []
      selector:
        action: {}
    double_dot_long_press:
      name: Double dot (Long press)
      description: Action to run on double dot long press
      default: []
      selector:
        action: {}
  source_url: https://community.home-assistant.io/t/zha-ikea-symfonisk-sound-controller-gen2-the-square-one-with-dot-button-support-for-new-firmware/573802
mode: single
max_exceeded: silent
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 == 'toggle' }}"
          - "{{ cluster_id == 6 }}"
          - "{{ endpoint_id == 1 }}"
        sequence:
          - service: media_player.media_play_pause
            target: !input media_player
      - conditions:
          - "{{ command == 'move_with_on_off' }}"
          - "{{ cluster_id == 8 }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.move_mode == 0}}"
        sequence:
          - service: media_player.volume_up
            target: !input media_player
          - delay: 0.1
      - conditions:
          - "{{ command == 'move_with_on_off' }}"
          - "{{ cluster_id == 8 }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.move_mode == 1 }}"
        sequence:
          - service: media_player.volume_down
            target: !input media_player
          - delay: 0.1
      - conditions:
          - "{{ command == 'step' }}"
          - "{{ cluster_id == 8 }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.step_mode == 0 }}"
        sequence:
          - service: media_player.media_next_track
            target: !input media_player
      - conditions:
          - "{{ command == 'step' }}"
          - "{{ cluster_id == 8 }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.step_mode == 1 }}"
        sequence:
          - service: media_player.media_previous_track
            target: !input media_player
      - conditions:
          - "{{ command == 'shortcut_v1_events' }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.shortcut_button == 1 }}"
          - "{{ trigger.event.data.params.shortcut_event == 1 }}"
        sequence: !input single_dot_single_press
      - conditions:
          - '{{ command == ''short_release'' }}'
          - '{{ endpoint_id == 2 }}'
        sequence: !input single_dot_single_press
      - conditions:
          - "{{ command == 'shortcut_v1_events' }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.shortcut_button == 1 }}"
          - "{{ trigger.event.data.params.shortcut_event == 2 }}"
        sequence: !input single_dot_double_press
      - conditions:
          - '{{ command == ''multi_press_complete'' }}'
          - '{{ endpoint_id == 2 }}'
        sequence: !input single_dot_double_press
      - conditions:
          - "{{ command == 'shortcut_v1_events' }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.shortcut_button == 1 }}"
          - "{{ trigger.event.data.params.shortcut_event == 3 }}"
        sequence: !input single_dot_long_press
      - conditions:
          - "{{ command == 'long_press' }}"
          - "{{ endpoint_id == 2 }}"
        sequence: !input single_dot_long_press
      - conditions:
          - "{{ command == 'shortcut_v1_events' }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.shortcut_button == 2 }}"
          - "{{ trigger.event.data.params.shortcut_event == 1 }}"
        sequence: !input double_dot_single_press
      - conditions:
          - "{{ command == 'short_release' }}"
          - "{{ endpoint_id == 3 }}"
        sequence: !input double_dot_single_press
      - conditions:
          - "{{ command == 'shortcut_v1_events' }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.shortcut_button == 2 }}"
          - "{{ trigger.event.data.params.shortcut_event == 2 }}"
        sequence: !input double_dot_double_press
      - conditions:
          - "{{ command == 'multi_press_complete' }}"
          - "{{ endpoint_id == 3 }}"
        sequence: !input double_dot_double_press
      - conditions:
          - "{{ command == 'shortcut_v1_events' }}"
          - "{{ endpoint_id == 1 }}"
          - "{{ trigger.event.data.params.shortcut_button == 2 }}"
          - "{{ trigger.event.data.params.shortcut_event == 3 }}"
        sequence: !input double_dot_long_press
      - conditions:
          - "{{ command == 'long_press' }}"
          - "{{ endpoint_id == 3 }}"
        sequence: !input double_dot_long_press
4 Likes

Iā€™m wondering if thereā€™s a way to add an action to one of the dots button that would change the media player. Like ā€œshort press one dotā€ = media player 1, ā€œshort press 2 dotsā€ = media player 2, etc

In the meantime My small contribution to improving this remote :slight_smile:

1 Like

If you have an Ikea Tradfri hub and the Ikea Home Smart app you can update the firmware by pairing the remote to the Tradfri hub, the update starts automatically. When youā€™re done you reset the remote and pair with your Zigbee controller.

1 Like

Just want to say thank you, this blueprint works like a charm. In addition to controlling a Roon media player, I turn the lights on/off and can control lights dimming (by using the long press actions). :slight_smile:

1 Like

Big thanks to @Atlantis_One for the base blueprint and @Pavoni for updating it to work properly (with mine at least) dots.

Iā€™ve got a question for the group tho - Iā€™m using the single dot, and double dot, to add/remove a second speaker from the group. When I add the second speaker, the volume control only controls the original speaker selected in the first line of the automation. Any ideas on a smooth way to control the group volume? On a semi-related thought, Iā€™d also like to have a script execute to bring the volumes in line with each other when joining the groups. But that can be phase 2 of my goals.

1 Like

The roon api only provides access to an individual volume control - so for a grouped zone you need to adjust each volume individually.

Youā€™d need to change the blueprint to do this. I have a little logic in one of my automations that depends on whether the zone is grouped - here is the code in case it helps you get started.

 - condition: template
   value_template: >-
      {{ not is_state_attr("media_player.shower", "group_members", []) }}
1 Like

Thank you - this was really useful and inspired me to create my own version which supports holding down the volume buttons and also configurable step amounts when single tapping the volume:

2 Likes