Умный дом в котором я живу. Работа с шаблонами
Все, кто начинает работать с Home Assistant рано или поздно сталкиваются с шаблонами.
И все хорошо до тех пор, пока количество вариантов не очень велико.
Но иногда сталкиваемся с ситуациями, когда вариантов слишком много, и приходится изобретать велосипед
Итак, практическая задача.
Наконец я вернул в строй свою метеостанцию.
Чем она замечательна? В режиме реального времени отдает метеоданные. Сейчас я ее завел только на публикацию данных в различные сервисы (weather underground, cwop, weathercloud, openweathermap).
Также настроил публикацию данных в MQTT, откуда данные можно затаскивать в Home Assistant.
Но тут возникли проблемы.
Метеостанция отдает направление ветра в градусах.
Но я не хочу в градусах, я хочу в румбах.
Для этого соберем такой шаблон:
- platform: template
sensors:
wind_direction:
friendly_name: "Направление ветра"
value_template: >
{% set direction = ['C','ССВ','СВ','ВСВ','В','ВЮВ','ЮВ','ЮЮВ','Ю','ЮЮЗ','ЮЗ','ЗЮЗ','З','ЗСЗ','СЗ','ССЗ','С'] %}
{% set degree = states('sensor.wind_dir')|float %}
{{ direction[((degree+11.25)/22.5)|int] }}
Что мы тут делаем?
1. создаем список румбов
2. вычисляем номер направления на основании показаний станции.
3. возвращаем элемент списка с найденным номером.
В общем, все просто и элегантно. Но годится для небольшого количества вариантов.
Дальше станция отдает прогноз погоды. Отдает в виде числового кода
Были найдены таблички описания этих кодов. Но там незадача - 198 значений.
Запоминать все прогнозы, чтоб потом как в анекдоте - не наш метод.
В который раз собирается одна и та же компания. Все анекдоты уже рассказаны, поэтому в компании решают рассказывать анекдоты по номерам. Вот сидят они, перешучиваются:
— Анекдот №325!
— Ха-ха-ха!
— Анекдот №719!
— Ха-ха-ха!
— Анекдот №18!
— Ха-ха-ха!
— Анекдот №133!
Молчание…
— Что такое? Анекдот №133!
Молчание…
— Чего вы это? Смешной же анекдот!
— Понимаешь… Одни умеют рассказывать анекдоты, а другие — нет…
Первоначально я замыслил сделать все через базу данных. Т.е. создается таблица, из нее на основе значений сенсора читаем расшифровку.
Но тут нас ждала засада. сенсоры платформы sql не поддерживают шаблоны, т.е
SELECT * FROM forecast_rules WHERE id = {{ states.sensor.forecast_rule.state }};
Не работает. Разрабы ответили:
idea is nice… but “with great powers comes great responsibility” that is a big target for an exploit…
В общем, со sql - облом.
Писать сенсор с шаблоном на 400 строк мне было жутко лениво.
- platform: templateЧастично снизит проблему то, что частично значения повторяются, но все равно. Жуткий индусский код - не наш стиль.
sensors:
weather_forecast
value_template: >-
{% if states('sensor.forecast_rule')=0 %}
"Ясно, ожидается похолодание."
{% elif states('sensor.forecast_rule')=1 %}
"Ясно, незначительное изменение температуры."
Тут еще 384 строки
{% elif states('sensor.forecast_rule')=196 %}
"Ясно, ожидается похолодание."
{% else %}
"Н/Д"
{% endif %}
Поэтому я решил искать обходные пути:
Создал текстовый файлик, где построчно вбил значения прогнозов
0,Ясно, ожидается похолодание.
1,Ясно, незначительное изменение температуры.
....
196,Ясно, ожидается похолодание.
200,Н/Д
Нарисовал простенький однострочник
что он делает
grep "$@" "$(dirname "$(realpath "$0")")/davis_forecast.csv"Из файла davis_forecast.csv, расположенного в той же директории что и сам скрипт выдает строки, содержащие, значения из передаваемого параметра.
sed -r 's!^[^,]+!!'Отрезает содержимое до 1-й запятой
cut -c2-Отрезает запятую.
head -1Оставляет только первую строчку.
Если мы будем искать по однозначным или двухзначным числам, нам прилетит много всего лишнего. Скажем, при поиске 14 нам прилетят значения и 140-149
Запускаем в командной строке на хост системе (да, баш скрипт лежит в каталоге python_scripts, чтоб враги не догадались).
Все отлично работает.
sh /usr/share/hassio/homeassistant/python_scripts/davis_forecast.sh 192
В основном облачно и ожидается похолодание. Вероятны осадки в течении 12 ч временами сильные. Ветрено.
Создаем сенсор .
- platform: command_lineИ получаем глухой облом:
name: Прогноз погоды
command: "sh /usr/share/hassio/homeassistant/python_scripts/davis_forecast.sh 192"
ERROR (SyncWorker_2) [homeassistant.components.command_line] Command failed: sh /usr/share/hassio/homeassistant/python_scripts/davis_forecast.sh 192Причина в том, что HA работает в докере. И у контейнера своя собственная файловая система.
После этого переделываем сенсор
- platform: command_lineИ вуаля
name: Прогноз погоды
command: "sh /config/python_scripts/davis_forecast.sh {{ states('sensor.forecast_rule') }} "
"Лобовая" альтернатива выглядит гораздо менее элегантно.
Засим наступило утро и Шахрезад прекратил дозволенные речи.