[Edge] Unlock IKEA BILRESA scroll wheel and dual button

I’ve added support for the new BILRESA buttons in my Matter Playground Edge Driver so you can unlock all the functionality, wheel customization included.

Given the singularities of these new Matter over Thread buttons it deserves its own post. :grin:

There is a teaser video in reddit, check it out since it showcases what you can do in combination with Matter bulbs using Matter Playground. There’s another one focused on the scroll.

The driver packs as many custom tweaks as technically possible, including triple-tap for the dual button via an original hack (it only supports double-tap), a nice user interface and routine conditions for the wheel (which doubles as three thanks to the selector underneath the indicators), advanced dimming and other quality of life features. I’ve been working on them well before having the buttons!

BILRESA scroll wheel added perks

  • :wheel: Full support for the wheel with Swipe left and Swipe right actions, Control devices by rotating and pressing and rotating actions plus sensitivity and direction adjustment.

    • Swipe Left / Righ behaviour: trigger L/R multiple times while scrolling (useful for dimmer or colour steps) or single trigger when scrolling ends (useful for toggling).
    • Scrolled sectors routine condition to trigger scenes depending on the amount scrolled. I recommend using the default values of sectors of size 33% for an easy way to toggle up to 6 scenes with a single gesture.
    • Control devices by rotating using the app or Rules API to mimic the native behaviour and step the dimmer level proportionally to the scroll. Read more about dimming in this comment.
    • Press + Rotate support so you can control both brightness and colour depending on whether you press at the same time or not. Read more about the official knob capability support.
  • :repeat_button: Auto-repeat Held emulation.

  • :up_arrow: Long press release as Toggled up. For convenience, it won’t trigger if you scroll while pressing so you can automate long presses even if you use the Control devices by pressing and rotating action or other press+rotate automations. Those actions will trigger Held but not Toggled Up, so you can use Toggled Up for long presses with no rotation involved.

  • :high_voltage: Initial Press and Short Release actions to turn on lights real quick. Read more about how to minimize latency to achive wall-switch like immediate reaction.

  • :battery: Profile with group names, battery type and quantity information. The buttons may report an unusually low battery reading, that is normal. The driver originally tried to correct the reading but recent versions just display what the buttons report.

BILRESA dual button added perks:

  • :pirate_flag: Triple-tap hack to expand the native double-tap. Can be enabled in Settings, works fine for me but the method used is not 100% error-proof and you might get a false triple-tap (I’ve not seen any though!). More specifically, single and double taps will always trigger normally, they’re not affected, the worst case scenario is an additional triple tap that should not be there or an actual triple tap not triggering. With 1.9.15 firmware (or later), getting a false triple-tap should be virtually impossible.

  • :high_voltage: Initial Press and Short Release actions to turn on lights real quick. Read more about minimizing button latency. For toggling lights it’s a day and night difference!

  • :repeat_button: Auto-repeat Held emulation, useful to auto-repeat brightness / volume increments in devices that support them.

  • :up_arrow: Long press release as Toggled up, useful for start/stop smooth dimming.

  • :battery: Profile with button names, battery type and quantity information. The buttons may report an unusually low battery reading, that is normal. The driver originally tried to correct the reading but recent versions just display what the buttons report.

Installation

To use the driver just install Matter Playground driver if you haven’t already and switch the driver of the button.

The driver does not steal the initial configuration from stock drivers so new devices are always added first to stock drivers.

If you see a "Can’t connect to the device. Check device and try again" message in the app right after changing the driver, close the app and open it again. I’ve seen that happening both when changing to a custom driver or going back to the stock driver so must be some cache issue of the app. You can also change drivers without the app using the advanced website.

Fantastic, much appreciated. I look forward to playing with this when I get the buttons

nice! looks like our local Ikea gets them in a week. do they support matter binding cluster?

Unfortunately no, everything is just Switch endpoints for the buttons and wheel. I don’t lose faith in an eventual firmware update supporting bindings.

