Zigbee2MQTT - IKEA Symfonisk Gen2 [E2123] Media Control

Hi,

This is a new topic to continue on from the previous that I’ve lost access to edit. I will add updates as new posts here but be sure to check out my GitHub where this Blueprint is hosted.

IKEA Symfonisk Gen2 [E2123] Media Control

Home Assistant Blueprint

This is a blueprint to support controlling a media player with an Ikea Symfonisk Gen2 remote. It’s designed to work with the device added via Zigbee2MQTT (Z2M) only.

I wanted to allow for the use of more than one of these devices but also avoid the need to find and copy and paste topic strings from the entity MQTT settings. You can just select your device from the list :slight_smile:

Hope you find it useful.

NOTE: It’s best to select “Legacy = False” in the specific settings for your controllers in the Z2M config if you’re still using a version that supports this setting.

Blueprint

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

Manual Import URL

If the button above doesn’t work, you can copy the URL below and paste it into the “Import Blueprint” dialog in Home Assistant:
https://github.com/shawsky/HA-Blueprints/blob/e38fa5b8be0bdde6fd79f9a058539c00326159af/IKEA/Zigbee/ikea-symfonisk-gen2-E2123/ikea-symfonisk-gen2-media-control.yaml

Setup

Basic Configuration

Select your Symfonisk Gen2 device, adjust your MQTT base topic if required, and choose a media_player to control (or a media_player that will act as the main device in a scenario where other players are grouped with it).

Dynamic Volume Control (Group vs. Room)

You can choose to disable group volume control by using the Allow Group Volume Control option, it is enabled by default. If you want to use the option to dynamically switch between controlling the group volume and just the room volume, you must select an Input Helper (Boolean) to store the state. If you have multiple Symfonisk devices and use this Blueprint with multipe automations you will need an input helper per device.

By default volume control will revert to group when Play/Pause is pressed, if you want to prevent this behaviour, turn off the Reset to Group Volume Control when Play/Pause pressed setting.

Use the drop down to select which button on the Symfonisk to use to switch between Group and Room volume control. Note: If you’ve previously set an action on the button you select to switch between Group and Room volume control, it will no longer fire.

The Volume Control Toggle option can be used to fire an action when switching between Group and Room volume control. This is useful if you have dashboards, indicators or other physical items you use to indicate state from your Home Assistant setup.

Volume Ducking

You can enable and configure volume ducking, which briefly lowers the volume to provide audio feedback when you successfully toggle between group and room volume control. The slider allows you to choose how long the volume is ducked for.

Custom Actions & Buttons

Configure the custom actions such as what happens when Play/Pause is pressed but no media is playing or queued and set up the actions for your “dot” buttons as needed.

Note
If you’re not sure how to create an Input Helper: In Home Assistant, navigate to Settings > Devices & Services > Helpers. Click the + Create Helper button in the bottom right, select Toggle, give it a recognisable name (e.g., “Living Room Volume Mode”), and click Create. Finally, select this new helper in the blueprint config.


Usage

  • :arrow_forward: - Toggle Play / Pause
  • :previous_track_button: - Previous Track
  • :next_track_button: - Next Track
  • :arrow_up_small: - Volume Up. Supports single press and hold
  • :arrow_down_small: - Volume Down. Supports single press and hold
  • Single Dot - Supports single, double and long press to fire one or more actions
  • Double Dot - Supports single, double and long press to fire one or more actions

Previous Updates

2025-12-30 v2.00: Add group/room volume control and switching with volume ducking, action running when switching from group/room volume control. Action on Play/Pause when no media playing/queued.

2024-04-16 v1.55: Add additional filtering to remove the false positives of the automations triggering for MQTT topics or where you run multiple Ikea E2123 devices. This should help clean up log book entries etc. Thanks kenno.

2024-04-10 v1.54: Update device selector to account for the Ikea refactoring which will change the model name slightly. Both versions supported. Add support for the legacy action on the play/pause button.

2023-09-06 v1.52/v1.53: Update to allow 100 volume steps. / Fix copy paste fail on volume down hold for non grouped players.

2023-09-06 v1.51: Fix to stop non grouped players with empty group_members attribute triggering the grouped volume actions.

2023-09-05 v1.5: Resolve an issue with non grouped players presenting empty arrays rather than “none” in the group members attribute. Also apply these and previous fixes to volume hold.

2023-08-15 v1.4: Resolve an issue with volume not working on media player integrations that do not populate the group members attribute for single devices/group in a different way to the Sonos integration

2023-06-26 v1.3: Resolve an issue where multiple devices are attached to a system and all automations are triggered by any device.

2023-05-08 v1.2: Added support for volume control of all Sonos players joined to/grouped with the media player specified in the automation. The volume is adjusted on a per player basis so any differential set in the Sonos app is maintained. Note: To continue control the main media player specified in the automation must always remain in the Sonos group.

2023-04-16 v1.1: Tweak descriptive text for volume steps and set the default to match the scale of the Sonos app.

2023-05-08 v1.2: Added support for volume control of all Sonos players joined to/grouped with the media player specified in the automation. The volume is adjusted on a per player basis so any differential set in the Sonos app is maintained. Note: To continue control the main media player specified in the automation must always remain in the Sonos group.

2023-04-16 v1.1: Tweak descriptive text for volume steps and set the default to match the scale of the Sonos app.

3 Likes

You won’t be able to edit this one either… You are at the Basic level on this platform.
You need to be a trust level ‘member’ to re-edit a post. Understanding Discourse Trust Levels

Of course, I know that but it resets the topic with no version number reference and a direct link to my GitHub. Not sure why the assumption is being made that I don’t know why and what I’ve chosen to do? :joy::man_shrugging:

I can add posts with new release and updates, that’s all that matters.

Hi Shawsky,

I want to flag a side-effect of the MQTT trigger pattern that I tracked down today and that I don’t think has been raised before. Both v1.55a and v2.00 use:

yaml

trigger:
  - platform: mqtt
    topic: "{{ base_topic }}/+/action"

The wildcard means HA opens an MQTT subscription matching every Z2M device’s action topic. The blueprint correctly filters by topic in its condition, so the automation itself only acts on its assigned remote — that part works fine.

The problem is for other automations on the system that use MQTT device triggers (the Z2M-recommended pattern for buttons/remotes). Those create their own specific subscription like zigbee2mqtt/Laundry Switch/action. Once both subscriptions exist on the same HA client, the Mosquitto broker delivers each matching message twice — once per matching subscription — per MQTT spec. Mosquitto’s allow_duplicate_messages defaults to true and won’t deduplicate. The result: every button-press automation across all unrelated Zigbee devices fires twice the moment any instance of this blueprint is installed.

Reference for the underlying broker behavior, recently described in another HA community thread: Home Assistant creates double mqtt subscriptions by wildcard and triggers automations twice.

A possible fix using trigger_variables (HA 2024.10+) would be to subscribe to the device-specific topic directly:

yaml

trigger_variables:
  base_topic: !input base_topic
  controller: !input remote
  device_name: "{{ device_attr(controller, 'name') }}"

trigger:
  - platform: mqtt
    topic: "{{ base_topic }}/{{ device_name }}/action"

That eliminates the overlap and removes the need for the topic-filtering condition.

Workarounds for users hitting this in the meantime:

  1. Set allow_duplicate_messages false in the Mosquitto broker config (broker-level fix), or
  2. Disable any automation using this blueprint until the trigger pattern changes.

Happy to test a revised version if helpful.

1 Like

Thankyou, that’s very helpful. In all honesty I thought I’d fixed it but I guess that was another side effect.

I’ll take a look and update :slight_smile:

Edit: Yes I have previously fixed a variant of this but the top level trigger is still a problem.

1 Like

I’ve spent some time on this today and nothing works :frowning: the trigger_variables aren’t able to run functions like device_attr to get the name needed to match the MQTT topic. They use limited templates so a no go.

I’ve (I think) exhausted all of the possibilities that don’t remove nice usability or force manual configuration.

What I think might be viable is the Zigbee2MQTT 2.0 feature supporting Home Assistant Events - it creates an Action entity. It’s still experimental and needs to be manually enabled but I’ll investigate if this is doable as it should make the triggering much cleaner

Basic level users have limited editing permissions.
This was done because of spammers.

I gave you a link that shows what you need to do to up your discourse level. Read a bunch of stuff, post a few times, like some posts, that kind of thing.

Some of the things are time based and will expire and bump you back to basic.

Basically one of the favorite attacks were to post something generic and a day later edit it to the porn or crypto or whatever. This permission change annoys the heck out of real people, but stops that.

Honestly I’m not sure why you keep repeating the same things? I’m over it, moved on and concentrating on making my Blueprint better and adding some new ones soon.

Though to address your point more directly. I was shared a list of requirements and my profile says I’ve met them yet I’ve still not had the extra permissions enabled. When I raised this with a mod it was dismissed in a patronising manner.

Not very community orientated but like I say, I’m working on the provision to the community aspect. The rest is irrelevant.

1 Like

It’s one of my faults I guess. Attempting to help people and explain problems.
I can fix that.

I thanked you for your earlier help and I appreciate it.

Repeating the same thing every time I post though is getting tiring. No need to throw your rattle out…

Alright back on track...

@atus I have well and truly run out of options based on your helpful suggestion and a bunch of other ideas I've had. Due to limitations on inputs or more importantly, the limited templates affecting trigger variables. The duplicate message issue doesn't look like it's going to go away and if it does, there's still an issue right now affecting multiple users.

However, the direction of HA is moving towards event entities so I've migrated over to use this. It does mean I can't filter on the device as well as before, entities can't be filtered by device they are attached to in an input. It does decouple the device from the event though which is probably a good thing longer term. It is still classed as experimental in Z2M but I'll track progress and update as required.

To use events you need to go to Zigbee2MQTT settings, choose Home Assistant Integration and enable the setting below and restart Z2M. It will then add an event entity called "Action":

Here's a direct link to the v3.00 yaml for testing, I can't see any difference in behaviour from a quick test on my setup but if you wouldn't mind having a look that would be appreciated.

If this works out I'll add it as a formal option in the docs until such a time as events become "final" :slight_smile: