Sistema de riego automático de jardines para Home Assistant, ESP8266 y MiFlora



Hace algún tiempo, mi familia tenía una casa con un pequeño jardín en un lugar muy cálido y árido, y enfrentamos el problema del riego regular.

Quería que el sistema de riego fuera automático, mientras que al elegirlo tenía que tener en cuenta las siguientes condiciones:

  • agua muy cara que debe ahorrarse de todas las formas disponibles
  • diferentes plantas en el jardín para requisitos de humedad, desde suculentas hasta amantes de la humedad
  • La necesidad de un riego totalmente autónomo durante la ausencia de personas en la casa, preferiblemente con la posibilidad de control remoto
  • clima árido que no perdona los errores de riego

Después de evaluar las soluciones listas para usar que se encontraron en las redes locales de bricolaje y en Amazon y leer las reseñas sobre su confiabilidad (generalmente no la más alta), decidimos intentar hacer algo por nuestra cuenta.

Descargo de responsabilidad: el autor no es un especialista en TI y no pretende ser un conocimiento profesional del tema. El nivel de ejecución del proyecto es un pasatiempo. El autor es muy consciente del nivel de sus conocimientos en programación y electrónica y apreciará enormemente las sugerencias para mejorar y optimizar las soluciones utilizadas.

Diagrama de circuito


El jardín se dividió en 4 zonas de riego, cada una de ellas está equipada con un sensor individual de humedad del suelo y se puede regar según un horario individual y una cantidad diferente de agua.
En el suelo, se colocan tuberías PND de riego por goteo con perforación, que se conectan a las tuberías que convergen en la unidad de recolección de agua y se conectan a través de las válvulas electromagnéticas al suministro de agua. Las válvulas están controladas por relés conectados al ESP8266 (Sonoff 4Ch).

El riego se lleva a cabo por temporizadores, por la noche, para aumentar la cantidad de agua que se absorbe en el suelo y no será evaporada por el sol.

En el horario de riego programado, se verifica el cumplimiento de varias condiciones:

  • humedad del suelo por debajo de un valor predeterminado
  • no hay precipitaciones previstas en una cantidad lo suficientemente grande para los próximos 2 días
  • no se supera el límite de agua para riego establecido para esta línea

Equipo usado


Raspberry Pie con HassIO instalado (ya tenía)

ESP32 DevKit , un firmware ESPHome, que actúa como una puerta de enlace bluetooth para MiFlora y recibe datos de sensores de humedad con cable. Ubicado en el jardín

Sensores de humedad con cable Sensor capacitivo de humedad del suelo v1.2 , que mide la humedad en las zonas de riego más cercanas al sitio de instalación de ESP32 Los

sensores MiFlora están conectados al ESP32 a través de BLE, que miden la humedad en zonas de riego remotas.

SONOFF 4Ch , cosido con ESPHome, se encuentra en la unidad de entrada de agua, donde vienen las tuberías de todas las zonas de riego

4 Válvulas solenoides normalmente cerradas para 220Vubicado en el soporte de agua y conectado al Sonoff 4Ch. Abra el suministro de agua para riego. Se eligió un modelo normalmente cerrado para minimizar la probabilidad de “inundación” en caso de falla de los sistemas eléctricos y electrónicos, y para minimizar el número de salidas de relé requeridas.

Un medidor de agua pulsada en la entrada del sistema de riego en la unidad de toma de agua y conectado al Sonoff 4ch. Se le permite transferir completamente los datos de flujo de agua a Home Asssistant e implementar la funcionalidad de riego con una cantidad determinada. Resultó ser muy exitoso que en esta versión de sonoff los contactos para el firmware ya estaban soldados e incluso había un GPIO02 libre: se colgó un contador de pulsos.


Parece un colector con válvulas instaladas y un medidor de agua. El controlador (sonoff 4Ch) no entró en el marco, se instaló a una distancia de medio metro en el escudo IP65

Configuración de ESPHome y Home Assistant


Sonoff 4ch
ESPHome , :

switch:
  - platform: gpio
    name: "   1"
    pin: GPIO12
    id: sw1
    icon: mdi:water
  - platform: gpio
    name: "   2"
    pin: GPIO5
    id: sw2
    icon: mdi:water
  - platform: gpio
    name: "   3"
    pin: GPIO4
    id: sw3
    icon: mdi:water
  - platform: gpio
    name: "   4"
    pin: GPIO15
    id: sw4
    icon: mdi:water
binary_sensor:
  - platform: gpio
    name: "WaterCounter"
    id: button
    pin:
      number: GPIO2
      mode: INPUT_PULLUP


Sensor capacitivo de humedad del suelo v1.2
ESPHome:

