Всем привет, никогда не понимал текстового блогинга, но с начала знакомства с Home Assistant прошло пол года и начали появляться личные наработки, естественно, как и весь опенсорс, они на базе чужих наработок :) Но хочется их где-то фиксировать и в т.ч. вносить свой небольшой вклад в опенсорс сообщество.
UPDATED
Эта заметка потеряла актуальность, так как с недавними апдейтами атрибут forecast исчез из датчика погоды в API openweathermap, чуть позже будет статья как дергать это же, но уже шаблоном из службы weather.get_forecasts.
Очень не понравился мне сенсор weather.openweathermap, тем что в атрибуты напихали весь прогноз, там в атрибутах прогноза на 5-8 полных прокруток экрана, но понаблюдав немного, показалось что точную погоду дает. По видосу американца которого постят на оф сайте ХА, сделал датчик осадков, показалось слишком сложно. Изобрел вариант попроще. Формируем массив данных из которого будем дергать нужное.
{%set massive=state_attr(‘weather.openweathermap’, «forecast»)%}
{{massive}}
Получаем блин какой-от поток сознания взбесившейся машины
[{'condition': 'cloudy', 'precipitation_probability': 0, 'datetime': '2024-01-09T21:00:00+00:00', 'wind_bearing': 32, 'cloud_coverage': 53,
'temperature': -1.3, 'pressure': 768.81, 'wind_speed': 32.65, 'precipitation': 0.0, 'humidity': 67},
{'condition': 'partlycloudy', 'precipitation_probability': 0, 'datetime': '2024-01-10T00:00:00+00:00', 'wind_bearing': 30, 'cloud_coverage': 35,
'temperature': -1.8, 'pressure': 768.81, 'wind_speed': 27.11, 'precipitation': 0.0, 'humidity': 74},
{'condition': 'clear-night', 'precipitation_probability': 0, 'datetime': '2024-01-10T03:00:00+00:00', 'wind_bearing': 27, 'cloud_coverage': 9,
'temperature': -2.2, 'pressure': 768.81, 'wind_speed': 31.1, 'precipitation': 0.0, 'humidity': 83},
Это всего 15% массива получаемого в ответ!!! КАК можно такую простынь засовывать в один датчик? Нелюди.
Фильтруем по нужному атрибуту — wind_speed
{%set massive=state_attr(‘weather.openweathermap’, «forecast») | map(attribute=’wind_speed’) |join(‘, ‘) %}
{{massive}}
Получаем удобоваримый уже небольшой массив цифр
32.65, 27.11, 31.1, 28.37, 27.0, 26.21, 23.33, 20.23, 18.36, 15.19, 12.56, 9.04, 14.08, 22.68, 24.44, 24.62, 26.1, 33.88, 36.86, 31.25, 30.38,
34.45, 32.22, 30.49, 27.65, 21.85, 17.35, 12.42, 7.02, 5.44, 5.72, 15.23, 20.56, 19.3, 5.83, 16.99, 16.52, 29.84, 33.05, 36.61
Я дальше брал четыре первых цифры массива, выбирал большую, так как мне надо было получить самые сильные порывы ветра на ближайший день.
{%set massive=state_attr(‘weather.openweathermap’, «forecast») | map(attribute=’wind_speed’) |join(‘, ‘) %}
{% set number0=(massive.split(‘,’) [0] | float)%}
{% set number1=(massive.split(‘,’) [1] | float)%}
{% set number2=(massive.split(‘,’) [2] | float)%}
{% set number3=(massive.split(‘,’) [3] | float)%}
Получили наши четыре переменных уже в формате чисел. Теперь выполнять с ними математические операции. Сравниваем выбирая максимальную, далее максимальную переменную переводим в м/с, так как датчик нам дал в км/ч, округляем до целых, в скорости ветра десятые не нужны.
{%set massive=state_attr(‘weather.openweathermap’, «forecast») | map(attribute=’wind_speed’) |join(‘, ‘) %}
{% set number0=(massive.split(‘,’) [0] | float)%}
{% set number1=(massive.split(‘,’) [1] | float)%}
{% set number2=(massive.split(‘,’) [2] | float)%}
{% set number3=(massive.split(‘,’) [3] | float)%}
{%set maxnumber = [ number0 , number1, number2, number3] | max %}
{{maxnumber / 3.6 | round(0) }}
Готово. Вставляем этот блок в данные value датчика и идем перезагружать всю yaml конфигурацию.
Оставить комментарий