Going down to IKEA tomorrow see what the have in stock

I wasn’t very happy with the dimming using the wheel so I’ve added some advanced features. Updated comment for version 2026-01-29 using new stock capabilities and the new app features introduced mid-April.

There are three ways to set up dimming with the BILRESA scroll. SmartThings stock drivers and the app have included official support so first check if you can use it:

Official SmartThings support

SmartThings added a official user interface to link the scroll to certain lights. It’s not compatible with every light at the moment so your lights may not be available for the new user interface. But, if they are, it’s a couple clicks and you’re done! With Matter Playground you can also assign actions to Control devices by pressing and rotating, useful to control colour temperature.

Mind, if you use Matter Playground lights, the default transition time is 0 seconds, you can change it in the settings of the light so it is a bit smoother. Stock drivers have a hardcoded 0.3 seconds.

Basic dimming with BILRESA scroll wheel

If the official way was not available for your lights, the easiest generic way to dim is assigning a fixed brightness step to the left and right actions.

Step or Adjust actions depend on the driver you use for the lights:

  • For Matter lights, stock drivers support them and you’ll see the Adjust brightness action. Alternatively, for Matter bulbs you can also use Matter Playground driver which supports customizing the transition times and On/Off behaviour.
  • For Zigbee bulbs you can use Lights Multifunction Mc, SmartThings is adding them to stock drivers too but it’s not yet in production.
  • For any light you can use Virtual Dimmer with Steps. Mind there are two Virtual Dimmer drivers in the channel, both work but the new one called Virtual Dimmer StatelessSwitchLevelStep Tx has better integration with the scroll so install that one.

The wheel more or less repeats the events while scrolling, many if you go slow, not so many if you go fast to avoid flooding the hub. You’ll get multiple steps and kind of works. You could say it’s fine, but not great. Lacks precision and speed.

Advanced dimming with BILRESA scroll wheel

(This is the option with more control but, since official way is so easy, there’s no point in using it unless your driver for lights does not support the new statelessSwitchLevelStep capability)

Using the Rules API, the button can feed the step size required to the light driver, changing it depending on how much you scroll and matching the native experience inside IKEA ecosystem. Gives both precision and speed, you can go slowly by small increments or quickly scroll the wheel a large amount for a large step.

The attribute rotateAmount in capability knob of BILRESA is the step level value you have to pass to the step level command of the lights driver.

The Rule, although verbose, is quite simple and would look like this for lights supporting the official statelessSwitchLevelStep capability, like this Matter Playground , stock Matter drivers, Virtual Dimmer StatelessSwitchLevelStep Tx and soon Zigbee stock drivers:

[
  {
    "if": {
      "greaterThanOrEquals": {
        "left": {
          "device": {
            "devices": [
              "BILRESA-SCROLL-DEVICE-ID"
            ],
            "component": "main",
            "capability": "knob",
            "attribute": "rotateAmount",
            "trigger": "Always"
          }
        },
        "right": {
          "integer": -100
        },
        "changesOnly": false
      },
      "then": [
        {
          "command": {
            "devices": [
              "LIGHT-DEVICE-ID",
              "ANOTHER-LIGHT-DEVICE-ID"
            ],
            "commands": [
              {
                "component": "main",
                "capability": "statelessSwitchLevelStep",
                "command": "stepLevel",
                "arguments": [
                  {
                    "device": {
                      "devices": [
                        "BILRESA-SCROLL-DEVICE-ID"
                      ],
                      "component": "main",
                      "capability": "knob",
                      "attribute": "rotateAmount"
                    }
                  }
                ]
              }
            ]
          }
        }
      ]
    }
  }
]

The component names for the knob are main for first group, group2 and group3.

You can create the Rule using the advanced website (Rules → Add Rule) and would look like this:

Adapting the Rule for other custom drivers

