Irrigation connectée depuis 3 récupérateurs d'eau de pluie

Bonjour,

Ancien propriétaire à regret d’une micro station d’épuration individuelle de nos eaux usées et suite à la mise en conformité(séparation eaux usées / eaux de Pluie) imposée par Grand Paris Grand Est je suis aujourd’hui un heureux propriétaire de 3 cuves enterrées de 1300L chacune que j’ai revalorisé en collecteur d’eau de pluie.

L’alimentation en eau se fait par la première cuve grâce au conduit de l’évent qui remontait au dessus de mon toit, j’ai juste routé la descente de ma gouttière dans cet évent.
Les 3 cuves communiquent par le haut, donc le trop plein la cuve 1 se déverse dans la 2 et le trop plein de la 2 dans la 3.
Pour la simplicité du projet j’aurai préféré un nivèlement par le bas mais bon j’avais pas le choix et donc j’ai du faire avec cette contrainte.

J’avais au départ pensé utiliser une pompe immergée dans chaque cuve. Après achat précipité j’étais en fait moyen chaud car courant fort à faire passer sous terre/gaine sur 8m donc besoin de raccords étanches et je préfère limiter au maximum l’usage du courant fort.

Le couperet est tombé avec de tests fait avec une des 3 pompes et clapet anti-retour ne permettait finalement pas d’avoir une pression suffisante pour la distribution…
Bref j’ai rendu mes 3 pompes et je me suis pris une pompe K…her BP4 Home & Garden, une fois amorcée elle dépote !

Du coup la pompe est reliée en entrée à une clarinette sur laquelle sont branchées 3 ElectroVannes reliées au fond de chacune de mes cuves(+ filtre muni d’un clapet anti retour)

En sortie de pompe j’ai une autre clarinette avec 3 EV pour la distribution d’eau sur des zones différentes de mon jardin et une autre EV qui part dans un drain pour la purge du système de distribution.

Pour savoir dans quelle cuve pomper en priorité j’ai mis en place des capteurs de niveau d’eau 4-20ma, j’ai opté pour des TL-136 que j’ai réussi à avoir à entre 20 et 23€ sur Am…on et Ali…ress.
Posés en fond de cuve ces capteurs permettent de connaitre la hauteur d’eau en mètres qu’il y a au dessus du capteur.

Donc 7 Electrovannes, 1 pompe et 3 capteurs 4-20ma à domotiser.
Après avoir chercher longuement le meilleur matériel pour ça je suis tombé sur la carte multifonction
ES32A08:

Pour moi cette carte est juste parfaite et regroupe absolument tout ce dont j’avais besoin pour mon projet, j’y ai rajouté un ESP32 avec antenne externe sur lequel j’ai bien sûr mis ESPHome.

Concernant cette carte ES32A08 je n’ai pas trouvé le moindre post qui en parle et ce dans quelque langue que ce soit et j’ai donc du faire avec les 3 petits exemples en C et le schéma electronique en pdf qui sont téléchargeables pour comprendre comment m’interfacer avec ESPHome.

Les relais et le display sont gérés au travers de 3 étendeurs de sorties 74HC595 et pas de soucis pour piloter les relais.
Après avoir passé quelques heures dessus j’en suis arrivé à la conclusion que pour faire fonctionner le Display sous ESPHome il faudrait passer par un custom component esphome et j’ai laché l’affaire pour le Display car de toutes façon ce sera dans une armoire extérieure fermée et en plus l’affichage était vraiment trop limité…à se demander pourquoi j’ai tant voulu insister là dessus.

Donc pour la partie ESPHome voilà ma conf pour cette carte :

sn74hc595:
  - id: 'sn74hc595_hub'
    data_pin: 13
    clock_pin: 27
    latch_pin: 14
    oe_pin: 4
    sr_count: 3

switch:
  - platform: gpio
    name: "ES32A08_relay_1"
    id: "ES32A08_relay_1"
    pin:
      sn74hc595: sn74hc595_hub
      # relais 1 pin number 16
      number: 16
      inverted: false

# relais 1 pin number 16
# relais 2 pin number 17
# relais 3 pin number 18
#...
# relais 8 pin number 23
#  
# Capteur de niveau TL-136
# adc 0-20mA i1 : GPIO36
# adc 0-20mA i2 : GPIO39
# adc 0-20mA i3 : GPIO34
# adc 0-20mA i4 : GPIO35
# 
  - platform: adc
    # adc 0-20mA i1   
    pin: GPIO36
    attenuation: 11db  # 11db comme dans les exemples en C ES32A08 
    name: "${devicename} Cuve 1 mA"
    accuracy_decimals: 2
    device_class: ""
    unit_of_measurement: "mA"
    icon: "mdi:water-well"
    update_interval: 10s
    filters:
      - lambda: !lambda |- # x -> Volts ; V*1000->mV ;R=91 I=V/R . le TL136 est 4-20mA donc min à 4mA for 0 meter of water et max 20ma pour 2m(mes TL136 sont en 0-2m)
          if (((x*1000) / 91) < 0.004) return 4;
          return (x*1000) / 91;
      - median: # Attenuation des pics
          window_size: 3
          send_every: 3
          send_first_at: 3
    on_value:
      then:
        - lambda: id(cuve_1_height).publish_state(x);
        - lambda: id(cuve_election).publish_state(x);

  - platform: template
    id: cuve_1_height
    name: "${devicename} Cuve 1 hauteur eau"
    update_interval: 10s
    accuracy_decimals: 1
    device_class: ""
    unit_of_measurement: "cm"
    icon: "mdi:water-well"
    filters:
      - median:
          window_size: 3
          send_every: 3
          send_first_at: 3
      - calibrate_linear:
        - 4 -> 0.0
        - 5 -> 12.5
        - 6 -> 25.0
        - 7 -> 37.5
        - 8 -> 50.0
        - 9 -> 62.5
        - 10 -> 75.0
        - 11 -> 87.5
        - 12 -> 100.0
        - 13 -> 112.5
        - 14 -> 125.0
        - 15 -> 137.5
        - 16 -> 150.0

  - platform: template
    id: cuve_election
    name: "${devicename} election Cuve"
    device_class: ""
    accuracy_decimals: 0
    unit_of_measurement: ""
    filters:
      - lambda: !lambda |- # x is Volts ; V*1000->mV ;R=91 I=V/R TL136 is 4-20mA so min is 4mA for 0 meter of water
          if ( (id(cuve_1_height).state > id(cuve_2_height).state) and (id(cuve_1_height).state > id(cuve_3_height).state) ) return 1 ;
          if ( (id(cuve_2_height).state > id(cuve_1_height).state) and (id(cuve_2_height).state > id(cuve_3_height).state) ) return 2 ;
          if ( (id(cuve_3_height).state > id(cuve_1_height).state) and (id(cuve_3_height).state > id(cuve_2_height).state) ) return 3 ;
          return 1;

Le capteur cuve_election permet de renvoyer le numéro de la cuve la plus pleine et dans laquelle puiser en priorité, avec un switch « cuve prioritaire » c’est très pratique pour la simplifier les automatisations.

La pompe sensée avoir un démarrage automatique au tirage n’est finalement pas des masses fiable avec mon réseau d’électrovanne, une fois sur N elle ne s’arrête pas… pas de fuite au niveau du montage mais je soupçonne qu’elle envoi trop en pression et que mes EV sont en limite de pression admissible…

Du coup ça veut dire pilotage de la pompe par homeassistant aussi.
Il me reste encore un relais 250V-10A inutilisé sur ma carte ES32A08 mais j’ai préféré ne pas mélanger les courant faibles (24V AC des Electrovannes) avec du 220V pour la pompe et j’ai opté pour un module Fibaro Zwave FGS222 qui dormait depuis bien trop d’années dans un tiroir et puis comme ça avec 2 voies je peux aussi piloter l’alim de ma carte ES32A08.

J’ai mis la carte dans un boitier pour gaine retractable modifié(je verrais plus tard pour faire un boitier en impression 3D si j’ai la foi), voilà à quoi ça ressemble, avec un système mono-carte je trouve que ça reste à peu près « propre » pour du DIY:

Coté HA pour le moment en brut de fonderie ça me donne ça:

Ca permet de tester mais à l’usage c’est pas pratique…Reste donc maintenant à exploiter les cycles d’arrosage, pour ça je pense peut être utiliser le composant sprinkler de ESPHome que je mettrais sur le même ESP32, à voir et à suivre…

6 « J'aime »

Merci pour votre travail cela m’a été très utile. J’essaie également de trouver les autres épingles. Si vous avez d’autres informations à partager, je ferai de même. Merci

1 « J'aime »

Maintenant, je cherche à mémoriser le programme d’irrigation dans ESPHome et non dans Home Assistant, car en cas de panne du serveur, l’irrigation ne fonctionnerait pas.

Voici mon travail, j’espère qu’il pourra être utile à quelqu’un. Si quelqu’un veut l’améliorer ou sait comment mémoriser les programmes d’irrigation sur ESPHome, n’hésitez pas.

substitutions:
  devicename: "irrigazione"
  upper_devicename: "Irrigazione"
  zone_1_name: "Irrigazione Centrale" #"zone 1"
  zone_2_name: "Irrigazione Fronte casa" #"zone 2"
  zone_3_name: "zone 3"
  zone_4_name: "Irrigazione Dietro casa" #"zone 4"
  zone_5_name: "Gocciolatoio viale principale" #"zone 5"
  zone_6_name: "Irrigazione Sotto ulivi" #"zone 6"
  sprinkler_auto_advance_name: "Avanzamento automatico" #"Auto Advance"
  sprinkler_controller_name: "Centralina" #"Sprinkler Controller"
  sprinkler_duration_name:  "Durata" #"Duration"
  sprinkler_enable_name: "Abilita" #"Enable" 
  sprinkler_main_switch_name: "${sprinkler_controller_name} avvia ${upper_devicename}"
  sprinkler_repeat_cycles: "Ripeti cicli ${devicename}"
  zone_1_valve_id: "valve_0"
  zone_2_valve_id: "valve_1"
  zone_3_valve_id: "valve_2"
  zone_4_valve_id: "valve_3"
  zone_5_valve_id: "valve_4"
  zone_6_valve_id: "valve_5"
esphome:
  name: ${devicename}
  platform: ESP32
  board: esp32dev


#Server web
captive_portal:
web_server:
 port: 80



# Enable logging
logger:

# Enable Home Assistant API
api:
  # encryption:
  #   key: "6zeG5VCmbWhBpYATSekLlTWG4qSR79dXoBTz0vnM4Ck="
  
  services:
    - service: set_multiplier
      variables:
        multiplier: float
      then:
        - sprinkler.set_multiplier:
            id: lawn_sprinkler_ctrlr
            multiplier: !lambda 'return multiplier;'
    - service: start_full_cycle
      then:
        - sprinkler.start_full_cycle: lawn_sprinkler_ctrlr
    - service: start_single_valve
      variables:
        valve: int
      then:
        - sprinkler.start_single_valve:
            id: lawn_sprinkler_ctrlr
            valve_number: !lambda 'return valve;'
    - service: next_valve
      then:
        - sprinkler.next_valve: lawn_sprinkler_ctrlr
    - service: previous_valve
      then:
        - sprinkler.previous_valve: lawn_sprinkler_ctrlr
    - service: shutdown
      then:
        - sprinkler.shutdown: lawn_sprinkler_ctrlr
    - service: pause
      then:
        - sprinkler.pause: lawn_sprinkler_ctrlr
    - service: resume
      then:
        - sprinkler.resume: lawn_sprinkler_ctrlr
    - service: resume_or_full_cycle
      then:
        - sprinkler.resume_or_start_full_cycle: lawn_sprinkler_ctrlr
    - service: repeat_2
      then:
        - sprinkler.set_repeat:
            id: lawn_sprinkler_ctrlr
            repeat: 2  # would run three cycles
    - service: repeat_3
      then:
        - sprinkler.set_repeat:
            id: lawn_sprinkler_ctrlr
            repeat: 3  # would run three cycles
        
ota:
   password: !secret ota_password

wifi:
  ssid: !secret wifi_nemo_ssid
  password: !secret wifi_nemo_password
  # ssid: !secret wifi_office_ssid
  # password: !secret wifi_office_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: ${devicename}
    password: !secret wifi_nemo_password



sn74hc595:
  - id: 'sn74hc595_hub'
    data_pin: 13
    clock_pin: 27
    latch_pin: 14
    oe_pin: 4
    sr_count: 3

# Configurazione del chip SN74HC165
sn74hc165:
  - id: sn74hc165_hub
    data_pin: 5
    clock_pin: 17
    load_pin: 16
    sr_count: 1    


status_led:
  pin:
    number: 15


sprinkler:
  - id: lawn_sprinkler_ctrlr
    main_switch: "${sprinkler_main_switch_name}"
    auto_advance_switch: "${upper_devicename} ${sprinkler_auto_advance_name}"
    reverse_switch: "${upper_devicename} Reverse"
    valve_overlap: 1s
    valves:
      - valve_switch: ${zone_1_name}
        enable_switch: "${sprinkler_enable_name} $zone_1_name"
        run_duration: 3s
        valve_switch_id: ${zone_1_valve_id}
      
      - valve_switch: ${zone_2_name}
        enable_switch: "${sprinkler_enable_name} ${zone_2_name}"
        run_duration: 3s
        valve_switch_id: ${zone_2_valve_id}
      
      - valve_switch: ${zone_3_name}
        enable_switch: "${sprinkler_enable_name} ${zone_3_name}"
        run_duration: 3s
        valve_switch_id: ${zone_3_valve_id}
      
      - valve_switch: "${zone_4_name}"
        enable_switch: "${sprinkler_enable_name} ${zone_4_name}"
        run_duration: 3s
        valve_switch_id: ${zone_4_valve_id}
      
      - valve_switch: ${zone_5_name}
        enable_switch: "${sprinkler_enable_name} ${zone_5_name}"
        run_duration: 3s
        valve_switch_id: ${zone_5_valve_id}

      - valve_switch: ${zone_6_name}
        enable_switch: "${sprinkler_enable_name} ${zone_6_name}"
        run_duration: 3s
        valve_switch_id: ${zone_6_valve_id}

     

switch:
  
  - platform: gpio
    # name: "${zone_1_name} Relay"
    id: ${zone_1_valve_id}
    pin:
      sn74hc595: sn74hc595_hub
      number: 16
      inverted: false

  - platform: gpio
    # name: "${zone_2_name} Relay"
    id: ${zone_2_valve_id}
    pin:
      sn74hc595: sn74hc595_hub
      number: 17
      inverted: false

  - platform: gpio
    # name: "${zone_3_name} Relay"
    id: ${zone_3_valve_id}
    pin:
      sn74hc595: sn74hc595_hub
      number: 18
      inverted: false

  - platform: gpio
    # name: "${zone_4_name} Relay"
    id: ${zone_4_valve_id}
    pin:
      sn74hc595: sn74hc595_hub
      number: 19
      inverted: false

  - platform: gpio
    # name: "${zone_5_name} Relay"
    id: ${zone_5_valve_id}
    pin:
      sn74hc595: sn74hc595_hub
      number: 20
      inverted: false

  - platform: gpio
    # name: "${zone_6_name} Relay"
    id: ${zone_6_valve_id}
    pin:
      sn74hc595: sn74hc595_hub
      number: 21
      inverted: false

  - platform: gpio
    # name: "ES32A08_relay_7"
    id: "ES32A08_relay_7"
    pin:
      sn74hc595: sn74hc595_hub
      number: 22
      inverted: false

  - platform: gpio
    # name: "ES32A08_relay_8"
    id: "ES32A08_relay_8"
    pin:
      sn74hc595: sn74hc595_hub
      number: 23
      inverted: false



# Example configuration to set multiplier via number
number:
  - platform: template
    id: sprinkler_ctrlr_multiplier
    name: "${sprinkler_controller_name} Multiplier"
    min_value: 0.1
    max_value: 10.0
    step: 0.1
    lambda: "return id(lawn_sprinkler_ctrlr).multiplier();"
    set_action:
      - sprinkler.set_multiplier:
          id: lawn_sprinkler_ctrlr
          multiplier: !lambda 'return x;'
          

