###############################################################################
#   @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 <config_directory>/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:
      outside_pressure:
        friendly_name: 'outisde pressure'
        value_template: '{{ state_attr(''weather.home'',''pressure'') }}'
        unit_of_measurement: ''
      clothing_forecast:
        friendly_name: "Clothing Forecast"
        unit_of_measurement: ''
        value_template: >-
            {%- if states('sensor.nws_daytime_temperature')|int > 63 %}
              {%- if states('sensor.nws_daytime_temperature')|int < 80 %}
                Nice
              {% elif states('sensor.nws_daytime_temperature')|int > 95 %}
                Hot
              {% else %}
                Toasty
              {%- endif %}
            {% elif states('sensor.nws_daytime_temperature')|int < 64 %}
              {%- if states('sensor.nws_daytime_temperature')|int < 32 %}
                Freezing
              {% elif states('sensor.nws_daytime_temperature')|int > 50 %}
                Chilly
              {% else %}
                Cold
              {%- endif %}
            {% else %}
              Unknown
            {%- endif %}
      nws_current_forecast:
        friendly_name: 'Current Forecast'
        value_template: "{{ states.weather.klzu_daynight.attributes.forecast[0].detailed_description | truncate(250, False) }}"
      nws_current_rain_forecast:
        friendly_name: 'Current Rain Chance'
        value_template: "{{ states.weather.klzu_daynight.attributes.forecast[0].precipitation_probability }}"
        unit_of_measurement: '%'
      nws_current_temperature:
        friendly_name: 'Current Temperature'
        value_template: "{{ states.weather.klzu_daynight.attributes.temperature }}"
        device_class: temperature
      nws_daytime_temperature:
        friendly_name: 'Daytime Temperature'
        value_template: >-
            {% if states.weather.klzu_daynight.attributes.forecast[0].daytime == True %}
              {{ states.weather.klzu_daynight.attributes.forecast[0].temperature }}
            {% elif states.weather.klzu_daynight.attributes.forecast[1].daytime == True %}
              {{ states.weather.klzu_daynight.attributes.forecast[1].temperature }}
            {% endif %}
        device_class: temperature
      nws_current_condition: 
        friendly_name: 'Current Condition'
        value_template: "{{ states.weather.klzu_daynight.state }}"
      nws_current_humidity:
        friendly_name: 'Current Humidity'
        value_template: "{{ states.weather.klzu_daynight.attributes.humidity }}"
      nws_current_visibility:
        friendly_name: "Current Visability"
        value_template: "{{ states.weather.klzu_daynight.attributes.visibility }}"
      nws_current_windspeed:
        friendly_name: "Current Windspeed"
        value_template: "{{ states.weather.klzu_daynight.attributes.wind_speed }}"
      nws_overnight_low:
        friendly_name: "Overnight Low"
        unit_of_measurement: ''
        value_template: >-
            {% if states.weather.klzu_daynight.attributes.forecast[0].daytime == False %}
              {{ states.weather.klzu_daynight.attributes.forecast[0].temperature }}
            {% elif states.weather.klzu_daynight.attributes.forecast[1].daytime == False %}
              {{ states.weather.klzu_daynight.attributes.forecast[1].temperature }}
            {% endif %}
      nws_overnight_forecast:
        friendly_name: "Overnight Forecast"
        unit_of_measurement: ''
        value_template: >-
            {% if states.weather.klzu_daynight.attributes.forecast[0].daytime == False %}
              {{ states.weather.klzu_daynight.attributes.forecast[0].detailed_description | truncate(250, False) }}
            {% elif states.weather.klzu_daynight.attributes.forecast[1].daytime == False %}
              {{ states.weather.klzu_daynight.attributes.forecast[1].detailed_description | truncate(250, False) }}
            {% elif states.weather.klzu_daynight.attributes.forecast[2].daytime == False %}
              {{ states.weather.klzu_daynight.attributes.forecast[2].detailed_description | truncate(250, False) }}
            {% endif %}
      nws_forecast_tomorrow:
        friendly_name: "Forecast Tomorrow"
        unit_of_measurement: ''
        value_template: >-
            {%- if states.weather.klzu_daynight.attributes.forecast[1].daytime == True %}
              {{ states.weather.klzu_daynight.attributes.forecast[1].detailed_description | truncate(250, False) }} 
            {% elif states.weather.klzu_daynight.attributes.forecast[2].daytime == True %}
              {{ states.weather.klzu_daynight.attributes.forecast[2].detailed_description | truncate(250, False) }} 
            {%- endif %}
      nws_forecast_rain_tomorrow:
        friendly_name: "Rain Chance Tomorrow"
        unit_of_measurement: '%'
        value_template: >-
            {%- if states.weather.klzu_daynight.attributes.forecast[1].daytime == True %}
              {{ states.weather.klzu_daynight.attributes.forecast[1].precipitation_probability }} 
            {% elif states.weather.klzu_daynight.attributes.forecast[2].daytime == True %}
              {{ states.weather.klzu_daynight.attributes.forecast[2].precipitation_probability }} 
            {%- endif %}
      nws_forecast_tomorrow_night:
        friendly_name: "Forecast Tomorrow Night"
        unit_of_measurement: ''
        value_template: >-
            {%- if states.weather.klzu_daynight.attributes.forecast[1].daytime == True %}
              {{ states.weather.klzu_daynight.attributes.forecast[2].detailed_description | truncate(250, False) }} 
            {% elif states.weather.klzu_daynight.attributes.forecast[2].daytime == True %}
              {{ states.weather.klzu_daynight.attributes.forecast[3].detailed_description | truncate(250, False) }}
            {%- endif %}
      nws_forecast_rain_tomorrow_night:
        friendly_name: "Rain Chance Tomorrow Night"
        unit_of_measurement: '%'
        value_template: >-
            {%- if states.weather.klzu_daynight.attributes.forecast[1].daytime == True %}
              {{ states.weather.klzu_daynight.attributes.forecast[2].precipitation_probability  }} 
            {% elif states.weather.klzu_daynight.attributes.forecast[2].daytime == True %}
              {{ states.weather.klzu_daynight.attributes.forecast[3].precipitation_probability  }}
            {%- endif %}
      current_inside_humidity:
        friendly_name: "Current Inside Humidity"
        unit_of_measurement: '%'
        value_template: "{{ states.climate.home.attributes.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.nws_overnight_low
        below: 35
      - platform: numeric_state
        entity_id: sensor.nws_current_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.nws_overnight_low
        above: 33
    condition:
      - condition: state
        entity_id: input_boolean.freeze_warning
        state: 'on'
      - condition: numeric_state
        entity_id: sensor.nws_overnight_low
        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 

  