Z2M - IKEA Symfonisk Gen2 [E2123] Media Control v1.55

Hey there,

Thanks for this awesome blueprint !
I just want to know if it is possible to customize next/previous actions?
My Yamaha amplifier not handle the next/previous commands on the zone 2 when it is synchronized with the main zone sound.

Thanks a lot

Glad you like it :smiley:

The next/previous commands just call the standard media player integration for next track and previous track. Is it a bug in the Yamaha integration causing the issue?

Actually it is working great.
But some yamaha recievers have a zone 2 (or sometimes more). It appears as a separate entity on HA. So when I have set the zone 2 on the “Main Zone Sync” source, the “next” or “previous” sent to the zone 2 does nothing, because the main zone should be triggered as it is the brain of the party. I made a little workaround by editing your blueprint to let choose the main zone in the automation so it sends the command to the main zone when source is “Main Zone Sync” :

blueprint:
# Media control via IKEA Symfonisk Gen2 - Shawsky April 2023 v1.55
# Updated April 2024 - Add additional filtering to prevent triggering from other devices/false positives. Thanks kenno.
# Updated April 2024 - Add support for device rename in upcoming Z2M release & allow legacy action for Play/Pause
# Updated September 2023 - Further updates for group/non grouped behaviour / fix issue for volume hold for grouped/non grouped. Allow 100 volume steps.
# Updated August 2023 - Resolve a volume issue for media players with no group_memeber attribute
# Updated June 2023 - Resolve filtering issue where multiple devices are in use
# Updated May 2023 - Add group volume control

# Volume changes partially based on https://gist.github.com/erkr/a437ebcb98a2b5ba2deebabd02f5ffae Eric Kreuwels
# and https://gist.github.com/alexwmaustin/2c25cfa1a0ade1ab9fc1ef0940289672 Alex Austin

  name: Z2M - IKEA Symfonisk gen2 Auto (Sof version)
  description: 
    'Control the selected media player (and any joined to it) with an IKEA Symfonisk sound controller GEN2 via Zigbee2MQTT (Z2M)

    Supports single press on media buttons and single, double and long press for the "dot" buttons.'
  domain: automation
  input:
    remote:
      name: Remote
      description: The IKEA Symfonisk controller GEN2 to use
      selector:
          device:
            filter:
            - integration: mqtt
              manufacturer: IKEA
              model: SYMFONISK sound remote gen2 (E2123)
            - integration: mqtt
              manufacturer: IKEA
              model: SYMFONISK sound remote, gen 2 (E2123)
    base_topic:
      name: Zigbee2MQTT Base mqtt topic
      description: The base topic configured in Zigbee2MQTT. If you haven't changed this, leave the default here ("zigbee2mqtt")
      default: zigbee2mqtt
    media_player:
      name: Media Player
      description: The media player to control with this automation
      selector:
        entity:
          domain: media_player
          multiple: false
    media_player_main_zone:
      name: Main Zone synced to 
      description: The main entity behind the controlled zone
      selector:
        entity:
          domain: media_player
          multiple: false
    volume_steps:
      name: Volume number of steps
      description: Controls the volume scale. The default of 25 is the same scale as the Sonos app.
      default: 25
      selector:
        number:
          min: 5
          max: 100
          step: 5
          unit_of_measurement: "Num"
          mode: slider
    single_dot:
      name: Single Dot (Single)
      description: Action to run on single dot press
      default: []
      selector:
        action: {}
    single_dot_double_press:
      name: Single Dot (Double)
      description: Action to run on single dot double press
      default: []
      selector:
        action: {}
    single_dot_long_press:
      name: Single Dot (Long)
      description: Action to run on single dot long press
      default: []
      selector: 
        action: {}
    double_dot:
      name: Double Dot (Single)
      description: Action to run on double dot press
      default: []
      selector:
        action: {}
    double_dot_double_press:
      name: Double Dot (Double)
      description: Action to run on double dot double press
      default: []
      selector:
        action: {}
    double_dot_long_press:
      name: Double Dot (Long)
      description: Action to run on double dot long press
      default: []
      selector:
        action: {}
      
