216 lines
9.1 KiB
YAML
216 lines
9.1 KiB
YAML
# Filename: irrigation_unlimited_adjustment.yaml
|
|
#
|
|
# This file is a package and should be located in the config/packages
|
|
# folder. If you do not have a packages folder then create it and add
|
|
# the following to configuration.yaml
|
|
#
|
|
# homeassistant:
|
|
# packages: !include_dir_named packages
|
|
#
|
|
# More information on packages can be found at https://www.home-assistant.io/docs/configuration/packages
|
|
#
|
|
# Set up some observation sensors.
|
|
# This uses the Home-Assistant-wundergroundpws https://github.com/cytech/Home-Assistant-wundergroundpws integration.
|
|
# Rain information (wupws_preciptotal) is a daily accumulation total. So we want to grab the
|
|
# data just before midnight to get the daily total. We shouldn't be too eager to look after midnight
|
|
# because the reset from WU may take a few minutes to come through, currently 10 min. Increase this
|
|
# if data is unreliable.
|
|
# Note: Requires the ha-average integration to be installed https://github.com/Limych/ha-average
|
|
|
|
sensor:
|
|
- platform: average
|
|
name: irrigation_unlimited_rain_0
|
|
entities:
|
|
- sensor.wupws_preciptotal
|
|
precision: 1
|
|
start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) }}"
|
|
end: "{{ now() }}"
|
|
scan_interval: 600
|
|
|
|
- platform: average
|
|
name: irrigation_unlimited_rain_1
|
|
entities:
|
|
- sensor.wupws_preciptotal
|
|
precision: 1
|
|
start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=1) }}"
|
|
end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=1) }}"
|
|
scan_interval: 600
|
|
|
|
- platform: average
|
|
name: irrigation_unlimited_rain_2
|
|
entities:
|
|
- sensor.wupws_preciptotal
|
|
precision: 1
|
|
start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=2) }}"
|
|
end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=2) }}"
|
|
scan_interval: 600
|
|
|
|
- platform: average
|
|
name: irrigation_unlimited_rain_3
|
|
entities:
|
|
- sensor.wupws_preciptotal
|
|
precision: 1
|
|
start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=3) }}"
|
|
end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=3) }}"
|
|
scan_interval: 600
|
|
|
|
- platform: average
|
|
name: irrigation_unlimited_rain_4
|
|
entities:
|
|
- sensor.wupws_preciptotal
|
|
precision: 1
|
|
start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=4) }}"
|
|
end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=4) }}"
|
|
scan_interval: 600
|
|
|
|
- platform: average
|
|
name: irrigation_unlimited_temperature_0
|
|
entities:
|
|
- sensor.wupws_temp
|
|
precision: 1
|
|
start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) }}"
|
|
end: "{{ now() }}"
|
|
scan_interval: 600
|
|
|
|
- platform: average
|
|
name: irrigation_unlimited_temperature_1
|
|
entities:
|
|
- sensor.wupws_temp
|
|
precision: 1
|
|
start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=1) }}"
|
|
end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=1) }}"
|
|
scan_interval: 600
|
|
|
|
- platform: average
|
|
name: irrigation_unlimited_temperature_2
|
|
entities:
|
|
- sensor.wupws_temp
|
|
precision: 1
|
|
start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=2) }}"
|
|
end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=2) }}"
|
|
scan_interval: 600
|
|
|
|
- platform: average
|
|
name: irrigation_unlimited_temperature_3
|
|
entities:
|
|
- sensor.wupws_temp
|
|
precision: 1
|
|
start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=3) }}"
|
|
end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=3) }}"
|
|
scan_interval: 600
|
|
|
|
- platform: average
|
|
name: irrigation_unlimited_temperature_4
|
|
entities:
|
|
- sensor.wupws_temp
|
|
precision: 1
|
|
start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=4) }}"
|
|
end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=4) }}"
|
|
scan_interval: 600
|
|
|
|
- platform: average
|
|
name: irrigation_unlimited_temperature_5_day_moving_average
|
|
entities:
|
|
- sensor.wupws_temp
|
|
precision: 1
|
|
start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=4) }}"
|
|
end: "{{ now() }}"
|
|
scan_interval: 600
|
|
|
|
# Five day weighted rain total sensor.
|
|
# Adjust the weight values (0.7, 0.3, 0.15, 0.05) to suit your needs (0.0 = ignore that day).
|
|
- platform: template
|
|
sensors:
|
|
irrigation_unlimited_rain_weighted_total:
|
|
friendly_name: "Irrigation Unlimited Rain Weighted Total"
|
|
unit_of_measurement: "mm"
|
|
icon_template: "mdi:umbrella"
|
|
value_template: >
|
|
{% set r0 = state_attr('sensor.irrigation_unlimited_rain_0','max_value') | float(-1) %}
|
|
{% set r1 = state_attr('sensor.irrigation_unlimited_rain_1','max_value') | float(-1) %}
|
|
{% set r2 = state_attr('sensor.irrigation_unlimited_rain_2','max_value') | float(-1) %}
|
|
{% set r3 = state_attr('sensor.irrigation_unlimited_rain_3','max_value') | float(-1) %}
|
|
{% set r4 = state_attr('sensor.irrigation_unlimited_rain_4','max_value') | float(-1) %}
|
|
{% if r0 != -1 and r1 != -1 and r2 != -1 and r3 != - 1 and r4 != -1 %}
|
|
{% set rain_total = r0 %}
|
|
{% set rain_total = rain_total + r1 * 0.7 %}
|
|
{% set rain_total = rain_total + r2 * 0.3 %}
|
|
{% set rain_total = rain_total + r3 * 0.15 %}
|
|
{% set rain_total = rain_total + r4 * 0.05 %}
|
|
{{ rain_total | round(1) }}
|
|
{% else %}
|
|
{{ -1 }}
|
|
{% endif %}
|
|
scan_interval: 600
|
|
|
|
# Automation to adjust the run times for Irrigation Unlimited.
|
|
# It uses the 5 day weighted rain total and the moving 5 day average temperature sensors
|
|
# created above to generate a variation.
|
|
# Adjust rain_total_threshold, rain_rate_threshold and temperature_threshold variables to suit you needs.
|
|
automation:
|
|
- id: 'IU1653340123453'
|
|
alias: Irrigation Unlimited Adjustment
|
|
trigger:
|
|
# -------------------------------------------------------------------
|
|
# Choose how you want to trigger this automation.
|
|
# Comment out/delete/change as required.
|
|
# -------------------------------------------------------------------
|
|
# Run at a fixed time
|
|
- platform: time
|
|
at: "02:00"
|
|
# Run when Home Assistant starts
|
|
- platform: homeassistant
|
|
event: start
|
|
# Run when the sensors update. Don't use this option if any of your
|
|
# schedules use the 'anchor: finish'. It will most likely cause the
|
|
# system to skip. Use a fixed time.
|
|
- platform: state
|
|
entity_id:
|
|
- sensor.irrigation_unlimited_rain_weighted_total
|
|
- sensor.irrigation_unlimited_temperature_5_day_moving_average
|
|
- sensor.wupws_preciprate
|
|
condition:
|
|
condition: and
|
|
conditions:
|
|
- "{{ states('sensor.irrigation_unlimited_rain_weighted_total') | float(-1) != -1 }}"
|
|
- "{{ states('sensor.wupws_preciprate') | float(-1) != -1 }}"
|
|
- "{{ states('sensor.irrigation_unlimited_temperature_5_day_moving_average') | float(-273) != -273 }}"
|
|
action:
|
|
service: irrigation_unlimited.adjust_time
|
|
data:
|
|
# -------------------------------------------------------------------
|
|
# Please see documentation regarding the adjust_time service call.
|
|
# Choose an option below. Comment out/delete/change as needed.
|
|
# *** This will NOT work as is. ***
|
|
# 1. Adjust a single zone. Change the zone as required
|
|
# entity_id: binary_sensor.irrigation_unlimited_c1_z1
|
|
# 2. Adjust a sequence. Change the sequence_id as required
|
|
# entity_id: binary_sensor.irrigation_unlimited_c1_m
|
|
# sequence_id: 1
|
|
# -------------------------------------------------------------------
|
|
percentage: >
|
|
{# Threshold variables #}
|
|
{% set rain_total_threshold = 3.5 %}
|
|
{% set rain_rate_threshold = 1.0 %}
|
|
{% set temperature_threshold = 20.0 %}
|
|
|
|
{# Sensor data #}
|
|
{% set rain_total = states('sensor.irrigation_unlimited_rain_weighted_total') | float(-1) %}
|
|
{% set rain_rate = states('sensor.wupws_preciprate') | float(-1) %}
|
|
{% set temperature_average = states('sensor.irrigation_unlimited_temperature_5_day_moving_average') | float(-273) %}
|
|
|
|
{# Threshold variables #}
|
|
{% set rain_multiplier = (1 - (rain_total / rain_total_threshold)) %}
|
|
{% set temperature_multiplier = temperature_average / temperature_threshold %}
|
|
|
|
{% set multiplier = 1.0 %}
|
|
{% if rain_rate < rain_rate_threshold and rain_multiplier > 0 and rain_total < rain_total_threshold %}
|
|
{% set multiplier = multiplier * temperature_multiplier %}
|
|
{% set multiplier = multiplier * rain_multiplier %}
|
|
{% else %}
|
|
{% set multiplier = 0.0 %} {# It's raining or enough already #}
|
|
{% endif %}
|
|
|
|
{# Return multiplier as a percentage #}
|
|
{{ (multiplier * 100) | round(0) }}
|