#   - platform: template
#     id: sprinkler_ctrlr_duration
#     name: "${sprinkler_controller_name} ${sprinkler_duration_name}"
#     min_value: 0.1
#     max_value: 500
#     step: 1
#     lambda: "return id(lawn_sprinkler_ctrlr).valve_run_duration(0);"
# #    lambda: "return id(lawn_sprinkler_ctrlr).duration(0);"
#     set_action:
#       - sprinkler.set_valve_run_duration:
#           id: lawn_sprinkler_ctrlr
#           valve_number: 0
#           run_duration: !lambda 'return x;'

  - platform: template
    id: sprinkler_ctrlr_duration_v_1
    name: "${sprinkler_controller_name} ${sprinkler_duration_name} ${zone_1_name}"
    min_value: 1
    max_value: 300
    step: 1
    lambda: "return id(lawn_sprinkler_ctrlr).valve_run_duration(0);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: lawn_sprinkler_ctrlr
          valve_number: 0
          run_duration: !lambda 'return x;'
  - platform: template
    id: sprinkler_ctrlr_duration_v_2
    name: "${sprinkler_controller_name} ${sprinkler_duration_name} ${zone_2_name}"
    min_value: 1
    max_value: 300
    step: 1
    lambda: "return id(lawn_sprinkler_ctrlr).valve_run_duration(1);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: lawn_sprinkler_ctrlr
          valve_number: 1
          run_duration: !lambda 'return x;'
  - platform: template
    id: sprinkler_ctrlr_duration_v_3
    name: "${sprinkler_controller_name} ${sprinkler_duration_name} ${zone_3_name}"
    min_value: 1
    max_value: 300
    step: 1
    lambda: "return id(lawn_sprinkler_ctrlr).valve_run_duration(2);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: lawn_sprinkler_ctrlr
          valve_number: 2
          run_duration: !lambda 'return x;'
  - platform: template
    id: sprinkler_ctrlr_duration_v_4
    name: "${sprinkler_controller_name} ${sprinkler_duration_name} ${zone_4_name}"
    min_value: 1
    max_value: 300
    step: 1
    lambda: "return id(lawn_sprinkler_ctrlr).valve_run_duration(3);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: lawn_sprinkler_ctrlr
          valve_number: 3
          run_duration: !lambda 'return x;'
  - platform: template
    id: sprinkler_ctrlr_duration_v_5
    name: "${sprinkler_controller_name} ${sprinkler_duration_name} ${zone_5_name}"
    min_value: 1
    max_value: 300
    step: 1
    lambda: "return id(lawn_sprinkler_ctrlr).valve_run_duration(4);"
    set_action:
      - sprinkler.set_valve_run_duration:
          id: lawn_sprinkler_ctrlr
          valve_number: 4
          run_duration: !lambda 'return x;'
  - platform: template
    id: sprinkler_ctrlr_repeat_cycles
    name: "${sprinkler_repeat_cycles}"
    min_value: 0
    max_value: 300
    step: 1
    mode: box
    lambda: "return id(lawn_sprinkler_ctrlr).repeat();"
    set_action:
      - sprinkler.set_repeat:
          id: lawn_sprinkler_ctrlr
          repeat: !lambda 'return x;'

sensor:
  - platform: uptime
    name: "${upper_devicename} Uptime"
    icon: mdi:clock-outline
  - platform: wifi_signal
    name: "${upper_devicename} Wifi Signal"
    update_interval: 60s  

  
  - platform: template
    id: tank_height
    name: "${devicename} Cisterna altezza dell'acqua"
    update_interval: 10s
    accuracy_decimals: 1
    device_class: ""
    unit_of_measurement: "cm"
    icon: "mdi:water-well"
    filters:
      - median:
          window_size: 3
          send_every: 3
          send_first_at: 3
      - calibrate_linear:
        - 4 -> 0.0
        - 5 -> 12.5
        - 6 -> 25.0
        - 7 -> 37.5
        - 8 -> 50.0
        - 9 -> 62.5
        - 10 -> 75.0
        - 11 -> 87.5
        - 12 -> 100.0
        - 13 -> 112.5
        - 14 -> 125.0
        - 15 -> 137.5
        - 16 -> 150.0

  
# TL-136
  - platform: adc
    # adc 0-20mA i1   
    pin: GPIO36
    attenuation: 11db  # 11db comme dans les exemples en C ES32A08 
    name: "${devicename} Cisterna 1 mA"
    accuracy_decimals: 2
    device_class: ""
    unit_of_measurement: "mA"
    icon: "mdi:water-well"
    update_interval: 10s
    filters:
      - lambda: !lambda |- # x -> Volts ; V*1000->mV ;R=91 I=V/R . le TL136 est 4-20mA donc min a 4mA for 0 meter of water et max 20ma pour 2m(mes TL136 sont en 0-2m)
          if (((x*1000) / 91) < 0.004) return 4;
          return (x*1000) / 91;
      - median: # Attenuation des pics
          window_size: 3
          send_every: 3
          send_first_at: 3
    on_value:
      then:
        - lambda: id(tank_height).publish_state(x);
        
        #- lambda: id(cuve_election).publish_state(x);

      
1 « J'aime »