ZHA - IKEA Symfonisk sound controller for media (the spinny one)

Any suggestion how to change the steps the volume increases? Currently a ver small change in on the controler ends up in a big volume increse/decrease. What do i need to do to have this more smooth?

@sparkydave, @Donkeyrollerz, @seamus65 any of you have an idea how to make the spinny less sensitive?

I am not sure.

I think the symfonisk controller has a few issues with ZHA.

Some of the edits and updates people are working on to this Blueprint are very interesting though.

@seamus65, so just have to wait until the blueprint getā€™s updated?

I havenā€™t yet tried this Blueprint as Iā€™ve been too busy. I was going to try both this one and also this one to see which is best

@sparkydave, nice i will test the other blueprint also. Thanks!

@sparkydave i canā€™t get this one to work.

Have you setup the controller blueprint first?

@sparkydave, aha, i forgot about that. i will test again.
Did you config any of these values?

Finally made the switch from smartthings to HA over the weekend and have two of these Symfonisk controllers. I get them to pair via ZHA (pressing the pair button 4 times) but the only entity exposed is the battery to HA, thereā€™s no actual remote functionality to it. Does anyone know how to fix this?

image

It works by sending ZHA ā€˜eventsā€™, you donā€™t need entities. Using this Blueprint will let you automate things without having to know too much about the ZHA events going on in the background.

really bizarre, I have two of them and both pair fine to ZHA but none of them send events when I check logbook. And Iā€™ve tried 3 different blueprints. Do these need to be firmware updated? Its been over a year since Ive used them on smartthings

The events arenā€™t listed in the logbook. You can see them if you subscribe to zha_events in the developer page.

No, they work straight out of the box.

1 Like

Thanks everyone, a lot of really nice code above! That variables setting action is amazing, you have no idea the tedious workarounds Iā€™ve used so far to achieve a similar function.

In case it helps anyone, below is how Iā€™ve adapted and implemented the above in my ground floor with one Google home, one Android TV, and a Sonos home theatre system connected to the TV. I had issues with a ton of repeat events coming in from the symfonisk volume controller, but was able to solve that (at least the automation still executes in a useful manner) by introducing a delay at the end of the parent action sequence and setting the automation mode to ā€œrestartā€. Itā€™s working pretty smoothly and reliably now, but I have thoughts to implement a kind of panic off action (on double or triple press) to be able to contravene a potential runaway volume increase.

There are some quirks with my media player arrangement that result in some extra logic. Kitchen_display is a Google Home smart speaker/display that is only ever temporarily active when either the home theatre or TV + home theatre are active (i.e. when I tell Google to dim the lights while watching TV). This means when it goes idle I typically want the active media player to revert to either the home theatre or the TV, and that is why my ā€œactive media playerā€ automation doesnā€™t trigger on idle state of either the TV or home theatre. The other thing is that the TV audio always comes via the home theatre. So whenever the TV is in a ā€œplayingā€ state, the home theatre is too. This means that when the TV is active, volume changes must be done via the home theatre, and play/pause must be done via the TV. Another common use case is telling the kitchen_display to play music on the home theatre. In this case the kitchen_display starts off as active, hands off to the home theatre when it is idle, and the TV doesnā€™t come into the picture at all.

This code and functionality is getting really fun now, and using the single volume dial to control all these things is still simple and intuitive. Iā€™m wondering how many other smart things I can start to do with this single button/dial interface!

Hereā€™s the automation adapted from the above that controls three different media players.

alias: 'Symfonisk: Sound controller actions'
description: ''
trigger:
  - platform: event
    event_type: zha_event
    event_data:
      device_id: SYMFONISK_DEV_ID_HERE
condition: []
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 }}'
      active_player: '{{ states(''input_text.active_media_player'') }}'
      volume_step: 0.04
      delay_time: 0.4
  - choose:
      - conditions:
          - condition: template
            value_template: '{{ command == ''toggle'' }}'
          - condition: template
            value_template: '{{ cluster_id == 6 }}'
          - condition: template
            value_template: '{{ endpoint_id == 1 }}'
        sequence:
          - choose:
              - conditions:
                  - condition: template
                    value_template: '{{ active_player == ''media_player.home_theatre'' }}'
                sequence:
                  - service: media_player.media_play_pause
                    target:
                      entity_id:
                        - media_player.home_theatre
              - conditions:
                  - condition: template
                    value_template: '{{ active_player == ''media_player.tv'' }}'
                sequence:
                  - service: media_player.media_play_pause
                    target:
                      entity_id:
                        - media_player.tv
            default:
              - service: media_player.media_play_pause
                target:
                  entity_id: media_player.kitchen_display
      - conditions:
          - condition: template
            value_template: '{{ command == ''step'' }}'
          - condition: template
            value_template: '{{ cluster_id == 8 }}'
          - condition: template
            value_template: '{{ endpoint_id == 1 }}'
          - condition: template
            value_template: '{{ args == [0, 1, 0] }}'
        sequence:
          - service: input_boolean.turn_on
            target:
              entity_id: input_boolean.report
      - conditions:
          - condition: template
            value_template: '{{ command == ''step'' }}'
          - condition: template
            value_template: '{{ cluster_id == 8 }}'
          - condition: template
            value_template: '{{ endpoint_id == 1 }}'
          - condition: template
            value_template: '{{ args == [1, 1, 0] }}'
        sequence:
          - service: light.turn_off
            target:
              entity_id: light.entire_house
      - conditions:
          - condition: template
            value_template: '{{ command == ''move'' }}'
          - condition: template
            value_template: '{{ cluster_id == 8 }}'
          - condition: template
            value_template: '{{ endpoint_id == 1 }}'
          - condition: template
            value_template: '{{ args == [0, 195] }}'
        sequence:
          repeat:
            while:
              - condition: template
                value_template: '{{ repeat.index < 20 }}'
            sequence:
              - choose:
                  - conditions:
                      - condition: template
                        value_template: >-
                          {{ active_player == 'media_player.home_theatre' or
                          active_player == 'media_player.tv' }}
                    sequence:
                      - service: media_player.volume_set
                        entity_id: media_player.home_theatre
                        data_template:
                          volume_level: >-
                            {{ state_attr('media_player.home_theatre' ,
                            'volume_level') | float + volume_step }}
                default:
                  - service: media_player.volume_set
                    entity_id: media_player.kitchen_display
                    data_template:
                      volume_level: >-
                        {{ state_attr('media_player.kitchen_display' ,
                        'volume_level') | float + volume_step }}
      - conditions:
          - condition: template
            value_template: '{{ command == ''move'' }}'
          - condition: template
            value_template: '{{ cluster_id == 8 }}'
          - condition: template
            value_template: '{{ endpoint_id == 1 }}'
          - condition: template
            value_template: '{{ args == [1, 195] }}'
        sequence:
          repeat:
            while:
              - condition: template
                value_template: '{{ repeat.index < 20 }}'
            sequence:
              - choose:
                  - conditions:
                      - condition: template
                        value_template: >-
                          {{ active_player == 'media_player.home_theatre' or
                          active_player == 'media_player.tv' }}
                    sequence:
                      - service: media_player.volume_set
                        entity_id: media_player.home_theatre
                        data_template:
                          volume_level: >-
                            {{ state_attr('media_player.home_theatre' ,
                            'volume_level') | float - volume_step }}
                default:
                  - service: media_player.volume_set
                    entity_id: media_player.kitchen_display
                    data_template:
                      volume_level: >-
                        {{ state_attr('media_player.kitchen_display' ,
                        'volume_level') | float - volume_step }}
  - delay: delay_time
mode: restart

And here is the automation that decides which is the active media player:

alias: 'Symfonisk: Choose active media player'
description: ''
trigger:
  - platform: device
    device_id: DEV_ID_HERE
    domain: media_player
    entity_id: media_player.kitchen_display
    type: playing
  - platform: device
    device_id: DEV_ID_HERE
    domain: media_player
    entity_id: media_player.kitchen_display
    type: idle
  - platform: device
    device_id: DEV_ID_HERE
    domain: media_player
    entity_id: media_player.home_theatre
    type: playing
  - platform: device
    device_id: DEV_ID_HERE
    domain: media_player
    entity_id: media_player.tv
    type: playing
condition: []
action:
  - service: input_text.set_value
    target:
      entity_id: input_text.active_media_player
    data:
      value: >-
        {% set player = '' %} {% if is_state('media_player.home_theatre',
        'playing') and not is_state('media_player.kitchen_display', 'playing')
        %}   {% if is_state('media_player.home_theatre', 'playing') and
        is_state('media_player.tv', 'playing') %}     {% set player =
        'media_player.tv' %}   {% else %}     {% set player =
        'media_player.home_theatre' %}   {% endif %} {% elif not
        is_state('media_player.home_theatre', 'playing') and
        is_state('media_player.kitchen_display', 'playing') %}   {% set player =
        'media_player.kitchen_display' %} {% elif
        states.media_player.home_theatre.last_updated >
        states.media_player.kitchen_display.last_updated %}   {% if
        is_state('media_player.home_theatre', 'playing') and
        is_state('media_player.tv', 'playing') %}     {% set player =
        'media_player.tv' %}   {% else %}     {% set player =
        'media_player.home_theatre' %}   {% endif %} {% else %}   {% set player
        = 'media_player.kitchen_display' %} {% endif %} {{player}}
mode: restart

Hi, Iā€™m using this version of the spinny remote blueprint because the volume change felt too slow with the original one, and I have double-click set to call ā€œmedia_player.media_next_trackā€ to skip whatever is currently playing.

However, it always skips 2 tracks with this blueprint. It works fine with the original one (with the slow volume change). I tried fiddling with the code but I donā€™t really know what Iā€™m doing, any ideas?

EDIT:

I kinda got it working, I noticed one of the changes was ā€œmodeā€ from single to repeat. I changed that back to single, and I reduced the ā€œrepeat.indexā€ to 5, and it works ok. You canā€™t continuously turn to change the volume (suspect thatā€™s what the ā€œrepeatā€ bit does) but Iā€™m happy enough.

Yeah, the ā€œrepeatā€ was so you can continuously spin it to change volume. But it seems that the handling is somewhat dodgy (I find sometimes the volume keeps going up even when Iā€™ve only spun it a little bit, for instance). I think this is HA being overrun with updates from ZHA or something like that.

I donā€™t use mine enough to feel the need to fix itā€¦ :wink:

Any suggestions on debugging. I have two of these devices connected via ZHA - but the automation (this + a media hook) Never runsā€¦

I suspect its a zha issue

How about using a different Blueprint? The one I use works great.

Had a lot of issues with ZHA and Ikea devices. Ended up having to re-pair them every few days, and the batteries drained within a week or so (I have 2x Symfonisk knobs and 1x on/off switch). I switched over to ZigBee2MQTT and everything is working much more reliably now with all the same hardware, and the Ikea device batteries are still at 100% after a week despite frequent use. Not sure what the issue was in ZHA, but perhaps this helps someone else with the same problem.

1 Like

Hi, thanks for the code it works well for the quicker volume control. I am having an issue though where the battery has drained over a 2 day period. I am seeing hourly a zha_event trigger that produces a No Action taken. I suspect this is likely the cause of the battery drain. Thoughts?