Умный  дом в  котором я  живу. Работа с шаблонами

Все, кто  начинает  работать с Home Assistant  рано или поздно сталкиваются с  шаблонами.
И все  хорошо  до  тех пор, пока  количество вариантов не очень велико.
Но  иногда  сталкиваемся  с ситуациями,  когда вариантов  слишком много, и  приходится  изобретать велосипед
Итак,  практическая  задача.
Наконец  я  вернул в строй свою метеостанцию. 
Чем она  замечательна? В режиме реального  времени  отдает метеоданные. Сейчас  я  ее завел только  на публикацию  данных в различные сервисы (weather underground, cwop, weathercloud, openweathermap).
Также настроил  публикацию  данных в MQTT,  откуда  данные  можно  затаскивать в Home Assistant.
Но тут возникли проблемы.
Метеостанция  отдает  направление ветра в градусах.

Умный  дом в  котором я  живу. Работа с шаблонами Home Assistant, Умный дом, Шаблон, Метеостанция, Длиннопост

Но я не хочу  в градусах, я  хочу в румбах.

Умный  дом в  котором я  живу. Работа с шаблонами 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,Н/Д


Нарисовал  простенький  однострочник

Умный  дом в  котором я  живу. Работа с шаблонами Home Assistant, Умный дом, Шаблон, Метеостанция, Длиннопост

что  он  делает

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') }} "
И вуаля
Умный  дом в  котором я  живу. Работа с шаблонами Home Assistant, Умный дом, Шаблон, Метеостанция, Длиннопост

"Лобовая"  альтернатива  выглядит  гораздо менее  элегантно.

Засим наступило  утро и  Шахрезад прекратил  дозволенные речи.