updated apps
This commit is contained in:
+484
@@ -0,0 +1,484 @@
|
||||
blueprint:
|
||||
name: Ikea BILRESA scroll wheel (sensors for scroll, events for press)
|
||||
description: "Ikea BILRESA blueprint met 3 kanalen.\n\n- Scroll links/rechts gebruikt
|
||||
sensor.*current_switch_position_* (pulse 0/1).\n Alleen rising edge (0->1) triggert,
|
||||
dus per klik exact 1 stap en direct.\n- Druk op scrollwiel blijft event.* gebruiken
|
||||
zodat single/double/long/hold blijft werken.\n"
|
||||
domain: automation
|
||||
input:
|
||||
remote:
|
||||
name: Remote
|
||||
description: Ikea BILRESA remote control device
|
||||
selector:
|
||||
device:
|
||||
multiple: false
|
||||
channel1_section:
|
||||
name: Kanaal 1
|
||||
collapsed: true
|
||||
input:
|
||||
click_action_ch1:
|
||||
name: 'Kanaal 1: click actie'
|
||||
default: []
|
||||
selector:
|
||||
action: {}
|
||||
double_click_action_ch1:
|
||||
name: 'Kanaal 1: double click actie'
|
||||
default: []
|
||||
selector:
|
||||
action: {}
|
||||
long_click_action_ch1:
|
||||
name: 'Kanaal 1: long press actie'
|
||||
default: []
|
||||
selector:
|
||||
action: {}
|
||||
on_hold_action_ch1:
|
||||
name: 'Kanaal 1: on-hold actie'
|
||||
description: Herhaalt totdat losgelaten, zie on_hold_delay
|
||||
default: []
|
||||
selector:
|
||||
action: {}
|
||||
scroll_wheel_target_ch1:
|
||||
name: 'Kanaal 1: scroll target(s)'
|
||||
description: Light of media_player die je met het wiel wilt bedienen
|
||||
default: []
|
||||
selector:
|
||||
entity:
|
||||
multiple: true
|
||||
filter:
|
||||
- domain:
|
||||
- light
|
||||
- media_player
|
||||
reorder: false
|
||||
scroll_wheel_mode_ch1:
|
||||
name: 'Kanaal 1: scroll mode'
|
||||
default: 'lights: dim'
|
||||
selector:
|
||||
select:
|
||||
options:
|
||||
- 'lights: dim'
|
||||
- 'lights: color temp and color hue'
|
||||
- 'lights: color temp only'
|
||||
- 'lights: color hue only'
|
||||
- 'media: volume control'
|
||||
custom_value: false
|
||||
multiple: false
|
||||
sort: false
|
||||
channel2_section:
|
||||
name: Kanaal 2
|
||||
collapsed: true
|
||||
input:
|
||||
click_action_ch2:
|
||||
name: 'Kanaal 2: click actie'
|
||||
default: []
|
||||
selector:
|
||||
action: {}
|
||||
double_click_action_ch2:
|
||||
name: 'Kanaal 2: double click actie'
|
||||
default: []
|
||||
selector:
|
||||
action: {}
|
||||
long_click_action_ch2:
|
||||
name: 'Kanaal 2: long press actie'
|
||||
default: []
|
||||
selector:
|
||||
action: {}
|
||||
on_hold_action_ch2:
|
||||
name: 'Kanaal 2: on-hold actie'
|
||||
description: Herhaalt totdat losgelaten, zie on_hold_delay
|
||||
default: []
|
||||
selector:
|
||||
action: {}
|
||||
scroll_wheel_target_ch2:
|
||||
name: 'Kanaal 2: scroll target(s)'
|
||||
default: []
|
||||
selector:
|
||||
entity:
|
||||
multiple: true
|
||||
filter:
|
||||
- domain:
|
||||
- light
|
||||
- media_player
|
||||
reorder: false
|
||||
scroll_wheel_mode_ch2:
|
||||
name: 'Kanaal 2: scroll mode'
|
||||
default: 'lights: dim'
|
||||
selector:
|
||||
select:
|
||||
options:
|
||||
- 'lights: dim'
|
||||
- 'lights: color temp and color hue'
|
||||
- 'lights: color temp only'
|
||||
- 'lights: color hue only'
|
||||
- 'media: volume control'
|
||||
custom_value: false
|
||||
multiple: false
|
||||
sort: false
|
||||
channel3_section:
|
||||
name: Kanaal 3
|
||||
collapsed: true
|
||||
input:
|
||||
click_action_ch3:
|
||||
name: 'Kanaal 3: click actie'
|
||||
default: []
|
||||
selector:
|
||||
action: {}
|
||||
double_click_action_ch3:
|
||||
name: 'Kanaal 3: double click actie'
|
||||
default: []
|
||||
selector:
|
||||
action: {}
|
||||
long_click_action_ch3:
|
||||
name: 'Kanaal 3: long press actie'
|
||||
default: []
|
||||
selector:
|
||||
action: {}
|
||||
on_hold_action_ch3:
|
||||
name: 'Kanaal 3: on-hold actie'
|
||||
description: Herhaalt totdat losgelaten, zie on_hold_delay
|
||||
default: []
|
||||
selector:
|
||||
action: {}
|
||||
scroll_wheel_target_ch3:
|
||||
name: 'Kanaal 3: scroll target(s)'
|
||||
default: []
|
||||
selector:
|
||||
entity:
|
||||
multiple: true
|
||||
filter:
|
||||
- domain:
|
||||
- light
|
||||
- media_player
|
||||
reorder: false
|
||||
scroll_wheel_mode_ch3:
|
||||
name: 'Kanaal 3: scroll mode'
|
||||
default: 'lights: dim'
|
||||
selector:
|
||||
select:
|
||||
options:
|
||||
- 'lights: dim'
|
||||
- 'lights: color temp and color hue'
|
||||
- 'lights: color temp only'
|
||||
- 'lights: color hue only'
|
||||
- 'media: volume control'
|
||||
custom_value: false
|
||||
multiple: false
|
||||
sort: false
|
||||
global_section:
|
||||
name: Globale instellingen
|
||||
collapsed: true
|
||||
input:
|
||||
dim_step_pct:
|
||||
name: Dimmer stapgrootte (%)
|
||||
default: 5
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
step: 1.0
|
||||
dim_min_pct:
|
||||
name: Minimum brightness (%)
|
||||
default: 5
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
step: 1.0
|
||||
min_color_temp:
|
||||
name: Minimum kleurtemperatuur (K)
|
||||
default: 2200
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
step: 1.0
|
||||
max_color_temp:
|
||||
name: Maximum kleurtemperatuur (K)
|
||||
default: 4000
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
step: 1.0
|
||||
color_temp_step:
|
||||
name: Kleurtemperatuur stap (K)
|
||||
default: 100
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
step: 1.0
|
||||
color_hue_step:
|
||||
name: Hue stap (graden, 0..360)
|
||||
default: 4
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
step: 1.0
|
||||
color_saturation:
|
||||
name: Saturation (%)
|
||||
default: 100
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
step: 1.0
|
||||
on_hold_delay:
|
||||
name: On-hold delay (sec)
|
||||
default: 0.1
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
step: 0.1
|
||||
volume_step_pct:
|
||||
name: Volume stap (%)
|
||||
default: 2
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
step: 1.0
|
||||
volume_max_pct:
|
||||
name: Max volume (%)
|
||||
default: 50
|
||||
selector:
|
||||
number:
|
||||
mode: box
|
||||
step: 1.0
|
||||
source_url: https://raw.githubusercontent.com/BoGu5/ha-blueprints/a688916fc161affcb2577e1ed90bb4f7ecf778fb/kea%20BILRESA%20scroll%20wheel%20(sensors%20for%20scroll%2C%20events%20for%20press)
|
||||
alias: Ikea_BILRESA_scroll_wheel
|
||||
mode: queued
|
||||
max: 50
|
||||
max_exceeded: silent
|
||||
trigger:
|
||||
- trigger: event
|
||||
event_type: state_changed
|
||||
event_data:
|
||||
entity_id: '{{ var_press_event_ch1 }}'
|
||||
id: press_ch1
|
||||
- trigger: event
|
||||
event_type: state_changed
|
||||
event_data:
|
||||
entity_id: '{{ var_press_event_ch2 }}'
|
||||
id: press_ch2
|
||||
- trigger: event
|
||||
event_type: state_changed
|
||||
event_data:
|
||||
entity_id: '{{ var_press_event_ch3 }}'
|
||||
id: press_ch3
|
||||
- trigger: event
|
||||
event_type: state_changed
|
||||
event_data:
|
||||
entity_id: '{{ var_scroll_right_sensor_ch1 }}'
|
||||
id: scroll_right_ch1
|
||||
- trigger: event
|
||||
event_type: state_changed
|
||||
event_data:
|
||||
entity_id: '{{ var_scroll_right_sensor_ch2 }}'
|
||||
id: scroll_right_ch2
|
||||
- trigger: event
|
||||
event_type: state_changed
|
||||
event_data:
|
||||
entity_id: '{{ var_scroll_right_sensor_ch3 }}'
|
||||
id: scroll_right_ch3
|
||||
- trigger: event
|
||||
event_type: state_changed
|
||||
event_data:
|
||||
entity_id: '{{ var_scroll_left_sensor_ch1 }}'
|
||||
id: scroll_left_ch1
|
||||
- trigger: event
|
||||
event_type: state_changed
|
||||
event_data:
|
||||
entity_id: '{{ var_scroll_left_sensor_ch2 }}'
|
||||
id: scroll_left_ch2
|
||||
- trigger: event
|
||||
event_type: state_changed
|
||||
event_data:
|
||||
entity_id: '{{ var_scroll_left_sensor_ch3 }}'
|
||||
id: scroll_left_ch3
|
||||
condition:
|
||||
- condition: template
|
||||
value_template: "{% set o = trigger.event.data.old_state %} {% set n = trigger.event.data.new_state
|
||||
%} {{ o is not none and n is not none\n and o.state not in ['unavailable','unknown']\n
|
||||
\ and n.state not in ['unavailable','unknown'] }}"
|
||||
variables:
|
||||
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
|
||||
var_min_pct: !input dim_min_pct
|
||||
var_dim_step_pct: !input dim_step_pct
|
||||
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_on_hold_delay: !input on_hold_delay
|
||||
var_volume_step_pct: !input volume_step_pct
|
||||
var_volume_max_pct: !input volume_max_pct
|
||||
action:
|
||||
- variables:
|
||||
channel: '{% if trigger.id in [''press_ch1'',''scroll_left_ch1'',''scroll_right_ch1'']
|
||||
%}ch1 {% elif trigger.id in [''press_ch2'',''scroll_left_ch2'',''scroll_right_ch2'']
|
||||
%}ch2 {% elif trigger.id in [''press_ch3'',''scroll_left_ch3'',''scroll_right_ch3'']
|
||||
%}ch3 {% else %}unknown{% endif %}'
|
||||
is_press: '{{ trigger.id is match(''^press_'') }}'
|
||||
is_scroll: '{{ trigger.id is match(''^scroll_'') }}'
|
||||
scroll_dir: '{% if trigger.id in [''scroll_left_ch1'',''scroll_left_ch2'',''scroll_left_ch3'']
|
||||
%}left {% elif trigger.id in [''scroll_right_ch1'',''scroll_right_ch2'',''scroll_right_ch3'']
|
||||
%}right {% else %}none{% endif %}'
|
||||
pulse_rising: '{% set o = trigger.event.data.old_state.state %} {% set n = trigger.event.data.new_state.state
|
||||
%} {{ (o in [''0'',''off''] and n in [''1'',''on'']) }}'
|
||||
scroll_steps: '{{ 1 if (is_scroll and pulse_rising) else 0 }}'
|
||||
press_event_type: "{% if is_press %}\n {{ trigger.event.data.new_state.attributes.event_type
|
||||
| default('') }}\n{% else %}\n {{ '' }}\n{% endif %}"
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ is_press and press_event_type == ''multi_press_1'' }}'
|
||||
sequence:
|
||||
- choose:
|
||||
- conditions: '{{ channel == ''ch1'' }}'
|
||||
sequence: !input click_action_ch1
|
||||
- conditions: '{{ channel == ''ch2'' }}'
|
||||
sequence: !input click_action_ch2
|
||||
- conditions: '{{ channel == ''ch3'' }}'
|
||||
sequence: !input click_action_ch3
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ is_press and press_event_type == ''multi_press_2'' }}'
|
||||
sequence:
|
||||
- choose:
|
||||
- conditions: '{{ channel == ''ch1'' }}'
|
||||
sequence: !input double_click_action_ch1
|
||||
- conditions: '{{ channel == ''ch2'' }}'
|
||||
sequence: !input double_click_action_ch2
|
||||
- conditions: '{{ channel == ''ch3'' }}'
|
||||
sequence: !input double_click_action_ch3
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ is_press and press_event_type == ''long_press'' }}'
|
||||
sequence:
|
||||
- choose:
|
||||
- conditions: '{{ channel == ''ch1'' }}'
|
||||
sequence:
|
||||
- sequence: !input long_click_action_ch1
|
||||
- repeat:
|
||||
while: "{{ repeat.index < 500\n and state_attr(var_press_event_ch1,
|
||||
'event_type') == 'long_press' }}"
|
||||
sequence:
|
||||
- sequence: !input on_hold_action_ch1
|
||||
- delay: '{{ var_on_hold_delay }}'
|
||||
- conditions: '{{ channel == ''ch2'' }}'
|
||||
sequence:
|
||||
- sequence: !input long_click_action_ch2
|
||||
- repeat:
|
||||
while: "{{ repeat.index < 500\n and state_attr(var_press_event_ch2,
|
||||
'event_type') == 'long_press' }}"
|
||||
sequence:
|
||||
- sequence: !input on_hold_action_ch2
|
||||
- delay: '{{ var_on_hold_delay }}'
|
||||
- conditions: '{{ channel == ''ch3'' }}'
|
||||
sequence:
|
||||
- sequence: !input long_click_action_ch3
|
||||
- repeat:
|
||||
while: "{{ repeat.index < 500\n and state_attr(var_press_event_ch3,
|
||||
'event_type') == 'long_press' }}"
|
||||
sequence:
|
||||
- sequence: !input on_hold_action_ch3
|
||||
- delay: '{{ var_on_hold_delay }}'
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ is_scroll and scroll_steps > 0 and scroll_dir in [''left'',''right'']
|
||||
}}'
|
||||
sequence:
|
||||
- repeat:
|
||||
for_each: '{{ (targets_entities_ch1 if channel == ''ch1'' else (targets_entities_ch2
|
||||
if channel == ''ch2'' else targets_entities_ch3)) }}'
|
||||
sequence:
|
||||
- choose:
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ (scroll_wheel_mode_ch1 if channel == ''ch1'' else
|
||||
(scroll_wheel_mode_ch2 if channel == ''ch2'' else scroll_wheel_mode_ch3))
|
||||
== ''lights: dim'' }}'
|
||||
sequence:
|
||||
- if:
|
||||
- condition: template
|
||||
value_template: '{{ is_state(repeat.item, ''on'') }}'
|
||||
then:
|
||||
- action: light.turn_on
|
||||
target:
|
||||
entity_id: '{{ repeat.item }}'
|
||||
data:
|
||||
brightness_step_pct: "{% if scroll_dir == 'right' %}\n {{ scroll_steps
|
||||
* var_dim_step_pct }}\n{% else %}\n {{ -1 * ([scroll_steps *
|
||||
var_dim_step_pct,\n state_attr(repeat.item, 'brightness')
|
||||
* 100 / 254 - var_min_pct] | min) }}\n{% endif %}"
|
||||
transition: 0.1
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: "{% set mode = (scroll_wheel_mode_ch1 if channel ==
|
||||
'ch1' else (scroll_wheel_mode_ch2 if channel == 'ch2' else scroll_wheel_mode_ch3))
|
||||
%} {{ mode == 'lights: color temp only'\n or (mode == 'lights: color
|
||||
temp and color hue' and state_attr(repeat.item, 'color_temp_kelvin')
|
||||
is not none) }}"
|
||||
sequence:
|
||||
- action: script.light_color_temp_helper
|
||||
data:
|
||||
mode: '{{ ''down'' if scroll_dir == ''left'' else ''up'' }}'
|
||||
min_color_temp: '{{ var_min_color_temp }}'
|
||||
max_color_temp: '{{ var_max_color_temp }}'
|
||||
color_temp_step: '{{ var_color_temp_step * scroll_steps }}'
|
||||
target_light: '{{ repeat.item }}'
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: "{% set mode = (scroll_wheel_mode_ch1 if channel ==
|
||||
'ch1' else (scroll_wheel_mode_ch2 if channel == 'ch2' else scroll_wheel_mode_ch3))
|
||||
%} {{ mode == 'lights: color hue only'\n or (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 }}'
|
||||
color_hue_step: '{{ var_color_hue_step * scroll_steps }}'
|
||||
color_saturation: '{{ var_color_saturation }}'
|
||||
mode: '{{ ''down'' if scroll_dir == ''left'' else ''up'' }}'
|
||||
- conditions:
|
||||
- condition: template
|
||||
value_template: '{{ (scroll_wheel_mode_ch1 if channel == ''ch1'' else
|
||||
(scroll_wheel_mode_ch2 if channel == ''ch2'' else scroll_wheel_mode_ch3))
|
||||
== ''media: volume control'' }}'
|
||||
sequence:
|
||||
- action: media_player.volume_set
|
||||
target:
|
||||
entity_id: '{{ repeat.item }}'
|
||||
data:
|
||||
volume_level: "{{ [[\n (state_attr(repeat.item, 'volume_level')
|
||||
| float(0)) * 100\n + (1 if scroll_dir == 'right' else -1) *
|
||||
scroll_steps * var_volume_step_pct,\n var_volume_max_pct\n ]
|
||||
| min, 0] | max / 100 }}"
|
||||
trigger_variables:
|
||||
var_remote: !input remote
|
||||
var_press_event_ch1: "{% for item in device_entities(var_remote) %}\n {% set m
|
||||
= item | regex_findall(find='^event\\\\..+_3$') %}\n {% if m | length > 0 %}{{
|
||||
m[0] }}{% endif %}\n{% endfor %}"
|
||||
var_press_event_ch2: "{% for item in device_entities(var_remote) %}\n {% set m
|
||||
= item | regex_findall(find='^event\\\\..+_6$') %}\n {% if m | length > 0 %}{{
|
||||
m[0] }}{% endif %}\n{% endfor %}"
|
||||
var_press_event_ch3: "{% for item in device_entities(var_remote) %}\n {% set m
|
||||
= item | regex_findall(find='^event\\\\..+_9$') %}\n {% if m | length > 0 %}{{
|
||||
m[0] }}{% endif %}\n{% endfor %}"
|
||||
var_scroll_right_sensor_ch1: "{% for item in device_entities(var_remote) %}\n {%
|
||||
set m = item | regex_findall(find='^sensor\\\\..+current_switch_position_1$')
|
||||
%}\n {% if m | length > 0 %}{{ m[0] }}{% endif %}\n{% endfor %}"
|
||||
var_scroll_left_sensor_ch1: "{% for item in device_entities(var_remote) %}\n {%
|
||||
set m = item | regex_findall(find='^sensor\\\\..+current_switch_position_2$')
|
||||
%}\n {% if m | length > 0 %}{{ m[0] }}{% endif %}\n{% endfor %}"
|
||||
var_scroll_right_sensor_ch2: "{% for item in device_entities(var_remote) %}\n {%
|
||||
set m = item | regex_findall(find='^sensor\\\\..+current_switch_position_4$')
|
||||
%}\n {% if m | length > 0 %}{{ m[0] }}{% endif %}\n{% endfor %}"
|
||||
var_scroll_left_sensor_ch2: "{% for item in device_entities(var_remote) %}\n {%
|
||||
set m = item | regex_findall(find='^sensor\\\\..+current_switch_position_5$')
|
||||
%}\n {% if m | length > 0 %}{{ m[0] }}{% endif %}\n{% endfor %}"
|
||||
var_scroll_right_sensor_ch3: "{% for item in device_entities(var_remote) %}\n {%
|
||||
set m = item | regex_findall(find='^sensor\\\\..+current_switch_position_7$')
|
||||
%}\n {% if m | length > 0 %}{{ m[0] }}{% endif %}\n{% endfor %}"
|
||||
var_scroll_left_sensor_ch3: "{% for item in device_entities(var_remote) %}\n {%
|
||||
set m = item | regex_findall(find='^sensor\\\\..+current_switch_position_8$')
|
||||
%}\n {% if m | length > 0 %}{{ m[0] }}{% endif %}\n{% endfor %}"
|
||||
Reference in New Issue
Block a user