- Принудительное обновление данных сенсоров из Home Assistant в InfluxDB для красивых графиков в Grafana
- Настройка Home Assistant: начало. File Editor. Настройка интерфейса
- Установка File Editor
- Configuration.yaml
- Добавление сенсоров
- Настройка интерфейса
- Сенсор открытого внешнего порта для Home Assistant
- Template сенсор в Home Assistant
- Создать сенсор со значением атрибута
- Рассчет абсолютной влажности
- Перевести значение кВтч в рубли
- Создание template сенсора с атрибутами
- Использование кавычек и других символов
- Новый синтаксис
Принудительное обновление данных сенсоров из Home Assistant в InfluxDB для красивых графиков в Grafana
В этой статье я опишу результат долгих изысканий и решения довольно нетривиальной задачи, которая в Node RED решается за три минуты, а в Home Assistant на её решение ушло почти 6 часов поисков в интернете и переделывания найденных решений.
Исходное состояние системы:
- есть котел, который управляется реле Sonoff через сухой контакт;
- к этому реле подключен датчик температуры, который измеряет температуру теплоносителя;
- в доме находится еще одно реле Sonoff с подключенным датчиком температуры;
- есть показания уличной температуры, которые берутся из стандартного сенсора Weather, который штатно есть в HA.
- Отобразить показания всех датчиков температуры и состояние котла (включен или выключен) на графиках, с длительной историей и возможностью масштабирования в необходимых пределах.
Казалось бы, что может быть проще? Однако не так все просто, как думалось изначально.
Sonoff подключены через Sonoff LAN и интеграцию от уважаемого AlexxIT. Все отлично интегрируется, с оговорками на косяки родных прошивок Sonoff и невозможности локально отдавать данные датчиков, которые приходится подтягивать из облака.
Данные обновляются с периодичностью в 10 секунд, так как изменения температуры теплоносителя довольно стремительны. А вот показания температуры в помещении изменяются довольно редко. И выяснилась одна проблема. Если данные состояния датчика не менялись — система считает, что ничего не происходит, и не записывает точки в базы. Ни в родные, ни во внешние. И мы видим довольно грустную картину:
К тому же хочется, чтобы на одном графике были видны совместные состояния всех датчиков и котла. Для этого придется поставить InfluxDB и Grafana. Как их настраивать я тут описывать не буду, но там все просто и понятно из стандартных мануалов.
После развёртывания Grafana и просмотра базы выяснилось, что такая же ситуация с отдачей данных в InfluxDB и, соответственно, в Grafana графики тоже «рваные». Правда можно соединить нулевые сегменты между собой и получить переходную линию, но если, например, вы строите график за час, а в течение этого часа показания датчика не менялись — его просто не будет видно на графике и вы не узнаете, в каком состоянии он находился.
В итоге, единственным способом привести графики в целевое состояние, оказалось принудительное обновление данных и передача их в InfluxDB. Но стандартных средств для этого найдено не было.
Путём очень долгих изучений, тестов и различных изменений конфигурации, был найден вариант, который делает то, что нужно в требуемых рамках.
Для начала нам потребуются искусственно созданные сенсоры на базе темплейтов. Для этого в файл configuration.yaml необходимо добавить:
Где sensor.sonoff_kotel_temperature и другие датчики — это реальные сенсоры, которые уже есть в системе. В моем случае — добавленные интеграцией Sonoff LAN. Мы берем реальные данные из них и присваиваем их значение в поле атрибута temp (или on_state в случае с реле) в создаваемых сенсорах.
И да, тут потребуется несколько пояснений.
Во-первых, зачем два сенсора уличной температуры? По причине того, что на главном экране Home Assistant мы хотим видеть показания температуры в чистом виде. А со всеми этими сенсорами, кроме street_temperature, мы будем производить манипуляции, которые этого сделать не позволят.
Во- вторых, у нас появляется сенсор boiler_state, который нужен нам для отражения состояния включенности котла. Так как графики строятся в пределах комнатной температуры (плюс-минус), что нам дает разброс по оси Y от 0 до 30 и выше (в летнее время), то отражение включенного котла в режиме: 0 — выключен, 1 — включен, на графике будет читаться очень плохо.
Поэтому мы меняем состояние датчика в момент включение котла и присваиваем ему значение равное 50, чтобы на графиках была четкая и понятная картина, что происходило, когда котел включен или выключен.
А дальше мы делаем хитрый ход. Дело в том, что Home Assistant отдает данные в InfluxDB только при изменении основного состояния датчика. То есть если даже меняются атрибуты, но не меняются основные показания — данные не передаются. Именно поэтому нам нужен механизм принудительного изменения показаний датчика, чтобы этому ничего не мешало.
И именно поэтому, фактические показания датчиков температуры из Sonoff, в данных виртуальных сенсорах прописываются в атрибуты, а не в основной state, так как мы именно его и будем менять.
Для того, чтобы их менять, нам потребуется скрипт на питоне и автоматизация, которая будет его использовать.
Скрипт необходимо разметить в папке python_scripts в основном каталоге Home Assistant. Если папки нет, её нужно просто создать.
Источник
Настройка Home Assistant: начало. File Editor. Настройка интерфейса
Все настройки внешнего вида, конфигураций и сценариев в Home Assistant можно выполнить как через web-интерфейс, так и вручную, прописывая все в конфигурационных файлах. Очень рекомендую пользоваться именно вторым способом.
Для написания всего и вся в Home Assistant используется язык YAML. Тут важно запомнить два момента:
-
- При внесении правок в конфигурацию, написании сценариев и других действиях нужно обязательно соблюдать правила вложенности и правильно проставлять отступы. Более подробно я расскажу об этом далее, когда будем вносить правки в конфигурационный файл.
- После внесения необходимых изменений, Home Assistant нужно перезапускать для их применения (за исключением изменений интерфейса). Так вот, перед каждой перезагрузкой нужно обязательно выполнять проверку конфигурации. А для того, чтобы она была доступна, нужно включить расширенный режим:
После его включения в настройках появится кнопка «Проверить конфигурацию». Соответственно сначала вносим необходимые изменения, проверяем в редакторе кода (который установим далее), что все ОК:
Далее переходим по пути «Настройки» -> «Сервер»:
И выполняем проверку. Если все хорошо, то нажимаем «Перезапустить» чуть ниже:
Установка File Editor
Для редактирования файлов конфигурации скачиваем и устанавливаем File Editor из Add-on Store:
Выбираем его, нажимаем Install, ожидаем завершения установки, после чего запускаем нажатием на кнопку Start и включаем Show in sidebar (выносит иконку запуска редактора в сайдбар слева).
После установки можно переходить к первоначальной настройке. Основной файл, в котором описаны все настройки – Configuration.yaml. Так что запускаем File Editor и открываем данный файл (скорее всего он откроется по умолчанию).
Configuration.yaml
Для создания файлов и папок, а также перехода между ними, нажимаем Browse Filesystem в File Editor:
Я создал папку myconfig (имя может быть любое) и уже в ней буду создавать все файлы конфигурации. Удаляем все стандартные файлы (groups.yaml, scenes.yaml, automations.yaml, scripts.yaml) из корневой папки и создаем новую папку и уже в ней файлы groups.yaml, scenes.yaml и папки sensor и automation.
Далее открываем файл configuration.yaml и добавляем туда строчки, как показано в примере ниже (выделил красным). Первый блок открывает возможность конфигурировать интерфейс через конфигурационный файл, второй – указывает пути до новых файлов и папок (myconfig меняем на название Вашей папки).
Добавление сенсоров
Первое, что можно сделать – вывести различную информация о состоянии сервера на главный экран. Для этого переходим в папку sensor и создаем там файл sysmonitor.yaml (название может быть любым). В нем – прописываем нужные нам сенсоры, список которых можно взять тут. Прописываем со всеми пробелами, как в примере ниже:
Настройка интерфейса
Создаем файл с именем ui-lovelace.yaml в папке, где и configuration.yaml. В него будем прописывать все настройки интерфейса. Ниже – пример моего файла, в который я добавил сенсоры из прошлого пункта и написал комментарии к большинству строчек. Найти имя нужного сенсора, его атрибуты и текущее состояние можно в панели разработчика во вкладке «Состояния»:
В итоге получился вот такой вот главный экран:
- Возможные типы карточек можно посмотреть в официальной документации (в правой колонке щелкаете по названиям ниже Cards). Там есть скриншоты и гифки, показывающие как они выглядят, а также список возможных параметров (на английском) и примеры кода.
- Доступные иконки можно найти щелкнув в редакторе кода на шестеренку и выбрав Material Icons в выпадающем списке. Далее, на открывшемся сайте в поле Search вводим что нужно найти (на английском), выбираем понравившуюся иконку и копируем ее имя. Обратите внимание, что все иконки прописываются так: icon: mdi:имя_иконки. После двоеточия, перед именем иконки пробела нет. И не забываем про mdi: перед именем.
- Обратите внимание на вложенность и пробелы в примере выше. Например, карточки, относящиеся к type: vertical-stack идут с выносом пробелами. Ниже идет горизонтальная группировка – type: horizontal-stack. Она вынесена от вертикальной (т к относится к ней) и все карточки, которые относятся к горизонтальной вынесены относительно нее. Если не соблюсти правила вложенности, то Home Assistant выдаст ошибку.
- Обязательные атрибуты, которые необходимо прописать карточке или сущности в официальной документации помечены словом REQUIRED . Опциональные – optional .
- После редактирования конфигурации не забывайте нажимать на иконку «Сохранить», появляющуюся в правом верхнем углу:
При редактировании интерфейса дополнительно выполнять проверку конфигурации и перезагружать сервер не нужно.
Источник
Сенсор открытого внешнего порта для Home Assistant
Большинство провайдеров всегда выдают своим пользователям динамические IP-адреса. Иногда адреса бывают белыми, иногда серыми. Некоторые провайдеры выдают белые/серые адреса через раз.
В примере ниже показаны несколько полезных сенсоров:
- сенсор вашего публичного IP-адреса, обновляется раз в 2 минуты
- сенсор открытого порта, обновляется автоматизацией при изменении IP-адреса
- сенсоры скорости Интернета, обновляется раз в час
И несколько полезных скриптов:
- принудительное обновление всех сенсоров по кнопке
- перезагрузка главного роутера (для получения нового IP-адреса)
Для перезагрузки роутера используется мой кастомный компонент PythonScriptPro. Он позволяет добавлять в Home Assistant любую логику на языке Python. А также пользоваться любыми внешними библиотеками Python, в том числе устанавливать эти библиотеке в Docker контейнер, если вы пользуетесь Hass.io.
Конечно именно для вашего роутера команда будет совсем другой, не стоит бездумно копировать мой вариант.
PS. У меня в примере открытый порт обновляется раз в сутки или автоматизацией при смене IP-адреса. Просьба не злоупотреблять этим интервалом. А то сайт 2ip.ru обидится на нас всех и вообще заблокирует эту возможность.
PS. В примере показано принудительное обновление сенсоров. Таким подходом можно пользоваться с любыми объектами в Home Assistant, данные которых обновляются по времени.
Источник
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. Для этого нужно написать вот такой конфиг:
После перезпуска Home Assistant повяляется новый сенсор — sensor.total_energy_pump, значение которого 77.13 — то же самое число которе содержится в атрибуте energy.
Как только меняется атрибут energy у сенсора sensor.0x842e14fffe1393a2_power значение нового сенсора автоматически меняется.
Рассчет абсолютной влажности
Вот пример создания сенсора который рассчитывает абсолюную влажность в ванной. Этот сенсор использует значения с двух сенсоров (у меня эти данные отдает Aqara climate sensor):
- sensor.0x00158d0004605ef0_humidity — данные про относительную влажность в ванной
- sensor.0x00158d0004605ef0_temperature — данные про температуру в ванной
Перевести значение кВтч в рубли
Если у вас есть сенсор в котором содержится данные про то сколько было израсходовано кВтч за сегодня (например, с помощью utility_meter, то можно посчитать сколько это стоит в рублях с помощью следующих сенсоров.
При использовании однотарифного учета:
При использовании двухтарифного учета:
Создание template сенсора с атрибутами
Можно создать сенсор и управлять не только содержимым стейта, но и тем что содержится в атрибутах. Вот пример:
Использование кавычек и других символов
Шаблон записывается в поле value_template. Обычно когда шаблон помещается в одну строчку, то он записывается в кавычках:
Но если шаблон состоит из нескольких строк, то удобнее его записывать с помощью других символов. Очень часто используется вариант >-
Разница между этими вариантами — это то как происходит работа с пробельными символами. Подрбности есть на сайте https://yaml-multiline.info.
Новый синтаксис
В 2021 году в Home Assistant появился новый синтаксис для описания template сенсоров, вот пример:
У этого способа описания есть большой недостаток — он не работает при использовании в packages.
Про это постоянно пишут тикета на GitHub (например, вот пример тикета), но разработчки HA говорят что это не баг, а так и задуманно и похоже что не собираются это исправлять.
У меня есть большие сомнения что нужно использовать новый синтаксис.
Источник