mode: restart
max_exceeded: silent

trigger_variables:
  base_topic: !input base_topic
  controller: !input remote

trigger:
  - platform: mqtt
    topic: "{{ base_topic }}/+/action"
condition:
  - condition: template
    value_template: "{{ trigger.topic == base_topic+'/'+device_attr(controller, 'name')+'/action' }} "  
action:
  - variables:
      controllertopic: "{{ base_topic }}/{{ device_attr(controller, 'name') }}/action"
      player: !input 'media_player'
      steps: !input volume_steps
      stepsize: '{{ 1.0 / steps }}'
  - choose:
    - conditions:
      - "{{ trigger.payload != ''}}"
      - "{{ trigger.topic == controllertopic }}"
      sequence:
        - choose:
          ## Commands

          # Play / Pause
          - conditions: "{{ trigger.payload == 'toggle' or trigger.payload == 'play_pause' }}"
            sequence:
            - service: media_player.media_play_pause
              entity_id: !input 'media_player'

          # Next Track
          - conditions: "{{ trigger.payload == 'track_next' }}"
            sequence:
              - if:
                  - condition: state
                    entity_id: !input 'media_player'
                    attribute: source
                    state: Main Zone Sync
                then:
                  - service: media_player.media_next_track
                    target:
                      entity_id: !input 'media_player_main_zone'
                    data: {}
                else:
                  - service: media_player.media_next_track
                    metadata: {}
                    data: {}
                    target:
                      entity_id: !input 'media_player'


              
          # Previous Track
          - conditions: "{{ trigger.payload == 'track_previous' }}"
            sequence:
              - if:
                  - condition: state
                    entity_id: !input 'media_player'
                    attribute: source
                    state: Main Zone Sync
                then:
                  - service: media_player.media_previous_track
                    data: {}
                    target:
                      entity_id: !input 'media_player_main_zone'
                else:
                  - service: media_player.media_previous_track
                    data: {}
                    target:
                      entity_id: !input 'media_player'

          
          ## Volume for media players supporting groups

          # Volume Up Press
          - conditions: "{{ trigger.payload == 'volume_up' and state_attr(player, 'group_members') != none and state_attr(player, 'group_members') != [] }}"
            sequence:
              - repeat:
                  for_each: "{{ state_attr(player, 'group_members') }}"
                  sequence:
                  - service: media_player.volume_set
                    target:
                      entity_id: "{{ repeat.item }}"
                    data:
                      volume_level: >-
                        {% set volume = state_attr(repeat.item, "volume_level") + stepsize %}
                        {{ 1.0 if volume > 1.0 else volume }}

          # Volume Down Press
          - conditions: "{{ trigger.payload == 'volume_down' and state_attr(player, 'group_members') != none and state_attr(player, 'group_members') != [] }}"
            sequence:
              - repeat:
                  for_each: "{{ state_attr(player, 'group_members') }}"
                  sequence:
                  - service: media_player.volume_set
                    target:
                      entity_id: "{{ repeat.item }}"
                    data:
                      volume_level: >-
                        {% set volume = state_attr(repeat.item, "volume_level") - stepsize %}
                        {{ 0.0 if volume < 0.0 else volume }}

          # Volume Up Hold
          - conditions: "{{ trigger.payload == 'volume_up_hold' and state_attr(player, 'group_members') != none and state_attr(player, 'group_members') != [] }}"
            sequence:
              - repeat:
                  for_each: "{{ state_attr(player, 'group_members') }}"
                  sequence:
                  - service: media_player.volume_up
                    target:
                      entity_id: "{{ repeat.item }}"

          # Volume Down Hold
          - conditions: "{{ trigger.payload == 'volume_down_hold' and state_attr(player, 'group_members') != none and state_attr(player, 'group_members') != [] }}"
            sequence:
              - repeat:
                  for_each: "{{ state_attr(player, 'group_members') }}"
                  sequence:
                  - service: media_player.volume_down
                    target:
                      entity_id: "{{ repeat.item }}"

          ## Volume for media players not supporting groups

          # Volume Up
          - conditions: "{{ trigger.payload == 'volume_up' and (state_attr(player, 'group_members') == none or state_attr(player, 'group_members') == []) }}"
            sequence:
              - service: media_player.volume_set
                target:
                  entity_id: "{{ player }}"
                data:
                  volume_level: >-
                    {% set volume = state_attr(player, "volume_level") + stepsize %}
                    {{ 1.0 if volume > 1.0 else volume }}
           
          # Volume Down Press
          - conditions: "{{ trigger.payload == 'volume_down' and (state_attr(player, 'group_members') == none or state_attr(player, 'group_members') == []) }}"
            sequence:
              - service: media_player.volume_set
                target:
                  entity_id: "{{ player }}"
                data:
                    volume_level: >-
                      {% set volume = state_attr(player, "volume_level") - stepsize %}
                      {{ 0.0 if volume < 0.0 else volume }}
          
          # Volume Up Hold
          - conditions: "{{ trigger.payload == 'volume_up_hold' and (state_attr(player, 'group_members') == none or state_attr(player, 'group_members') == []) }}"
            sequence:
              - service: media_player.volume_up
                target:
                  entity_id: "{{ player }}"
          
          # Volume Down Hold
          - conditions: "{{ trigger.payload == 'volume_down_hold' and (state_attr(player, 'group_members') == none or state_attr(player, 'group_members') == []) }}"
            sequence:
              - service: media_player.volume_down
                target:
                  entity_id: "{{ player }}"

          ## Actions

          # Single Dot Press
          - conditions: "{{ trigger.payload == 'dots_1_short_release' }}"
            sequence: !input single_dot
          # Single Dot Double Press
          - conditions: "{{ trigger.payload == 'dots_1_double_press' }}"
            sequence: !input single_dot_double_press
          # Single Dot Long Press
          - conditions: "{{ trigger.payload == 'dots_1_long_press' }}"
            sequence: !input single_dot_long_press
          # Double Dot Press
          - conditions: "{{ trigger.payload == 'dots_2_short_release' }}"
            sequence: !input double_dot
          # Double Dot Double Press
          - conditions: "{{ trigger.payload == 'dots_2_double_press' }}"
            sequence: !input double_dot_double_press
          # Double Dot Long Press
          - conditions: "{{ trigger.payload == 'dots_2_long_press' }}"
            sequence: !input double_dot_long_press
