278 lines
7.8 KiB
YAML
278 lines
7.8 KiB
YAML
#:########################################################################################:#
|
|
# Open-Meteo Rain Chance Package #
|
|
#:########################################################################################:#
|
|
#
|
|
# TITLE:
|
|
# Open-Meteo Rain Chance
|
|
#
|
|
# FILE:
|
|
# open_meteo_rain_chance.yaml
|
|
#
|
|
# VERSION:
|
|
# V1.2 2026-07-19
|
|
# - Changed today's forecast period to use remaining daylight hours.
|
|
# - Before sunrise, today's forecast covers sunrise through sunset.
|
|
# - During daylight, today's forecast covers now through sunset.
|
|
# - At sunset or later, today's forecast covers now through midnight.
|
|
# - Tomorrow continues to cover daylight hours only.
|
|
#
|
|
# V1.1 2026-07-19
|
|
# - Changed today's prediction to use only the remaining forecast hours
|
|
# from the current local hour until midnight.
|
|
# - Changed tomorrow's prediction to cover daylight hours only.
|
|
# - Added hourly precipitation probability data.
|
|
# - Added today's and tomorrow's sunrise and sunset data.
|
|
#
|
|
# V1.0 2026-07-18
|
|
# - Initial version.
|
|
# - Used the full-day maximum precipitation probability for today and
|
|
# tomorrow.
|
|
#
|
|
# PURPOSE:
|
|
# Creates dedicated Home Assistant sensors for the maximum hourly
|
|
# probability of precipitation during useful forecast periods today and
|
|
# tomorrow.
|
|
#
|
|
# SOURCE:
|
|
# Open-Meteo Forecast API
|
|
#
|
|
# LOCATION:
|
|
# Uses the latitude and longitude attributes of zone.home.
|
|
#
|
|
# OUTPUT ENTITIES:
|
|
# sensor.open_meteo_rain_chance_today
|
|
# sensor.open_meteo_rain_chance_tomorrow
|
|
#
|
|
# FORECAST PERIODS:
|
|
# Today before sunrise:
|
|
# Sunrise through sunset.
|
|
#
|
|
# Today during daylight:
|
|
# Current time through sunset.
|
|
#
|
|
# Today at or after sunset:
|
|
# Current time through midnight.
|
|
#
|
|
# Tomorrow:
|
|
# Sunrise through sunset.
|
|
#
|
|
# UPDATE RATE:
|
|
# Every 30 minutes.
|
|
#
|
|
# NOTES:
|
|
# - No API key is required.
|
|
# - timezone=auto makes Open-Meteo return forecast times in the local
|
|
# timezone determined from the zone.home coordinates.
|
|
# - Each Open-Meteo hourly precipitation probability applies to the
|
|
# preceding hour.
|
|
# - Hourly forecast periods that partly overlap sunrise or sunset are
|
|
# included.
|
|
# - The displayed result is the highest hourly probability within the
|
|
# applicable period.
|
|
# - The result is not a separately calculated probability of receiving
|
|
# rain at any point across the whole selected period.
|
|
# - Sensor values and forecast-period changes are recalculated whenever
|
|
# the REST request updates.
|
|
#
|
|
#:########################################################################################:#
|
|
|
|
rest:
|
|
- resource_template: >-
|
|
https://api.open-meteo.com/v1/forecast?latitude={{ state_attr('zone.home', 'latitude') }}&longitude={{ state_attr('zone.home', 'longitude') }}&hourly=precipitation_probability&daily=sunrise,sunset&timezone=auto&forecast_days=2
|
|
|
|
method: GET
|
|
scan_interval: 1800
|
|
timeout: 20
|
|
|
|
sensor:
|
|
#:###################################################################################:#
|
|
# Rain Chance Today #
|
|
#:###################################################################################:#
|
|
#
|
|
# Before sunrise:
|
|
# Uses today's sunrise through sunset.
|
|
#
|
|
# During daylight:
|
|
# Uses the current time through today's sunset.
|
|
#
|
|
# At or after sunset:
|
|
# Uses the current time through midnight.
|
|
#
|
|
|
|
- name: "Open Meteo Rain Chance Today"
|
|
unique_id: open_meteo_rain_chance_today
|
|
unit_of_measurement: "%"
|
|
state_class: measurement
|
|
icon: mdi:weather-rainy
|
|
|
|
value_template: >-
|
|
{% set current_timestamp =
|
|
as_timestamp(now())
|
|
%}
|
|
|
|
{% set sunrise_timestamp =
|
|
as_timestamp(
|
|
value_json.daily.sunrise[0],
|
|
0
|
|
)
|
|
%}
|
|
|
|
{% set sunset_timestamp =
|
|
as_timestamp(
|
|
value_json.daily.sunset[0],
|
|
0
|
|
)
|
|
%}
|
|
|
|
{% set tomorrow_midnight_timestamp =
|
|
as_timestamp(
|
|
value_json.daily.time[1] ~ 'T00:00',
|
|
0
|
|
)
|
|
%}
|
|
|
|
{% if current_timestamp < sunrise_timestamp %}
|
|
|
|
{% set period_start_timestamp =
|
|
sunrise_timestamp
|
|
%}
|
|
|
|
{% set period_end_timestamp =
|
|
sunset_timestamp
|
|
%}
|
|
|
|
{% elif current_timestamp < sunset_timestamp %}
|
|
|
|
{% set period_start_timestamp =
|
|
current_timestamp
|
|
%}
|
|
|
|
{% set period_end_timestamp =
|
|
sunset_timestamp
|
|
%}
|
|
|
|
{% else %}
|
|
|
|
{% set period_start_timestamp =
|
|
current_timestamp
|
|
%}
|
|
|
|
{% set period_end_timestamp =
|
|
tomorrow_midnight_timestamp
|
|
%}
|
|
|
|
{% endif %}
|
|
|
|
{% set ns = namespace(
|
|
maximum=0,
|
|
found=false
|
|
) %}
|
|
|
|
{% for index in range(
|
|
value_json.hourly.time | count
|
|
) %}
|
|
|
|
{% set forecast_end_timestamp =
|
|
as_timestamp(
|
|
value_json.hourly.time[index],
|
|
0
|
|
)
|
|
%}
|
|
|
|
{% set probability =
|
|
value_json.hourly.precipitation_probability[index]
|
|
%}
|
|
|
|
{% if
|
|
forecast_end_timestamp > period_start_timestamp
|
|
and forecast_end_timestamp < period_end_timestamp + 3600
|
|
and probability is not none
|
|
%}
|
|
|
|
{% set ns.found = true %}
|
|
|
|
{% if probability | int(0) > ns.maximum %}
|
|
|
|
{% set ns.maximum =
|
|
probability | int(0)
|
|
%}
|
|
|
|
{% endif %}
|
|
|
|
{% endif %}
|
|
|
|
{% endfor %}
|
|
|
|
{{ ns.maximum if ns.found else 0 }}
|
|
|
|
#:###################################################################################:#
|
|
# Rain Chance Tomorrow — Daylight #
|
|
#:###################################################################################:#
|
|
#
|
|
# Uses hourly forecast periods that overlap tomorrow's daylight
|
|
# period between sunrise and sunset.
|
|
#
|
|
|
|
- name: "Open Meteo Rain Chance Tomorrow"
|
|
unique_id: open_meteo_rain_chance_tomorrow
|
|
unit_of_measurement: "%"
|
|
state_class: measurement
|
|
icon: mdi:weather-sunset-up
|
|
|
|
value_template: >-
|
|
{% set sunrise_timestamp =
|
|
as_timestamp(
|
|
value_json.daily.sunrise[1],
|
|
0
|
|
)
|
|
%}
|
|
|
|
{% set sunset_timestamp =
|
|
as_timestamp(
|
|
value_json.daily.sunset[1],
|
|
0
|
|
)
|
|
%}
|
|
|
|
{% set ns = namespace(
|
|
maximum=0,
|
|
found=false
|
|
) %}
|
|
|
|
{% for index in range(
|
|
value_json.hourly.time | count
|
|
) %}
|
|
|
|
{% set forecast_end_timestamp =
|
|
as_timestamp(
|
|
value_json.hourly.time[index],
|
|
0
|
|
)
|
|
%}
|
|
|
|
{% set probability =
|
|
value_json.hourly.precipitation_probability[index]
|
|
%}
|
|
|
|
{% if
|
|
forecast_end_timestamp > sunrise_timestamp
|
|
and forecast_end_timestamp < sunset_timestamp + 3600
|
|
and probability is not none
|
|
%}
|
|
|
|
{% set ns.found = true %}
|
|
|
|
{% if probability | int(0) > ns.maximum %}
|
|
|
|
{% set ns.maximum =
|
|
probability | int(0)
|
|
%}
|
|
|
|
{% endif %}
|
|
|
|
{% endif %}
|
|
|
|
{% endfor %}
|
|
|
|
{{ ns.maximum if ns.found else 0 }}
|