There are settings to change the default behaviour but that’s only needed for specific cases mentioned below.

  • First check if your driver for lights has included the official statelessSwitchLevelStep capability, in that case no action is needed. Keep the Max step size at 100 and just copy the rule above changing the IDs.
  • For Virtual Dimmer , if you installed the new driver with statelessSwitchLevelStepsupport no action is needed, keep the max at 100 and copy the rule. If you are using the original driver and don’t want to switch yet, use capability islandtheme02751.stepLevel, command setStepLevel and change the Max step size to 25 or won’t work as expected since the driver sends steps up to 100% by default if you fully scroll the wheel.
  • For Lights Multifunction would be capability legendabsolute60149.levelSteps and command setLevelSteps, with Max step size being 30.

Improving the smoothness

When using Matter Playground, you can improve the smoothness of the steps by adding a transition time.

An option is changing the step level transition in the settings of the light. It’s in seconds, I recommend 0.3 for IKEA KAJPLATS, 0.1 for Nanoleaf and 0 for WiZ since they already add their own smoothness.

Alternatively, if you use panelorange55982.stepLevel capability you can add the second and third optional stepLevel parameters to the rule which are an integer for the transition time in tenths of a second and a boolean for the WithOnOff behaviour.

Stock drivers that implement steps have a hardcoded transition time of 0.3 seconds and you can’t change it.

Recent changes

:information_source: Feb 13th, 2026 note. SmartThings is officially adding support for dimming by scrolling and hopefully the app will provide a user interface so the Rules API is not needed :partying_face: . It is not there yet but SmartThings has created a new knob capability to communicate the level steps that my driver already uses and so will stock drivers. A previous version of the instructions used the Scrolled sectors as step options but they are no longer needed. If you were using scrolledSectors for the steps feel free to migrate to knob using attribute rotateAmount instead of scrolledSectors , integer instead of decimal and capability knob instead of panelorange55982.scrolledSectors.

There are also new official capabilities for the steps so I’ve changed the screenshots to use them instead. The Adjust brightness action is the English translation but in your language may be Ajustar brillo or other text. You can still use the Step dimmer level action too, it’s exactly the same internally except using my custom capability. I’ve also updated the Rule to use the official statelessSwitchLevelStep that more drivers will use in the near future.

Feb 24th, 2026. Stock drivers now include the Adjust brightness and temperature as well as the knob capability in the BILRESA scroll.

April 16th, 2026. Updated comment since the app already has a user interface so the Rules API are not needed.

While testing I managed to make the BILRESA dual button unresponsive. I thought it was bricked for a moment since it didn’t send any pressed events.

Had to remove the batteries and insert them again. That didn’t work or I was not patient enough so I switched to stock drivers (the number of buttons was not even recognized correctly there) and then switched to my custom driver again (that forces a re-subscription to the events). Fully working now.

It’s probably a rare bug of the firmware that you won’t find but it’s worth documenting it.

Turns out some of the BILRESA scroll wheels have bad switches, or I have bad luck…

I have two units, one of them has a “clicky” wheel button, the other feels “mushy”. The problem is the mushy one skips taps a lot, maybe you wanted a triple tap and registers single or double, or you wanted double and registers single.

Will have it in observation…

That sounds like a faulty device. Open it and see if you can fix it?

Sounds like it, I’ve reported it, won’t try to fix it myself in case they want to inspect the unit and whatnot. If not I’ll just return it in my next visit to IKEA and bring a different Matter toy.

https://www.reddit.com/r/tradfri/comments/1pklqb3/bad_switch_in_bilresa_scroll_wheel/

Good job, @mocelet !

Also the scroll wheel, the new devices desperately need a firmware update, they are too prone to go unresponsive but I probably play with them more than the average.

The scroll wheel was completely bricked, not even the selector lights worked, so I had to factory reset it with the button on the back leaving it pressed and then set it up again.

