@klogg: did a lot of thinking over the last days. at the moment i’m irrigating every day. which is suboptimal.
regarding professional lawn shops it’s best to water ONCE A WEEK, in hot summer season TWICE a week.
in our region (center of europe) an estimate of 20-25 l/m2 per week is the optimal amount of water.
maybe we should rethink the algorithm in a way like: “set desired amount of water per area” and then water twice a week until you reach that amount.
so maybe water 10l on monday, then add the rain fall on mon, tue, wed, thu, and the expected rain for fri-son, and then water the difference left to 25l on friday. that way you could be quite sure to not overwater the lawn.
what do you think?
edit: it would also be cool to add something like: water used / today / this week etc …
i guess every household worldwide has a water meter where the water pipe enters the house. your irrigation setup won’t change a lot over time, so once setup it’s quite stable. so i took a stop watch, and counted liters/min for every zone activated. if i could enter this number in the package’s setup it could calculate liters used.
sorry for the late reply, I’ve been rather busy. Because my code is based on using a MQTT switch it’s looking for feedback. Have you tried swapping the switch code for something else like a light or something to test with?
I’m away at the moment so cant test things but hope to have my system fully functioning some time next week when I’m back home
I had a look through my code remotely and found some errors. I haven’t yet had a chance to even look at integrating the weather side of things unfortunately. That will come in time.
Here is the updated code:
reticulation.yaml (package)
########################################
#
# This is a full reticulation
# control package using DarkSky
# weather prediction to
# prevent watering if rain
# is expected, or occured recently
# with local moisture sensor data
# as well
#
#
########################################
sensor:
- platform: darksky # Weather setup
api_key: !secret darksky_api_key
name: Reticulation Weather
forecast:
- 1
update_interval: '00:30:00'
monitored_conditions:
- precip_intensity
- precip_probability
- precip_intensity_max
# - summary
# - icon
# - temperature
# - apparent_temperature
# - wind_speed
# - wind_bearing
# - cloud_cover
# - humidity
# - hourly_summary
# - daily_summary
# - temperature_max
# - temperature_min
# - apparent_temperature_high
- platform: template # determine if today is selected as a watering day for program 1
sensors:
retic_program1_watering_day:
value_template: >
{% set sensor_names = [ 'monday', 'tuesday', 'wednesday','thursday','friday','saturday','sunday'] %}
{% set today_name = sensor_names[now().weekday()] %}
{% set entity_id = 'input_boolean.retic_program1_'+today_name %}
{{ is_state(entity_id, 'on') }}
retic_program2_watering_day:
value_template: >
{% set sensor_names = [ 'monday', 'tuesday', 'wednesday','thursday','friday','saturday','sunday'] %}
{% set today_name = sensor_names[now().weekday()] %}
{% set entity_id = 'input_boolean.retic_program2_'+today_name %}
{{ is_state(entity_id, 'on') }}
# Calculations for rain to stop reticulation
input_datetime:
retic_program1_start_time: # program start time control
name: Program 1 Start Time
has_date: false
has_time: true
# initial: '04:00'
retic_program2_start_time:
name: Program 2 Start Time
has_date: false
has_time: true
# initial: '18:00'
input_number:
retic_program1_station1_run_time: # station run time control
name: Station 1 Run Time
# initial: 10
min: 0
max: 30
step: 1
icon: mdi:camera-timer
retic_program1_station2_run_time:
name: Station 2 Run Time
# initial: 10
min: 0
max: 30
step: 1
icon: mdi:camera-timer
retic_program2_station1_run_time:
name: Station 1 Run Time
# initial: 10
min: 0
max: 30
step: 1
icon: mdi:camera-timer
retic_program2_station2_run_time:
name: Station 2 Run Time
# initial: 10
min: 0
max: 30
step: 1
icon: mdi:camera-timer
input_boolean:
retic_program1_monday: # watering day selections for program 1
name: Monday
retic_program1_tuesday:
name: Tuesday
retic_program1_wednesday:
name: Wednesday
retic_program1_thursday:
name: Thursday
retic_program1_friday:
name: Friday
retic_program1_saturday:
name: Saturday
retic_program1_sunday:
name: Sunday
retic_program2_monday: # watering day selections for program 2
name: Monday
retic_program2_tuesday:
name: Tuesday
retic_program2_wednesday:
name: Wednesday
retic_program2_thursday:
name: Thursday
retic_program2_friday:
name: Friday
retic_program2_saturday:
name: Saturday
retic_program2_sunday:
name: Sunday
retic_station1_manual_run:
name: Station 1 ON Manual
icon: mdi:arrow-right-drop-circle
retic_station2_manual_run:
name: Station 2 ON Manual
icon: mdi:arrow-right-drop-circle
retic_program1_enable:
name: Enable
retic_program2_enable:
name: Enable
group: # frontend interface setup
retic_manual:
control: hidden
name: 'Manual Control'
entities:
- input_boolean.retic_station1_manual_run
- input_boolean.retic_station2_manual_run
retic_program1:
control: hidden
name: 'Program 1'
entities:
- input_boolean.retic_program1_enable
- script.retic_program1_run
# - input_select.program1_retic_watering_days
- input_datetime.retic_program1_start_time
- group.retic_program1_watering_days
# - input_number.retic_program1_station1_run_time
# - input_number.retic_program1_station2_run_time
- group.retic_program1_run_times
retic_program2:
control: hidden
name: 'Program 2'
entities:
- input_boolean.retic_program2_enable
- script.retic_program2_run
# - input_select.program2_retic_watering_days
- input_datetime.retic_program2_start_time
- group.retic_program2_watering_days
# - input_number.retic_program2_station1_run_time
# - input_number.retic_program2_station2_run_time
- group.retic_program2_run_times
retic_program1_watering_days:
control: hidden
name: 'Watering days'
icon: mdi:calendar-multiple-check
entities:
- input_boolean.retic_program1_monday
- input_boolean.retic_program1_tuesday
- input_boolean.retic_program1_wednesday
- input_boolean.retic_program1_thursday
- input_boolean.retic_program1_friday
- input_boolean.retic_program1_saturday
- input_boolean.retic_program1_sunday
retic_program2_watering_days:
control: hidden
name: 'Watering days'
icon: mdi:calendar-multiple-check
entities:
- input_boolean.retic_program2_monday
- input_boolean.retic_program2_tuesday
- input_boolean.retic_program2_wednesday
- input_boolean.retic_program2_thursday
- input_boolean.retic_program2_friday
- input_boolean.retic_program2_saturday
- input_boolean.retic_program2_sunday
retic_program1_run_times:
control: hidden
name: 'Run times'
icon: mdi:camera-timer
entities:
- input_number.retic_program1_station1_run_time
- input_number.retic_program1_station2_run_time
retic_program2_run_times:
control: hidden
name: 'Run times'
icon: mdi:camera-timer
entities:
- input_number.retic_program2_station1_run_time
- input_number.retic_program2_station2_run_time
switch: # Solenoid control (will be signals to NodeMCU)
- platform: mqtt
name: "Retic Station 1 Valve"
state_topic: "retic/station1/state"
command_topic: "retic/station1/cmd"
payload_on: "1"
payload_off: "0"
optimistic: false
qos: 0
retain: true
- platform: mqtt
name: "Retic Station 2 Valve"
state_topic: "retic/station2/state"
command_topic: "retic/station2/cmd"
payload_on: "1"
payload_off: "0"
optimistic: false
qos: 0
retain: true
automation:
- alias: Reticulation Run Program 1 # start program 1 at designated time if it is enabled and today is selected as a watering day
initial_state: 'on'
trigger:
- platform: template
value_template: '{{ states.sensor.time.state == (states.input_datetime.retic_program1_start_time.attributes.timestamp | int | timestamp_custom("%H:%M", False)) }}'
condition:
condition: and
conditions:
- condition: state
entity_id: input_boolean.retic_program1_enable
state: 'on'
- condition: state
entity_id: sensor.retic_program1_watering_day
state: 'true'
action:
- service: script.turn_on
entity_id: script.retic_program1_run
- alias: Reticulation Run Program 2 # start program 2 at designated time if it is enabled and today is selected as a watering day
initial_state: 'on'
trigger:
- platform: template
value_template: '{{ states.sensor.time.state == (states.input_datetime.retic_program2_start_time.attributes.timestamp | int | timestamp_custom("%H:%M", False)) }}'
condition:
condition: and
conditions:
- condition: state
entity_id: input_boolean.retic_program2_enable
state: 'on'
- condition: state
entity_id: sensor.retic_program2_watering_day
state: 'true'
action:
- service: script.turn_on
entity_id: script.retic_program2_run
script:
retic_program1_run: #run retic program 1 through each station for selected time
alias: Program 1 Run
sequence:
- service: switch.turn_on
data:
entity_id: switch.retic_station_1_valve
- delay: "00:{{ states('input_number.retic_program1_station1_run_time')|int }}:00"
- service: switch.turn_off
data:
entity_id: switch.retic_station_1_valve
- service: switch.turn_on
data:
entity_id: switch.retic_station_2_valve
- delay: "00:{{ states('input_number.retic_program1_station2_run_time')|int }}:00"
- service: switch.turn_off
data:
entity_id: switch.retic_station_2_valve
retic_program2_run: #run retic program 2 through each station for selected time
alias: Program 2 Run
sequence:
- service: switch.turn_on
data:
entity_id: switch.retic_station_1_valve
- delay: "00:{{ states('input_number.retic_program2_station1_run_time')|int }}:00"
- service: switch.turn_off
data:
entity_id: switch.retic_station_1_valve
- service: switch.turn_on
data:
entity_id: switch.retic_station_2_valve
- delay: "00:{{ states('input_number.retic_program2_station2_run_time')|int }}:00"
- service: switch.turn_off
data:
entity_id: switch.retic_station_2_valve
hmm. it seems that this is still not keeping the states of some items on HA restart. I will try and figure out why and post an update, unless someone else can explain it… I know there are work-arounds using persistence but this seems rather annoying to me given that HA is supposed to support it out of the box. Currently my code is keeping the start times and watering days for me but losing the enable and run durations
EDIT: what gets kept and what gets lost during a restart seems pretty random… just an issue with HA, not my code. Hopefully this gets fixed with HA updates
@klogg thanks for sharing I changed my irrigation control based on your input, hence it’s a greenhouse I don’t need to worry about the weather (removed it all). I have added my diy soil mosture sensors for each zone.
I really like this. Much cheaper and smaller than my setup but even if I had the electronics skills to build this I already had mine installed before you posted yours. And besides I don’t have a 3D printer!
I really must find some on-line resources to teach myself electronics. Got any pointers?
haha. no electronics involved. mostly. it’s the most simple setup you can have. there is just one pin for each relais. and the leds were removed from the relais board and replaced by wires with leds at the end. the dc/dc converter is also easy. 24v in 5v out, and with the little screw you can change the output voltage a bit to your likings. the only “more sophisticated” part is the bridge rectifier. that’s basically a diode network that “transforms” ac in dc so we can use the same powersupply used for the valves for the cpu board. you can just use a second 5v power supply if you prefer that.
but you’re right it’s a very cheap setup. can’t beat that price. great value for what you get.
i on the other hand understand maybe less than 10% of the code you wrote. no idea what’s really going on here
I bought one of those rain gauges a year ago.It works OK with ESPeasy and MQTT. I don’t remember the calculation, but I figured out how many tips per litres of water.
thanks for the feedback. so you say it works for more than a year now w/o issues? you never know with this chinese crap … could you tell us what the wire is for? does it even come with a wire?
I must admit that haven’t used it much. I was buying a house and haven’t opened that box since I moved…
The reed switch is simply closing the circuit so you need a dry sensor to pick up the open/close. It equals a tip of the bucket.
I first tried to connect the wires to the dry sensor of a z-wave Vision door sensor, but the close/open was too fast. Wemos D1 Mini was fast enough to pick up the signal with the ESPeasy firmware.
Let me know if you are interested in how to calculate the amount of water (ml/tip), I can try to dig it out from somewhere