Hello everyone,
After a few years spent under Jeedom, I migrated my home automation to HA last March.
I share with you my most successful current project: automatic watering.
The project aims to replace my rainbird system, whose wifi dongle broke down after two and a half seasons…
In summary: use an ESP8266 to control a plate of 8 relays, 5 used in the assembly on the GPIOs D0, D1, D2, D3, D4
Dallas DS18B20 temperature sensors (one inside the case, the other for the outside temperature), on D7
1 soil moisture sensor (yl38), on A0
two push buttons to launch an automation:
5 minute watering of all zones on D5
10 minutes watering of all zones on D6
A third button will be wired to the GPIO RST & GND: one press, on reboot all the valves will be off
And in a second step, the creation of three maps in HA to drive everything:
the first card is to be used to either launch a 5-minute watering sequence per zone, or 10 minutes, and just in case… a stop
the second is used to view the watering zones, and to start / stop them manually
the third is in my opinion the most interesting: the watering time of each zone can be adjusted between 1 and 20 minutes, and we start the sequence of sequences
Bonjour à toutes et à tous,
Après quelques années passées sous Jeedom, j’ai migré ma domotique sur HA en mars dernier.
Je vous partage mon projet actuel le plus abouti: l’arrosage automatique.
Le projet vise à remplacer mon système rainbird, dont le dongle wifi à rendu l’âme après deux saisons et demi …
En synthèse: utiliser un ESP8266 pour contrôler une plaque de 8 relais, 5 utilisés dans le montage sur les GPIO D0,D1,D2,D3,D4
capteurs de température Dallas DS18B20 (un intérieur au boîtier, l’autre pour la température extérieure), sur D7
1 capteur d’humidité du sol (yl38), sur A0
deux boutons poussoir pour lancer une automatisation :
5 minutes d’arrosage de toutes les zones sur D5
10 minutes d’arrosage de toutes les zones sur D6
Un troisième bouton sera cablé sur le GPIO RST & GND: un appuie, au reboot toutes les vannes seront éteintes
Et dans un second temps, la création de trois cartes dans HA pour piloter le tout:
la première carte est a utiliser pour soit lancer une séquence d’arrosage de 5mn par zone, soit 10mn, et au cas ou… un stop
la deuxième, sert visualiser les zones d arrosage, et a les démarrer / arrêter manuellement
la troisième est à mon sens la plus intéressante: le temps d arrosage de chaque zone peut être ajusté entre 1 et 20mn, et on lance l enchainement des séquences
In HA, you need to create 5 entries
dans HA il faut créer 5 entrées ( 5 vannes, 8 si vous en avez 8)
# définition des variables pour le temps d'arrosage
# un timmer propre a chaque zone pour un mode personnalisé
# a positionner dans un fichier input_number.yaml dans le même répertoire que le fichier configuration.yaml
# et dans le fichier configuration: input_number: !include input_number.yaml
tempo_temps1:
name: tempo_temps1
initial: 1
min: 1
max: 20
step: 1
unit_of_measurement: "min"
tempo_temps2:
name: tempo_temps2
initial: 1
min: 1
max: 20
step: 1
unit_of_measurement: "min"
tempo_temps3:
name: tempo_temps3
initial: 1
min: 1
max: 20
step: 1
unit_of_measurement: "min"
tempo_temps4:
name: tempo_temps4
initial: 1
min: 1
max: 20
step: 1
unit_of_measurement: "min"
tempo_temps5:
name: tempo_temps5
initial: 1
min: 1
max: 20
step: 1
unit_of_measurement: "min"
then here is the code for the ESP8266
this is my first code, so it is certainly optimizable
I created it from the ESPHome doc, from various projects gleaned from the net, but also using ChatGPT
ensuite voici le code pour l ESP8266
c est mon premier code, donc il est certainement optimisable
je l’ai créé a partir de la doc ESPHome, de divers projets glanés sur le net, mais également en tâtonnant avec ChatGPT que je découvre en même temps (il peut donner des pistes, mais rarement une solution a appliquer directement, mais cela m a aidé)
# code v2 ARROSAGE AUTOMATIQUE
# Controle d'une plaque de 8 relais, 5 utilisés dans le montage, GPIO D0,D1,D2,D3,D4
# 2 capteurs de température Dallas DS18B20 (un interrieur au boitier, un température exterieure), sur D7
# 1 capteur d'humidité du sol (yl38), sur A0
# deux boutons poussoir pour lancer une automatisation :
# 5 minutes d'arrosage de toutes les zones sur D5
# 10 minutes d'arrosage de toutes les zones sur D6
# Un troisieme bouton sera cablé sur le GPIO RST & GND: un appuie, au reboot toutes les vannes seront eteintes
# ici, on commence par configurer les différentes variables, cela facilite la duplication ;-)
substitutions:
# nom des Zones d'arrosage
switch1_name: 1🎍Bambous
switch2_name: 2🌱Jardin côté droit
switch3_name: 3🌱Jardin côté gauche
switch4_name: 4🌹Bordures
switch5_name: 5🍅 Potager
# switch6_name: 6 Libre
# switch7_name: 7 Libre
# switch8_name: 8 Libre
# ici, on donne les PIN du GPIO 8266 qui seront utilisés
# Pour les relais
pin_switch1: D0
pin_switch2: D1
pin_switch3: D2
pin_switch4: D3
pin_switch5: D4
pin_bouton1: D5
pin_bouton2: D6
pin_dallas: D7
# Pour le capteur d'humidité du sol:
pin_moisure: A0
# true ou flase en fonction de votre relay et des boutons, afin d aligner l état remonté sur l'état physique ( allumé/éteint )
is_inverted: "true"
button_inverted: "true"
# Configuration de l IP fixe, ici en "2"
ip_device: 192.168.1.2
ip_gateway: 192.168.1.254
ip_subnet: 255.255.255.0
# Nom de l ESP qui sera vible sur votre box (en minuscules)
esphome_name: gpioarrosagev2
# Frendly name qui sera visible dans Home Assistant
devicename: GPIO Arrosage V2
# Timer des automatismes (ici, 5 minutes par Zone pour le premier et 10 minutes pour le second)
Temps1: "5"
Temps2: "10"
# Nom des deux boutons possoirs qui feront démarrer deux automatismes
bouton1_name: ${Temps1} minutes d'arrosage de toutes les zones
bouton2_name: ${Temps2} minutes d'arrosage de toutes les zones
# ici, on indique le nom des icones à utiliser pour que cela soit joli dans home assistant
switch_icon: sprinkler-variant
switch_remote: remote
switch_reboot: restart
pushbutton1: pushbutton1
pushbutton2: pushbutton2
# ici, on donne le Numéro de série des capteurs de température dallas DS18B20
dallas_int: "0x64xxN°de serie dallas 1"
dallas_ext: "0xcbN°de serie dallas 2"
# dans le reste du code, tout est variabilisé sur les labels de subsitution
esphome:
name: ${esphome_name}
friendly_name: ${devicename}
on_boot:
priority: -10
then:
- switch.turn_off: relay4
- switch.turn_off: relay3
- switch.turn_off: relay2
- switch.turn_off: relay1
- switch.turn_off: relay5
esp8266:
board: nodemcuv2
# Enable logging
logger:
# Enable Home Assistant API
# créez ici dans le repertoir EPSHome un fichier secret.yaml qui comportera les valeurs sensibles comme vos mots de passe
# le déclaratif est simple à réaliser , dans le fichier secret.yaml, ajouter une ligne key_arrosage: la clé de votre API, ota_arrosage: l'OTA de votre arrosage etc
api:
encryption:
key: !secret key_arrosage
ota:
password: !secret ota_arrosage
# Ici, on lance la connexion de l'ESP8266 à votre WIFI,
# les paramètres sont à remplir plus haut, et dans le fichier sercet.ymal
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
manual_ip:
static_ip: ${ip_device}
gateway: ${ip_gateway}
subnet: ${ip_subnet}
# Enable fallback hotspot (captive portal) in case wifi connection fails
# En cas de plantage, un point d'acces est créé
ap:
ssid: "${devicename} Hotspot"
password: !secret mdp_hotspot
# Ici, on active le serveur WEB du ESP8266, en allant sur l IP du ESP8266, on tombe sur une interface pour piloter les relais
web_server:
port: 80
auth:
username: !secret server_username
password: !secret server_password
captive_portal:
# Enable Home Assistant API
text_sensor:
- platform: version
name: "${devicename} ESPHome Version"
hide_timestamp: true
- platform: wifi_info
ip_address:
name: "${devicename} IP Address"
# Example configuration entry
dallas:
- pin: ${pin_dallas}
globals:
- id: temps1
type: int
restore_value: no #pas besoin de conserver cette valeur puisque c'est Nodered qui l'envoie à chaque clignotement demandé.
initial_value: '1' #on pourrait s'en passer aussi, mais j'ai toujours peur de plantages éventuels si on ne met pas au moins une valeur dedans
- id: temps2
type: int
restore_value: no
initial_value: '1'
- id: temps3
type: int
restore_value: no
initial_value: '300'
- id: temps4
type: int
restore_value: no
initial_value: '1'
- id: temps5
type: int
restore_value: no
initial_value: '1'
# Individual sensors
sensor:
- platform: homeassistant
id: tempo_temps1
entity_id: input_number.tempo_temps1
on_value:
then:
- globals.set:
id: temps1
value: !lambda 'return int(x);'
- platform: homeassistant
id: tempo_temps2
entity_id: input_number.tempo_temps2
on_value:
then:
- globals.set:
id: temps2
value: !lambda 'return int(x);'
- platform: homeassistant
id: tempo_temps3
entity_id: input_number.tempo_temps3
on_value:
then:
- globals.set:
id: temps3
value: !lambda 'return int(x);'
- platform: homeassistant
id: tempo_temps4
entity_id: input_number.tempo_temps4
on_value:
then:
- globals.set:
id: temps4
value: !lambda 'return int(x);'
- platform: homeassistant
id: tempo_temps5
entity_id: input_number.tempo_temps5
on_value:
then:
- globals.set:
id: temps5
value: !lambda 'return int(x);'
# Ici , c est la récupération de la température interieure et exterieure
- platform: dallas
address: ${dallas_int}
name: "Temperature Interieure"
- platform: dallas
address: ${dallas_ext}
name: "Temperature Exterieure"
# Ici , c est la récupération de l humidité du sol
- platform: adc
pin: ${pin_moisure}
name: "Humidité du sol"
id: hum_sol
update_interval: 60s
unit_of_measurement: "%"
filters:
- median:
window_size: 7
send_every: 4
send_first_at: 1
- calibrate_linear:
- 0.85 -> 0.00
- 0.44 -> 100.00
- lambda: if (x < 1) return 0; else return (x);
accuracy_decimals: 0
- platform: wifi_signal
name: "${devicename} WiFi signal"
####################################################################################################################
# #
# Configuration de 5 relais correspondants aux 5 vannes d'arrosage #
# #
# # # S W I T C H # # #
# #
####################################################################################################################
switch:
- platform: gpio
name: "${switch1_name}"
id : relay1
icon: "mdi:${switch_icon}"
pin: ${pin_switch1}
on_turn_on:
- logger.log: "L'arrosage de la zone ${switch1_name} est en cours."
on_turn_off:
- logger.log: "L'arrosage de la zone ${switch1_name} est terminé."
inverted: ${is_inverted}
- platform: gpio
name: "${switch2_name}"
id : relay2
icon: "mdi:${switch_icon}"
pin: ${pin_switch2}
on_turn_on:
- logger.log: "L'arrosage de la zone ${switch2_name} est en cours."
on_turn_off:
- logger.log: "L'arrosage de la zone ${switch2_name} est terminé."
inverted: ${is_inverted}
- platform: gpio
name: "${switch3_name}"
id : relay3
icon: "mdi:${switch_icon}"
pin: ${pin_switch3}
on_turn_on:
- logger.log: "L'arrosage de la zone ${switch3_name} est en cours."
on_turn_off:
- logger.log: "L'arrosage de la zone ${switch3_name} est terminé."
inverted: ${is_inverted}
- platform: gpio
name: "${switch4_name}"
id : relay4
icon: "mdi:${switch_icon}"
pin: ${pin_switch4}
on_turn_on:
- logger.log: "L'arrosage de la zone ${switch4_name} est en cours."
on_turn_off:
- logger.log: "L'arrosage de la zone ${switch4_name} est terminé."
inverted: ${is_inverted}
- platform: gpio
name: "${switch5_name}"
id : relay5
icon: "mdi:${switch_icon}"
pin: ${pin_switch5}
on_turn_on:
- logger.log: "L'arrosage de la zone ${switch5_name} est en cours."
on_turn_off:
- logger.log: "L'arrosage de la zone ${switch5_name} est terminé."
inverted: ${is_inverted}
- platform: restart
name: "🛑Reboot ${devicename}🛑"
id: reboot
icon: "mdi:${switch_reboot}"
####################################################################################################################
# #
# Ici on fait deux switch virtuels, pour lancer l'un ou l'autre des deux scipts #
# #
####################################################################################################################
- platform: template
name: "🕐Lancer ${Temps1} mn d'arrosage"
icon: "mdi:${switch_remote}"
turn_on_action:
- script.execute: script_${Temps1}
# turn_off_action:
- platform: template
name: "🕑Lancer ${Temps2} mn d'arrosage"
icon: "mdi:${switch_remote}"
turn_on_action:
- script.execute: script_${Temps2}
- platform: template
name: "🕑Lancer l'arrosage manuel"
icon: "mdi:${switch_remote}"
turn_on_action:
- script.execute: tempo_manuelle
####################################################################################################################
# #
# #
# Configuration de 2 boutons poussoirs, le premier servira à lancer un cycle d'arrosage de toutes les zones 10mn #
# le second lancera un cycle de 10mn pour la pellouse et 20 minutes pour les plantes #
# #
# #
####################################################################################################################
binary_sensor:
- platform: gpio
device_class: motion
icon: "mdi:${switch_remote}"
pin:
number: ${pin_bouton1}
mode: INPUT_PULLUP
inverted: ${button_inverted}
name: "${bouton1_name}"
id: pb1
on_press:
then:
- script.execute: script_${Temps1}
- platform: gpio
device_class: motion
icon: "mdi:${switch_remote}"
pin:
number: ${pin_bouton2}
mode: INPUT_PULLUP
inverted: ${button_inverted}
name: "${bouton2_name}"
id: pbd
on_press:
then:
- script.execute: script_${Temps2}
####################################################################################################################
# #
# #
# Ancienne configuration, via button, elle a été remplacée par les deux switchs virtuels #
# #
# #
####################################################################################################################
# button:
# - platform: template
# name: Programme de ${Temps1}
# id: Bouton5
# icon: "mdi:${switch_remote}"
# on_press:
# - script.execute: script_${Temps1}
# - platform: template
# name: Programme de ${Temps2}
# id: Bouton10
# icon: "mdi:${switch_remote}"
# on_press:
# - script.execute: script_${Temps2}
####################################################################################################################
# #
# #
# Voici les scripts qui seront lancés en fonction du switch de commande qui sera activé par home assistant #
# ou par le fait de presse un des deux boutons poussoir (Le 3eme etant directement relié au GPIO RST) #
# #
# #
####################################################################################################################
script:
- id: script_${Temps1}
mode: restart
then:
- logger.log: "Programme de ${Temps1} minutes"
####################################################################################################################
# Sscript qui suit la temporisation N1 #
# On part d'un état ou toutes les vannes sont éteintes
# puis 3 actions sont enchainées, pour chacunes des vannes:
# on allume la vanne de la premiere zone,
# on écrit dans le log que l arrosage de la zone 1 a déuté,
# on patiente un délai égale à Temps1 (ici 5mn)
# on ferme la vanne de la zone 1
# on ouvre la vanne de la zone 2 et ainsi de suite #
####################################################################################################################
- switch.turn_off: relay4
- switch.turn_off: relay3
- switch.turn_off: relay2
- switch.turn_off: relay1
- switch.turn_off: relay5
- switch.turn_on: relay1
- delay: ${Temps1}min
- logger.log: "Arrosage ${switch1_name} terminé "
- switch.turn_off: relay1
- switch.turn_on: relay2
- delay: ${Temps1}min
- logger.log: "Arrosage ${switch2_name} terminé "
- switch.turn_off: relay2
- switch.turn_on: relay3
- delay: ${Temps1}min
- logger.log: "Arrosage ${switch3_name} terminé "
- switch.turn_off: relay3
- switch.turn_on: relay4
- delay: ${Temps1}min
- logger.log: "Arrosage ${switch4_name} terminé "
- switch.turn_off: relay4
- switch.turn_on: relay5
- delay: ${Temps1}min
- logger.log: "Arrosage ${switch5_name} terminé "
- switch.turn_off: relay5
# idem, on en profite pour vérifier si tous les autres relais sont bien eteints
- switch.turn_off: relay4
- switch.turn_off: relay3
- switch.turn_off: relay2
- switch.turn_off: relay1
- id: script_${Temps2}
mode: restart
then:
- logger.log: "Programme de ${Temps2} minutes"
# idem que pour le premier scipt, avec un délai égale au temps 2
- switch.turn_off: relay4
- switch.turn_off: relay3
- switch.turn_off: relay2
- switch.turn_off: relay1
- switch.turn_off: relay5
- switch.turn_on: relay1
- delay: ${Temps2}min
- logger.log: "Arrosage ${switch1_name} terminé "
- switch.turn_off: relay1
- switch.turn_on: relay2
- delay: ${Temps2}min
- logger.log: "Arrosage ${switch2_name} terminé "
- switch.turn_off: relay2
- switch.turn_on: relay3
- delay: ${Temps2}min
- logger.log: "Arrosage ${switch3_name} terminé "
- switch.turn_off: relay3
- switch.turn_on: relay4
- delay: ${Temps2}min
- logger.log: "Arrosage ${switch4_name} terminé "
- switch.turn_off: relay4
- switch.turn_on: relay5
- delay: ${Temps2}min
- logger.log: "Arrosage ${switch5_name} terminé "
- switch.turn_off: relay5
# idem, on en profite pour vérifier si tous les autres relais sont bien eteints
- switch.turn_off: relay4
- switch.turn_off: relay3
- switch.turn_off: relay2
- switch.turn_off: relay1
- id: tempo_manuelle
mode: restart
then:
- logger.log: "Programme manuel lancé"
####################################################################################################################
# Sscript qui suit la temporisation N1 #
# On part d'un état ou toutes les vannes sont éteintes
# puis 3 actions sont enchainées, pour chacunes des vannes:
# on allume la vanne de la premiere zone,
# on écrit dans le log que l arrosage de la zone 1 a déuté,
# on patiente un délai égale à Temps1 (ici 5mn)
# on ferme la vanne de la zone 1
# on ouvre la vanne de la zone 2 et ainsi de suite #
####################################################################################################################
- switch.turn_off: relay4
- switch.turn_off: relay3
- switch.turn_off: relay2
- switch.turn_off: relay1
- switch.turn_off: relay5
- switch.turn_on: relay1
- logger.log: id(temps1) minutes d'arrosage pour ${switch1_name}
- delay: !lambda 'return id(temps1) * 60000;' # Convertit la valeur en secondes
- logger.log: "Arrosage ${switch1_name} terminé "
- switch.turn_off: relay1
- switch.turn_on: relay2
- delay: !lambda 'return id(temps2) * 60000;' # Convertit la valeur en secondes
- logger.log: "Arrosage ${switch2_name} terminé "
- switch.turn_off: relay2
- switch.turn_on: relay3
- delay: !lambda 'return id(temps3) * 60000;' # Convertit la valeur en secondes
- logger.log: "Arrosage ${switch3_name} terminé "
- switch.turn_off: relay3
- switch.turn_on: relay4
- delay: !lambda 'return id(temps4) * 60000;' # Convertit la valeur en secondes
- logger.log: "Arrosage ${switch4_name} terminé "
- switch.turn_off: relay4
- switch.turn_on: relay5
- delay: !lambda 'return id(temps5) * 60000;' # Convertit la valeur en secondes
- logger.log: "Arrosage ${switch5_name} terminé "
- switch.turn_off: relay5
# idem, on en profite pour vérifier si tous les autres relais sont bien eteints
- switch.turn_off: relay4
- switch.turn_off: relay3
- switch.turn_off: relay2
- switch.turn_off: relay1
# Enjoy #
#
# La prochaine évolution, variabiliser le temps pour n'avoir qu un seul script
#
# si vous souhaitez faire évoluer ce code et partager vos amélioration, je suis preneur ;-)
# [email protected]
#
Le code des trois cartes:
first card
carte 1:
type: picture-elements
image: \local\plans\Perso\Arrosage.png
elements:
- type: image
entity: switch.gpio_arrosage_v2_lancer_5_mn_d_arrosage
tap_action:
action: toggle
hold_action:
action: 'on'
image: \local\plans\Perso\5MN.png
state_filter:
'on': brightness(130%) saturate(1.5) drop-shadow(0px 0px 10px gold)
'off': brightness(80%) saturate(0.8)
style:
top: 60%
left: 16%
width: 30%
padding: 30%
- type: image
entity: switch.gpio_arrosage_v2_lancer_10_mn_d_arrosage
tap_action:
action: toggle
hold_action:
action: more-info
image: \local\plans\Perso\10MN.png
state_filter:
'on': brightness(130%) saturate(1.5) drop-shadow(0px 0px 10px gold)
'off': brightness(80%) saturate(0.8)
style:
top: 60%
left: 85%
width: 30%
- type: image
entity: switch.gpio_arrosage_v2_reboot_gpio_arrosage_v2
tap_action:
action: toggle
hold_action:
action: more-info
image: \local\plans\Perso\stop.png
state_filter:
'on': brightness(130%) saturate(1.5) drop-shadow(0px 0px 10px gold)
'off': brightness(80%) saturate(0.8)
style:
top: 87%
left: 50%
width: 12%
padding: 30%
second card
code de la carte 2
type: entities
entities:
- entity: switch.gpio_arrosage_v2_1bambous
name: 1 Bambous
- entity: switch.gpio_arrosage_v2_2jardin_cote_droit
name: 2 Jardin côté droit
- entity: switch.gpio_arrosage_v2_3jardin_cote_gauche
name: 3 Jardin côté gauche
- entity: switch.gpio_arrosage_v2_4bordures
name: 4 Bordures
- entity: switch.gpio_arrosage_v2_5_potager
name: 5 Potager
- entity: switch.gpio_arrosage_v2_lancer_10_mn_d_arrosage
name: Lancer 10 mn d'arrosage
- entity: switch.gpio_arrosage_v2_lancer_5_mn_d_arrosage
name: Lancer 5 mn d'arrosage
- entity: switch.gpio_arrosage_v2_lancer_l_arrosage_manuel
title: GPIO Arrosage V2
header:
type: picture
image: \local\plans\Perso\arrosage_bandeau2.png
tap_action:
action: none
hold_action:
action: none
thierd card
code de la carte 3
type: vertical-stack
cards:
- type: entities
entities:
- entity: input_number.tempo_temps1
name: Bambous
icon: mdi:timer-sand-complete
- entity: input_number.tempo_temps2
name: Côté droit
icon: mdi:timer-sand-complete
- entity: input_number.tempo_temps3
name: Côté Gauche
icon: mdi:timer-sand-complete
- entity: input_number.tempo_temps4
name: Bordures
icon: mdi:timer-sand-complete
- entity: input_number.tempo_temps5
name: Potager
icon: mdi:timer-sand-complete
- entity: switch.gpio_arrosage_v2_lancer_l_arrosage_manuel
name: Lancer l'arrosage manuel
header:
type: picture
image: \local\plans\Perso\arrosage_bandeau2.png
tap_action:
action: none
hold_action:
action: none
les images utilisées à mettre dans le répertoire: www\plans\Perso
a venir car pour le moment je n ai le droit qu a une image
the pics for this project are in the answers below
ma configuration :
RPi 4 4go SSD M2 64Go