Template сенсор в Home Assistant
Иногда появлятеся необходимость создать в Home Assistant новый сенсор значение которого — это
что-то расчетное. Например, может понадобиться создать сенсор значение которого — это атрибут другого сенсора
или результат какой-то математическкой операции. Для это существует специальный инструмент — template сенсор — шаблонный сенсор.
В Home Assistant активно используется инструмент для работы с шаблонами который называется Jinja2.
Это не собственная разрабтка Home Assistant, это весьма привычная вещь для языка
программирования питон. Jinja2 — достаточно большой и сложный инструмент, но в двух словах —
нужно записывать выражение внутри фигурных скобок, вот пример:
Результат этого шаблона — это число 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) }}"
Создание template сенсора с атрибутами
Можно создать сенсор и управлять не только содержимым стейта, но и тем что содержится в атрибутах. Вот пример:
input_text:
t_state:
t_attribute:
sensor:
- platform: template
sensors:
my:
value_template: "{{ states('input_text.t_state') }}"
attribute_templates:
a: "{{ states('input_text.t_attribute') }}"
Использование кавычек и других символов
Шаблон записывается в поле 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 говорят что это не баг, а так и задуманно и похоже что не собираются это исправлять.
У меня есть большие сомнения что нужно использовать новый синтаксис.