From 4cfc8e5db90ad2f83a059048b9d7d1ec1cf47f62 Mon Sep 17 00:00:00 2001 From: Stuart Lamont Date: Wed, 31 May 2023 10:04:35 +1000 Subject: [PATCH] Adding pending-updates.md and renaming files --- pending updates.md | 0 weatherTemperature.md | 188 ++++++++++++++++++++++++++++++++++++++++++ weatherWind.md | 56 +++++++++++++ 3 files changed, 244 insertions(+) create mode 100644 pending updates.md create mode 100644 weatherTemperature.md create mode 100644 weatherWind.md diff --git a/pending updates.md b/pending updates.md new file mode 100644 index 0000000..e69de29 diff --git a/weatherTemperature.md b/weatherTemperature.md new file mode 100644 index 0000000..fce0230 --- /dev/null +++ b/weatherTemperature.md @@ -0,0 +1,188 @@ +# Home Assistant Jinja 2 Templates for Weather Temperatures + +## Step-by-step + +### Get the current Temperature from Home Assistant +We're casting this as a float, probably no need, but I'd rather be safe. +``` +{% set current_temp = state_attr ('weather.home','temperature') | float %} +``` + +### Get the current weather condition from Home Assistant as well +``` +{% set current_condition = states('weather.home') %} +``` +### Fix the current Condition +When the Current weather condition is "Partly Cloudy" the default weather integration returns `partlycloudy` and it sounds odd when read out by a Text to Speech engine. +To fix it I added: +``` +{% if current_condition == 'partlycloudy' %} + {% set current_condition = 'Partly Cloudy' %} +{% endif %} +``` + +## Announce the current condition and Temperature +``` +Outside, It's {{ current_condition }} and {{ current_temp }} degrees Celsius. +``` + +## Figure out the Highs and Lows from the forecast +For weather information, I want to know the High and Low temp. This data is strangely not included by default in the default weather integration, so we have to figure it out ourselves. + +### Start by Extracting the `forecast` array data into a variable +``` +{% set weather = state_attr('weather.home', 'forecast') %} +``` + +### Instantiate a `high_temp` and `low_temp` variable +We're assigning the temperature from the 0th record in the array to get started. + +``` +{% set high_temp = weather[0].temperature %} +{% set low_temp = weather[0].templow %} +``` + +### Iterate through the array and set the `high_temp` or `low_temp` variables accordingly. +I've also added an `if` statement in here to announce if any of the forecast conditions are `rainy` and the `hour` that the rain is forecast for and to tell us to take an umbrella. +I've surrounded that code block with `###########` for clarity + +``` +{% for entry in weather %} + {% if entry.temperature > high_temp %} + {% set high_temp = entry.temperature %} + {% endif %} + {% if entry.templow < low_temp %} + {% set low_temp = entry.templow %} + {% endif %} + + ########### + # While we're here, if the condition for this hour is `rainy` let's announce that + {% if entry.condition == 'rainy'%} + It looks like there's rain expected at around {{ entry.datetime.split('T')[1][:2] }} o'clock. + You might want to take an umbrella if you're leaving the house. + {% endif %} + ########### + +{% endfor %} +``` + +### Some Qualitative statements about the `high_temp` +This code block looks at the `high_temp` variable and runs the if statement below to make a qualitative statement about it. +These have been built for °C and I pulled the qualitative statements out of my head. +Change them as you need to + +`Above 30°C` say "It's going to be a hot one" +`between 20°C and 30°C` say "It should be a warm day" +`between 15°C and 20°C` say "It's going to be a pretty mild temperature today" +`between 10°C and 15°C` say "It seems like it'll be a bit chilly today" +`between 0°C and 10°C` say "It's going to be a cold day" +else: the `high_temp` variable must be < 0°C +`< 0°C` say "It's going to be freezing today" + +``` +{% if high_temp > 30 %} + It's going to be a hot one +{% elif 20 < high_temp < 30 %} + It should be a warm day +{% elif 15 < high_temp < 20 %} + It's going to be a pretty mild temperature today +{% elif 10 < high_temp < 15 %} + It seems like it'll be a bit chilly today +{% elif 0 < high_temp < 10 %} + It's going to be a cold day +{% else %} + It's going to be freezing today +{% endif %} +``` + +### Announce the `high_temp` and `low_temp` values +Again, built for °C + +``` +The forecast high is {{ high_temp }} °C. +With a Low of {{ low_temp }} °C . +``` + +### Some qualitative statements about the `low_temp` +Again we're looking at °C and the statements and ranges are arbitrary, and can be adjusted to your tastes + +Remember these are for the `low_temp` variable, so it's not going to get colder than these + +`Above 30°C` say "Wow. That's hot!" +`between 20°C and 30°C` say "it's not going to get below 20°C toda.y" +`between 10°C and 20°C` say "it might get a little bit chilly." +`between 0°C and 10°C` say "That's cold." +`< 0°C` say "Absolutely freezing!" + +Puntuation like `.`, `!`, `?` and `,` is important in the text to speech statments so the timing sounds "natural" + +``` +{% if low_temp > 30 %} + Wow. That's hot! +{% elif 20 < low_temp < 30 %} + it's not going to go below 20°C today. +{% elif 10 < low_temp < 20 %} + it might get a little bit chilly. +{% elif 0 < low_temp < 10 %} + That's cold. +{% else %} + Absolutely freezing! +{% endif %} +``` + +## Now we can put it all together: +``` +{% set current_temp = state_attr ('weather.home','temperature') | float %} +{% set current_condition = states('weather.home') %} + +{% if current_condition == 'partlycloudy' %} + {% set current_condition = 'Partly Cloudy' %} +{% endif %} + +Outside, It's {{ current_condition }} and {{ current_temp }} degrees Celsius. + +{% set weather = state_attr('weather.home', 'forecast') %} +{% set high_temp = weather[0].temperature %} +{% set low_temp = weather[0].templow %} + +{% for entry in weather %} + {% if entry.temperature > high_temp %} + {% set high_temp = entry.temperature %} + {% endif %} + {% if entry.templow < low_temp %} + {% set low_temp = entry.templow %} + {% endif %} + {% if entry.condition == 'rainy'%} + It looks like there's rain expected at around {{ entry.datetime.split('T')[1][:2] }} o'clock. You might want to take an umbrella if you're leaving the house. + {% endif %} +{% endfor %} + +{% if high_temp > 30 %} + It's going to be a hot one +{% elif 20 < high_temp < 30 %} + It should be a warm day +{% elif 15 < high_temp < 20 %} + It's going to be a pretty mild temperature today +{% elif 10 < high_temp < 15 %} + It seems like it'll be a bit chilly today +{% elif 0 < high_temp < 10 %} + It's going to be a cold day +{% else %} + It's going to be freezing today +{% endif %} + +The forecast high is {{ high_temp }} °C. + +With a Low of {{ low_temp }} °C . +{% if low_temp > 30 %} + Wow. That's hot! +{% elif 20 < low_temp < 30 %} + it's not going to go below 20 degrees today. +{% elif 10 < low_temp < 20 %} + it might get a little bit chilly. +{% elif 0 < low_temp < 10 %} + That's cold. +{% else %} + Absolutely freezing! +{% endif %} +``` \ No newline at end of file diff --git a/weatherWind.md b/weatherWind.md new file mode 100644 index 0000000..1ccfeff --- /dev/null +++ b/weatherWind.md @@ -0,0 +1,56 @@ +# Home Assistant Jinja Templating to anmnounce Wind Details + +## get the current wind speed and wind bearing in degrees from Home Assistant +``` +{% set wind_bearing = state_attr('weather.home', 'wind_bearing') | float %} +{% set wind_speed = state_attr('weather.home','wind_speed') | float %} +``` + +## This array is a list of Cardinal Directions allowing us to convert the +``` +{% set directions = { + (0.0, 11.25): 'North', + (11.25, 33.75): 'North North East', + (33.75, 56.25): 'North East', + (56.25, 78.75): 'East North East', + (78.75, 101.25): 'East', + (101.25, 123.75): 'East South East', + (123.75, 146.25): 'South Eeast', + (146.25, 168.75): 'South South East', + (168.75, 191.25): 'South', + (191.25, 213.75): 'South South West', + (213.75, 236.25): 'South West', + (236.25, 258.75): 'West South West', + (258.75, 281.25): 'West', + (281.25, 303.75): 'West North West', + (303.75, 326.25): 'North West', + (326.25, 348.75): 'North Nort West', + (348.75, 360.0): 'North' +} %} +``` + +## Announce a qualitative description of wind speed +``` +{% if wind_speed > 50 %} + Its very windy outside. +{% elif 40 < wind_speed < 50 %} + It's pretty windy at the moment +{% elif 30 < wind_speed < 40 %} + Theres a strong breeze right now +{% elif 20 < wind_speed < 30 %} + It's a bit breezy outside +{% elif 10 < wind_speed < 20 %} + There's a light breeze +{% else %} + it's quite still +{% endif %} +``` + +### +``` +{% for rng, direction in directions.items() %} + {% if wind_bearing >= rng[0] and wind_bearing < rng[1] %} + The wind is currently blowing from the {{ direction }} direction, at {{ wind_speed }} kilometres per hour + {% endif %} +{% endfor %} +``` \ No newline at end of file