various packages

This commit is contained in:
zorruno
2026-07-20 19:24:35 +12:00
parent afcbf1a94b
commit d8bcf05bf6
15 changed files with 4743 additions and 5310 deletions
+277
View File
@@ -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 }}