input_boolean: sprinkler_is_winterized: name: "Sprinkler: Is Winterized" icon: mdi:sprinkler log_precipitation: name: "Log Precipitation" icon: mdi:file log_soil_moisture: name: "Log Soil Moisture" icon: mdi:file 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 ['unkown', '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 ['unkown', 'unavailable'] and states('input_number.front_yard_station_minutes') not in ['unkown', 'unavailable'] and states('input_number.east_side_station_minutes') not in ['unkown', 'unavailable'] and states('input_number.back_yard_station_minutes') not in ['unkown', 'unavailable'] and states('input_number.west_side_station_minutes') not in ['unkown', 'unavailable'] and states('input_number.sprinkler_repeat_program_amount') not in ['unkown', '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_from: - "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 ['unkown', 'unavailable'] }}" # state: > # {{ states('sensor.rain_quarter_hourly_precipitation') | float(default=0) > 0.0 }} availability: "{{ states('binary_sensor.is_raining') not in ['unkown', '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: "Log Precipitation" id: 1f133cd1-7e69-4eb9-ba5f-7fa967dd869d trigger: - platform: state entity_id: input_boolean.log_precipitation from: "off" to: "on" - platform: state entity_id: sensor.ecowitt_wh40_21917_precipitation not_to: - "unknown" - "unavailable" - platform: state entity_id: binary_sensor.is_raining condition: - condition: state entity_id: input_boolean.log_precipitation state: "on" action: - service: notify.send_message target: entity_id: notify.precipitation data: message: "{{now().strftime('%Y-%m-%d')}}T{{now().strftime('%H:%M:%S.%f')}},{{states('sensor.ecowitt_wh40_21917_precipitation')}},{{states('binary_sensor.is_raining')}},{{state_attr('binary_sensor.is_raining','sample_count')}},{{state_attr('binary_sensor.is_raining','sample_duration')}},{{state_attr('binary_sensor.is_raining','min_gradient')}},{{state_attr('binary_sensor.is_raining','gradient')}}" - alias: "Log Soil Moisture" id: 362fbc8d-64f1-47dd-a686-e460e9c18690 trigger: - platform: state entity_id: input_boolean.log_soil_moisture from: "off" to: "on" - platform: state entity_id: sensor.fineoffset_wh51_00f935_moisture not_to: - "unknown" - "unavailable" - platform: state entity_id: sensor.fineoffset_wh51_0ce593_moisture not_to: - "unknown" - "unavailable" - platform: state entity_id: sensor.fineoffset_wh51_0d1e11_moisture not_to: - "unknown" - "unavailable" condition: - condition: state entity_id: input_boolean.log_soil_moisture state: "on" action: - service: notify.send_message target: entity_id: notify.soil_moisture data: message: "{{now().strftime('%Y-%m-%d')}}T{{now().strftime('%H:%M:%S.%f')}},{{states('sensor.fineoffset_wh51_00f935_moisture')}},{{states('sensor.fineoffset_wh51_0ce593_moisture')}},{{states('sensor.fineoffset_wh51_0d1e11_moisture')}}" - 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: - service: script.sprinkler_reset_helper_values - service: 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 ['unkown', 'unavailable'] }}" action: - service: 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.outdoors_mean_temperature condition: - condition: numeric_state entity_id: sensor.outdoors_mean_temperature above: input_number.sprinkler_maximum_temperature_measured action: service: input_number.set_value target: entity_id: input_number.sprinkler_maximum_temperature_measured data: value: "{{ states('sensor.outdoors_mean_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: service: 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: - service: input_number.set_value target: entity_id: input_number.sprinkler_repeat_program_amount data: value: 1 - service: 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: - service: input_number.set_value target: entity_id: input_number.sprinkler_repeat_program_amount data: value: 1 - service: 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: - service: input_number.set_value target: entity_id: input_number.sprinkler_repeat_program_amount data: value: 1 - service: 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: - service: script.sprinkler_reset_helper_values data: {} default: - service: input_number.set_value target: entity_id: input_number.sprinkler_repeat_program_amount data: value: 0 - service: 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: - service: input_number.set_value target: entity_id: input_number.sprinkler_maximum_temperature_measured data: value: "{{ states('sensor.outdoors_mean_temperature') | float(default=50) }}" - service: input_datetime.set_datetime target: entity_id: input_datetime.sprinkler_last_reset data: timestamp: "{{ as_timestamp(now()) }}" - service: 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: - service: 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.ecowitt_wh40_21917_precipitation cycle: quarter-hourly tariffs: - Precipitation rain_hourly: unique_id: utility_meter_rain_hourly name: "Rain: Hourly" source: sensor.ecowitt_wh40_21917_precipitation cycle: hourly tariffs: - Precipitation rain_daily: unique_id: utility_meter_rain_daily name: "Rain: Daily" source: sensor.ecowitt_wh40_21917_precipitation cycle: daily offset: "12:00" tariffs: - Precipitation rain_monthly: unique_id: utility_meter_rain_monthly name: "Rain: Monthly" source: sensor.ecowitt_wh40_21917_precipitation cycle: monthly tariffs: - Precipitation rain_yearly: unique_id: utility_meter_rain_yearly name: "Rain: Yearly" source: sensor.ecowitt_wh40_21917_precipitation cycle: yearly tariffs: - Precipitation sprinkler_recent_rain: unique_id: utility_meter_sprinkler_recent_rain name: "Sprinkler: Recent Rain" source: sensor.ecowitt_wh40_21917_precipitation cycle: yearly tariffs: - Precipitation