Funny how the list of firmware attributes gets longer and longer each time I look at it, but there’s only one Matter device (Eve Energy) that can be updated through SmartThings - even when there are firmware updates available for other devices in the DCL.

Minimize action latency in BILRESA. Available from version 2025-12-15

Sometimes you just want to turn on a light and want it wall-switch fast, not half a second later. If you don’t care it’s better that you don’t try these new options, there’s no going back when you notice the difference :rofl:.

This is the story of a single-press in BILRESA told in Matter events, from when you press the button (Initial Press), release the finger (Short Release) around 100 ms later and the device reports it’s a single-press (Multipress Complete) around half a second later.

The driver now allows to expose both the Initial Press and the Short Release for both models if you want to favour speed over double/triple tap.

  • Initial Press is the fastest but will trigger with a long press too, so it’s inconvenient unless you just want a quick light toggle and nothing else. Exposes as Toggled down.
  • Short Release still feels fast (it’s 100 ms vs 500 ms) and it’s compatible with the long press, so you only lose the double or triple tap unless you manage to create double-tap automations where it doesn’t matter that the short release runs twice. Exposes as Swipe up.

I’m using the Short Release for the BILRESA scroll wheel since the switch is a hardware lottery and the double-tap is not reliable so I just gave up and use only single and long presses. Plus, I notice if a light takes half a second to turn on, now the experience is so much better.

Capabilities!

It’s possible to read using CLI for example statelessSwitchLevelStep:

smartthings capabilities statelessSwitchLevelStep -j
{
    "id": "statelessSwitchLevelStep",
    "version": 1,
    "status": "proposed",
    "name": "Stateless Switch Level Step",
    "ephemeral": false,
    "attributes": {},
    "commands": {
        "stepLevel": {
            "name": "stepLevel",
            "arguments": [
                {
                    "name": "stepSize",
                    "optional": false,
                    "schema": {
                        "type": "integer",
                        "minimum": -100,
                        "maximum": 100
                    }
                }
            ],
            "sensitive": false
        }
    }
}

About time, a standard step level function using the native step command! Good news is that it’s an integer from -100 to 100 so it’s also compatible with my advanced dimming feature :grin:

I’m also glad they opted for the Step command and not StepWithOnOff, that way lights that are off will not turn on.

function CapabilityHandlers.handle_step_level(driver, device, cmd)

[...]

device:send(clusters.LevelControl.server.commands.Step(device, endpoint_id, step_mode, math.abs(step_size), fields.TRANSITION_TIME, fields.OPTIONS_MASK, fields.OPTIONS_OVERRIDE))

Edit:

Will they add the step function to groups? That would be SO great.

I’ve also noticed the stock driver will update a “knob” capability with the step information, how will they “link” that to the step level capability of the light? Some secret sauce in SmartThings app? Smart Lighting sync switch? Rules API? This is going to be so interesting!

So far the new capabilities don’t have text and they don’t appear to enable nothing magically in the app, maybe a new app update will be needed.

The capabilities appear in the website actually: Proposed Capabilities | Developer Documentation | SmartThings , there’s also a stateless scenes which is intriguing and may hint to Matter scenes support.

Its a nice driver! But i cant make it work with scroll wheel, detect but dont do nothing :slight_smile:
Maybe the problem is mine but i will test a little bit more :smiling_face_with_sunglasses:

Do you see the Swipe left and Swipe right actions but they won’t trigger?

Mind some wheels have hardware defects and must be returned to the store, double check if that’s the case:

  • The selector in the bottom should cycle the LEDs (signaling if group 1, 2 or 3 is active), like in the video linked in first post. If that doesn’t happen it’s an issue with the button.
  • In reddit there are reports of failing wheels that need too much pressure to register the scroll and even broken switches due to too much pressure.

You can also try to switch back to stock drivers and then again to my driver in case there’s any issue with the subscriptions. Do the normal presses, double press, etc. work?