############################################################################### # @author : Jeffrey Stone # @date : 02/19/2019 # @package : Weather # @description : Weather and NWS Alerts # @original : https://github.com/Vasiley/Home-Assistant-Main/blob/master/packages/weather_alerts_nws.yaml ############################################################################### homeassistant: customize: package.node_anchors: customize: &customize package: 'weather_alerts' sensor.nws_alert_count: friendly_name: Alerts icon: mdi:alert-outline # weather: # # REMOVING darksky integration since API is EOL in 18 months. Migrated to NWS # # - platform: darksky # # api_key: !secret darksky_api # - platform: nws # api_key: !secret nws_api_key # station: klzu weather: - platform: pirateweather api_key: !secret pirate_weather_api # Additional optional values: #latitude: Location latitude #longitude: Location longitude mode: "daily" name: Anchorage House group: alerts_card: name: Alerts entities: - sensor.nws_alerts 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 utility_meter: daily_rainfall_in: source: sensor.acurite_rain899_2743_rt cycle: daily weekly_rainfall_in: source: sensor.acurite_rain899_2743_rt cycle: weekly recent_lightning_strikes: source: sensor.acurite_6045m_3078_strcnt cycle: quarter-hourly ### You first need to find either your NWS Zone ID or County ID. I’m not sure which is better but I used my Zone ID here. ### You can find your Zone ID by going to https://alerts.weather.gov/ 7, scroll down to your state and click on the “zone list” then look for the entry for your county. ### I recommond useing both #I’ve taken much of the underlying work here and created a custom component for nws alerts sensor. #The sensor can be created by adding the nws_alerts.py file to /custom_components/sensor/ and adding the following to your sensor definitions: sensor: # - platform: nws_alerts # zone_id: 'GAZ034,GAC135' - platform: weatheralerts state: GA zone: 34 county: 135 - platform: pirateweather api_key: !secret pirate_weather_api scan_interval: '00:15:00' monitored_conditions: - temperature - precip_probability - precip_type - humidity - cloud_cover - nearest_storm_distance - precip_intensity - wind_speed - platform: statistics name: Inside Humidity Stats entity_id: sensor.current_inside_humidity state_characteristic: mean sampling_size: 500 - platform: template sensors: current_forecast: friendly_name: Current Forecast unit_of_measurement: '' icon_template: mdi:weather-sunny value_template: >- {% set forecast = state_attr('weather.anchorage_house','forecast')[0] %} {{ forecast.condition }} attribute_templates: high_temp: >- {% set forecast = state_attr('weather.anchorage_house','forecast')[0] %} {{ forecast.temperature }} overnight_low: >- {% set forecast = state_attr('weather.anchorage_house','forecast')[1] %} {{ forecast.templow }} wind_bearing: >- {% set forecast = state_attr('weather.anchorage_house','forecast')[0] %} {{ forecast.wind_bearing }} wind_speed: >- {% set forecast = state_attr('weather.anchorage_house','forecast')[0] %} {{ forecast.wind_speed }} precipitation: >- {% set forecast = state_attr('weather.anchorage_house','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 Grayson ', '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.anchorage_house','forecast')[1] %} {{ forecast.condition }} attribute_templates: high_temp: >- {% set forecast = state_attr('weather.anchorage_house','forecast')[1] %} {{ forecast.temperature }} overnight_low: >- {% set forecast = state_attr('weather.anchorage_house','forecast')[2] %} {{ forecast.templow }} wind_bearing: >- {% set forecast = state_attr('weather.anchorage_house','forecast')[1] %} {{ forecast.wind_bearing }} wind_speed: >- {% set forecast = state_attr('weather.anchorage_house','forecast')[1] %} {{ forecast.wind_speed }} precipitation: >- {% set forecast = state_attr('weather.anchorage_house','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 Grayson ', '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 Grayson {{ [ ' is ', ' is currently ' ] | random }} {{states('sensor.acurite_6045m_3078_f')|round}} degrees {% if is_state('weather.home', 'rainy') %} {{ [ 'with rain.', 'with showers.' ] | random }} {% elif is_state('weather.home', 'cloudy') %} {{ [ 'with clouds.', 'with cloudy skies.' ] | random }} {% elif is_state('weather.home', 'partlycloudy') %} {{ [ 'with some clouds.', 'with partly cloudy skies.', 'with scatterd clouds' ] | random }} {% elif is_state('weather.home', '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.home.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 Grayson {{ [ ' is ', ' is currently ' ] | random }} {{states('sensor.acurite_6045m_3078_f')|round}} degrees {% if is_state('weather.home', 'rainy') %} {{ [ 'with rain.', 'with showers.' ] | random }} {% elif is_state('weather.home', 'cloudy') %} {{ [ 'with clouds.', 'with cloudy skies.' ] | random }} {% elif is_state('weather.home', 'partlycloudy') %} {{ [ 'with some clouds.', 'with partly cloudy skies.', 'with scatterd clouds' ] | random }} {% elif is_state('weather.home', '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.home.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: 'outisde pressure' value_template: '{{ state_attr(''weather.home'',''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.anchorage_house','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.anchorage_house','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.acurite_6045m_3078_f')|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 Visability" value_template: "{{ ((state_attr('weather.anchorage_house','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 %} automation: - alias: 'record previous day rainfall' trigger: - platform: time at: '23:58:00' action: service: mqtt.publish data_template: topic: 'house/rain/yesterday_total' retain: true payload: "{{ states('sensor.todays_rainfall') }}" - alias: Forecast Low Near Freezing trigger: - platform: numeric_state entity_id: sensor.tonights_low_temp below: 35 - platform: numeric_state entity_id: sensor.pirateweather_temperature below: 35 condition: - condition: state entity_id: input_boolean.freeze_warning state: 'off' action: - service: input_boolean.turn_on entity_id: input_boolean.freeze_warning - alias: Forecast Low Above Freezing trigger: - platform: numeric_state entity_id: sensor.tonights_low_temp above: 33 condition: - condition: state entity_id: input_boolean.freeze_warning state: 'on' - condition: numeric_state entity_id: sensor.tonights_low_temp above: 35 action: - service: input_boolean.turn_off entity_id: input_boolean.freeze_warning script: refresh_weather_alert_sensors: sequence: - service: homeassistant.update_entity entity_id: sensor.tornado_warning - service: homeassistant.update_entity entity_id: sensor.tornado_watch - service: homeassistant.update_entity entity_id: sensor.tstorm_warning - service: homeassistant.update_entity entity_id: sensor.tstorm_watch - service: homeassistant.update_entity entity_id: sensor.flood_warning - service: homeassistant.update_entity entity_id: sensor.flood_watch