Bonjour à tous,
En voyant le nombre de robots de piscine HS traîner sur Leboncoin et eBay, je me suis posé la question “mais pourquoi tous ces engins hors de prix finissent-ils à la poubelle au bout de quelques saisons ? »
J’ai donc fait l’acquisition d’un modèle en panne (Hayward TigerShark) et j’ai ouvert la bête pour comprendre. Et là, pas besoin de chercher longtemps :
Le boîtier moteur étanche contenant toute l’électronique est immergé, les moteurs chauffent, l’eau de la piscine étant plus fraîche, ça condense à gogo sur les parois
Bref, tout ce petit monde baigne allègrement dans les eaux de condensation accumulées car le sachet de dessiccant d’origine a dû être rapidement saturé.
Pour pousser les tests et sans trop y croire, je vide, je sèche, je referme… et là miracle : le robot repart comme si de rien n’était ! Sauf que… la corrosion avait déjà fait son œuvre. Quelques heures plus tard, retour à la case départ.
C’est là que j’ai décidé de jeter la carte électronique d’origine et de repartir sur une base saine.
J’ai donc greffé un ESP8266 (Wemos D1 Mini) et un pont en H pour piloter l’inversion de sens des chenilles plus quelques bigailles que je détaillerai plus bas.
Présentation du robot:
En gros, le robot est constitué d’
1 moteur qui actionne les chenilles (droite et gauche !)
1 moteur qui actionne une turbine qui a pour effet de plaquer le robot au fond ou à la paroi et d’aspirer les saletés dans le filtre.
Le décalage du robot pour nettoyer la “bande” suivante est assuré par la poignée-flotteur qui est a un angle ce qui fait que lorsque le robot grimpe a la paroi, une fois arrivé a la ligne d’eau, il se décale naturellement et le robot repart dans l’autre sens.
Pour plus de précisions aller voir la vidéo ici à 1:48
Tout le reste c’est … du plastique!
BOM:
1 pont en H (driver de puissance) BTS7960
1 wemos D1 mini
1 transistor IRL 540N
1 step down LM2596 qui sera réglé a 5V en sortie (attention! La tension d’alimentation d’origine du robot varie beaucoup et dépasse les 33 V a vide, le premier step down que j’avais choisi buggait au delà de 25V (données de la plaque constructeur de l’alim !)
1 diode 1N5822 (diode de roue libre): Protection contre les retours de tension lorsque le moteur de la turbine s’arrête.
2 interrupteurs au mercure de ce type (pour détecter lorsque le robot grimpe aux parois)
Le schéma
Les deux contacts mercure sont soudés en série et je me sers d’eux pour détecter que le robot monte a la paroi gauche ou droite de la piscine. Comme un dessin vaut mieux qu’un long discours voilà quelques vues qui vous permettront de mieux appréhender leur positionnement:
( A noter que l’ensemble est représenté a l’envers, la partie noire sur laquelle reposent tous les éléments est imprimée en 3D pour sécuriser l’angle précis des interrupteurs mercure : Menteur tu as foutu un angle au pif !
)
Ainsi, quand le robot est au sol, les 2 contact mercure sont fermés mais dès que le robot va prendre un peu d’angle pour grimper à une paroi, un des 2 contacts s’ouvrira permettant la détection de bord.
Les puristes hurleront devant cet infâme assemblage mais c’est un proto, promis-juré-craché, cet hiver je fais un PCB digne de ce nom !
le lien vers la bidouille infâme qui tient lieu de PCB
Le code :
esphome:
name: robot-piscine
friendly_name: Robot Piscine
# Démarrage immédiat même sans Wi-Fi
on_boot:
priority: 200
then:
- logger.log: "Boot immédiat même sans Wi-Fi"
- delay: 5s
- if:
condition:
binary_sensor.is_on: contact_capteur
then:
- logger.log: "Contact ON → Mode Travail"
- text_sensor.template.publish:
id: etat_robot
state: "Mode Travail"
- script.execute: cycle_travail
else:
- logger.log: "Contact OFF → Mode Maintenance"
- text_sensor.template.publish:
id: etat_robot
state: "Mode Maintenance"
esp8266:
board: d1_mini
wifi:
networks:
- ssid: "XXXX"
password: "xxxxxxxxx"
- ssid: "XXXX"
password: "xxxxxxxxx"
- ssid: "XXXX"
password: "xxxxxxxxx"
# ✅ Démarrage rapide sans attendre le Wi-Fi
fast_connect: true
reboot_timeout: 0s # Ne redémarre jamais en cas d'échec Wi-Fi
power_save_mode: none
ap:
ssid: "Robot-Piscine Fallback"
password: "12345678"
logger:
api:
encryption:
key: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
ota:
platform: esphome
password: "ota_password"
# === Variables globales ===
globals:
- id: cycle_active
type: bool
restore_value: no
initial_value: 'false'
# === Capteur mercure ===
binary_sensor:
- platform: gpio
pin:
number: D7
mode: INPUT_PULLUP
id: contact_capteur
name: "Contact Mercure"
device_class: motion
filters:
- invert
# === Text sensor ===
text_sensor:
- platform: template
name: "État du Robot"
id: etat_robot
icon: "mdi:robot"
# === Sorties (moteurs et turbine) ===
switch:
# --- Chenilles avant ---
- platform: gpio
pin: D5
id: moteur_avant
name: "Chenilles Avant"
interlock: [moteur_arriere]
interlock_wait_time: 1000ms
# --- Chenilles arrière ---
- platform: gpio
pin: D6
id: moteur_arriere
name: "Chenilles Arrière"
interlock: [moteur_avant]
interlock_wait_time: 1000ms
# --- Turbine ---
- platform: gpio
pin: D3
id: turbine
name: "Turbine"
# === Script principal ===
script:
- id: cycle_travail
mode: restart
then:
- logger.log: "Cycle Travail démarré"
- text_sensor.template.publish:
id: etat_robot
state: "Cycle en cours"
- globals.set:
id: cycle_active
value: 'true'
- switch.turn_on: turbine
- delay: 5s
- switch.turn_on: moteur_avant
- script.execute: boucle_travail
- id: boucle_travail
mode: restart
then:
# 1️⃣ Paroi gauche
- wait_until:
binary_sensor.is_off: contact_capteur
- logger.log: "Robot sur paroi gauche"
- delay: 30s
- switch.turn_off: moteur_avant
- delay: 1s
- switch.turn_on: moteur_arriere
# Retour au fond
- wait_until:
binary_sensor.is_on: contact_capteur
- logger.log: "Robot au fond"
# 2️⃣ Paroi droite
- wait_until:
binary_sensor.is_off: contact_capteur
- logger.log: "Robot sur paroi droite"
- delay: 30s
- switch.turn_off: moteur_arriere
- delay: 1s
- switch.turn_on: moteur_avant
# Reboucle tant que cycle actif
- if:
condition:
lambda: 'return id(cycle_active);'
then:
- script.execute: boucle_travail
# === Fin automatique du cycle après 30 min ===
interval:
- interval: 30min
then:
- if:
condition:
lambda: 'return id(cycle_active);'
then:
- logger.log: "Fin du cycle (30 min)"
- switch.turn_off: moteur_avant
- switch.turn_off: moteur_arriere
- switch.turn_off: turbine
- globals.set:
id: cycle_active
value: 'false'
- text_sensor.template.publish:
id: etat_robot
state: "Cycle terminé"
La logique du robot:
A la mise sous tension:
Si contact mercure fermés ON (fermé) → “Mode Travail” → Démarrage automatique du cycle complet
Si contact OFF (ouvert) → “Mode Maintenance” → aucune action automatique, tu pilotes manuellement depuis Home Assistant
Mode Maintenance
On a 3 interrupteurs visibles dans Home Assistant :
Chenilles Avant
Chenilles Arrière
Turbine
On peut activer manuellement chaque sortie pour faire des tests.
L’interlock empêche “Avant” et “Arrière” d’être ON simultanément ce qui grillerait instantanément le driver du moteurs des chenilles.
Mode Travail (automatique)
Le robot :
Démarre turbine → attend 5 s
Active la marche avant
Alterne avant/arrière selon les capteurs mercure
- Lorsqu’ 1 interrupteur mercure passe OFF → “Robot sur paroi gauche”
- Continue 30 s → inverse sens → descend de la paroi(J’ai réglé arbitrairement 30 S car chez moi j’ai une coque avec une marche périphérique mais chacun peut ajuster cette durée pour sa piscine)
- Attend que les interrupteurs mercure repassent ON → “Robot au fond”
- attend qu’1 interrupteur mercure passe OFF → “Robot sur paroi droite”
- Continue 30 s → inverse sens → descend de la paroi → reboucle
Continue pendant 30 minutes puis une fois ce temps écoulé, Coupe tout et affiche :
“Cycle terminé”
En prime une carte pour votre dashboard:
type: vertical-stack
cards:
- type: markdown
content: |
## 🤖 **Robot Piscine**
**Mode actuel :** `{{ states('text_sensor.robot_piscine_etat_du_robot') }}`
_Dernière mise à jour : {{ now().strftime('%d/%m/%Y %H:%M') }}_
- type: grid
title: Contrôle Manuel
columns: 3
square: false
cards:
- type: button
entity: switch.robot_piscine_chenilles_avant
name: Avant
icon: mdi:arrow-up-bold
tap_action:
action: toggle
- type: button
entity: switch.robot_piscine_turbine
name: Turbine
icon: mdi:fan
tap_action:
action: toggle
- type: button
entity: switch.robot_piscine_chenilles_arriere
name: Arrière
icon: mdi:arrow-down-bold
tap_action:
action: toggle
- type: entity
entity: binary_sensor.robot_piscine_contact_mercure
name: Capteur Mercure (Paroi/Fond)
icon: mdi:angle-acute
- type: history-graph
title: Historique Capteurs & Moteurs (2h)
hours_to_show: 2
refresh_interval: 0
entities:
- entity: text_sensor.robot_piscine_etat_du_robot
name: Mode
- entity: switch.robot_piscine_chenilles_avant
name: Avant
- entity: switch.robot_piscine_chenilles_arriere
name: Arrière
- entity: switch.robot_piscine_turbine
name: Turbine
Ce montage à base de Wemos permet de faire durer un robot (qui est hors de prix une fois démonté et au vu de ce que contient la bête) mais il ne résout en aucun cas le problème de condensation qui se forme sur le caisson des moteurs.
Aussi, je pense qu’un démontage-séchage par an lors de l’hivernage permettra d’économiser les 800€ d’un robot neuf (et en prime vous aurez moins l’impression de passer pour un pigeon! )
Merci de m’avoir lu!
Manu



