---
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
```