Skip to content

Instantly share code, notes, and snippets.

@jhol-byte
Last active August 3, 2026 14:50
Show Gist options
  • Select an option

  • Save jhol-byte/b2731a4d2476f530d76b9ff409f7f3a4 to your computer and use it in GitHub Desktop.

Select an option

Save jhol-byte/b2731a4d2476f530d76b9ff409f7f3a4 to your computer and use it in GitHub Desktop.
Home Assistent Blueprint "Ikea_bilresa_scroll_wheel"
blueprint:
name: Ikea_bilresa_scroll_wheel
description: |
Blueprint for Ikea Bilresa Matter (button and scroll wheel for 3 different channels)
Version: 2026-04-06
Info: https://community.home-assistant.io/t/ikea-bilresa-scroll-wheel-blueprint-matter/965365
domain: automation
# input selectors
input:
remote:
name: Remote
description: "Ikea Bilresa scroll wheel remote control"
selector:
device:
filter:
manufacturer: IKEA of Sweden
model: BILRESA scroll wheel
integration: matter
# input selectors: channel 1
channel1_section:
name: Channel 1
collapsed: true
input:
click_action_ch1:
name: "Channel 1: <click> action"
default: []
selector:
action: {}
double_click_action_ch1:
name: "Channel 1: <double-click> action"
default: []
selector:
action: {}
triple_click_action_ch1:
name: "Channel 1: <triple-click> action"
default: []
selector:
action: {}
long_click_action_ch1:
name: "Channel 1: <long-click> action"
description: ""
default: []
selector:
action: {}
on_hold_action_ch1:
name: "Channel 1: <on-hold> action"
description: "repeat action until button is released, see also on_hold_delay"
default: []
selector:
action: {}
scroll_wheel_target_ch1:
name: "Channel 1: Scroll wheel target entity"
description: |
Light or media player to be controlled by scroll wheel for channel 1
- empty for <user defined> scroll wheel mode
selector:
entity:
multiple: true
filter:
domain:
- light
- media_player
default: []
scroll_wheel_mode_ch1:
selector:
select:
options:
- "lights: dim"
- "lights: color temp and color hue"
- "lights: color temp only"
- "lights: color hue only"
- "media: volume control"
- "dynamic: choose from input_select"
- "user defined"
default: "lights: dim"
name: "Channel 1: Scroll wheel mode"
description: "Select attribute of target entity controlled by scroll wheel"
scroll_wheel_mode_dynamic_ch1:
selector:
entity:
filter:
domain:
- input_select
default:
name: "Channel 1: Scroll wheel mode input_select"
description: |-
For scroll wheel mode <dynamic> only, leave empty otherwise.
Create and choose an 'input_select' containing the scroll wheel modes you want to choose from dynamically, e.g.
- "lights: dim"
- "lights: color temp only"
scroll_wheel_mode_ext_ch1:
selector:
select:
options:
- "relaxed"
- "instant"
default: "relaxed"
name: "Channel 1: Scroll wheel evaluation mode"
description: |
<relaxed>: one action call after scrolling
<instant>: many action calls while scrolling
Beware:
for <instant> mode the 9 hidden sensor entities of Bilresa device have to be enabled
scroll_wheel_user_action_ch1:
name: "Channel 1: User defined scroll wheel action"
description: |
For scroll wheel mode <user defined> only
Exposed variables:
- <scroll_clicks>: for <instant> mode always 1, for <relaxed> mode number between 1 to 8
- <scroll_direction>: 'left' or 'right'
default: []
selector:
action: {}
# input selectors: channel 2
channel2_section:
name: Channel 2
collapsed: true
input:
click_action_ch2:
name: "Channel 2: <click> action"
default: []
selector:
action: {}
double_click_action_ch2:
name: "Channel 2: <double-click> action"
default: []
selector:
action: {}
triple_click_action_ch2:
name: "Channel 2: <triple-click> action"
default: []
selector:
action: {}
long_click_action_ch2:
name: "Channel 2: <long-click> action"
description: ""
default: []
selector:
action: {}
on_hold_action_ch2:
name: "Channel 2: <on-hold> action"
description: "repeat action until button is released, see also on_hold_delay"
default: []
selector:
action: {}
scroll_wheel_target_ch2:
name: "Channel 2: Scroll wheel target entity"
description: |
Light or media player to be controlled by scroll wheel for channel 2
- empty for <user defined> scroll wheel mode
selector:
entity:
multiple: true
filter:
domain:
- light
- media_player
default: []
scroll_wheel_mode_ch2:
selector:
select:
options:
- "lights: dim"
- "lights: color temp and color hue"
- "lights: color temp only"
- "lights: color hue only"
- "media: volume control"
- "dynamic: choose from input_select"
- "user defined"
default: "lights: dim"
name: "Channel 2: Scroll wheel mode"
description: "Select attribute of target entity controlled by scroll wheel"
scroll_wheel_mode_dynamic_ch2:
selector:
entity:
filter:
domain:
- input_select
default:
name: "Channel 2: Scroll wheel mode input_select"
description: |-
For scroll wheel mode <dynamic> only, leave empty otherwise.
Create and choose an 'input_select' containing the scroll wheel modes you want to choose from dynamically, e.g.
- "lights: dim"
- "lights: color temp only"
scroll_wheel_mode_ext_ch2:
selector:
select:
options:
- "relaxed"
- "instant"
default: "relaxed"
name: "Channel 2: Scroll wheel evaluation mode"
description: |
- <relaxed>: one action call after scrolling
- <instant>: many action calls while scrolling
Beware:
- for <instant> mode the 9 hidden sensor entities of Bilresa device have to be enabled
scroll_wheel_user_action_ch2:
name: "Channel 2: User defined scroll wheel action"
description: |
For scroll wheel mode <user defined> only
Exposed variables:
- <scroll_clicks>: for <instant> mode always 1, for <relaxed> mode number between 1 to 8
- <scroll_direction>: 'left' or 'right'
default: []
selector:
action: {}
# input selectors: channel 3
channel3_section:
name: Channel 3
collapsed: true
input:
click_action_ch3:
name: "Channel 3: <click> action"
default: []
selector:
action: {}
double_click_action_ch3:
name: "Channel 3: <double-click> action"
default: []
selector:
action: {}
triple_click_action_ch3:
name: "Channel 3: <triple-click> action"
default: []
selector:
action: {}
long_click_action_ch3:
name: "Channel 3: <long-click> action"
description: ""
default: []
selector:
action: {}
on_hold_action_ch3:
name: "Channel 3: <on-hold> action"
description: "repeat action until button is released, see also on_hold_delay"
default: []
selector:
action: {}
scroll_wheel_target_ch3:
name: "Channel 3: Scroll wheel target entity"
description: |
Light or media player to be controlled by scroll wheel for channel 3
- empty for <user defined> scroll wheel mode
selector:
entity:
multiple: true
filter:
domain:
- light
- media_player
default: []
scroll_wheel_mode_ch3:
selector:
select:
options:
- "lights: dim"
- "lights: color temp and color hue"
- "lights: color temp only"
- "lights: color hue only"
- "media: volume control"
- "dynamic: choose from input_select"
- "user defined"
default: "lights: dim"
name: "Channel 3: Scroll wheel mode"
description: "Select attribute of target entity controlled by scroll wheel"
scroll_wheel_mode_dynamic_ch3:
selector:
entity:
filter:
domain:
- input_select
default:
name: "Channel 3: Scroll wheel mode input_select"
description: |-
For scroll wheel mode <dynamic> only, leave empty otherwise.
Create and choose an 'input_select' containing the scroll wheel modes you want to choose from dynamically, e.g.
- "lights: dim"
- "lights: color temp only"
scroll_wheel_mode_ext_ch3:
selector:
select:
options:
- "relaxed"
- "instant"
default: "relaxed"
name: "Channel 3: Scroll wheel evaluation mode"
description: |
- <relaxed>: one action call after scrolling
- <instant>: many action calls while scrolling
Beware:
- for <instant> mode the 9 hidden sensor entities of Bilresa device have to be enabled
scroll_wheel_user_action_ch3:
name: "Channel 3: User defined scroll wheel action"
description: |
For scroll wheel mode <user defined> only
Exposed variables:
- <scroll_clicks>: for <instant> mode always 1, for <relaxed> mode number between 1 to 8
- <scroll_direction>: 'left' or 'right'
default: []
selector:
action: {}
# input selectors: global settings for all channels
# global light settings
global_light_setting:
name: Global light settings
collapsed: true
input:
# light
dim_step_pct:
name: Dimmer step percentage
description: "change in brightness in %"
default: 10
selector:
number:
mode: box
dim_min_pct:
name: Minimum brightness
description: "minimum brightness in %"
default: 5
selector:
number:
mode: box
dim_turns_lights_on:
name: Dim turns lights on
description: |
allow scroll wheel (mode: dim) to turn lights on
default: false
selector:
boolean:
min_color_temp:
name: Minimum color temperature
description: "minimum color temperature in K (for color_mode = color_temp)"
default: 2200
selector:
number:
mode: box
max_color_temp:
name: Maximum color temperature
description: "maximum color temperature in K (for color_mode = color_temp)"
default: 4000
selector:
number:
mode: box
color_temp_step:
name: Color temperature step
description: "change in color temperature in K (for color_mode = color_temp)"
default: 100
selector:
number:
mode: box
color_hue_step:
name: Color hue step
description: "change in color hue in degree (0..360) (for color_mode = color_hue)"
default: 6
selector:
number:
mode: box
color_saturation:
name: Color saturation
description: "color saturation in % (for color_mode = color_hue)"
default: 100
selector:
number:
mode: box
light_transition_duration:
name: Transition duration
description: "Controls the duration of transitions"
default: 0.5
selector:
number:
mode: box
# global media settings
global_media_setting:
name: Global media settings
collapsed: true
input:
# media_player
volume_step_pct:
name: Media player volume step percentage
description: "change in volume in %"
default: 3.5
selector:
number:
mode: box
volume_use_up_down_for_instant:
name: "Media player: use actions volume_up/volume_down for <instant> mode"
description: |
<instant> mode uses standard actions volume_up/volume_down instead of <volume step percentage> by default
if this is to coarse disable this option and adjust the <volume step percentage> value to the lowest value which still changes the volume while scrolling in both directions
default: true
selector:
boolean:
volume_max_pct:
name: Media player max volume percentage
description: "max volume in %"
default: 70
selector:
number:
mode: box
# global misc settings
global_misc_setting:
name: Miscellaneous settings
collapsed: true
input:
# misc
auto_reset_time_input_select_helpers:
name: Auto reset time for input_select helpers
description: |
auto reset time for input_select helpers if > 0
input_selects are reset to first selection
default: 0
selector:
number:
mode: box
step: 60
on_hold_delay:
name: On hold delay
description: delay between separate action calls while on hold button
default: 0.1
selector:
number:
mode: box
step: 0.1
max_queued_automation_calls:
name: Max queued automation calls
description: |
Increase if you want to queue more automation calls for special cases
default: 10
selector:
number:
mode: box
step: 1
# automation logic
alias: Ikea_bilresa_scroll_wheel
trigger:
- event_type: state_changed
event_data:
entity_id: "{{ var_button_ch1 }}"
trigger: event
id: button_ch1
- event_type: state_changed
event_data:
entity_id: "{{ var_scroll_left_ch1 }}"
trigger: event
id: scroll_left_ch1
- event_type: state_changed
event_data:
entity_id: "{{ var_scroll_right_ch1 }}"
trigger: event
id: scroll_right_ch1
- event_type: state_changed
event_data:
entity_id: "{{ var_scroll_left_ext_ch1 }}"
trigger: event
id: scroll_left_ext_ch1
- event_type: state_changed
event_data:
entity_id: "{{ var_scroll_right_ext_ch1 }}"
trigger: event
id: scroll_right_ext_ch1
- event_type: state_changed
event_data:
entity_id: "{{ var_button_ch2 }}"
trigger: event
id: button_ch2
- event_type: state_changed
event_data:
entity_id: "{{ var_scroll_left_ch2 }}"
trigger: event
id: scroll_left_ch2
- event_type: state_changed
event_data:
entity_id: "{{ var_scroll_right_ch2 }}"
trigger: event
id: scroll_right_ch2
- event_type: state_changed
event_data:
entity_id: "{{ var_scroll_left_ext_ch2 }}"
trigger: event
id: scroll_left_ext_ch2
- event_type: state_changed
event_data:
entity_id: "{{ var_scroll_right_ext_ch2 }}"
trigger: event
id: scroll_right_ext_ch2
- event_type: state_changed
event_data:
entity_id: "{{ var_button_ch3 }}"
trigger: event
id: button_ch3
- event_type: state_changed
event_data:
entity_id: "{{ var_scroll_left_ch3 }}"
trigger: event
id: scroll_left_ch3
- event_type: state_changed
event_data:
entity_id: "{{ var_scroll_right_ch3 }}"
trigger: event
id: scroll_right_ch3
- event_type: state_changed
event_data:
entity_id: "{{ var_scroll_left_ext_ch3 }}"
trigger: event
id: scroll_left_ext_ch3
- event_type: state_changed
event_data:
entity_id: "{{ var_scroll_right_ext_ch3 }}"
trigger: event
id: scroll_right_ext_ch3
condition:
- condition: template
value_template: >-
{{ trigger.event.data.old_state.state != 'unavailable'
and trigger.event.data.new_state.state != 'unavailable'
}}
action:
- variables:
channel: >-
{% if trigger.id in ['button_ch1', 'scroll_left_ch1', 'scroll_right_ch1', 'scroll_left_ext_ch1', 'scroll_right_ext_ch1'] %}
ch1
{% elif trigger.id in ['button_ch2', 'scroll_left_ch2', 'scroll_right_ch2', 'scroll_left_ext_ch2', 'scroll_right_ext_ch2'] %}
ch2
{% elif trigger.id in ['button_ch3', 'scroll_left_ch3', 'scroll_right_ch3', 'scroll_left_ext_ch3', 'scroll_right_ext_ch3'] %}
ch3
{% endif %}
- if: "{{ var_reset_time_input_select_helpers > 0 and last_triggered_seconds > var_reset_time_input_select_helpers }}"
then:
repeat:
for_each:
- "ch1"
- "ch2"
- "ch3"
sequence:
- action: input_select.select_first
target:
entity_id: "{{ vars['scroll_wheel_mode_dynamic_' ~ repeat.item ] }}"
- choose:
# button click
- conditions:
- condition: template
value_template: >
{{ trigger.id == ('button_' ~ channel) and trigger.event.data.new_state.attributes.event_type ==
'multi_press_1' }}
sequence:
- if: "{{ channel == 'ch1'}}"
then:
!input click_action_ch1
- if: "{{ channel == 'ch2'}}"
then:
!input click_action_ch2
- if: "{{ channel == 'ch3'}}"
then:
!input click_action_ch3
# button double-click
- conditions:
- condition: template
value_template: >
{{ trigger.id == ('button_' ~ channel) and trigger.event.data.new_state.attributes.event_type ==
'multi_press_2' }}
sequence:
- if: "{{ channel == 'ch1'}}"
then:
!input double_click_action_ch1
- if: "{{ channel == 'ch2'}}"
then:
!input double_click_action_ch2
- if: "{{ channel == 'ch3'}}"
then:
!input double_click_action_ch3
# button triple-click
- conditions:
- condition: template
value_template: >
{{ trigger.id == ('button_' ~ channel) and trigger.event.data.new_state.attributes.event_type ==
'multi_press_3' }}
sequence:
- if: "{{ channel == 'ch1'}}"
then:
!input triple_click_action_ch1
- if: "{{ channel == 'ch2'}}"
then:
!input triple_click_action_ch2
- if: "{{ channel == 'ch3'}}"
then:
!input triple_click_action_ch3
# button long-press
- conditions:
- condition: template
value_template: >
{{ trigger.id == ('button_' ~ channel) and trigger.event.data.new_state.attributes.event_type ==
'long_press' }}
# button on-hold action
sequence:
- if: "{{ channel == 'ch1'}}"
then:
sequence:
- sequence: !input long_click_action_ch1
- repeat:
while: "{{ repeat.index < 100 and state_attr(var_button_ch1, 'event_type') == 'long_press' }}"
sequence:
- sequence: !input on_hold_action_ch1
- delay: "{{ var_on_hold_delay }}"
- if: "{{ channel == 'ch2'}}"
then:
sequence:
- sequence: !input long_click_action_ch2
- repeat:
while: "{{ repeat.index < 100 and state_attr(var_button_ch2, 'event_type') == 'long_press' }}"
sequence:
- sequence: !input on_hold_action_ch2
- delay: "{{ var_on_hold_delay }}"
- if: "{{ channel == 'ch3'}}"
then:
sequence:
- sequence: !input long_click_action_ch3
- repeat:
while: "{{ repeat.index < 100 and state_attr(var_button_ch3, 'event_type') == 'long_press' }}"
sequence:
- sequence: !input on_hold_action_ch3
- delay: "{{ var_on_hold_delay }}"
# scroll wheel actions
- conditions:
- condition: template
value_template: >
{{ ( (vars['scroll_wheel_mode_ext_' ~ channel] == 'relaxed') and (trigger.id == ('scroll_left_' ~ channel) or trigger.id == ('scroll_right_' ~ channel))) or
( (vars['scroll_wheel_mode_ext_' ~ channel] == 'instant') and (trigger.id == ('scroll_left_ext_' ~ channel) or trigger.id == ('scroll_right_ext_' ~ channel)) and trigger.event.data.new_state.state == '1' )
}}
sequence:
- variables:
scroll_clicks: >
{% if (vars['scroll_wheel_mode_ext_' ~ channel] == 'relaxed') %}
{{ trigger.event.data.new_state.attributes.totalNumberOfPressesCounted }}
{% else %}
1
{% endif %}
scroll_direction: >
{% if (trigger.id == 'scroll_left_' ~ channel) or (trigger.id == 'scroll_left_ext_' ~ channel)%}
left
{% else %}
right
{% endif %}
scroll_wheel_mode: >
{{ vars['scroll_wheel_mode_' ~ channel] if vars['scroll_wheel_mode_' ~ channel] != 'dynamic: choose from input_select' else states(vars['scroll_wheel_mode_dynamic_' ~ channel]) }}
- if:
# scroll wheel mode: <user defined>
- condition: template
value_template: "{{ scroll_wheel_mode == 'user defined' }}"
then:
sequence:
- if: "{{ channel == 'ch1'}}"
then:
!input scroll_wheel_user_action_ch1
- if: "{{ channel == 'ch2'}}"
then:
!input scroll_wheel_user_action_ch2
- if: "{{ channel == 'ch3'}}"
then:
!input scroll_wheel_user_action_ch3
else:
- repeat:
for_each: "{{ vars['targets_entities_' ~ channel] }}"
sequence:
- choose:
- conditions:
- condition: template
value_template: "{{ scroll_wheel_mode == 'lights: dim'}}"
sequence:
# scroll wheel mode: <lights: dim>
- if:
- condition: template
value_template: >-
{{ is_state(repeat.item, 'on') or (var_dim_turns_lights_on and scroll_direction == 'right')
}}
then:
- if:
- condition: template
value_template: >-
{{ is_state(repeat.item, 'on')
}}
then:
- action: light.turn_on
target:
entity_id: "{{ repeat.item }}"
data:
brightness_step_pct: >-
{{ iif(scroll_direction == 'right', scroll_clicks * var_dim_step_pct,
-1*([scroll_clicks * var_dim_step_pct, state_attr(repeat.item, 'brightness')*100/254
- var_min_pct]|min))
}}
transition: "{{ var_light_transition_duration }}"
else:
- action: light.turn_on
target:
entity_id: "{{ repeat.item }}"
data:
transition: "{{ var_light_transition_duration }}"
# scroll wheel mode: <lights: color temp>
- conditions:
- condition: template
value_template: "{{ scroll_wheel_mode == 'lights: color temp only' or (scroll_wheel_mode == 'lights: color temp and color hue' and state_attr(repeat.item, 'color_temp_kelvin') is not none ) }}"
sequence:
# scroll wheel mode: lights: color temp
- action: script.light_color_temp_helper
data:
mode: >-
{{ iif(scroll_direction == 'left', 'down', 'up')
}}
min_color_temp: "{{ var_min_color_temp }}"
max_color_temp: "{{ var_max_color_temp }}"
color_temp_step: "{{ var_color_temp_step * scroll_clicks }}"
target_light: "{{ repeat.item }}"
light_transition_duration: "{{ var_light_transition_duration }}"
# scroll wheel mode: <lights: color hue>
- conditions:
- condition: template
value_template: "{{ scroll_wheel_mode == 'lights: color hue only' or (scroll_wheel_mode == 'lights: color temp and color hue' and state_attr(repeat.item, 'color_temp_kelvin') is none ) }}"
sequence:
- action: script.light_color_hs_helper
data:
target_light: "{{ repeat.item }}"
light_transition_duration: "{{ var_light_transition_duration }}"
color_hue_step: "{{ var_color_hue_step * scroll_clicks }}"
color_saturation: "{{ var_color_saturation }}"
mode: >-
{{ iif(scroll_direction == 'left', 'down', 'up')
}}
# scroll wheel mode: <media: volume>
- conditions:
- condition: template
value_template: "{{ scroll_wheel_mode == 'media: volume control' and (is_state(repeat.item, 'playing') or is_state(repeat.item, 'on') )}}"
sequence:
- if:
- condition: template
value_template: "{{ vars['scroll_wheel_mode_ext_' ~ channel] == 'relaxed' or not var_volume_use_up_down_for_instant}}"
then:
- action: media_player.volume_set
target:
entity_id: "{{ repeat.item }}"
data:
volume_level: >-
{{ [[state_attr(repeat.item, 'volume_level')*100 +
iif(scroll_direction == 'right', 1, -1)* scroll_clicks * var_volume_step_pct, var_volume_max_pct] | min, 0] | max / 100
}}
else:
- if:
- condition: template
value_template: "{{ scroll_direction == 'left' }}"
then:
- action: media_player.volume_down
target:
entity_id: "{{ repeat.item }}"
else:
- if:
- condition: template
value_template: "{{ state_attr(repeat.item, 'volume_level')*100 < var_volume_max_pct }}"
then:
- action: media_player.volume_up
target:
entity_id: "{{ repeat.item }}"
mode: queued
max: !input max_queued_automation_calls
max_exceeded: silent
variables:
vars: {'targets_entities_ch1': !input scroll_wheel_target_ch1, 'targets_entities_ch2': !input scroll_wheel_target_ch2, 'targets_entities_ch3': !input scroll_wheel_target_ch3,
'scroll_wheel_mode_ch1': !input scroll_wheel_mode_ch1, 'scroll_wheel_mode_ch2': !input scroll_wheel_mode_ch2, 'scroll_wheel_mode_ch3': !input scroll_wheel_mode_ch3,
'scroll_wheel_mode_ext_ch1': !input scroll_wheel_mode_ext_ch1, 'scroll_wheel_mode_ext_ch2': !input scroll_wheel_mode_ext_ch2, 'scroll_wheel_mode_ext_ch3': !input scroll_wheel_mode_ext_ch3,
'scroll_wheel_mode_dynamic_ch1': !input scroll_wheel_mode_dynamic_ch1, 'scroll_wheel_mode_dynamic_ch2': !input scroll_wheel_mode_dynamic_ch2, 'scroll_wheel_mode_dynamic_ch3': !input scroll_wheel_mode_dynamic_ch3
}
var_min_pct: !input dim_min_pct
var_dim_step_pct: !input dim_step_pct
var_dim_turns_lights_on: !input dim_turns_lights_on
var_color_hue_step: !input color_hue_step
var_color_saturation: !input color_saturation
var_min_color_temp: !input min_color_temp
var_max_color_temp: !input max_color_temp
var_color_temp_step: !input color_temp_step
var_light_transition_duration: !input light_transition_duration
var_on_hold_delay: !input on_hold_delay
var_volume_step_pct: !input volume_step_pct
var_volume_max_pct: !input volume_max_pct
var_volume_use_up_down_for_instant: !input volume_use_up_down_for_instant
var_reset_time_input_select_helpers: !input auto_reset_time_input_select_helpers
last_triggered_seconds: >
{{ as_timestamp(now()) - as_timestamp(this.attributes.last_triggered, 0) }}
trigger_variables:
var_remote: !input remote
# get all event names from device_id only
var_button_ch1: >-
{% for item in device_entities(var_remote) %}
{% set match = item | regex_findall(find='^event\..+[a-zA-Z]_3.*$') %}
{% if (match | length) > 0 %}
{{ match[0] }}
{% endif %}
{% endfor %}
var_scroll_left_ch1: >-
{% for item in device_entities(var_remote) %}
{% set match = item | regex_findall(find='^event\..+[a-zA-Z]_2.*$') %}
{% if (match | length) > 0 %}
{{ match[0] }}
{% endif %}
{% endfor %}
var_scroll_right_ch1: >-
{% for item in device_entities(var_remote) %}
{% set match = item | regex_findall(find='^event\..+[a-zA-Z]_1.*$') %}
{% if (match | length) > 0 %}
{{ match[0] }}
{% endif %}
{% endfor %}
var_scroll_left_ext_ch1: >-
{% for item in device_entities(var_remote) %}
{% set match = item | regex_findall(find='^sensor\..+[a-zA-Z]_2.*$') %}
{% if (match | length) > 0 %}
{{ match[0] }}
{% endif %}
{% endfor %}
var_scroll_right_ext_ch1: >-
{% for item in device_entities(var_remote) %}
{% set match = item | regex_findall(find='^sensor\..+[a-zA-Z]_1.*$') %}
{% if (match | length) > 0 %}
{{ match[0] }}
{% endif %}
{% endfor %}
var_button_ch2: >-
{% for item in device_entities(var_remote) %}
{% set match = item | regex_findall(find='^event\..+[a-zA-Z]_6.*$') %}
{% if (match | length) > 0 %}
{{ match[0] }}
{% endif %}
{% endfor %}
var_scroll_left_ch2: >-
{% for item in device_entities(var_remote) %}
{% set match = item | regex_findall(find='^event\..+[a-zA-Z]_5.*$') %}
{% if (match | length) > 0 %}
{{ match[0] }}
{% endif %}
{% endfor %}
var_scroll_right_ch2: >-
{% for item in device_entities(var_remote) %}
{% set match = item | regex_findall(find='^event\..+[a-zA-Z]_4.*$') %}
{% if (match | length) > 0 %}
{{ match[0] }}
{% endif %}
{% endfor %}
var_scroll_left_ext_ch2: >-
{% for item in device_entities(var_remote) %}
{% set match = item | regex_findall(find='^sensor\..+[a-zA-Z]_5.*$') %}
{% if (match | length) > 0 %}
{{ match[0] }}
{% endif %}
{% endfor %}
var_scroll_right_ext_ch2: >-
{% for item in device_entities(var_remote) %}
{% set match = item | regex_findall(find='^sensor\..+[a-zA-Z]_4.*$') %}
{% if (match | length) > 0 %}
{{ match[0] }}
{% endif %}
{% endfor %}
var_button_ch3: >-
{% for item in device_entities(var_remote) %}
{% set match = item | regex_findall(find='^event\..+[a-zA-Z]_9.*$') %}
{% if (match | length) > 0 %}
{{ match[0] }}
{% endif %}
{% endfor %}
var_scroll_left_ch3: >-
{% for item in device_entities(var_remote) %}
{% set match = item | regex_findall(find='^event\..+[a-zA-Z]_8.*$') %}
{% if (match | length) > 0 %}
{{ match[0] }}
{% endif %}
{% endfor %}
var_scroll_right_ch3: >-
{% for item in device_entities(var_remote) %}
{% set match = item | regex_findall(find='^event\..+[a-zA-Z]_7.*$') %}
{% if (match | length) > 0 %}
{{ match[0] }}
{% endif %}
{% endfor %}
var_scroll_left_ext_ch3: >-
{% for item in device_entities(var_remote) %}
{% set match = item | regex_findall(find='^sensor\..+[a-zA-Z]_8.*$') %}
{% if (match | length) > 0 %}
{{ match[0] }}
{% endif %}
{% endfor %}
var_scroll_right_ext_ch3: >-
{% for item in device_entities(var_remote) %}
{% set match = item | regex_findall(find='^sensor\..+[a-zA-Z]_7.*$') %}
{% if (match | length) > 0 %}
{{ match[0] }}
{% endif %}
{% endfor %}
@PGSCOM

PGSCOM commented May 4, 2026

Copy link
Copy Markdown

It works perfect!!!! Thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment