Использование шаблонов в Home Assistant

В системе умного дома Home Assistant в куче мест используются шаблоны (templates). Например, можно отправить сообщение в мессенджер и там указать значение какого-нибудь сенсора. Или создать новый сенсор значение которого это будет атрибут другого сенсора.

В разделе Developer Tools -> Template есть специальный инструмент, с помощью которого можно проверить как работают шаблоны. Этот инструмент находится по адресу http://hassio.local:8123/developer-tools/template И на этой странице даже показаны какие-то примеры, но когда я впервые столкнулся с шаблонами Home Assistant мне эти примеры мало помогли.

Давайте, начнем с самого начала.

Итак, есть какая штука в Home Assistant. У этой штуки есть 2 вещи:

Например, в Home Assistant есть информация про солнце. "sun.sun". С помощью инструмента Developer Tools -> States ( http://hassio.local:8123/developer-tools/state ) хорошо видно текущий статус и атрибуты:

Статус: "above_horizon"

Атрибуты:

next_dawn: '2020-04-08T04:23:05+00:00'
next_dusk: '2020-04-07T18:59:37+00:00'
next_midnight: '2020-04-07T23:42:09+00:00'
next_noon: '2020-04-08T11:42:16+00:00'
next_rising: '2020-04-08T04:58:27+00:00'
next_setting: '2020-04-07T18:24:22+00:00'
elevation: 12.51
azimuth: 266.07
rising: false
friendly_name: Sun

Получить state в шаблоне

Вот пример шаблона, который отображает state:

Sun state is "{{ states('sun.sun') }}"

И этот шаблон превратится в:

Sun state is "above_horizon"

Вообще, еще можно использовать и такой шаблон: "{{ states.sun.sun.state }}", в большинстве случаев он будет работать точно так же. Но такую форму записи настоятельно не рекомендуется использовать: есть ситуации когда это работает неправильно, так что если нужно получить состояние элемента, то всегда стоит использовать states('...')

Получить значение атрибута в шаблоне

Вот как получить значение атрибута 'elevation' элемента "sun.sun":

Sun elevation is "{{ state_attr('sun.sun', 'elevation') }}"

Это покажет:

Sun elevation is "12.51"

И для получения значения атрибута тоже есть другой способ (но который использовать не нужно):

{{ states.sun.sun.attributes.elevation }}

Использование условий в шаблоне

Иногда необходимо чтобы результат работы шаблона как-то отличался в зависимости от условий. Вот пример, который выдает разный текст в зависимости от статуса элемента "sun.sun":

{% if states('sun.sun') == 'above_horizon' %}
Солнце тут
{% else %}
Солнце там
{% endif %}

Если статус "sun.sun" это строка 'above_horizon', то тогда будет выведен первый текст, а если статус как-той другой, то текст, который расположен после "{% else %}"

Вообще, вроде как считается что более правильно проверку записывать иначе:

{% if is_state('sun.sun', 'above_horizon') %}
Солнце тут
{% else %}
Солнце там
{% endif %}

Разница только в первой строчке. Используется не оператор сравнения, а специальный метод, который возвращает True или False. Но, насколько я знаю, оба эти варианта работает абсолютно одинаково. Мне проще читать вариант с оператором сравнения, так что я обычно использую первый вариант.

Использование регулярных выражений

Регулярные выражения — это очень мощный способ как-то преобразовать строку. Достать ее часть или превратить во что-то другое. Вот пример использования регулярного выражения:

{{ state_attr('sun.sun','next_setting') | regex_findall_index('[\d-]+') }}

Результат работы этого шаблона:

2020-04-07

Значение атрибута "next_setting" это строка '2020-04-07T18:24:22+00:00'. Регулярное '[\d-]+' достанет из строки максимально длинный блок цифр и символов минус начиная с самого начала строки.

Создание template сенсора

В configuration.yaml записываем:

sensor:
  - platform: template
    sensors:
      solar_angle:
        value_template: "{{ state_attr('sun.sun', 'elevation') }}"

Перезапускаем HA и после этого в системе появляется новая сущность "sensor.solar_angle" значение которого — это значение атрибута "elevation" у объекта "sun.sun":

Иван Бессарабов
ivan@bessarabov.ru

7 апреля 2020

Кстати, у меня есть телеграм канал про Home Assistant: https://t.me/bessarabov_ha