sensor:
  - platform: adc
    pin: GPIO34
    filters:
      - lambda: |-
          if (x > 3.22) {
            return 0;
          } else if (x < 1.65) {
            return 100;
          } else {
            return (3.22-x) / (3.22-1.65) * 100.0;
          }
    name: "   1  "
    update_interval: 60s
    attenuation: 11db
    unit_of_measurement: "%"
    accuracy_decimals: 0
    icon: mdi:water-percent

(ADC)
, ( 3.22 ) (1,65 ). log' ESPHome HassIO .



ESP32 Home Assistant ,

Medidor de agua de pulso
«», ( ). — , , ( — 3 10 ).
, GND GPIO .

ESPHome :

binary_sensor:
  - platform: gpio
    name: "WaterCounter"
    id: counter
    pin:
      number: GPIO2
      mode: INPUT_PULLUP

Home Assistant :

(counter),
(, «» ). — counter, ESPHome, sensor, counter ( ).

2 — , «». , , .

( automations.yaml )
- alias:     
  trigger:
  - entity_id: binary_sensor.watercounter
    platform: state
    from: 'on'
    to: 'off'
  action:
  - data:
      entity_id:
      - counter.my_water_counter
    service: counter.increment
- alias:    1 
  trigger:
  - entity_id: binary_sensor.watercounter
    platform: state
    from: 'on'
    to: 'off'
  condition:
    - condition: state
      entity_id: switch.sistema_poliva_liniia_1
      state: 'on'
  action:
  - data:
      entity_id:
      - counter.my_water_line1, counter.my_water_line1t
    service: counter.increment    


configuration.yaml +

sensor:
  - platform: template
    sensors:
      water_counter:    
        unit_of_measurement: 'M3'
        value_template: "{{ (states('counter.my_water_counter')| float)/1000 }}"    
counter:
  my_water_counter:
    initial: 2.667
    step: 10
  my_water_line1:
    name: " 1     ()"
    initial: 0
    step: 10
  my_water_line1t:
    name: " 1   ()"
    initial: 0
    step: 10



Sensor MiFlora
MiFlora ESPHome , esphome.io
Home Assistant — , , «» . — , .

Sensor de lluvia virtual
— . , .

darksky. , Apple « ». API , , , , HA . darksky, , .

2 :

configuration.yaml sensors.yaml

sensor:
  - platform: darksky
    api_key: xxxx_your_API_key_xxxx
    forecast:
      - 1
      - 2
    monitored_conditions:
      - precip_intensity

HA : sensor.dark_sky_precip_intensity_1d sensor.dark_sky_precip_intensity_2d, .

template-sensor:

configuration.yaml sensors.yaml

sensor:
  - platform: template
    sensors:
       rain2days:    
        unit_of_measurement: 'mm'
        value_template: "{{ (((states('sensor.dark_sky_precip_intensity_2d')| float)+(states('sensor.dark_sky_precip_intensity_1d')| float))*24)| round(3) }}"    

HA sensor.rain2days 2 .
, Darksky ,


Después de recopilar todos los datos, puede proceder directamente al riego.

Así es como miro una parte de la interfaz desde una de las zonas del Asistente de inicio:



aquí puede establecer la cantidad de agua para riego (con un control deslizante) y ver los valores de los principales sensores y contadores. Le di la interfaz para una de las líneas, para el resto todo es igual, solo en líneas con sensores de datos cableados es un poco menos.

En la interfaz, puede observar un detalle "superfluo": el sensor auxiliar "Se ha alcanzado la norma". Tenía que ser introducido, porque No pude obtener la condición: plantilla para trabajar para detener la automatización cuando se alcanzó la norma para la cantidad de agua, y como resultado, la automatización solo verifica el valor de este sensor. Estoy seguro de que esta parte de la automatización puede hacerse más simple y elegante, pero mi nivel no fue suficiente para esto.

A continuación se muestra el código para el sensor de plantilla "muleta" resultante:

Sensor de suficiencia de riego (dentro de configuration.yaml o un archivo separado)
  - platform: template
    sensors:
      line4_status:
        friendly_name: " 4 -  "
        value_template: >-
          {% if states('counter.my_water_line4t')|float > states('input_number.slider4')|float %}
            yes
          {% elif states('counter.my_water_line4t')|float == states('input_number.slider4')|float  %}
            yes
          {% else %}
            no
          {% endif %}


La automatización para comenzar a regar finalmente se ve así:

Comience a regar (dentro de automatations.yaml o un archivo separado)
- alias:   4   23.01
  trigger:
    platform: time
    at: "23:01:00"
  condition:
   condition: and
   conditions:
#    
    - condition: numeric_state
      entity_id: sensor.rainfor2days
      below: 5
#      
    - condition: numeric_state
      entity_id: sensor.miflora_1_moisture
      below: 50
# ,       
    - condition: state
      entity_id: 'sensor.line4_status'
      state: 'no'
  action:
   - service: switch.turn_on
     entity_id: switch.sistema_poliva_liniia_4


El riego comienza tarde en la noche, con cada línea comenzando en su propio intervalo de tiempo. La separación por hora de inicio le permite usar un medidor de agua de entrada para obtener datos en 4 líneas.

Al inicio, se verifican tres condiciones:

  • ¿No se ha excedido el límite de la cantidad de agua para hoy (si, por ejemplo, se activó el riego manual)
  • ¿La humedad supera el 50% (según las observaciones en nuestras condiciones, el suelo recién derramado tiene un contenido de humedad de no más del 60%)
  • no se esperan precipitaciones mayores de 5 mm en los próximos dos días.

La siguiente automatización es deshabilitar el riego:

Deshabilitar el riego (dentro de automatations.yaml o un archivo separado)
- alias:   4 
  trigger:
#      
  - entity_id: sensor.line4_status
    platform: state
    to: 'yes'
    for: 
      seconds: 5    
#   
  - platform: time
    at: "23:59:00"
#     
  - platform: numeric_state
    entity_id: sensor.miflora_1_moisture
    above: 65
#       
  - platform: state
    entity_id: switch.sistema_poliva_liniia_4
    to: 'on'
    for: 
      minutes: 60
  action:
   - service: switch.turn_off
     entity_id: switch.sistema_poliva_liniia_4


En la automatización, se utilizaron hasta 4 variantes de disparadores, pero en la mayoría de los casos funciona de acuerdo con el primero: un sensor de "muleta", que controla el exceso del límite por la cantidad de agua. El resto de los desencadenantes se realizan en gran medida por razones de seguridad.

Bueno, la última automatización relacionada con el problema es restablecer el contador diario

Poner a cero el contador diario (dentro de automatations.yaml o un archivo separado)

- alias:    4 
  trigger:
  - platform: time
    at: "00:00:01"
  action:
  - service: counter.reset
    entity_id: counter.my_water_line4t


Proyecto economico


Los costos para la parte de control del sistema de riego fueron los siguientes:

(Raspberry PIE con HassIO a bordo y un enrutador WiFi con un revestimiento en el jardín ya estaban antes del inicio del proyecto, no los tengo en cuenta)

Válvula solenoide UNIPUMP BCX-15 1/2 "(normalmente cerrada) 4 * 20 euros
Sonoff 4CH 17 euros
Medidor de pulso Pulsar 8 euros
ESP32 DevKitC 3.5 euros
Sensor capacitivo de humedad del suelo v1.2 2 * 0.67 euros
Sensores MiFlora 2 * 16 euros Protectores
, colector, cables, accesorios, todos juntos alrededor de 50 euros

TOTAL: alrededor de 190 euros

El tiempo dedicado a configurar los sensores y MK es de aproximadamente 3 a 4 pm durante varias horas, pero la mayor parte del tiempo se dedicó a "inventar bicicletas" e inventar "muletas", en general, no hay mucho trabajo. El montaje físico del sistema tomó alrededor de 2 tardes.
En general, se espera un ahorro de agua de alrededor del 20-50% en comparación con el sistema de temporizador "tonto" y, a precios locales del agua, el sistema debería pagar en una o dos temporadas.

Deficiencias y planes de revisión


Como resultado del proyecto, se revelaron algunos matices y oportunidades para una mejora adicional.

En particular, reemplazaría las válvulas solenoides de 220V con un modelo de 24V; este voltaje es estándar para los sistemas de riego. En este caso, tendría que agregar un transformador de 24 V al sistema y cambiar el Sonoff 4Ch a algo con un contacto seco (por ejemplo, Sonoff 4CH Pro o algo autoensamblado). Las válvulas en sí son más baratas (a partir de 8 euros) y reducen la probabilidad de descarga eléctrica.

También resultó que para trabajar con tuberías de plástico, la presión del suministro de agua es demasiado alta y los accesorios pueden tener fugas durante el ciclo de riego. En mi caso, esto no es crítico, todos los accesorios están ubicados por encima del área de riego, pero en el buen sentido es necesario agregar un reductor en la entrada para disminuir la presión.

Estaba aún más molesto por la imposibilidad de contabilizar la cantidad de agua para riego en volúmenes inferiores a 10 litros; este volumen es la cantidad mínima medible para dicho medidor. Este problema puede resolverse desmontando el mostrador e intercambiando las ruedas, pero hasta entonces las manos no lo han alcanzado.

All Articles