diff --git a/packages/custom_weather.yaml b/packages/custom_weather.yaml index a5a5c4c..8840ff9 100644 --- a/packages/custom_weather.yaml +++ b/packages/custom_weather.yaml @@ -1,21 +1,29 @@ weather: - platform: template name: "Iron Nerd Weather Station" - condition_template: "{{ states('weather.stratton_ave') }}" - temperature_template: "{{ states('sensor.temperature') | float }}" - humidity_template: "{{ states('sensor.humidity') | float }}" - forecast_template: "{{ state_attr('weather.stratton_ave', 'forecast') }}" + condition_template: "{{ states('weather.iron_nerd_studios') }}" + temperature_template: "{{ states('sensor.pirateweather_temperature') | float }}" + humidity_template: "{{ states('sensor.pirateweather_humidity') | float }}" + forecast_template: "{{ state_attr('weather.iron_nerd_studios', 'forecast') }}" pressure_template: "{{ states('sensor.barometric_pressure') | float }}" - wind_speed_template: "{{ states('sensor.wind_speed') | float }}" - wind_bearing_template: "{{ states('sensor.wind_direction') | float }}" + wind_speed_template: "{{ states('sensor.pirateweather_wind_speed') | float }}" + wind_bearing_template: "{{ states('sensor.pirateweather_wind_bearing') | float }}" visibility_template: "{{ states('sensor.kdfi_visibility') | float }}" attribution_template: "Weather data from Iron Nerd's custom weather station template" + ozone_template: "{{ states('sensor.pirateweather_ozone') | float }}" - platform: pirateweather api_key: !secret pirate_weather_api mode: "daily" name: Iron Nerd Studios sensor: + # - platform: template + # sensors: + # pirateweather_pressure_inhg: + # friendly_name: Pirateweather Pressure inHg + # device_class: pressure + # unit_of_measurement: 'inHg' + # value_template: "{{ (states('sensor.pirateweather_pressure') | float * 0.029529983071445) | round(2) }}" - platform: pirateweather api_key: !secret pirate_weather_api scan_interval: '00:15:00' @@ -50,7 +58,696 @@ sensor: - sunset_time - nearest_storm_bearing - alerts + units: us - platform: weatheralerts state: OH zone: 4 county: 39 + + - platform: average + name: 'Average Temperature' + duration: + days: 7 + entities: + - sensor.pirateweather_temperature + - platform: average + name: 'Average Feels Like' + duration: + days: 7 + entities: + - sensor.pirateweather_apparent + - platform: average + name: 'Average Wind Speed' + duration: + days: 7 + entities: + - sensor.pirateweather_wind_speed + + + - platform: template + sensors: + current_forecast: + friendly_name: Current Forecast + unit_of_measurement: '' + icon_template: mdi:weather-sunny + value_template: >- + {% set forecast = state_attr('weather.iron_nerd_studios','forecast')[0] %} + {{ forecast.condition }} + attribute_templates: + high_temp: >- + {% set forecast = state_attr('weather.iron_nerd_studios','forecast')[0] %} + {{ forecast.temperature }} + overnight_low: >- + {% set forecast = state_attr('weather.iron_nerd_studios','forecast')[1] %} + {{ forecast.templow }} + wind_bearing: >- + {% set forecast = state_attr('weather.iron_nerd_studios','forecast')[0] %} + {{ forecast.wind_bearing }} + wind_speed: >- + {% set forecast = state_attr('weather.iron_nerd_studios','forecast')[0] %} + {{ forecast.wind_speed }} + precipitation: >- + {% set forecast = state_attr('weather.iron_nerd_studios','forecast')[0] %} + {{ forecast.precipitation }} + current_forecast_detail: + friendly_name: Current Forecast Detail + unit_of_measurement: '' + icon_template: mdi:weather-sunny + value_template: >- + {%- macro getReport() -%} + {{ [ + 'Today in Defiance ', + 'Later Today ', + 'For the rest of the day' + ] | random }} + expect a high of {{ state_attr('sensor.current_forecast','high_temp') }} + {%- if states('sensor.current_forecast') == 'sunny' and is_state('binary_sensor.night','off')%} + {{ [ + 'and sunny.', + 'with sun.', + 'with sunny conditions prevailing.' + ] | random }} + {%- elif states('sensor.current_forecast') == 'sunny' and is_state('binary_sensor.night','on') %} + {{ [ + 'and clear.', + 'with clear skies.' + ] | random }} + {%- elif states('sensor.current_forecast') == 'clear-night' %} + {{ [ + 'and clear.', + 'with clear skies.' + ] | random }} + {%- elif states('sensor.current_forecast') == 'rainy' %} + {{ [ + 'with rain.', + 'with showers.', + 'and rainy.' + ] | random }} + {{ [ + 'Rainfall accumulations ', + 'Total Rainfall amounts ' + ] | random }} + near {{ state_attr('sensor.current_forecast','precipitation') }} inches + possible. + {%- elif states('sensor.current_forecast') == 'snowy' %} + {{ [ + 'with snow.', + 'with snow showers.' + ] | random }} + {{ [ + 'Snowfall accumulations ', + 'Total snowfall amounts ' + ] | random }} + near {{ state_attr('sensor.current_forecast','precipitation') }} inches + possible. + {%- elif states('sensor.current_forecast') == 'snowy-rainy' %} + {{ [ + 'with mix preciptation possible.', + 'with snow and rain showers.' + ] | random }} + Total accumulation near {{ state_attr('sensor.current_forecast','precipitation') }} inches + possible. + {%- elif states('sensor.current_forecast') == 'windy' %} + {{ [ + 'and windy.', + 'with lots of wind.' + ] | random }} + {%- elif states('sensor.current_forecast') == 'fog' %} + {{ [ + 'and foggy.', + 'with some fog.' + ] | random }} + {% elif states('sensor.current_forecast') == 'cloudy' %} + {{ [ + 'with clouds.', + 'with cloudy skies.' + ] | random }} + {% elif states('sensor.current_forecast') == 'partlycloudy' %} + {{ [ + 'with some clouds.', + 'with partly cloudy skies.', + 'with scattered clouds' + ] | random }} + {%- elif states('sensor.current_forecast') == 'hail' %} + {{ [ + 'with severve thunderstorms possible.', + 'with hail possible.' + ] | random }} + {{ [ + 'Rainfall accumulations ', + 'Total Rainfall amounts ' + ] | random }} + near {{ state_attr('sensor.current_forecast','precipitation') }} inches + possible. + {%- elif states('sensor.current_forecast') == 'lightning' %} + {{ [ + 'with thunderstorms possible.', + 'with the potential of thunderstorms.' + ] | random }} + {{ [ + 'Rainfall accumulations ', + 'Total Rainfall amounts ' + ] | random }} + near {{ state_attr('sensor.current_forecast','precipitation') }} inches + possible. + {% endif -%} + {{ [ + 'Later tonight expect a low of ', + 'Overnight expect a low of ' + ] | random }} + {{ state_attr('sensor.current_forecast','overnight_low') }} degrees. + {%- endmacro -%} + {# a macro that removes all newline characters, empty spaces, and returns formatted text #} + {%- macro cleanup(data) -%} + {%- for item in data.split("\n") if item | trim != "" -%} + {{ item | trim }} {% endfor -%} + {%- endmacro -%} + {# a macro to call all macros :) #} + {%- macro mother_of_all_macros() -%} + {{ getReport() }} + {%- endmacro -%} + + {# Call the macro #} + {{- cleanup(mother_of_all_macros()) -}} + tomorrow_forecast: + friendly_name: Tomorrows Forecast + unit_of_measurement: '' + icon_template: mdi:weather-sunny + value_template: >- + {% set forecast = state_attr('weather.iron_nerd_studios','forecast')[1] %} + {{ forecast.condition }} + attribute_templates: + high_temp: >- + {% set forecast = state_attr('weather.iron_nerd_studios','forecast')[1] %} + {{ forecast.temperature }} + overnight_low: >- + {% set forecast = state_attr('weather.iron_nerd_studios','forecast')[2] %} + {{ forecast.templow }} + wind_bearing: >- + {% set forecast = state_attr('weather.iron_nerd_studios','forecast')[1] %} + {{ forecast.wind_bearing }} + wind_speed: >- + {% set forecast = state_attr('weather.iron_nerd_studios','forecast')[1] %} + {{ forecast.wind_speed }} + precipitation: >- + {% set forecast = state_attr('weather.iron_nerd_studios','forecast')[1] %} + {{ forecast.precipitation }} + tomorrow_forecast_detail: + friendly_name: Tomorrow Forecast Detail + unit_of_measurement: '' + icon_template: mdi:weather-sunny + value_template: >- + {%- macro getReport() -%} + {{ [ + 'Tomorrow in Defiance ', + 'For the next day ', + 'Tomorrow ' + ] | random }} + expect a high of {{ state_attr('sensor.tomorrow_forecast','high_temp') }} + {%- if states('sensor.tomorrow_forecast') == 'sunny' %} + {{ [ + 'and sunny.', + 'with sun.', + 'with sunny conditions prevailing.' + ] | random }} + {%- elif states('sensor.tomorrow_forecast') == 'rainy' %} + {{ [ + 'with rain.', + 'with showers.', + 'and rainy.' + ] | random }} + {{ [ + 'Rainfall accumulations ', + 'Total Rainfall amounts ' + ] | random }} + near {{ state_attr('sensor.tomorrow_forecast','precipitation') }} inches + possible. + {%- elif states('sensor.tomorrow_forecast') == 'snowy' %} + {{ [ + 'with snow.', + 'with snow showers.' + ] | random }} + {{ [ + 'Snowfall accumulations ', + 'Total snowfall amounts ' + ] | random }} + near {{ state_attr('sensor.tomorrow_forecast','precipitation') }} inches + possible. + {%- elif states('sensor.tomorrow_forecast') == 'snowy-rainy' %} + {{ [ + 'with mix preciptation possible.', + 'with snow and rain showers.' + ] | random }} + Total accumulation near {{ state_attr('sensor.tomorrow_forecast','precipitation') }} inches + possible. + {%- elif states('sensor.tomorrow_forecast') == 'windy' %} + {{ [ + 'and windy.', + 'with lots of wind.' + ] | random }} + {%- elif states('sensor.current_forecast') == 'fog' %} + {{ [ + 'and foggy.', + 'with some fog.' + ] | random }} + {% elif states('sensor.tomorrow_forecast') == 'cloudy' %} + {{ [ + 'with clouds.', + 'with cloudy skies.' + ] | random }} + {% elif states('sensor.tomorrow_forecast') == 'partlycloudy' %} + {{ [ + 'with some clouds.', + 'with partly cloudy skies.', + 'with scattered clouds' + ] | random }} + {%- elif states('sensor.tomorrow_forecast') == 'hail' %} + {{ [ + 'with severve thunderstorms possible.', + 'with hail possible.' + ] | random }} + {{ [ + 'Rainfall accumulations ', + 'Total Rainfall amounts ' + ] | random }} + near {{ state_attr('sensor.current_forecast','precipitation') }} inches + possible. + {%- elif states('sensor.current_forecast') == 'lightning' %} + {{ [ + 'with thunderstorms possible.', + 'with the potential of thunderstorms.' + ] | random }} + {{ [ + 'Rainfall accumulations ', + 'Total Rainfall amounts ' + ] | random }} + near {{ state_attr('sensor.current_forecast','precipitation') }} inches + possible. + {% endif -%} + {{ [ + ' Tomorrow night expect a low of ' + ] | random }} + {{ state_attr('sensor.tomorrow_forecast','overnight_low') }} degrees. + {%- endmacro -%} + {# a macro that removes all newline characters, empty spaces, and returns formatted text #} + {%- macro cleanup(data) -%} + {%- for item in data.split("\n") if item | trim != "" -%} + {{ item | trim }} {% endfor -%} + {%- endmacro -%} + {# a macro to call all macros :) #} + {%- macro mother_of_all_macros() -%} + {{ getReport() }} + {%- endmacro -%} + + {# Call the macro #} + {{- cleanup(mother_of_all_macros()) -}} + current_conditions: + friendly_name: Current Conditions + unit_of_measurement: '' + icon_template: mdi:weather-sunny + value_template: >- + {%- macro getReport() -%} + The Weather in Defiance + {{ [ + ' is ', + ' is currently ' + ] | random }} + {{states('sensor.pirateweather_temperature')|round}} degrees + {% if is_state('weather.iron_nerd_weather_station', 'rainy') %} + {{ [ + 'with rain.', + 'with showers.' + ] | random }} + {% elif is_state('weather.iron_nerd_weather_station', 'cloudy') %} + {{ [ + 'with clouds.', + 'with cloudy skies.' + ] | random }} + {% elif is_state('weather.iron_nerd_weather_station', 'partlycloudy') %} + {{ [ + 'with some clouds.', + 'with partly cloudy skies.', + 'with scatterd clouds' + ] | random }} + {% elif is_state('weather.iron_nerd_weather_station', 'sunny') %} + {% if is_state('sun.sun', 'above_horizon') %} + {{ [ + 'and sunny.', + 'with sun.' + ] | random }} + {% else %} + {{ [ + 'and clear.', + 'with clear skies.' + ] | random }} + {% endif %} + {% else %} + and {{ states.weather.iron_nerd_weather_station.state }} + {% endif %} + {%- endmacro -%} + {# a macro that removes all newline characters, empty spaces, and returns formatted text #} + {%- macro cleanup(data) -%} + {%- for item in data.split("\n") if item | trim != "" -%} + {{ item | trim }} {% endfor -%} + {%- endmacro -%} + {# a macro to call all macros :) #} + {%- macro mother_of_all_macros() -%} + {{ getReport() }} + {%- endmacro -%} + + {# Call the macro #} + {{- cleanup(mother_of_all_macros()) -}} + current_conditions_detail: + friendly_name: Current Conditions Detail + unit_of_measurement: '' + icon_template: mdi:weather-sunny + value_template: >- + {%- macro getReport() -%} + The Weather in Defiance + {{ [ + ' is ', + ' is currently ' + ] | random }} + {{states('sensor.pirateweather_temperature')|round}} degrees + {% if is_state('weather.iron_nerd_weather_station', 'rainy') %} + {{ [ + 'with rain.', + 'with showers.' + ] | random }} + {% elif is_state('weather.iron_nerd_weather_station', 'cloudy') %} + {{ [ + 'with clouds.', + 'with cloudy skies.' + ] | random }} + {% elif is_state('weather.iron_nerd_weather_station', 'partlycloudy') %} + {{ [ + 'with some clouds.', + 'with partly cloudy skies.', + 'with scatterd clouds' + ] | random }} + {% elif is_state('weather.iron_nerd_weather_station', 'sunny') %} + {% if is_state('sun.sun', 'above_horizon') %} + {{ [ + 'and sunny.', + 'with sun.' + ] | random }} + {% else %} + {{ [ + 'and clear.', + 'with clear skies.' + ] | random }} + {% endif %} + {% else %} + and {{ states.weather.iron_nerd_weather_station.state }} + {% endif %} + {%- if is_state('binary_sensor.night','off')%} + {{ [ + 'Later Today ', + 'For the rest of the day' + ] | random }} + expect a high of {{ state_attr('sensor.current_forecast','high_temp') }} + {%- if states('sensor.current_forecast') == 'sunny' and is_state('binary_sensor.night','off')%} + {{ [ + 'and sunny.', + 'with sun.', + 'with sunny conditions prevailing.' + ] | random }} + {%- elif states('sensor.current_forecast') == 'sunny' and is_state('binary_sensor.night','on') %} + {{ [ + 'and clear.', + 'with clear skies.' + ] | random }} + {%- elif states('sensor.current_forecast') == 'clear-night' %} + {{ [ + 'and clear.', + 'with clear skies.' + ] | random }} + {%- elif states('sensor.current_forecast') == 'rainy' %} + {{ [ + 'with rain.', + 'with showers.', + 'and rainy.' + ] | random }} + {{ [ + 'Rainfall accumulations ', + 'Total Rainfall amounts ' + ] | random }} + near {{ state_attr('sensor.current_forecast','precipitation') }} inches + possible. + {%- elif states('sensor.current_forecast') == 'snowy' %} + {{ [ + 'with snow.', + 'with snow showers.' + ] | random }} + {{ [ + 'Snowfall accumulations ', + 'Total snowfall amounts ' + ] | random }} + near {{ state_attr('sensor.current_forecast','precipitation') }} inches + possible. + {%- elif states('sensor.current_forecast') == 'snowy-rainy' %} + {{ [ + 'with mix preciptation possible.', + 'with snow and rain showers.' + ] | random }} + Total accumulation near {{ state_attr('sensor.current_forecast','precipitation') }} inches + possible. + {%- elif states('sensor.current_forecast') == 'windy' %} + {{ [ + 'and windy.', + 'with lots of wind.' + ] | random }} + {%- elif states('sensor.current_forecast') == 'fog' %} + {{ [ + 'and foggy.', + 'with some fog.' + ] | random }} + {% elif states('sensor.current_forecast') == 'cloudy' %} + {{ [ + 'with clouds.', + 'with cloudy skies.' + ] | random }} + {% elif states('sensor.current_forecast') == 'partlycloudy' %} + {{ [ + 'with some clouds.', + 'with partly cloudy skies.', + 'with scattered clouds' + ] | random }} + {%- elif states('sensor.current_forecast') == 'hail' %} + {{ [ + 'with severve thunderstorms possible.', + 'with hail possible.' + ] | random }} + {{ [ + 'Rainfall accumulations ', + 'Total Rainfall amounts ' + ] | random }} + near {{ state_attr('sensor.current_forecast','precipitation') }} inches + possible. + {%- elif states('sensor.current_forecast') == 'lightning' %} + {{ [ + 'with thunderstorms possible.', + 'with the potential of thunderstorms.' + ] | random }} + {{ [ + 'Rainfall accumulations ', + 'Total Rainfall amounts ' + ] | random }} + near {{ state_attr('sensor.current_forecast','precipitation') }} inches + possible. + {% endif -%} + {{ [ + 'Later tonight expect a low of ', + 'Overnight expect a low of ' + ] | random }} + {{ state_attr('sensor.current_forecast','overnight_low') }} degrees. + {%- else -%} + {{ [ + 'Tonight expect a low of ', + 'Overnight expect a low of ' + ] | random }} + {{ state_attr('sensor.current_forecast','overnight_low') }} degrees. + {% endif %} + {%- endmacro -%} + {# a macro that removes all newline characters, empty spaces, and returns formatted text #} + {%- macro cleanup(data) -%} + {%- for item in data.split("\n") if item | trim != "" -%} + {{ item | trim }} {% endfor -%} + {%- endmacro -%} + {# a macro to call all macros :) #} + {%- macro mother_of_all_macros() -%} + {{ getReport() }} + {%- endmacro -%} + + {# Call the macro #} + {{- cleanup(mother_of_all_macros()) -}} + outside_pressure: + friendly_name: 'Outside Pressure' + value_template: '{{ state_attr(''weather.iron_nerd_weather_station'',''pressure'') }}' + unit_of_measurement: '' + todays_high_temp: + friendly_name: "Today's High Temp" + unit_of_measurement: '' + device_class: temperature + value_template: >- + {% set forecast = state_attr('weather.iron_nerd_studios','forecast')[0] %} + {{ forecast.temperature }} + tonights_low_temp: + friendly_name: "Tonight's Low Temp" + unit_of_measurement: '' + device_class: temperature + value_template: >- + {% set forecast = state_attr('weather.iron_nerd_studios','forecast')[1] %} + {{ forecast.lowtemp }} + clothing_forecast: + friendly_name: "Clothing Forecast" + unit_of_measurement: '' + value_template: >- + {% if is_state('binary_sensor.overnight', 'off') %} + {% set temp = states('sensor.todays_high_temp')|int %} + {% else %} + {% set temp = states('sensor.pirateweather_temperature')|round %} + {% endif %} + {%- if states('sensor.todays_high_temp')|int > 63 %} + {%- if states('sensor.todays_high_temp')|int < 80 %} + Nice + {% elif states('sensor.todays_high_temp')|int > 95 %} + Hot + {% else %} + Toasty + {%- endif %} + {% elif states('sensor.todays_high_temp')|int < 64 %} + {%- if states('sensor.todays_high_temp')|int < 32 %} + Freezing + {% elif states('sensor.todays_high_temp')|int > 50 %} + Chilly + {% else %} + Cold + {%- endif %} + {% else %} + Unknown + {%- endif %} + clothing_forecast_detail: + friendly_name: "Clothing Forecast Detail" + unit_of_measurement: '' + value_template: >- + {% if is_state('binary_sensor.morning','on') %} + Based on the forecasted high temperature, + {% if is_state('sensor.clothing_forecast', 'Freezing') %} + It is going to be freezing today. so I suggest wearing long pants and a heavy coat. + {% elif is_state('sensor.clothing_forecast','Cold') %} + It is going to be cold today. so I suggest wearing long pants and a light jacket. + {% elif is_state('sensor.clothing_forecast', 'Chilly') %} + It is going to be chilly today. so I suggest wearing at least long pants. + {% elif is_state('sensor.clothing_forecast', 'Nice') %} + It is going to be + {{ [ 'nice outside. ', + 'pretty nice outside. ', + 'a good day to be outside. ', + 'rather enjoyable outside. ', + ] | random }} + So I suggest wearing shorts. + {% elif is_state('sensor.clothing_forecast', 'Toasty') %} + It is going to be + {{ [ 'bit warm ', + ' rather warm outside ', + ' almost too hot outside ', + ' a little warm ', + ] | random }} + today. So I suggest wearing shorts. + {% elif is_state('sensor.clothing_forecast', 'Hot') %} + It is going to be + {{ [ 'hot', + 'hotter than the sun ', + 'hotter than hot. but in a lot of bad ways ', + 'hotter than the sun outside ', + 'super hot ', + 'hotter than the inside of a volcano ' + ] | random }} + today. So I suggest wearing shorts. + {% else %} + It is going to be {{ states.sensor.clothing_forecast.state }} today so I suggest wearing shorts. + {% endif %} + {% else %} + Based on the current temperature, + {% if is_state('sensor.clothing_forecast', 'Freezing') %} + It is freezing. so I suggest wearing long pants and a heavy coat if you are going out. + {% elif is_state('sensor.clothing_forecast','Cold') %} + It is cold outside. so I suggest wearing long pants and a light jacket. + {% elif is_state('sensor.clothing_forecast', 'Chilly') %} + It is chilly right now. so I suggest wearing at least long pants + if you are going to venture outside. + {% elif is_state('sensor.clothing_forecast', 'Nice') %} + It is + {{ [ 'nice outside. ', + 'pretty nice outside. ', + 'a good day to be outside. ', + 'rather enjoyable outside. ', + ] | random }} + So I suggest wearing shorts. + {% elif is_state('sensor.clothing_forecast', 'Toasty') %} + It is + {{ [ 'bit warm ', + ' rather warm outside ', + ' almost too hot outside ', + ' a little warm ', + ] | random }} + outside. So I suggest wearing shorts. + {% elif is_state('sensor.clothing_forecast', 'Hot') %} + It is + {{ [ 'hot', + 'hotter than the sun ', + 'hotter than hot. but in a lot of bad ways ', + 'hotter than the sun outside ', + 'super hot ', + 'hotter than the inside of a volcano ' + ] | random }} + outside. So I suggest wearing shorts. + {% else %} + It is {{ states.sensor.clothing_forecast.state }} right now so I suggest wearing shorts. + {% endif %} + {% endif %} + nws_current_visibility: + friendly_name: "Current Visibility" + value_template: "{{ ((state_attr('weather.iron_nerd_studios','visibility') | int) * 0.621371) | round }}" + + current_inside_humidity: + friendly_name: "Current Inside Humidity" + unit_of_measurement: '%' + value_template: "{{ state_attr('climate.home','current_humidity') }}" + # lighting_stike_count: + # friendly_name: "Lightning Strike Count" + # value_template: "{{ states('sensor.acurite_6045m_3078_strcnt') }}" + yesterday_rainfall_in: + friendly_name: "Yesterday Rainfall" + value_template: "{{ state_attr('sensor.daily_rainfall_in', 'last_period') }}" + previous_rainfall: + friendly_name: "Past 48h Rainfall" + value_template: "{{ states('sensor.daily_rainfall_in') | float + state_attr('sensor.daily_rainfall_in', 'last_period') | float }}" + # lightning_warning: + # friendly_name: "Lightning Warning" + # value_template: >- + # {%- if states('sensor.recent_lightning_strikes') | int > 0 %} + # Unsafe + # {% else %} + # Safe + # {%- endif %} + +input_boolean: + freeze_warning: + name: Freeze Warning + icon: mdi:snowflake-alert + weather_alert_texts: + name: Weather Alert Texts + icon: mdi:telegram + lightning_warning: + name: Lightning Warning + icon: mdi:flash-alert + tornado_alarm: + name: Tornado Alarm + icon: mdi:speaker-wireless + tstorm_alarm: + name: T-Storm Alarm + icon: mdi:speaker-wireless + raining: + name: Raining