I have created a blueprint for my Ikea Bilresa scroll wheel remote.
Button supports:
- click
- double-click
- triple-click
- long-click
- on-hold
Scroll wheel supports the following modes:
- for lights:
– dimming
– color temperature change
– color hue change - for media player:
– volume control - user defined action (for examples see below)
- (switch between above modes dynamically using an
input_select-helper, see below)
You need two additional helper scripts for color control, these can also be used stand-alone (e.g. as action for double-click or on-hold), see below.
Update: 2026-02-07
- add support for switching the scroll wheel mode dynamically, thanks for the idea to @rneurink
, see #84 for the details
previous important changes
- as setting the media_player volume seems to be quite delicate (see #31 as well) I added the option Media player: use actions volume_up/volume_down for <instant> mode to the global settings
- add evaluation mode for scroll wheel:
relaxed: (default), one action call after scrolling
instant: many action calls while scrolling for better responsiveness


be aware that for instant mode the 9 hidden sensor entities have to be enabled first (see #27 as well)
- for the idea thanks to @bogus

- if automation doesn’t trigger at all, try steps in #19 and #63
Description
A typical example for a light may look like this:
- toggle light “Globe” on click
- use scroll-wheel to dim up/down light “Globe” (you can change dim step size and min brightness as well)
- long-click turns light “Globe” on
- on-hold calls repeatedly helper script “light_color_hs_helper” to change color of light “Globe”
A typical example for a media player may look like this:
- start/pause player on click
- double-click jumps to next title
- use scroll-wheel to volume up/down (you can change volume step size and max volume as well)
Get the blueprint Ikea_bilresa_scroll_wheel.yaml here:
![]()
Or copy from github: Home Assistent Blueprint "Ikea_bilresa_scroll_wheel" · GitHub
First helper script
light_color_hs_helper (change color hue in steps):
![]()
Yaml code 'light_color_hs_helper'
sequence:
- action: light.turn_on
target:
entity_id: "{{ target_light }}"
data:
hs_color: >-
{% set new_value = (state_attr(target_light, 'hs_color')[0] + iif(mode
== "down", -1, +1) * color_hue_step) %} {{ [iif(new_value > 360,
new_value - 360,
iif(new_value < 0,
new_value + 360,
new_value),
new_value),
color_saturation - 1 ] }}
alias: light_color_hs_helper
fields:
target_light:
name: Light
description: Light entity
selector:
entity:
filter:
domain: light
required: true
color_hue_step:
name: Change of color hue per step
default: 5
selector:
number:
mode: box
required: true
color_saturation:
name: Color saturation
default: 100
selector:
number:
mode: box
required: true
mode:
selector:
select:
options:
- up
- down
required: true
default: up
name: Mode
description: Select switch mode
description: Switch color hue/saturation of light in steps
Second helper script
light_color_temp_helper (change color temp in steps):
![]()
Yaml code 'light_color_temp_helper'
sequence:
- action: light.turn_on
target:
entity_id: "{{ target_light }}"
data:
color_temp_kelvin: |-
{% if state_attr(target_light, 'color_temp_kelvin') is none %}
{{ max_color_temp }}
{% else %}
{% if mode == "cycle" and state_attr(target_light, 'color_temp_kelvin')
== max_color_temp %}
{{min_color_temp}}
{% else %}
{% set new_value = state_attr(target_light, 'color_temp_kelvin')+iif(mode == "down", -1, +1) * color_temp_step %}
{{ [([new_value, max_color_temp] | min), min_color_temp] | max}}
{% endif %}
{% endif %}
alias: light_color_temp_helper
fields:
target_light:
name: Light
description: Light entity
selector:
entity:
filter:
domain: light
required: true
min_color_temp:
name: Minimal color temperature
default: 2200
selector:
number:
mode: box
required: true
max_color_temp:
name: Maximal color temperature
default: 4000
selector:
number:
mode: box
required: true
color_temp_step:
name: Change of color temperature per step
default: 300
selector:
number:
mode: box
required: true
mode:
selector:
select:
options:
- up
- down
- cycle
required: true
default: cycle
name: Mode
description: Select switch mode
description: Switch color temperature of light in steps
Examples for user defined scroll wheel mode
YAML code for changing the brightness in a user defined way:
if:
- condition: template
value_template: "{{ scroll_direction == 'left' }}"
then:
- action: light.turn_on
metadata: {}
target:
entity_id: light.globe_lampe
data:
brightness_step_pct: "{{ scroll_clicks * (-5) }}"
else:
- action: light.turn_on
metadata: {}
target:
entity_id: light.globe_lampe
data:
brightness_step_pct: "{{ scroll_clicks * 5 }}"
similar for volume control to change by 4% with max volume of 70%:
action: media_player.volume_set
data:
volume_level: |-
{{ [[state_attr('media_player.ruark_r1s', 'volume_level')*100 +
iif(scroll_direction == 'right', 1, -1)* scroll_clicks * 4, 70] | min, 0] | max / 100
}}
target:
entity_id: media_player.ruark_r1s
in the same vein for covers (user experience maybe not great and depends on your covers, relaxed mode might be more suitable here):
action: cover.set_cover_position
data:
position: |-
{{ [[state_attr('cover.rollladen_sz', 'current_position') +
iif(scroll_direction == 'right', -1, +1)* scroll_clicks * 10, 100] | min, 0] | max
}}
target:
entity_id: cover.rollladen_sz













