211 lines
6.9 KiB
Markdown
211 lines
6.9 KiB
Markdown
---
|
||
slug: using-variables-as-configuration-for-home-assistant-automation
|
||
title: "Using variables as configuration for Home Assistant automation"
|
||
tags: [smart home, Home Assistant, home automation]
|
||
image: /img/blog/2020/11/variables.jpeg
|
||
---
|
||
|
||
Home Assistant 0.115 got the ability to use variables in automation and scripts. You can declare variables even using templates and use them across the script or automation.
|
||
Here is an example from the release notes:
|
||
|
||
```yaml
|
||
automation:
|
||
trigger:
|
||
platform: sun
|
||
event: sunset
|
||
offset: -00:30
|
||
variables:
|
||
notification_service: notify.paulus_iphone
|
||
action:
|
||
- service: "{{ notification_service }}"
|
||
data:
|
||
message: Beautiful sunset!
|
||
```
|
||
<!-- truncate -->
|
||
It is very useful and fun feature but at first I didn’t realize how powerful it is. Today I want to show you an example how you can use variables as some sort of configuration for automation to avoid creating a lot of `if`s and automation to handle identical tasks.
|
||
|
||
I have a lot of ZigBee wall switches. Previously I had a separate automation to handle each of them. Every automation was handling:
|
||
|
||
- First button press – toggle the lights with max brightness
|
||
- Second button press – toggle the lights with low brightness
|
||
- First button long press – increase the brightnress
|
||
- Second button long press – decrease the brightness
|
||
|
||
After implementing `variables` for automation I decided to store the mapping of device id, event (represents the button pressed and the type of press: long or short), corresponding brightness and light `entity_id` in `variables` like this:
|
||
|
||
```yaml
|
||
variables:
|
||
device_map:
|
||
00:15:8d:00:02:cb:1a:9b:
|
||
light_entity_id: light.kitchen
|
||
brightness_buttons:
|
||
1001: -30
|
||
1002: 50
|
||
2001: 30
|
||
2002: 100
|
||
00:15:8d:00:02:c9:39:62:
|
||
light_entity_id: light.hallway
|
||
brightness_buttons:
|
||
1001: -30
|
||
1002: 55
|
||
2001: 30
|
||
2002: 100
|
||
00:15:8d:00:02:e9:fe:9e:
|
||
light_entity_id: light.living_room
|
||
brightness_buttons:
|
||
1001: 30
|
||
1002: 100
|
||
2001: -30
|
||
2002: 60
|
||
00:15:8d:00:02:cb:64:b4:
|
||
light_entity_id: light.hallway
|
||
brightness_buttons:
|
||
1001: 30
|
||
1002: 100
|
||
2001: -30
|
||
2002: 60
|
||
00:15:8d:00:02:c9:37:7d:
|
||
light_entity_id: light.bedroom
|
||
brightness_buttons:
|
||
1001: 30
|
||
1002: 100
|
||
2001: -30
|
||
2002: 24
|
||
00:15:8d:00:02:58:61:74:
|
||
light_entity_id: light.bathroom
|
||
brightness_buttons:
|
||
1001: 30
|
||
1002: 100
|
||
2001: -30
|
||
2002: 40
|
||
```
|
||
|
||
So now I can take the brightness value from my `device_map` by device id and event. Also, I can take `entity_id` of the light each wall switch should control.
|
||
|
||
Also when I’m toggling the light I need to use `brightness_pct` service data to set the brightness, but when changing the brightness I need to use `brightness_step_pct`. So I added another variable to set the brightness service data name:
|
||
|
||
```yaml
|
||
variables:
|
||
brightness_attr: '{% if (trigger.event.data[''event''] == 2001) or (trigger.event.data[''event'']== 1001) %}brightness_step_pct{% else %}brightness_pct{% endif %}'
|
||
```
|
||
|
||
So when the button held the event is `2001` or `1001` (first and second button) and I need `brightness_step_pct`. I’m getting `brightness_pct` in another case.
|
||
|
||
Now we can use all these variables in `action`:
|
||
|
||
```yaml
|
||
action:
|
||
- data:
|
||
'{{brightness_attr}}': '{{ device_map[trigger.event.data[''unique_id'']].brightness_buttons[trigger.event.data[''event'']]}}'
|
||
entity_id: '{{ device_map[trigger.event.data[''unique_id'']].light_entity_id}}'
|
||
service: light.{% if (trigger.event.data['event'] == 2001) or (trigger.event.data['event']== 1001) %}turn_on{% else %}toggle{% endif %}
|
||
```
|
||
|
||
Here we are using the most of variables – we are getting the right brightness value by the `unique_id` of our device and by the `event` that is representing the button and the type of press:
|
||
|
||
```
|
||
{{ device_map[trigger.event.data[''unique_id'']].brightness_buttons[trigger.event.data[''event'']]}}
|
||
```
|
||
|
||
Also, we are getting light `entity_id` by `unique_id` of the switch:
|
||
|
||
```
|
||
{{ device_map[trigger.event.data[''unique_id'']].light_entity_id}}
|
||
```
|
||
|
||
And the full automation:
|
||
|
||
```yaml
|
||
- id: wall_switch_handler
|
||
alias: Wall switch handler
|
||
trigger:
|
||
- event_data:
|
||
event: 1001
|
||
event_type: deconz_event
|
||
platform: event
|
||
- event_data:
|
||
event: 1002
|
||
event_type: deconz_event
|
||
platform: event
|
||
- event_data:
|
||
event: 2001
|
||
event_type: deconz_event
|
||
platform: event
|
||
- event_data:
|
||
event: 2002
|
||
event_type: deconz_event
|
||
platform: event
|
||
condition:
|
||
- condition: template
|
||
value_template: '{{''wall_switch'' in trigger.event.data[''id'']}}'
|
||
action:
|
||
- data:
|
||
'{{brightness_attr}}': '{{ device_map[trigger.event.data[''unique_id'']].brightness_buttons[trigger.event.data[''event'']]}}'
|
||
entity_id: '{{ device_map[trigger.event.data[''unique_id'']].light_entity_id}}'
|
||
service: light.{% if (trigger.event.data['event'] == 2001) or (trigger.event.data['event']
|
||
== 1001) %}turn_on{% else %}toggle{% endif %}
|
||
variables:
|
||
brightness_attr: '{% if (trigger.event.data[''event''] == 2001) or (trigger.event.data[''event'']
|
||
== 1001) %}brightness_step_pct{% else %}brightness_pct{% endif %}'
|
||
device_map:
|
||
00:15:8d:00:02:cb:1a:9b:
|
||
light_entity_id: light.kitchen
|
||
brightness_buttons:
|
||
1001: -30
|
||
1002: 50
|
||
2001: 30
|
||
2002: 100
|
||
00:15:8d:00:02:c9:39:62:
|
||
light_entity_id: light.hallway
|
||
brightness_buttons:
|
||
1001: -30
|
||
1002: 55
|
||
2001: 30
|
||
2002: 100
|
||
00:15:8d:00:02:e9:fe:9e:
|
||
light_entity_id: light.living_room
|
||
brightness_buttons:
|
||
1001: 30
|
||
1002: 100
|
||
2001: -30
|
||
2002: 60
|
||
00:15:8d:00:02:cb:64:b4:
|
||
light_entity_id: light.hallway
|
||
brightness_buttons:
|
||
1001: 30
|
||
1002: 100
|
||
2001: -30
|
||
2002: 60
|
||
00:15:8d:00:02:c9:37:7d:
|
||
light_entity_id: light.bedroom
|
||
brightness_buttons:
|
||
1001: 30
|
||
1002: 100
|
||
2001: -30
|
||
2002: 24
|
||
00:15:8d:00:02:58:61:74:
|
||
light_entity_id: light.bathroom
|
||
brightness_buttons:
|
||
1001: 30
|
||
1002: 100
|
||
2001: -30
|
||
2002: 40
|
||
initial_state: true
|
||
mode: parallel
|
||
max: 10
|
||
```
|
||
|
||
I have not only wall switches so I’m using template condition here to make sure the switch is the wall switch:
|
||
|
||
```yaml
|
||
condition:
|
||
- condition: template
|
||
value_template: '{{''wall_switch'' in trigger.event.data[''id'']}}'
|
||
```
|
||
|
||
Also, this automation should be able to run in parallel to make it possible to handle several switch clicks at the same time in different rooms by different persons:
|
||
|
||
```yaml
|
||
mode: parallel
|
||
max: 10
|
||
``` |