1 Like

Firstly, thanks for creating this blueprint!

Am using v1.55. When single pressing volume down, the volume increases on the Sonos group. If I long press, the volume does go down. This issue isn’t present for the volume up button.

Any ideas on how I may fix this?

I have installed the blueprint and created an automation using.

The Symfonisk remote is sending button presses visible in zigbee2MQTT and Home Assistant history.

How do I get the automation the respond to the Symfonisk button presses.

I selected the Symfonisk remote from the drop down list.

Checked the yaml, all looks good.

Is there something else you have to do to get it to respond to the remote?

I am still new to Home Assistant so still learning - any guidance would be helpful.



Also is there a way to get the automation to show on the Device page the same as other automations or does this not show because it is a Blueprint based automation?

Hmm I’ve just tested mine and it works fine, then done the latest Z2M and Core updates and still working. I’ve checked over the code it’s all good so there must be something about your devices - possibly worth using the reconfigure option? Perhaps related to the media player you’re using? I use Sonos, what are you using?

The blueprint controls the media player for the relevant buttons, for the dots then you do as you appear to have done (I can’t validate if what you have would work as it’s specific to your setup). One to check though is that Z2M is seeing the dot button presses, throughout this thread you’ll find instances of people finding the device didn’t get configured correctly at initial setup or sometimes a Z2M update can screw it up - worth using the reconfigure option on the device in the Z2M control panel, worst case, remove and re-add, making sure you repeatedly press buttons to keep the device awake.

None of my automations show as devices, this is normal. Not sure if I understand fully what you mean though?

Looking at the device in Home Assistant I am getting the button presses in Home Assistant.

But the automation is not reporting/catching any of the button presses.

So the automation is not ‘watching’ the switch, just wondering if there is another step required.

Normally I see all associated automations showing on the Device page.

But not here and wondering if this relates to the automation not responding to the button presses that Home Assistant is logging.

I had expected the Symfonisk remote automation to show the same way as other automations show, like the blind controller.

But if you don’t see automations on your devices, then mine might be a new feature added to Home Assistant recently?

I migrated my Node Red across to Home Assistant and I am only starting to use Home Assistant automations instead of node Red.

I’ll try uninstalling the blueprint and re-installing see if that enables the Blueprint to ‘see’ Home Assistant device actions.

Have you changed the MQTT topic name in your Z2M setup? If so you’ll need to specify this in the automation created from the blueprint, it’s 2nd option:

That’s all I can think of, it’s like the message isn’t reaching the automation.

Worth adding that the blueprint isn’t automating MQTT per se, it’s looking for messages received from the specified device, you’ll see in the yaml that it builds the message path based on base topic and device name etc etc

Sorry, I thought you meant on the devices list under settings. No automations don’t show there for me - it’s to do with how the device is selected in the automation. I prefer the method I’ve used as it’s more intuitive and I can limit the list to only Symfonisk device rather than asking for a device id / listing all devices

1 Like

Ok thanks.

Not changed default zigbee2MQTT settings.

The weird thing is that Home Assistant is seeing it but the automation is not.

I have two Symfonisk one in Kitchen one in Lounge.

I did try removing the automations, blueprint did a full os reboot and reinstalled the blueprint.

Same issue.

I’ll try again tomorrow, if push comes to shove I do it in node Red, this was a foray into Home Assistant automations.

Thanks for look8ng though, much appreciated:-)

There must be something about your setup that’s different/non-standard, the only issues that have come up really have been either things I’ve fixed or problems with the devices binding properly in Z2M. Be worth checking it out, shame to give up on HA when it makes so much so simple :smiley:

1 Like

You have this set-up as the name of the remote. Are you certain that is the actual name?

The friendly name in the other screens is something with a ‘/’ and a ‘space’.
Sometimes names with ‘/’ and ‘space’ in them cause problems, so that could be an issue, but I’m betting that stupid 32chr number is either the entity_id or there is a wrong character. Also make sure there is no space leading or trailing that thing. I always change my names in Z2M, those are horrible to work with. I would put something human readable without spaces or punctuation in there as the name. You can do that easily in the Z2M addon/docker main screen. (be sure to click update HA entities as well). Then you can look at it and see if it’s right or not
I explain the renaming process in some of my blueprints instruction files.
HA_Blueprints/Automations/Zigbee2MQTT-Xiaomi_Cube_Controller_MQTT_Triggered.md at cc117b702de8fb79ef2295fd4460bfae7dc03bd8 · SirGoodenough/HA_Blueprints · GitHub.

The error you describe tells me your blueprint is not looking at the same device that you are looking at in the device panel. It matches all your symptoms.

1 Like

Hi Folks,

First of all thanks for this great blueprint. I really appreciate it.

TLDR: The volume controls fail for my Sonos speaker group exposed to HA via Music Assistant due to a type missmatch in the volume handling condition. For some reason the type of the group_members attribute for my player is a set not a list hence the checks state_attr(player, ‘group_members’) != [] return true even if the attribute itself is an empty set causing the subsequent repeat action to fail. If the conditions for the goup volume controls are expanded with an additional state_attr(player, ‘group_members’) | length > 0 statement than it begins to work. It may even work without the != [] cehck by replacing it with the | length > 0 but I haven’t tested it. I do not have a player which exposes the group_members attribute as a list instead of a set .

Longer version with steps of investigation:
I just bought a Symfonisk media controller the other day for my new (and only) Sonos kitchen speakers. A pair of Era 100s set up as a Stereo Pair in the Sonos app itself.
I use Music Assistant thus the stereo pair is not integrated into HA “directly” using the Sonos integration but I’m using the player exposed by Music Assistant.

After setting up an automation for this blueprint the volume controls were not working.
I noticed the following error message upon pressing any of the two volume controls:

Error message in Trace

Here is the part ot the code which failed:

Part of the code throwing the error
          ## Volume for media players supporting groups

          # Volume Up Press
          - conditions: "{{ trigger.payload == 'volume_up' and state_attr(player, 'group_members') != none and state_attr(player, 'group_members') != [] }}"
            sequence:
              - repeat:
                  for_each: "{{ state_attr(player, 'group_members') }}"
                  sequence:
                  - service: media_player.volume_set
                    target:
                      entity_id: "{{ repeat.item }}"
                    data:
                      volume_level: >-
                        {% set volume = state_attr(repeat.item, "volume_level") + stepsize %}
                        {{ 1.0 if volume > 1.0 else volume }}

I checked the state and attributes of my speaker (playing music) and noticed that the group_members attribute was empty yet in the automation during execution it entered the case where it is expected to have multiple values:

Attributes of the player

I’m not an expert Python dev but I did some googling and trial and error and discovered that the type of the attribute for me is set but the !=[ ] check only works for lists (if I’m not mistaken) thus an empty set not being equal to an empty list the condition for the goup player volume control passes. But the attribute itself is still empty so the subsequent repeat step fails with the error in the first picture.

Jinja debugging and proof

Here is the version I’m using now with the additional statements in the conditions to cover cases where the type of the attribute is a set not a list:
Note that it may be sufficient to ommit the !=[] part altogether and only use the | length > 0 to cover both list and set types but I do not have a player which exposes the attribute as a list to test this theory thus I left it in the code.

Modified blueprint version I'm using
blueprint:
# Media control via IKEA Symfonisk Gen2 - Shawsky April 2023 v1.55
# Updated April 2024 - Add additional filtering to prevent triggering from other devices/false positives. Thanks kenno.
# Updated April 2024 - Add support for device rename in upcoming Z2M release & allow legacy action for Play/Pause
# Updated September 2023 - Further updates for group/non grouped behaviour / fix issue for volume hold for grouped/non grouped. Allow 100 volume steps.
# Updated August 2023 - Resolve a volume issue for media players with no group_memeber attribute
# Updated June 2023 - Resolve filtering issue where multiple devices are in use
# Updated May 2023 - Add group volume control

# Volume changes partially based on https://gist.github.com/erkr/a437ebcb98a2b5ba2deebabd02f5ffae Eric Kreuwels
# and https://gist.github.com/alexwmaustin/2c25cfa1a0ade1ab9fc1ef0940289672 Alex Austin

  name: Z2M - IKEA Symfonisk sound controller GEN2 for media HomeMade Version
  description: 
    'Control the selected media player (and any joined to it) with an IKEA Symfonisk sound controller GEN2 via Zigbee2MQTT (Z2M)

    Supports single press on media buttons and single, double and long press for the "dot" buttons.'
  domain: automation
  input:
    remote:
      name: Remote
      description: The IKEA Symfonisk controller GEN2 to use
      selector:
          device:
            filter:
            - integration: mqtt
              manufacturer: IKEA
              model: SYMFONISK sound remote gen2 (E2123)
            - integration: mqtt
              manufacturer: IKEA
              model: SYMFONISK sound remote, gen 2 (E2123)
    base_topic:
      name: Zigbee2MQTT Base mqtt topic
      description: The base topic configured in Zigbee2MQTT. If you haven't changed this, leave the default here ("zigbee2mqtt")
      default: zigbee2mqtt
    media_player:
      name: Media Player
      description: The media player to control with this automation
      selector:
        entity:
          domain: media_player
          multiple: false
    volume_steps:
      name: Volume number of steps
      description: Controls the volume scale. The default of 25 is the same scale as the Sonos app.
      default: 25
      selector:
        number:
          min: 5
          max: 100
          step: 5
          unit_of_measurement: "Num"
          mode: slider
    single_dot:
      name: Single Dot (Single)
      description: Action to run on single dot press
      default: []
      selector:
        action: {}
    single_dot_double_press:
      name: Single Dot (Double)
      description: Action to run on single dot double press
      default: []
      selector:
        action: {}
    single_dot_long_press:
      name: Single Dot (Long)
      description: Action to run on single dot long press
      default: []
      selector: 
        action: {}
    double_dot:
      name: Double Dot (Single)
      description: Action to run on double dot press
      default: []
      selector:
        action: {}
    double_dot_double_press:
      name: Double Dot (Double)
      description: Action to run on double dot double press
      default: []
      selector:
        action: {}
    double_dot_long_press:
      name: Double Dot (Long)
      description: Action to run on double dot long press
      default: []
      selector:
        action: {}
      
mode: restart
max_exceeded: silent

trigger_variables:
  base_topic: !input base_topic
  controller: !input remote

trigger:
  - platform: mqtt
    topic: "{{ base_topic }}/+/action"
condition:
  - condition: template
    value_template: "{{ trigger.topic == base_topic+'/'+device_attr(controller, 'name')+'/action' }} "  
action:
  - variables:
      controllertopic: "{{ base_topic }}/{{ device_attr(controller, 'name') }}/action"
      player: !input 'media_player'
      steps: !input volume_steps
      stepsize: '{{ 1.0 / steps }}'
  - choose:
    - conditions:
      - "{{ trigger.payload != ''}}"
      - "{{ trigger.topic == controllertopic }}"
      sequence:
        - choose:
          ## Commands

          # Play / Pause
          - conditions: "{{ trigger.payload == 'toggle' or trigger.payload == 'play_pause' }}"
            sequence:
            - service: media_player.media_play_pause
              entity_id: !input 'media_player'
          # Next Track
          - conditions: "{{ trigger.payload == 'track_next' }}"
            sequence:
            - service: media_player.media_next_track
              entity_id: !input 'media_player'
          # Previous Track
          - conditions: "{{ trigger.payload == 'track_previous' }}"
            sequence:
            - service: media_player.media_previous_track
              entity_id: !input 'media_player'

          ## Volume for media players supporting groups

          # Volume Up Press
          - conditions: "{{ trigger.payload == 'volume_up' and state_attr(player, 'group_members') != none and state_attr(player, 'group_members') != [] and state_attr(player, 'group_members') | length > 0 }}"
            sequence:
              - repeat:
                  for_each: "{{ state_attr(player, 'group_members') }}"
                  sequence:
                  - service: media_player.volume_set
                    target:
                      entity_id: "{{ repeat.item }}"
                    data:
                      volume_level: >-
                        {% set volume = state_attr(repeat.item, "volume_level") + stepsize %}
                        {{ 1.0 if volume > 1.0 else volume }}

          # Volume Down Press
          - conditions: "{{ trigger.payload == 'volume_down' and state_attr(player, 'group_members') != none and state_attr(player, 'group_members') != [] and state_attr(player, 'group_members') | length > 0 }}"
            sequence:
              - repeat:
                  for_each: "{{ state_attr(player, 'group_members') }}"
                  sequence:
                  - service: media_player.volume_set
                    target:
                      entity_id: "{{ repeat.item }}"
                    data:
                      volume_level: >-
                        {% set volume = state_attr(repeat.item, "volume_level") - stepsize %}
                        {{ 0.0 if volume < 0.0 else volume }}

          # Volume Up Hold
          - conditions: "{{ trigger.payload == 'volume_up_hold' and state_attr(player, 'group_members') != none and state_attr(player, 'group_members') != [] and state_attr(player, 'group_members') | length > 0 }}"
            sequence:
              - repeat:
                  for_each: "{{ state_attr(player, 'group_members') }}"
                  sequence:
                  - service: media_player.volume_up
                    target:
                      entity_id: "{{ repeat.item }}"

          # Volume Down Hold
          - conditions: "{{ trigger.payload == 'volume_down_hold' and state_attr(player, 'group_members') != none and state_attr(player, 'group_members') != [] and state_attr(player, 'group_members') | length > 0 }}"
            sequence:
              - repeat:
                  for_each: "{{ state_attr(player, 'group_members') }}"
                  sequence:
                  - service: media_player.volume_down
                    target:
                      entity_id: "{{ repeat.item }}"

          ## Volume for media players not supporting groups

          # Volume Up
          - conditions: "{{ trigger.payload == 'volume_up' and (state_attr(player, 'group_members') == none or state_attr(player, 'group_members') == [] or state_attr(player, 'group_members') | length == 0 ) }}"
            sequence:
              - service: media_player.volume_set
                target:
                  entity_id: "{{ player }}"
                data:
                  volume_level: >-
                    {% set volume = state_attr(player, "volume_level") + stepsize %}
                    {{ 1.0 if volume > 1.0 else volume }}
           
          # Volume Down Press
          - conditions: "{{ trigger.payload == 'volume_down' and (state_attr(player, 'group_members') == none or state_attr(player, 'group_members') == [] or state_attr(player, 'group_members') | length == 0) }}"
            sequence:
              - service: media_player.volume_set
                target:
                  entity_id: "{{ player }}"
                data:
                    volume_level: >-
                      {% set volume = state_attr(player, "volume_level") - stepsize %}
                      {{ 0.0 if volume < 0.0 else volume }}
          
          # Volume Up Hold
          - conditions: "{{ trigger.payload == 'volume_up_hold' and (state_attr(player, 'group_members') == none or state_attr(player, 'group_members') == [] or state_attr(player, 'group_members') | length == 0 ) }}"
            sequence:
              - service: media_player.volume_up
                target:
                  entity_id: "{{ player }}"
          
          # Volume Down Hold
          - conditions: "{{ trigger.payload == 'volume_down_hold' and (state_attr(player, 'group_members') == none or state_attr(player, 'group_members') == [] or state_attr(player, 'group_members') | length == 0 ) }}"
            sequence:
              - service: media_player.volume_down
                target:
                  entity_id: "{{ player }}"

          ## Actions

          # Single Dot Press
          - conditions: "{{ trigger.payload == 'dots_1_short_release' }}"
            sequence: !input single_dot
          # Single Dot Double Press
          - conditions: "{{ trigger.payload == 'dots_1_double_press' }}"
            sequence: !input single_dot_double_press
          # Single Dot Long Press
          - conditions: "{{ trigger.payload == 'dots_1_long_press' }}"
            sequence: !input single_dot_long_press
          # Double Dot Press
          - conditions: "{{ trigger.payload == 'dots_2_short_release' }}"
            sequence: !input double_dot
          # Double Dot Double Press
          - conditions: "{{ trigger.payload == 'dots_2_double_press' }}"
            sequence: !input double_dot_double_press
          # Double Dot Long Press
          - conditions: "{{ trigger.payload == 'dots_2_long_press' }}"
            sequence: !input double_dot_long_press
