IKEA Bilresa 2 Button Remote pairs with ZHA

I saw a comment on Reddit today that the new matter over thread IKEA Bilresa remotes support Zigbee and can pair with ZHA. I happened to have a remote sitting around that I had picked up with the idea of trying out matter over thread, but I really like my Zigbee network.

Sure enough, I was able to pair the remote following this procedure:

  1. In ZHA, add new device
  2. On remote, press the center pairing button 4 times
  3. Wait for light to blink rapidly
  4. Press pairing button 8 times. Some people are able to pair with 4 presses here.

The interview successfully completes, the device is confgured. Only diagnostic entities are created BUT the remote fires off several zha_event messages for press on, hold on, hold on released, press off, hold off, `hold off released.

Here is some more detail on the events.

This is pretty exciting. I have submitted a PR for a ZHA quirk v2:

Unfortunately, the other Bilresa with the dial is not available in the US yet, or at least not at the IKEA nearest me, so I don’t have that to test out. I presume it will also pair with ZHA.

1 Like

The one with the fiead does also paid over Zigbee. Works with ZHA.

Hey @iamjosh,

thanks for your contribution. I was able to pair my Bilresa 2 Button Device with ZHA, but unfortunately the button presses are not recognised.

I also added your custom quirk as suggested in your github instructions.

Has anyone else tested it so far?

I get the BILRESA with scroll wheel connected via Zigbee using instructions above. It detects press on the wheel and even scroll. But not when I press the body (3 led).

Does not report correct battery level.

You need to provide a little more information, please.
What is your installation? It is possible directory for the custom quirk may be different for your install.
Did you add the directory to your configuration.yaml file?
Did the quirk apply? You can check this by clicking Zigbee info in the device screen.
Are events being fired? It will tell you in activity on the device page, but you can see the actual event data in Developer Tools → Events, then listen to zha_event.

The device actually works without the quirk, it is just providing predefined triggers for automations. There are actually disadvantages to this, since it is device instead of entity.

Additionally, there is more work being done on the quirk since turns out there are double clicks that can be captured, too.

HAOS (2025.12.5) via Proxmox, ZHA, Sonoff-Dongle-M. Other Devices, like IKEA Styrbar are working correctly.

Yes, custom_zha_quirks-folder containing bilresa_v2_py-file.
I also added the directory to the configuration.yaml

zha:
  custom_quirks_path: /config/custom_zha_quirks

I Guess?

No, there are no events beeing fired by pressing the buttons :frowning:. I thought your custom quirk would help, but

Seems like I have another issue …

Yes the quirk is applied.

My troubleshooting steps would involve a couple of things.

I would remove the device from ZHA. Remove the quirk (or just rename the file with .old temporarily). Restart HA. Re-pair the remote to ZHA without the quirk. Test if events are firing by pressing buttons while listening to zha_event on the Events page.

Did all of your suggested troubleshooting steps, but unfortunately there are no events from my 3 Bilresa.

Can you share the device signatures?

The Information I can see at ā€œDevice-Infoā€?

No, in the device page, click the three dots in the Device Info section. Then Manage Zigbee Device, then the signature tab.

{
  "node_descriptor": {
    "logical_type": 2,
    "complex_descriptor_available": 0,
    "user_descriptor_available": 0,
    "reserved": 0,
    "aps_flags": 0,
    "frequency_band": 8,
    "mac_capability_flags": 128,
    "manufacturer_code": 4476,
    "maximum_buffer_size": 127,
    "maximum_incoming_transfer_size": 242,
    "server_mask": 11776,
    "maximum_outgoing_transfer_size": 242,
    "descriptor_capability_field": 0
  },
  "endpoints": {
    "1": {
      "profile_id": "0x0104",
      "device_type": "0x0006",
      "input_clusters": [
        "0x0000",
        "0x0001",
        "0x0003",
        "0x0020"
      ],
      "output_clusters": [
        "0x0003",
        "0x0004",
        "0x0005",
        "0x0006",
        "0x0008",
        "0x1000"
      ]
    }
  },
  "manufacturer": "IKEA of Sweden",
  "model": "09B9",
  "class": "zigpy.device.Device"
}

{
  "node_descriptor": {
    "logical_type": 2,
    "complex_descriptor_available": 0,
    "user_descriptor_available": 0,
    "reserved": 0,
    "aps_flags": 0,
    "frequency_band": 8,
    "mac_capability_flags": 128,
    "manufacturer_code": 4476,
    "maximum_buffer_size": 127,
    "maximum_incoming_transfer_size": 242,
    "server_mask": 11776,
    "maximum_outgoing_transfer_size": 242,
    "descriptor_capability_field": 0
  },
  "endpoints": {
    "1": {
      "profile_id": "0x0104",
      "device_type": "0x0006",
      "input_clusters": [
        "0x0000",
        "0x0001",
        "0x0003",
        "0x0020"
      ],
      "output_clusters": [
        "0x0003",
        "0x0004",
        "0x0005",
        "0x0006",
        "0x0008",
        "0x1000"
      ]
    }
  },
  "manufacturer": "IKEA of Sweden",
  "model": "09B9",
  "class": "zigpy.device.Device"
}

{
  "node_descriptor": {
    "logical_type": 2,
    "complex_descriptor_available": 0,
    "user_descriptor_available": 0,
    "reserved": 0,
    "aps_flags": 0,
    "frequency_band": 8,
    "mac_capability_flags": 128,
    "manufacturer_code": 4476,
    "maximum_buffer_size": 127,
    "maximum_incoming_transfer_size": 242,
    "server_mask": 11776,
    "maximum_outgoing_transfer_size": 242,
    "descriptor_capability_field": 0
  },
  "endpoints": {
    "1": {
      "profile_id": "0x0104",
      "device_type": "0x0006",
      "input_clusters": [
        "0x0000",
        "0x0001",
        "0x0003",
        "0x0020"
      ],
      "output_clusters": [
        "0x0003",
        "0x0004",
        "0x0005",
        "0x0006",
        "0x0008",
        "0x1000"
      ]
    }
  },
  "manufacturer": "IKEA of Sweden",
  "model": "09B9",
  "class": "zigpy.device.Device"
}

The signatures are the same. I don’t see why these would not generate the zha_event on the event bus.

You tried removing the device, restarting HA, and re-pairing it?
Maybe something to do with the dongle you’re using? Not really sure here.

1 Like

I did it a couple of times. I will investigate my dongle. Tanks for your help so far. Happy new year!

If this were me, I would be throwing pasta at the wall to see what sticks.

Some ideas in no particular order:

  • Removing the batteries and starting over.
  • Clicking buttons on the remote while it is pairing.
  • Rebooting the host and not just restarting HAOS

And Happy New Year to you, too!

1 Like

I’ve been experimenting with this for the last three days in a row :sweat_smile:.
I also bought a Myggspray, because I thought all new IKEA Matter devices were also compatible with Zigbee…

I also bought a couple of the new Hue Essential bulbs and tried to get everything running with Matter over Thread. But that currently seems hopeless as well. Everything appears to be running, but the last step — connecting the devices to my network — just doesn’t work.

Connecting via ZHA was very easy. At least until now :joy:

I am also having trouble getting my Bilresa (two button, no scroll wheel) to function with ZHA. I can reset it (long press), get into both the pulse and blink modes, and 8 presses does get it to pair, but no events fire. I can see 100% battery, but nothing else happens when pressing buttons. ZHA with a large network of other devices, latest firmware Sonoff DongleE. I’ve tried pressing buttons in all sorts of ways and pressing while pairing, rebooting my HA server, and reconfigure button in ZHA but it doesn’t do anything differently. The signature page shows the following:

{
  "node_descriptor": {
    "logical_type": 2,
    "complex_descriptor_available": 0,
    "user_descriptor_available": 0,
    "reserved": 0,
    "aps_flags": 0,
    "frequency_band": 8,
    "mac_capability_flags": 128,
    "manufacturer_code": 4476,
    "maximum_buffer_size": 127,
    "maximum_incoming_transfer_size": 242,
    "server_mask": 11776,
    "maximum_outgoing_transfer_size": 242,
    "descriptor_capability_field": 0
  },
  "endpoints": {
    "1": {
      "profile_id": "0x0104",
      "device_type": "0x0006",
      "input_clusters": [
        "0x0000",
        "0x0001",
        "0x0003",
        "0x0020"
      ],
      "output_clusters": [
        "0x0003",
        "0x0004",
        "0x0005",
        "0x0006",
        "0x0008",
        "0x1000"
      ]
    }
  },
  "manufacturer": "IKEA of Sweden",
  "model": "09B9",
  "class": "zigpy.device.Device"
}

I am curious what dongle people are using and the proximity to the dongle when pairing.

There have been instances in the past for some devices (not Ikea specifically, Aqara is one, I think?) where firmware on certain Zigbee dongles needed to be updated. I am not advising to update firmware, to be clear.

I’m having exactly the same issue, using a HUSBZB-1 with updated firmware. It pairs, but no events fired for anything - neither on the device page nor when listening on the zha_event bus.

I was excited as i read in the new zigbee2mqtt update about mey new ā€œthreadā€ remote. I just got some new IKEA device as a start to experiment with thread, which worked so far.
But i dont get the BILRESA scroll wheel remote to switch to zigbee mode?!
Is it because of sucessfull binding with thread already?
I tried pushing all 3 buttons (reset at back, wheel and lower part), 4 and 8 times each but i got no blinking led. do i need to reset first?