Évacuation automatique des condensats de climatisation
Pilotage d'une pompe immergée par Raspberry Pi et prise Shelly : deux flotteurs à contact sec, aucune manipulation du 230 V côté carte, interface Web embarquée et douze sécurités.
Technologies employées
- Python
- Flask
- gpiozero
- Raspberry Pi OS
- systemd
- Shelly RPC
- pytest
- ruff
Résumé
Une climatisation rejette ses condensats dans un bac sans écoulement gravitaire. Deux flotteurs à contact sec renseignent un Raspberry Pi sur le niveau ; quand l’eau atteint la sonde haute, une prise Wi-Fi Shelly alimente une pompe immergée qui transfère le bac vers un bidon. Le cycle s’arrête lorsque la sonde basse se découvre.

Contexte
Vider le bac à la main est une corvée quotidienne, et un oubli suffit à faire déborder l’eau. Les solutions du commerce sont soit des pompes à marche continue, soit des contacteurs à flotteur pilotant directement le secteur — sans supervision, sans journal, et sans rien pour arrêter la pompe si le flotteur se bloque.

Objectifs
- Automatiser le cycle de vidange sans intervention.
- Rendre l’état du système lisible à distance, avec un historique.
- Ne jamais laisser la pompe tourner à sec ni au-delà de la durée d’un cycle.
Contraintes
- Le Raspberry Pi ne doit jamais commuter le 230 V. Ses GPIO restent en 3,3 V.
- Le système doit rester sûr si le Raspberry plante ou perd le réseau.
- Aucune dépendance à Internet : tout fonctionne en réseau local.
- Le code doit être développable et testable sans le matériel.
Architecture
Le Raspberry Pi lit les deux flotteurs sur des GPIO en pull-up interne — contacts secs, aucune alimentation ni résistance externe — et commande le secteur indirectement, par requête HTTP vers l’API RPC locale de la prise Shelly. Le cloud du fabricant n’est jamais sollicité.

Le code suit un découpage ports/adaptateurs : la logique métier ne dépend d’aucune bibliothèque matérielle. Les sondes, la prise et le notificateur sont des ports, chacun avec une implémentation réelle et une implémentation simulée. C’est ce qui permet de faire tourner l’ensemble du projet sur un poste de travail.
L’horloge est injectée plutôt que lue globalement : le watchdog de soixante secondes est donc vérifié sans attendre soixante secondes, et la suite complète s’exécute en moins d’une seconde.
Implémentation
Toute la logique — transitions d’état et sécurités — est centralisée dans un
unique tick() synchrone appelé par une boucle de contrôle. Un seul endroit
décide de l’état de la pompe, ce qui rend l’ensemble des garde-fous lisibles d’un
seul tenant plutôt que dispersés dans des rappels asynchrones.

La géométrie du bac et la position des sondes viennent de la configuration : aucun volume n’est écrit en dur. Le programme refuse de démarrer si une contrainte est violée — sondes inversées, auto-coupure nulle, broche invalide — et émet des avertissements sur les réglages risqués sans jamais les corriger silencieusement.
Une interface Web embarquée sert un tableau de bord temps réel, un journal d’événements et des graphiques historiques, sans aucune ressource externe. Les notifications Telegram sont optionnelles : toutes les sécurités fonctionnent sans Internet.
Difficultés rencontrées
La sécurité la plus difficile à obtenir est celle qui doit survivre à la panne du superviseur lui-même : un watchdog logiciel ne sert à rien si c’est le processus qui l’héberge qui meurt, pompe allumée.
Côté déploiement, le backend GPIO bas niveau ne s’installe pas depuis PyPI sur un
Raspberry Pi sans chaîne de compilation complète : le paquet compile une extension
C et réclame swig ainsi que les en-têtes Python.
Enfin, arrêter la pompe dès que la sonde haute se découvre produirait un cycle court et un battement continu autour du seuil.
Solutions
La coupure est déléguée au matériel : chaque ordre d’allumage porte un délai d’auto-extinction que la prise applique elle-même. Le Raspberry peut disparaître, la pompe s’arrête. Le watchdog logiciel double ce timer sans le remplacer, et une extinction est forcée si la prise s’allume sans ordre.
Le backend GPIO est installé depuis le paquet système et le venv créé avec
--system-site-packages, ce que fait le script d’installation — idempotent, il
préserve la configuration locale, les données et les journaux à chaque relance.
Le cycle applique une hystérésis : la sonde haute déclenche, seule la sonde basse arrête. Le volume transféré est estimé à partir de l’écart entre les deux sondes, ce qui donne au passage le suivi de remplissage du bidon.
Résultats
- Cycle entièrement autonome, avec estimation du volume transféré et du bidon.
- Douze sécurités documentées, dont deux matérielles, sur le principe fail safe = pompe à l’arrêt.
- Aucune route de démarrage manuel : impossible de contourner l’anti-marche-à-sec ni le blocage bidon plein depuis l’interface.
- Suite de tests couvrant la géométrie, la machine d’état, le client de la prise et l’API, exécutable sans matériel.
Améliorations possibles
- Exposition des métriques pour un suivi long terme du volume évacué.
- Détection d’un débit anormal, révélateur d’un tuyau partiellement obstrué.
- Validation physique complète du montage : sens réel des flotteurs, débit et durée de cycle chronométrés, réglage de l’auto-coupure au double de cette durée.