Maciej Małecki, IoT Community, , 2021.
water pressure
\[ 2.5 [bar] < pressure < 5 [bar]\]water flow
\[ flow \bigg[\frac{m^3}{h}\bigg]= 3.6 \times \frac{volume}{time} \bigg[\frac{l}{s}\bigg] \]as above plus:
8 channel electromechanical relay
12V LED power supply unit
5V micro power supply unit
listener/valveCmd
- seconds to runadjustment/valve1|2|3|4
- weight per valve
on listener#valveCmd do
if [listener#valveCmd]<=0
TimerSet,1,0
TimerSet,2,0
TimerSet,3,0
TimerSet,4,0
GPIO,5,0
GPIO,4,0
GPIO,14,0
GPIO,12,0
Publish,"Podlewacz/valve/state", 0
Publish,"Podlewacz/state","Emergency shut-off"
else
if [listener#valveCmd]<2600
TaskValueSet,3,1,[listener#valveCmd]*[adjustment#valve1]
TaskValueSet,3,2,[listener#valveCmd]*[adjustment#valve2]
TaskValueSet,3,3,[listener#valveCmd]*[adjustment#valve3]
TaskValueSet,3,4,[listener#valveCmd]*[adjustment#valve4]
Publish,"Podlewacz/valve/state", 1
if [valves0#valve1]>=1
GPIO,5,1
Publish,"Podlewacz/state","Valve 1 open"
if [valves0#valve1]<2400
TimerSet,1,[valves0#valve1]
else
TimerSet,1,2400
endif
else
Publish,"Podlewacz/state","Valve 1 skipped"
TimerSet,1,3
endif
endif
endif
endon
on Rules#Timer=1 do
GPIO,5,0
if [valves0#valve2]>=1
GPIO,4,1
Publish,"Podlewacz/state","Valve 2 open"
if [valves0#valve2]<2400
TimerSet,2,[valves0#valve2]
else
TimerSet,2,2400
endif
else
Publish,"Podlewacz/state","Valve 2 skipped"
TimerSet,2,3
endif
endon
on Rules#Timer=2 do
GPIO,4,0
if [valves0#valve3]>=1
GPIO,14,1
Publish,"Podlewacz/state","Valve 3 open"
if [valves0#valve3]<2400
TimerSet,3,[valves0#valve3]
else
TimerSet,3,2400
endif
else
Publish,"Podlewacz/state","Valve 3 skipped"
TimerSet,3,3
endif
endon
on Rules#Timer=3 do
GPIO,14,0
if [valves0#valve4]>=1
GPIO,12,1
Publish,"Podlewacz/state","Valve 4 open"
if [valves0#valve4]<2400
TimerSet,4,[valves0#valve4]
else
TimerSet,4,2400
endif
else
Publish,"Podlewacz/state","Valve 4 skipped"
TimerSet,4,3
endif
endon
on Rules#Timer=4 do
GPIO,12,0
Publish,"Podlewacz/valve/state",0
Publish,"Podlewacz/state","Idle"
endon
Architecture with Home Assistant and MQTT
given the input parameters:
\[ t_{min}, t_{max}, h_{min}, h_{max} \]we have:
\[ t = \left\{ \begin{array}{ll} 0, & h > h_{max} \\ t_{max}, & h < h_{min} \\ \frac{t_{max} - t_{min}}{h_{max} - h_{min}} (h_{min} - h) + t_{min}, & h_{min} <= h <= h_{max} \end{array} \right. \]
automation:
- alias: "Smart gardener checks for condition once per day"
trigger:
platform: time
at: "03:00:00"
action:
service: script.evaluate_watering_time
script:
evaluate_watering_time:
sequence:
- condition: state
entity_id: 'input_boolean.watering_enable'
state: 'on'
- condition: numeric_state
entity_id: 'input_number.watering_delay_counter'
below: 1
- service: system_log.write
data_template:
message: >
Running the script
{{ states('sensor.wilgotnosc_gruntu') | float }},
{{ states('input_number.watering_off_threshold') | float }}
level: debug
logger: homeassistant.podlewacz
- service: mqtt.publish
data:
topic: Podlewacz/listener/valveCmd
payload_template: >
{% if states('sensor.wilgotnosc_gruntu') | float
> states('input_number.watering_off_threshold') | float %}
0.0
{% elif states('sensor.wilgotnosc_gruntu') | float
< states('input_number.watering_full_threshold') | float %}
{{ (states('input_number.watering_maximal_time') | float)*60 }}
{% else %}
{{ (
(
states('input_number.watering_maximal_time') | float
- states('input_number.watering_minimal_time') | float
)
/
(
states('input_number.watering_full_threshold') | float
- states('input_number.watering_off_threshold') | float
)
*
(
states('sensor.wilgotnosc_gruntu') | float
- states('input_number.watering_off_threshold') | float
)
+ states('input_number.watering_minimal_time') | float
)*60 }}
{% endif %}
Simplified power supply