В системе умного дома 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:
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-]+' достанет из строки максимально длинный блок цифр и символов минус начиная с самого начала строки.
В configuration.yaml записываем:
sensor:
- platform: template
sensors:
solar_angle:
value_template: "{{ state_attr('sun.sun', 'elevation') }}"
Перезапускаем HA и после этого в системе появляется новая сущность "sensor.solar_angle" значение которого — это значение атрибута "elevation" у объекта "sun.sun":
7 апреля 2020
Кстати, у меня есть телеграм канал про Home Assistant: https://t.me/bessarabov_ha
|