Une intégration pour l’arrosage de mon jardin

Il me semble qu’au moment de la création de input.number, tu peux définir la valeur mini et maxi (0 à 100) et le pas d’incrément (« taille de pas du curseur » dans l’UI).

Oui on défini l’input.number qu’on veut, j’ai d’ailleurs commencer par créer un taux en % de 0 à 100.
C’est l’intégration qui prend cette valeur comme facteur multiplicateur.
Donc mes 5min d’arrosage se sont transformés en 8h30 d’arrosage. (5x100=500 min ! )
C’est documenté dans le Github d’irrigation v5, il faut une valeur entre 0 et 1.

A y réfléchir, ne serait il pas possible de trifouiller dans les fichiers du programme (python ou json …je ne sais plus) ?
J’ai peur que ça me dépasse un peu.

Edit du 03 sept: finalement c’est pas si compliqué, j’ai une méthode pour passer en % de 0 à 100.
Il faut ajouter un ratio de 0,01 sur une formule dans le irrigationzone.py ( sous: config\custom_components\irrigationprogram

def water_adjust_value(self):
    '''determine watering adjustment - ICI Modifyed 1 to 100'''
    water_adjust_value = 1
    if self._water_adjust is not None:
        water_adjust_value = float(self.hass.states.get(self._water_adjust).state)*0.01
    return water_adjust_value
1 « J'aime »

Salut @ficus ,
Tu pourrais partager tes fichiers configuration et des cartes pour que je teste ?
Merci

Bonjour,
Why not, mais il y a eu plusieurs MàJ depuis l’été dernier, tant coté HA que l’app HACS.
En ouvrant ma carte plusieurs éléments sont en défaut :woozy_face:

Je dois d’abord remettre ça d’aplomb pour la saison 2024 !
Si ça va vite je veux bien partager ce que je pourrais car je ne vois pas trop mais on verra dans un 2ème temps.

Si je je procrastine n’hésites pas a me bousculer dans sous 15jrs :slight_smile:

Merci.
Pas de problemes. Je trouve qu’il y a pas mal de trucs interessants sur ta carte :wink:

Rien ne t’empêche de faire un input number de 1 à 100, et d’en créer un autre qui sera automatiquement calculé comme étant la valeur du premier divisée par 100, qui servira ensuite dans l’intégration, non?

1 « J'aime »

bonjour à tous!

Je trouve cela intéressant, j’aimerais m’en servir mais pour un potager, y en a t’il un parmi vous qui à essayé?
pourriez vous me conseiller du matériel? (je n’ai absolument rien!)

merci!

Bonjour,
Il y a plusieurs solutions possibles. Tu en trouveras quelques unes en parcourant le forum.
Une question préliminaire est de savoir quel type d’arrivée d’eau et d’électricité tu as.
En particulier:

  • quel type d’arrosage souhaites-tu? Goutte à gouttes, spinklers, etc.
  • quelle superficie d’arrosage?
  • arrivée d’eau: juste un robinet d’eau, une cuve, un puit, une arrivée d’eau dans une boite enterrée?
  • électricité: as-tu une arrivée d’électricité proche de ton arrivée d’eau?
  • Internet: as-tu accès à Internet (filaire, WIFI) proche de ton arrivée d’eau?
    Ce sont quelques questions qui me viennent en tête et qui conditionnent beaucoup la solution que tu peux mettre en place.

merci pour ta réponse!

Merci des précisions.
Je ne suis pas un expert, et je ne peux donc parler que de ce que je connais.
Une autre question concerne les besoins de planification: j’imagine que dans ton potager, tout n’a pas les mêmes besoin d’eau, et que tu veux peut-être gérer plusieusr « zones » différentes.
Le fait que tu as aussi une cuve rajoute un peu de complexité car il te faut une pompe je pense pour avoir une pression suffisante sur le réseau. Il faut aussi potentiellement gérer le passage de la cuve au réseau lorsque la cuve est vide.
Le fait d’avoir besoin d’une pompe je pense élimine les solutions à base de têtes de robinets connectées.
Parmi les solutions matérielles un peu plus évoluées, il y en a au moins 2 systèmes auxquels il est fait référence dans cette discussion.
Pour ma part, j’utilise OpenSprinkler | OpenSprinkler depuis plusieurs années et j’en suis satisfait. C’est un contrôleur d’arrosage développé en Open Source, relié au web, qui a de mon point de vue l’intérêt d’être indépendant (mais il y a une intégration HA), ce qui veut dire que même sans HA il continue à fonctionner. Il peut gérer une pompe externe et commander des vannes d’arrosage.
Il y a aussi la solution Netro citée par kcofoni.
A toi de mire un peu. N’hésite pas à revenir ves nous si tu as des questions.

Hello
tu l’as commandé où ton opensprinkler? en vue de peut etre changer ma solution rainbird.

@Plouf34 , directement sur le site web donné en lien dans mon message précédent.
Je l’ai depuis maintenant au moins 4 ans. J’ai pris un model « tout en un », mais en fonction de ton niveau de technicité, tu peux aussi prendre juste la carte d’extension pour RPI et downloader le system, qui est en Open Source, et même imprimer le boitier en 3D (il y a un fichier dispo sur le site).
Pour info, le wifi ne portant pas à l’endroit où était le programmateur, j’ai mis un boitier CPL sur l’arrivée électrique, dans la trappe.

Très sympa ce sujet et merci pour les partages d’intégration @Sigalou.
Je vais mettre en service prochainement mon irrigation de potager sur pied, après avoir testé une electrovanne géré par esphome et un capteur de plant ble pendant l’hiver.
J’ai retenu l’irrigation v5 qui paraît au 1er abord assez complexe mais finalement avec tous les exemples, ca le fait. Un planning simple qui peut devenir complexe et une optimisation du temps par le capteur d’humidité, à suivre…

1 « J'aime »

Comme il y a eu plusieurs version depuis ma dernière utilisation, j’ai tout supprimé et réinstallé la dernière version (qui intègre la custom card)

Effectivement il y a pas mal de renseignement sur le GitHub officiel, ce qui facilite la mise en place, voir le tuto Irrigation-V5/help/help.md at main · petergridge/Irrigation-V5 · GitHub

En bref, il faut créer des Entrées qui seront appelées dans l’appli Irrigation v5

Ensuite tu créé un programme dans l’application Irrigation v5, installer depuis HACS
ici un exemple d’un programme à 2 zones

Puis dans tes cartes tu ajoutes celle fourni: Irrigation Card
tout est dit ici: GitHub - petergridge/Irrigation-Card: Companion card for Irrigation-V5

type: custom:irrigation-card
program: switch.irrigation_massif
entities: []
show_program: true
next_run_label: Prochain arrosage
last_ran_label: Dernier arrosage
remaining_label: Arrosage Massif
title: Arrosage Massif
icon: mdi:watering-can

J’espère que ça correspondra à ton besoin.

Bonjour,

Merci pour ton Post, j’ai installé la version 5.2.4 mais je n’arrive pas a créer une cartes avec les infos que tu as données.
Ci-joint la Screenshot de ma carte et mon code :

type: custom:irrigation-card
program: switch.programme_1
entities: []
show_program: true
next_run_label: Prochain arrosage
last_ran_label: Dernier arrosage
remaining_label: Arrosage Massif
title: Arrosage Massif
icon: mdi:watering-can

carte

Bonjour
j’ai beaucoup ton dashboard.
Pourrais-tu donner ton code stp?

Salut a tous.
Question possiblement stupide, mais je ne trouve nulle part l’intégration irrigation v-5…
Ni dans les intégrations, ni via hacs.
Je passe probablement a côté de quelque chose.
Merci du coup de main.
Boz

Ok. Trouvé.
Je faisais une recherche par nom: irrigation v-5 depuis hacs alors que le nom de l’intégration a changé.
Boz

Très sympa ton comparatif. Merci !

J’ai l’impression que tous ces intégrations nécessite la création de helpers dans HA.

Est ce qu’il y en a 1 ou la configuration est plus simple et se fait uniquement dans l’intégration ?

J’ai juste une éléctrovanne et un capteur d’humidité de sol. Donc pas besoin d’une machine de guerre :sweat_smile:

J’utilisais Irrigation unlimited, mais elle ne marche plus et n’a pas d’erreur dans les logs :smiling_face_with_tear:

Voilà mon code :

irrigation_unlimited:
  controllers:
    all_zones_config: # <= Add these three lines <─┐
      show: # <= to the configuration            <─┤
        timeline: true # <= for all zones        <─┘
    name: Arrosage intelligent
    zones:
      zone_id: jardin
      name: Jardin
      maximum: '00:75'
      entity_id: switch.arrosage

    sequences:
      - name: "Summer"
        duration: "01:00"
        # delay: "00:01"
        schedules:
          - time: "05:30"
            weekday: [mon, wed, fri]
            month: [jun, jul, aug]
        zones:
          - zone_id: 1

# Filename: irrigation_unlimited_adjustment.yaml
#
# This file is a package and should be located in the config/packages
# folder. If you do not have a packages folder then create it and add
# the following to configuration.yaml
#
# homeassistant:
#  packages: !include_dir_named packages
#
# More information on packages can be found at https://www.home-assistant.io/docs/configuration/packages
#
# Set up some observation sensors.
# This uses the Weather Underground (WUnderground) https://www.home-assistant.io/integrations/wunderground/ integration.
# Rain information (wupws_preciptotal) is a daily accumulation total. So we want to grab the
# data just before midnight to get the daily total. We shouldn't be too eager to look after midnight
# because the reset from WU may take a few minutes to come through, currently 10 min. Increase this
# if data is unreliable.
# Note: Requires the ha-average integration to be installed https://github.com/Limych/ha-average

sensor:
  - platform: average
    name: irrigation_unlimited_rain_0
    entities:
      - sensor.conflans_sainte_honorine_daily_precipitation
    precision: 1
    start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) }}"
    end: "{{ now() }}"
    scan_interval: 600

  - platform: average
    name: irrigation_unlimited_rain_1
    entities:
      - sensor.conflans_sainte_honorine_daily_precipitation
    precision: 1
    start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=1) }}"
    end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=1) }}"
    scan_interval: 600

  - platform: average
    name: irrigation_unlimited_rain_2
    entities:
      - sensor.conflans_sainte_honorine_daily_precipitation
    precision: 1
    start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=2) }}"
    end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=2) }}"
    scan_interval: 600

  - platform: average
    name: irrigation_unlimited_rain_3
    entities:
      - sensor.conflans_sainte_honorine_daily_precipitation
    precision: 1
    start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=3) }}"
    end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=3) }}"
    scan_interval: 600

  - platform: average
    name: irrigation_unlimited_rain_4
    entities:
      - sensor.conflans_sainte_honorine_daily_precipitation
    precision: 1
    start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=4) }}"
    end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=4) }}"
    scan_interval: 600

  - platform: average
    name: irrigation_unlimited_temperature_0
    entities:
      - sensor.conflans_sainte_honorine_temperature
    precision: 1
    start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) }}"
    end: "{{ now() }}"
    scan_interval: 600

  - platform: average
    name: irrigation_unlimited_temperature_1
    entities:
      - sensor.conflans_sainte_honorine_temperature
    precision: 1
    start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=1) }}"
    end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=1) }}"
    scan_interval: 600

  - platform: average
    name: irrigation_unlimited_temperature_2
    entities:
      - sensor.conflans_sainte_honorine_temperature
    precision: 1
    start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=2) }}"
    end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=2) }}"
    scan_interval: 600

  - platform: average
    name: irrigation_unlimited_temperature_3
    entities:
      - sensor.conflans_sainte_honorine_temperature
    precision: 1
    start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=3) }}"
    end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=3) }}"
    scan_interval: 600

  - platform: average
    name: irrigation_unlimited_temperature_4
    entities:
      - sensor.conflans_sainte_honorine_temperature
    precision: 1
    start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=4) }}"
    end: "{{ now().replace(hour=23).replace(minute=59).replace(second=0) - timedelta(days=4) }}"
    scan_interval: 600

  - platform: average
    name: irrigation_unlimited_temperature_5_day_moving_average
    entities:
      - sensor.conflans_sainte_honorine_temperature
    precision: 1
    start: "{{ now().replace(hour=0).replace(minute=30).replace(second=0) - timedelta(days=4) }}"
    end: "{{ now() }}"
    scan_interval: 600

  # Five day weighted rain total sensor.
  # Adjust the weight values (0.7, 0.3, 0.15, 0.05) to suit your needs (0.0 = ignore that day).
  - platform: template
    sensors:
      irrigation_unlimited_rain_weighted_total:
        friendly_name: "Irrigation Unlimited Rain Weighted Total"
        unit_of_measurement: "mm"
        icon_template: "mdi:umbrella"
        value_template: >
          {% set r0 = state_attr('sensor.irrigation_unlimited_rain_0','max_value') | float(-1) %}
          {% set r1 = state_attr('sensor.irrigation_unlimited_rain_1','max_value') | float(-1) %}
          {% set r2 = state_attr('sensor.irrigation_unlimited_rain_2','max_value') | float(-1) %}
          {% set r3 = state_attr('sensor.irrigation_unlimited_rain_3','max_value') | float(-1) %}
          {% set r4 = state_attr('sensor.irrigation_unlimited_rain_4','max_value') | float(-1) %}
          {% if r0 != -1 and r1 != -1 and r2 != -1 and r3 != - 1 and r4 != -1 %}
            {% set rain_total = r0 %}
            {% set rain_total = rain_total + r1 * 0.7 %}
            {% set rain_total = rain_total + r2 * 0.3 %}
            {% set rain_total = rain_total + r3 * 0.15 %}
            {% set rain_total = rain_total + r4 * 0.05 %}
            {{ rain_total | round(1) }}
          {% else %}
            {{ -1 }}
          {% endif %}
    scan_interval: 600

# Automation to adjust the run times for Irrigation Unlimited.
# It uses the 5 day weighted rain total and the moving 5 day average temperature sensors
# created above to generate a variation.
# Adjust rain_total_threshold, rain_rate_threshold and temperature_threshold variables to suit you needs.
automation:
  - alias: Irrigation Unlimited Adjustment
    trigger:
      platform: state
      entity_id:
        - sensor.irrigation_unlimited_rain_weighted_total
        - sensor.irrigation_unlimited_temperature_5_day_moving_average
        - sensor.conflans_sainte_honorine_daily_precipitation
    action:
      service: irrigation_unlimited.adjust_time
      data:
        entity_id: binary_sensor.irrigation_unlimited_c1_z1
        percentage: >
          {# Threshold variables #}
          {% set rain_total_threshold = 3.5 %}
          {% set rain_rate_threshold = 1.0 %}
          {% set temperature_threshold = 20.0 %}

          {# Sensor data #}
          {% set rain_total = states('sensor.irrigation_unlimited_rain_weighted_total') | float(-1) %}
          {% set rain_rate = states('sensor.conflans_sainte_honorine_daily_precipitation') | float(-1) %}
          {% set temperature_average = states('sensor.irrigation_unlimited_temperature_5_day_moving_average') | float(-273) %}

          {# Check if sensor data is valid #}
          {% if rain_total != -1 and rain_rate != -1 and temperature_average and temperature_average != -273 %}
            {# Threshold variables #}
            {% set rain_multiplier = (1 - (rain_total / rain_total_threshold)) %}
            {% set temperature_multiplier = temperature_average / temperature_threshold %}

            {% set multiplier = 1.0 %}
            {% if rain_rate < rain_rate_threshold and rain_multiplier > 0 and rain_total < rain_total_threshold %}
              {% set multiplier = multiplier * temperature_multiplier %}
              {% set multiplier = multiplier * rain_multiplier %}
            {% else %}
              {% set multiplier = 0.0 %} {# It's raining or enough already #}
            {% endif %}

            {# Return multiplier as a percentage #}
            {{ (multiplier * 100) | round(0) }}
          {% else %}
            {{ 100 }}
          {% endif %}

  - alias: Soil moisture adjustment
    trigger:
      - platform: state
        entity_id: sensor.pittosporum_soil_moisture
      # - platform: state
      #   entity_id: input_select.irrigation_sensor
      - platform: state
        entity_id: input_number.irrigation_humidite
    action:
      service: irrigation_unlimited.adjust_time
      data:
        entity_id: binary_sensor.irrigation_unlimited_c1_m
        percentage: >
          {# Threshold variable 0-100 percent #}
          {% set threshold = states('input_number.irrigation_humidite') | float(0) %}

          {# Sensor data #}
          {% set humidity = states('sensor.pittosporum_soil_moisture') | float(0) %}

          {% if humidity < threshold %}
            {# Option 1 - A linear sliding scale #}
            {% set multiplier = 1 - (humidity / threshold) %}
            {# Option 2 - On or Off #}
            {% set multiplier = 1.0 %}
          {% else %}
            {% set multiplier = 0.0 %} {# It's too wet, turn off #}
          {% endif %}

          {# Return multiplier as a percentage #}
          {{ (multiplier * 100) | round(0) }}

  - alias: "Irrigation Unlimited Completion"
    trigger:
      platform: event
      event_type: irrigation_unlimited_finish
    action:
      - service: notify.persistent_notification
        data:
          title: "Irrigation Unlimited - Completed"
          message: |
            Time: {{ as_local(trigger.event.time_fired).strftime('%c') }}
            Controller: {{ trigger.event.data.controller.index + 1 }} {{ trigger.event.data.controller.name }}
            Sequence: {{ trigger.event.data.sequence.index + 1 }} {{ trigger.event.data.sequence.name }}
            Schedule: {% if trigger.event.data.schedule.index is integer %}{{ trigger.event.data.schedule.index + 1 }} {{ trigger.event.data.schedule.name }}{% else %}Manual{% endif %}
            Duration: {{ timedelta(seconds=trigger.event.data.run.duration) }}

A plus !

J’ai installé smart irrigation qui m’a vraiment attiré par son modèle de calcul de l’évapotranspiration basé sur des capteurs sachant que j’ai une station météo qui peut en fournir une partie.
Malheureusement impossible d’avoir des résultats cohérents. En regardant les derniers messages du post sur le forum HA, j’ai compris que j’étais très loin d’être le seul.
Donc grosse déception.
J’espère que mon post fera gagner du temps à certains mais en même temps je ne veux pas décourager tout le monde d’utiliser cette intégration. Avant de vous lancer jettez bien un oeil sur le forum pour voir si les problèmes ont été corrigés. C’est quand meme une intégration qui a fait son chemin et qui a du satisfaire pas mal de monde.

Ensuite je vais peut être tester Irrigation v5, j’hésite encore…

@Sigalou : ou en es tu de tes tests ? as tu choisi une intégration ?

2 « J'aime »