Files
fresh-home/components/packages/automatic_sprinkler_system.yaml
T
2026-07-09 16:26:31 -04:00

700 lines
26 KiB
YAML

input_boolean:
sprinkler_is_winterized:
name: "Sprinkler: Is Winterized"
icon: mdi:sprinkler
input_datetime:
sprinkler_last_reset:
name: "Sprinkler: Last Reset"
icon: mdi:calendar
has_date: true
has_time: false
sprinkler_last_run:
name: "Sprinkler: Last Run"
icon: mdi:calendar
has_date: true
has_time: false
sprinkler_next_dawn:
name: "Sprinkler: Next Dawn"
icon: mdi:weather-sunset-up
has_date: true
has_time: true
input_number:
sprinkler_days_before_high_run:
name: "Sprinkler: Days Before High Run"
icon: mdi:calendar
min: 0
max: 10
step: 1
mode: box
sprinkler_days_before_medium_run:
name: "Sprinkler: Days Before Medium Run"
icon: mdi:calendar
min: 0
max: 10
step: 1
mode: box
sprinkler_days_before_low_run:
name: "Sprinkler: Days Before Low Run"
icon: mdi:calendar
min: 0
max: 10
step: 1
mode: box
sprinkler_days_before_reset:
name: "Sprinkler: Days Before Reset"
icon: mdi:calendar
min: 0
max: 20
step: 1
mode: box
sprinkler_precipitation_below_high_run:
name: "Sprinkler: Precipitation Below - High Run"
icon: mdi:water
min: 0
max: 50
step: 0.1
unit_of_measurement: mm
mode: box
sprinkler_precipitation_below_medium_run:
name: "Sprinkler: Precipitation Below - Medium Run"
icon: mdi:water
min: 0
max: 50
step: 0.1
unit_of_measurement: mm
mode: box
sprinkler_precipitation_below_low_run:
name: "Sprinkler: Precipitation Below - Low Run"
icon: mdi:water
min: 0
max: 50
step: 0.1
unit_of_measurement: mm
mode: box
sprinkler_temp_above_high_run:
name: "Sprinkler: Temp Above - High Run"
icon: mdi:thermometer-high
min: 50
max: 90
step: 1
unit_of_measurement: °F
sprinkler_temp_above_medium_run:
name: "Sprinkler: Temp Above - Medium Run"
icon: mdi:thermometer
min: 50
max: 90
step: 1
unit_of_measurement: °F
sprinkler_temp_above_low_run:
name: "Sprinkler: Temp Above - Low Run"
icon: mdi:thermometer-low
min: 50
max: 90
step: 1
unit_of_measurement: °F
sprinkler_maximum_temperature_measured:
name: "Sprinkler: Maximum Temperature Measured"
icon: mdi:thermometer
min: -20
max: 150
step: 0.01
unit_of_measurement: °F
mode: box
sprinkler_repeat_program_amount:
name: "Sprinkler: Repeat Program Amount"
icon: mdi:pound
min: 0
max: 10
step: 1
sprinkler_high_water_level:
name: "Sprinkler: High Water Level"
icon: mdi:water-plus
min: 0
max: 300
step: 1
mode: box
sprinkler_medium_water_level:
name: "Sprinkler: Medium Water Level"
icon: mdi:water
min: 0
max: 300
step: 1
mode: box
sprinkler_low_water_level:
name: "Sprinkler: Low Water Level"
icon: mdi:water-minus
min: 0
max: 300
step: 1
mode: box
template:
- trigger:
- platform: state
entity_id:
- input_number.sprinkler_maximum_temperature_measured
- sensor.sprinkler_total_rain_fallen_plus_expected
- sensor.sprinkler_days_since_last_watering
- input_number.sprinkler_temp_above_high_run
- input_number.sprinkler_temp_above_medium_run
- input_number.sprinkler_temp_above_low_run
- input_number.sprinkler_precipitation_below_high_run
- input_number.sprinkler_precipitation_below_medium_run
- input_number.sprinkler_precipitation_below_low_run
- input_number.sprinkler_days_before_high_run
- input_number.sprinkler_days_before_medium_run
- input_number.sprinkler_days_before_low_run
- switch.opensprinkler_enabled
not_to: "unavailable"
- platform: event
event_type: event_template_reloaded
id: "reload"
- platform: homeassistant
event: start
sensor:
- name: "Sprinkler: Current Status"
unique_id: "custom_sensor.sprinkler_current_status"
icon: mdi:sprinkler-variant
state: >
{%- if is_state('input_boolean.sprinkler_is_winterized','on') %}
Sprinkler is winterized
{%- else %}
{%- if is_state('switch.opensprinkler_enabled','on') %}
{%- if states('input_number.sprinkler_maximum_temperature_measured') | int(default=0) > states('input_number.sprinkler_temp_above_low_run') | int(default=0) %}
{%- if states('input_number.sprinkler_maximum_temperature_measured') | int(default=0) > states('input_number.sprinkler_temp_above_medium_run') | int(default=0) %}
{%- if states('input_number.sprinkler_maximum_temperature_measured') | int(default=0) > states('input_number.sprinkler_temp_above_high_run') | int(default=0) %}
{%- if states('sensor.sprinkler_total_rain_fallen_plus_expected') | float(default=0) < states('input_number.sprinkler_precipitation_below_high_run') | float(default=0.0) -%}
{%- if states('sensor.sprinkler_days_since_last_watering') | float(default=0) > states('input_number.sprinkler_days_before_high_run') | float(default=10.0) -%}
High
{%- else %}
Too Soon
{% endif %}
{%- else %}
Too Wet
{% endif %}
{%- else %}
{%- if states('sensor.sprinkler_total_rain_fallen_plus_expected') | float(default=0) < states('input_number.sprinkler_precipitation_below_medium_run') | float(default=0.0) %}
{%- if states('sensor.sprinkler_days_since_last_watering') | float(default=0) > states('input_number.sprinkler_days_before_medium_run') | float(default=10.0) %}
Medium
{%- else %}
Too Soon
{% endif %}
{%- else %}
Too Wet
{%- endif %}
{% endif %}
{%- else %}
{%- if states('sensor.sprinkler_total_rain_fallen_plus_expected') | float(default=0) < states('input_number.sprinkler_precipitation_below_low_run') | float(default=0.0) %}
{%- if states('sensor.sprinkler_days_since_last_watering') | float(default=0) > states('input_number.sprinkler_days_before_low_run') | float(default=10.0) %}
Low
{%- else %}
Too Soon
{% endif %}
{%- else %}
Too Wet
{% endif %}
{% endif %}
{%- else %}
Too Cold
{% endif %}
{%- else %}
Off
{% endif %}
{% endif %}
- trigger:
- platform: state
entity_id: sensor.sprinkler_recent_rain_precipitation
- platform: event
event_type: event_template_reloaded
id: "reload"
- platform: homeassistant
event: start
sensor:
- name: "Sprinkler: Total Rain Fallen Plus Expected"
unique_id: "custom_sensor.sprinkler_total_rain_fallen_plus_expected"
icon: mdi:weather-pouring
unit_of_measurement: mm
availability: "{{ states('sensor.sprinkler_recent_rain_precipitation') not in ['unknown', 'unavailable'] }}"
state: >
{{ (states('sensor.sprinkler_recent_rain_precipitation') | float + states('sensor.sprinkler_total_expected_precipitation') | float(default=100.0) ) | round(2) }}
- trigger:
- platform: state
entity_id: sensor.sun_next_rising
- platform: event
event_type: event_template_reloaded
id: "reload"
- platform: homeassistant
event: start
sensor:
- name: "Sprinkler: One Hour Before Sunrise"
unique_id: "custom_sensor.sprinkler_one_hour_before_sunrise"
icon: mdi:clock
device_class: timestamp
state: >
{{ (( as_timestamp(states('sensor.sun_next_rising')) - 3600) | timestamp_utc) }}
- trigger:
- platform: state
entity_id:
- sensor.opensprinkler_water_level
- input_number.front_yard_station_minutes
- input_number.east_side_station_minutes
- input_number.back_yard_station_minutes
- input_number.west_side_station_minutes
- input_number.sprinkler_repeat_program_amount
- platform: event
event_type: event_template_reloaded
id: "reload"
- platform: homeassistant
event: start
sensor:
- name: "Sprinkler: Expected Run Length"
unique_id: "custom_sensor.sprinkler_expected_run_length"
icon: mdi:clock
unit_of_measurement: seconds
availability: >
{{ states('sensor.opensprinkler_water_level') not in ['unknown', 'unavailable'] and
states('input_number.front_yard_station_minutes') not in ['unknown', 'unavailable'] and
states('input_number.east_side_station_minutes') not in ['unknown', 'unavailable'] and
states('input_number.back_yard_station_minutes') not in ['unknown', 'unavailable'] and
states('input_number.west_side_station_minutes') not in ['unknown', 'unavailable'] and
states('input_number.sprinkler_repeat_program_amount') not in ['unknown', 'unavailable'] }}
state: >
{{ states("sensor.opensprinkler_water_level")| float(default=0) | multiply(0.01) | multiply(states("input_number.front_yard_station_minutes") | multiply(60)) | float(default=0) +
states("sensor.opensprinkler_water_level")| float(default=0) | multiply(0.01) | multiply(states("input_number.east_side_station_minutes") | multiply(60)) | float(default=0) +
states("sensor.opensprinkler_water_level")| float(default=0) | multiply(0.01) | multiply(states("input_number.back_yard_station_minutes") | multiply(60)) | float(default=0) +
states("sensor.opensprinkler_water_level")| float(default=0) | multiply(0.01) | multiply(states("input_number.west_side_station_minutes") | multiply(60)) | float(default=0) *
states("input_number.sprinkler_repeat_program_amount") | float(default=0) }}
attributes:
front_yard: "{{ states('sensor.opensprinkler_water_level')| float(default=0) | multiply(0.01) | multiply(states('input_number.front_yard_station_minutes') | multiply(60)) | float(default=0) }} seconds"
east_side: "{{ states('sensor.opensprinkler_water_level')| float(default=0) | multiply(0.01) | multiply(states('input_number.east_side_station_minutes') | multiply(60)) | float(default=0) }} seconds"
back_yard: "{{ states('sensor.opensprinkler_water_level')| float(default=0) | multiply(0.01) | multiply(states('input_number.back_yard_station_minutes') | multiply(60)) | float(default=0) }} seconds"
west_side: "{{ states('sensor.opensprinkler_water_level')| float(default=0) | multiply(0.01) | multiply(states('input_number.west_side_station_minutes') | multiply(60)) | float(default=0) }} seconds"
water_level: "{{ states('sensor.opensprinkler_water_level') | float(default=0) }}%"
run_cycle: "{{ states('input_number.sprinkler_repeat_program_amount') | float(default=0) }} time(s)"
- trigger:
- platform: time_pattern
minutes: "/5"
- platform: state
entity_id: input_datetime.sprinkler_last_reset
- platform: state
entity_id: input_datetime.sprinkler_next_dawn
- platform: event
event_type: event_template_reloaded
id: "reload"
- platform: homeassistant
event: start
sensor:
- name: "Sprinkler: Days Since Last Watering"
unique_id: "custom_sensor.sprinkler_days_since_last_watering"
icon: mdi:calendar
state: >
{{ ((as_timestamp(states('sensor.sprinkler_one_hour_before_sunrise')) - as_timestamp(states('input_datetime.sprinkler_last_reset'))) / 86400 | float) | round(2) }}
# This really isn't needed. It just checks the trend binary_sensor.is_raining, and keeps it 'on' an extra 15 minutes
- trigger:
- platform: state
entity_id: binary_sensor.is_raining
not_to:
- "unknown"
- "unavailable"
binary_sensor:
- name: "Sprinkler: Raining"
unique_id: "custom_binary_sensor.sprinkler_raining"
device_class: moisture
delay_off:
minutes: 15
# availability: "{{ states('sensor.rain_quarter_hourly_precipitation') not in ['unknown', 'unavailable'] }}"
# state: >
# {{ states('sensor.rain_quarter_hourly_precipitation') | float(default=0) > 0.0 }}
availability: "{{ states('binary_sensor.is_raining') not in ['unknown', 'unavailable'] }}"
state: >
{{ states('binary_sensor.is_raining') }}
# - trigger:
# # - platform: homeassistant
# # event: start
# # - platform: time
# # at: '01:00:00'
# # - platform: state
# # entity_id: input_boolean.sprinkler_is_winterized
# binary_sensor:
# - name: "Sprinkler: In Season"
# unique_id: "custom_binary_sensor.sprinkler_in_season"
# device_class: moisture
# state: "{{ now().month > 4 and now().month < 10 }}"
# - trigger:
# - platform: homeassistant
# event: start
# - platform: time
# at: '01:00:00'
# - platform: state
# entity_id: input_boolean.sprinkler_is_winterized
# - platform: event
# event_type: event_template_reloaded
# id: "reload"
# binary_sensor:
# - name: "Sprinkler: Should Winterize"
# unique_id: "custom_binary_sensor.sprinkler_should_winterize"
# device_class: problem
# state: "{{ iif(is_state('binary_sensor.sprinkler_in_season', 'off'), iif(is_state('input_boolean.sprinkler_is_winterized', 'off'), 'on', 'off'), 'off') }}"
# - trigger:
# - platform: homeassistant
# event: start
# - platform: time
# at: '01:00:00'
# - platform: state
# entity_id: input_boolean.sprinkler_is_winterized
# - platform: event
# event_type: event_template_reloaded
# id: "reload"
# binary_sensor:
# - name: "Sprinkler: Should Dewinterize"
# unique_id: "custom_binary_sensor.sprinkler_should_dewinterize"
# device_class: problem
# state: "{{ iif(is_state('binary_sensor.sprinkler_in_season', 'on'), iif(is_state('input_boolean.sprinkler_is_winterized', 'on'), 'on', 'off'), 'off') }}"
automation:
- alias: "Sprinkler: Reset After Automatic Run"
id: automation_sprinkler_reset_after_automatic_run
trigger:
- platform: state
entity_id: binary_sensor.automatic_run_program_running
from: "on"
to: "off"
action:
- action: script.sprinkler_reset_helper_values
- action: input_datetime.set_datetime
target:
entity_id: input_datetime.sprinkler_last_run
data:
timestamp: "{{ as_timestamp(now()) }}"
- alias: "Sprinkler: Update Next Dawn"
id: automation_sprinkler_update_next_dawn
trigger:
- platform: state
entity_id: sensor.sun_next_dawn
condition: "{{ states('sensor.sun_next_dawn') not in ['unknown', 'unavailable'] }}"
action:
- action: input_datetime.set_datetime
target:
entity_id: input_datetime.sprinkler_next_dawn
data:
timestamp: "{{ as_timestamp(states('sensor.sun_next_dawn')) }}"
- alias: "Sprinkler: Check Maximum Temperature When Temperature Changes"
id: automation_sprinkler_check_maximum_temperature_when_temperature_changes
trigger:
- platform: state
entity_id: sensor.outdoor_temperature
condition:
- condition: numeric_state
entity_id: sensor.outdoor_temperature
above: input_number.sprinkler_maximum_temperature_measured
action:
action: input_number.set_value
target:
entity_id: input_number.sprinkler_maximum_temperature_measured
data:
value: "{{ states('sensor.outdoor_temperature') | float(default=50) }}"
- alias: "Sprinkler: Stop Watering If Starts Raining"
id: 74ef91ed-6665-4e24-a817-c1a3540d2e3d
trigger:
- platform: state
entity_id: binary_sensor.is_raining
to: "on"
condition:
condition: or
conditions:
- condition: state
entity_id: binary_sensor.back_yard_station_running
state: "on"
- condition: state
entity_id: binary_sensor.front_yard_station_running
state: "on"
- condition: state
entity_id: binary_sensor.east_side_station_running
state: "on"
- condition: state
entity_id: binary_sensor.west_side_station_running
state: "on"
- condition: state
entity_id: binary_sensor.s05_station_running
state: "on"
- condition: state
entity_id: binary_sensor.s06_station_running
state: "on"
- condition: state
entity_id: binary_sensor.s07_station_running
state: "on"
- condition: state
entity_id: binary_sensor.master_station_running
state: "on"
action:
action: opensprinkler.stop
data:
entity_id: switch.opensprinkler_enabled
- alias: "Sprinkler: Check If Yard Needs to Be Watered"
id: automation_sprinkler_check_if_yard_needs_to_be_watered
description: "If OpenSprinkler is enabled and the sprinkler system is not winterized, then check if the grass should be watered"
mode: queued
trigger:
- platform: sun
event: sunrise
offset: "-01:15:00"
- platform: state
entity_id: sensor.sprinkler_total_rain_fallen_plus_expected
- platform: state
entity_id: input_number.sprinkler_maximum_temperature_measured
- platform: state
entity_id: sensor.sprinkler_days_since_last_watering
- platform: state
entity_id: input_number.sprinkler_temp_above_high_run
- platform: state
entity_id: input_number.sprinkler_temp_above_medium_run
- platform: state
entity_id: input_number.sprinkler_temp_above_low_run
condition:
- condition: state
entity_id: switch.opensprinkler_enabled
state: "on"
- condition: state
entity_id: input_boolean.sprinkler_is_winterized
state: "off"
action:
- choose:
# Check for High run
- conditions:
- condition: numeric_state
entity_id: input_number.sprinkler_maximum_temperature_measured
above: input_number.sprinkler_temp_above_high_run
- condition: numeric_state
entity_id: sensor.sprinkler_days_since_last_watering
above: input_number.sprinkler_days_before_high_run #0
- condition: numeric_state
entity_id: sensor.sprinkler_total_rain_fallen_plus_expected
below: input_number.sprinkler_precipitation_below_high_run #20.1
sequence:
- action: input_number.set_value
target:
entity_id: input_number.sprinkler_repeat_program_amount
data:
value: 1
- action: opensprinkler.set_water_level
data:
entity_id: sensor.opensprinkler_water_level
water_level: "{{ states('input_number.sprinkler_high_water_level') | int }}"
# Check for Medium run
- conditions:
- condition: numeric_state
entity_id: sensor.sprinkler_days_since_last_watering
above: input_number.sprinkler_days_before_medium_run #2
- condition: numeric_state
entity_id: input_number.sprinkler_maximum_temperature_measured
above: input_number.sprinkler_temp_above_medium_run
below: input_number.sprinkler_temp_above_high_run
- condition: numeric_state
entity_id: sensor.sprinkler_total_rain_fallen_plus_expected
below: input_number.sprinkler_precipitation_below_medium_run #15.1
sequence:
- action: input_number.set_value
target:
entity_id: input_number.sprinkler_repeat_program_amount
data:
value: 1
- action: opensprinkler.set_water_level
data:
entity_id: sensor.opensprinkler_water_level
water_level: "{{ states('input_number.sprinkler_medium_water_level') | int }}"
# Check for Low run
- conditions:
- condition: numeric_state
entity_id: sensor.sprinkler_days_since_last_watering
above: input_number.sprinkler_days_before_low_run #3
- condition: numeric_state
entity_id: input_number.sprinkler_maximum_temperature_measured
above: input_number.sprinkler_temp_above_low_run
below: input_number.sprinkler_temp_above_medium_run
- condition: numeric_state
entity_id: sensor.sprinkler_total_rain_fallen_plus_expected
below: input_number.sprinkler_precipitation_below_low_run #10.1
sequence:
- action: input_number.set_value
target:
entity_id: input_number.sprinkler_repeat_program_amount
data:
value: 1
- action: opensprinkler.set_water_level
data:
entity_id: sensor.opensprinkler_water_level
water_level: "{{ states('input_number.sprinkler_low_water_level') | int }}"
# Check for reset
- conditions:
- condition: numeric_state
entity_id: sensor.sprinkler_days_since_last_watering
above: input_number.sprinkler_days_before_reset #4
sequence:
- action: script.sprinkler_reset_helper_values
data: {}
default:
- action: input_number.set_value
target:
entity_id: input_number.sprinkler_repeat_program_amount
data:
value: 0
- action: opensprinkler.set_water_level
data:
entity_id: sensor.opensprinkler_water_level
water_level: 0
script:
sprinkler_reset_helper_values:
alias: "Sprinkler: Reset Helper Values"
icon: mdi:refresh
sequence:
- action: input_number.set_value
target:
entity_id: input_number.sprinkler_maximum_temperature_measured
data:
value: "{{ states('sensor.outdoor_temperature') | float(default=50) }}"
- action: input_datetime.set_datetime
target:
entity_id: input_datetime.sprinkler_last_reset
data:
timestamp: "{{ as_timestamp(now()) }}"
- action: utility_meter.reset
data: {}
target:
entity_id: select.sprinkler_recent_rain
sprinkler_start_scripted_watering:
alias: "Sprinkler: Start Scripted Watering"
icon: mdi:sprinkler-variant
sequence:
- alias: "Run the sprinkler program the appropriate number of times"
repeat:
count: "{{states('input_number.sprinkler_repeat_program_amount') | int }}"
sequence:
- action: opensprinkler.run
data:
entity_id: switch.opensprinkler_enabled
run_seconds:
- '{{ states("sensor.opensprinkler_water_level") | multiply(0.01) | multiply(states("input_number.front_yard_station_minutes") | multiply(60)) | int }}'
- '{{ states("sensor.opensprinkler_water_level") | multiply(0.01) | multiply(states("input_number.east_side_station_minutes") | multiply(60)) | int }}'
- '{{ states("sensor.opensprinkler_water_level") | multiply(0.01) | multiply(states("input_number.back_yard_station_minutes") | multiply(60)) | int }}'
- '{{ states("sensor.opensprinkler_water_level") | multiply(0.01) | multiply(states("input_number.west_side_station_minutes") | multiply(60)) | int }}'
- delay: '{{ states("sensor.opensprinkler_water_level") | multiply(0.01) | multiply(states("input_number.front_yard_station_minutes") | multiply(60)) | int }}'
- delay: '{{ states("sensor.opensprinkler_water_level") | multiply(0.01) | multiply(states("input_number.east_side_station_minutes") | multiply(60)) | int }}'
- delay: '{{ states("sensor.opensprinkler_water_level") | multiply(0.01) | multiply(states("input_number.back_yard_station_minutes") | multiply(60)) | int }}'
- delay: '{{ states("sensor.opensprinkler_water_level") | multiply(0.01) | multiply(states("input_number.west_side_station_minutes") | multiply(60)) | int }}'
utility_meter:
rain_quarter_hourly:
unique_id: utility_meter_rain_quarter_hourly
name: "Rain: Quarter Hourly"
source: sensor.rain_gauge_precipitation
cycle: quarter-hourly
tariffs:
- Precipitation
rain_hourly:
unique_id: utility_meter_rain_hourly
name: "Rain: Hourly"
source: sensor.rain_gauge_precipitation
cycle: hourly
tariffs:
- Precipitation
rain_daily:
unique_id: utility_meter_rain_daily
name: "Rain: Daily"
source: sensor.rain_gauge_precipitation
cycle: daily
offset: "12:00"
tariffs:
- Precipitation
rain_monthly:
unique_id: utility_meter_rain_monthly
name: "Rain: Monthly"
source: sensor.rain_gauge_precipitation
cycle: monthly
tariffs:
- Precipitation
rain_yearly:
unique_id: utility_meter_rain_yearly
name: "Rain: Yearly"
source: sensor.rain_gauge_precipitation
cycle: yearly
tariffs:
- Precipitation
sprinkler_recent_rain:
unique_id: utility_meter_sprinkler_recent_rain
name: "Sprinkler: Recent Rain"
source: sensor.rain_gauge_precipitation
cycle: yearly
tariffs:
- Precipitation