Template сенсор в Home Assistant

Иногда появлятеся необходимость создать в Home Assistant новый сенсор значение которого — это что-то расчетное. Например, может понадобиться создать сенсор значение которого — это атрибут другого сенсора или результат какой-то математическкой операции. Для это существует специальный инструмент — template сенсор — шаблонный сенсор.

В Home Assistant активно используется инструмент для работы с шаблонами который называется Jinja2. Это не собственная разрабтка Home Assistant, это весьма привычная вещь для языка программирования питон. Jinja2 — достаточно большой и сложный инструмент, но в двух словах — нужно записывать выражение внутри фигурных скобок, вот пример:

{{ 2 + 3 }}

Результат этого шаблона — это число 5.

Перед тем как использовать шаблон в template сенсоре очень удобно его протестировать в специальном инструменете которые есть в Home Assistant. Он находится по адресу homeassistant.local:8123/developer-tools/template

Дополнительная информация про использование шаблонов есть в этой статье.

Создать сенсор со значением атрибута

У меня есть zigbee розетка BlitzWolf BW-SHP13. Она подключена в Home Assistant с помощью zigbee2mqtt. В Home Assistant автоматически появляется несколько разных сенсоров, например sensor.0x842e14fffe1393a2_power Вот как выглядит этот сенсор в инструменте проверки состояния:

Есть статус (в данный момент — это число 0), и куча разных атрибутов. Я хочу создать отдельный сенсор, значение которого — это значение атрибута energy. Для этого нужно написать вот такой конфиг:

sensor:
  - platform: template
    sensors:
      total_energy_pump:
        unit_of_measurement: kWh
        value_template: "{{ state_attr('sensor.0x842e14fffe1393a2_power', 'energy') }}"

После перезпуска Home Assistant повяляется новый сенсор — sensor.total_energy_pump, значение которого 77.13 — то же самое число которе содержится в атрибуте energy.

Как только меняется атрибут energy у сенсора sensor.0x842e14fffe1393a2_power значение нового сенсора автоматически меняется.

Рассчет абсолютной влажности

Вот пример создания сенсора который рассчитывает абсолюную влажность в ванной. Этот сенсор использует значения с двух сенсоров (у меня эти данные отдает Aqara climate sensor):

  • sensor.0x00158d0004605ef0_humidity — данные про относительную влажность в ванной
  • sensor.0x00158d0004605ef0_temperature — данные про температуру в ванной
sensor:
  - platform: template
    sensors:
      bathroom_abs_hum:
        unit_of_measurement: "g/m³"
        value_template: >-
          {% set h, t = states('sensor.0x00158d0004605ef0_humidity') | float, states('sensor.0x00158d0004605ef0_temperature') %}
          {% if not h or t == 'unknown' -%}
            'unknown'
          {%- else %}
           {% set t = t | float %}
           {{ (h*6.112*2.1674*e**((t*17.67)/(t+243.5))/(t+273.15))|round(2) }}
          {% endif %}

Перевести значение кВтч в рубли

Если у вас есть сенсор в котором содержится данные про то сколько было израсходовано кВтч за сегодня (например, с помощью utility_meter, то можно посчитать сколько это стоит в рублях с помощью следующих сенсоров.

При использовании однотарифного учета:

sensor:
  - platform: template
    sensors:
      cost_today:
        friendly_name: "Стоимость электричества сегодня"
        icon_template: mdi:currency-rub
        unit_of_measurement: "руб."
        value_template: "{{ (states('sensor.daily_energy_pzem') | float * 3.96) | round(2) }}"

При использовании двухтарифного учета:

sensor:
  - platform: template
    sensors:
      cost_today:
        friendly_name: "Стоимость электричества сегодня"
        icon_template: mdi:currency-rub
        unit_of_measurement: "руб."
        value_template: "{{ ( (states('sensor.daily_energy_pzem_tariff_night') | float) * 2.32 + (states('sensor.daily_energy_pzem_tariff_day') | float) * 4.55) | round(2) }}"

Использование кавычек и других символов

Шаблон записывается в поле value_template. Обычно когда шаблон помещается в одну строчку, то он записывается в кавычках:

sensor:
  - platform: template
    sensors:
      test:
        value_template: "{{ 22 * 11 }}"

Но если шаблон состоит из нескольких строк, то удобнее его записывать с помощью других символов. Очень часто используется вариант >-

Разница между этими вариантами — это то как происходит работа с пробельными символами. Подрбности есть на сайте https://yaml-multiline.info.

Вот пример:

sensor:
  - platform: template
    sensors:
      t1:
        value_template: >
          {{ "раз" }}
          {{ "два" }}
          {{ "три" }}

  - platform: template
    sensors:
      t2:
        value_template: |
          {{ "раз" }}
          {{ "два" }}
          {{ "три" }}

Новый синтаксис

В 2021 году в Home Assistant появился новый синтаксис для описания template сенсоров, вот пример:

template:
  - sensor:
      - name: "Average temperature"
        unit_of_measurement: "°C"
        state: >
          {% set bedroom = states('sensor.bedroom_temperature') | float %}
          {% set kitchen = states('sensor.kitchen_temperature') | float %}

          {{ ((bedroom + kitchen) / 2) | round(1) }}

У этого способа описания есть большой недостаток — он не работает при использовании в packages.

Про это постоянно пишут тикета на GitHub (например, вот пример тикета), но разработчки HA говорят что это не баг, а так и задуманно и похоже что не собираются это исправлять.

У меня есть большие сомнения что нужно использовать новый синтаксис.

Редактировать страницу на GitHub