1 Like

You sir are a steely eyed missleman!!,

Just changed the name of one of the Symfonisk from Kitchen/Symfonisk remote to Symfonisk1 and the blueprint worked!

Most of my zigbee2MQTT devices are named using the / delimiter, this impacts how the device is stored in Mqtt.

For instance Sensor/Window/Lounge/Left

This makes it very easy to set a tracker on all the Window sensors so if a window opens anywhere I get an immediate notification and a flag is set that blocks the blind from closing in the open window room.

Incredibly easy and quick in Node Red.

It never occurred to me that this standard zigbee2MQTT naming convention would cause Home Assistant automations issues.

@Sir_Goodenough thank you so much!

I understand the limitation of the blueprint now and the workaround is simple and doable.

1 Like

@Sir_Goodenough nailed it.

The standard use of / in zigbee2MQTT for groupings seems to disagree with the blueprint.

So by striping out the / and spaces, to be extra careful makes the blueprint work.

I am going to play around with zigbee2MQTT naming/Home Assistant naming and see if I can keep zigbee2MQTT grouping AND have the blueprint working.

But thank you so much for the blueprint and all your help.

The reason I got the Symfonisk remotes was because my wife ‘struggles’ with the Sonos App (well who isn’t after the last disastrous release :slight_smile: )

1 Like