various packages
This commit is contained in:
@@ -0,0 +1,277 @@
|
||||
#:########################################################################################:#
|
||||
# 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 }}
|
||||
Reference in New Issue
Block a user