![[Geek] Un capteur de température wifi pour piscine](/pooltemp.jpg)
Et si on bricolait un capteur de température de piscine pour HomeAssistant ?
Un commentaire, c’est par ici : journalduhacker .
## Hein ? Pourquoi et pour quoi faire ?
J’ai dans l’idée de modifier la durée de fonctionnement de ma pompe de piscine selon la température.
Puisque j’ai déjà créé tout ce qu’il faut dans HomeAssistant pour que la pompe de filtration se gère seule, selon une durée définie, et la production des panneaux photovoltaïques, ben… il me manque que la température pour faire varier cette durée quotidienne.
Le truc : on trouve des capteurs de température pour les piscine, mais ils sont rarement “en réseau” (que ce soit wifi ou zigbee) ; ou alors ils sont à un prix excessif. Et puis, où est le challenge ? Mon but est, avant tout, de bricoler un truc, pas acheter le produit tout fait.
Partant du principe que créer une sonde de température c’est simple, il ne manque que le côté “piscine” : étanche, sans fil donc rechargeable… solaire ?
## Matériel initial
Premier sujet : la sonde.
En gros, c’est tout bête avec un ESP et une sonde DS18B20 qu’on trouve partout sur internet. C’est en plus une question de quelques euros.
Esphome derrière fait presque tout seul la programmation.
On prend un esp8266 dans mon cas :
Une sonde de température à 1,49€ .. :
Et un peu de câblage :
- le fil rouge de la sonde sur le 3.3V
- le noir sur GND
- le jaune sur un des pins, D4 dans mon cas
Un peu de conf dans esphome :
esphome:
name: esp-pool-temp
esp8266:
board: d1_mini
logger:
level: INFO
ota:
- platform: esphome
password: <unsuperpwd>
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
one_wire:
- platform: gpio
pin: D3
sensor:
- platform: dallas_temp
name: "Température Piscine"
On alimente l’esp en 3.3V et c’est parti.
Néanmoins :
- il faut qu’on parle de l’alimentation (c’est tout un sujet)
- il faut qu’on parle de l’endroit où on envoie la donnée :p
- et il faut le rendre “piscinable” (si ça va être usage unique :D)
## Première version
Ce que je veux c’est le mettre dans une piscine. Donc il me faut quelque chose d’étanche. J’ai tout de suite pensé à le mettre sur un truc solaire, et ça tombe bien : il existe des lumières solaires de piscine sous la forme d’un flotteur (comme un distributeur à chlore).
En plus, on en trouve pour pas trop cher.. l’idée que j’ai donc : pirater un peu le truc pour exploiter juste la partie batterie/solaire et y greffer ma sonde.
Le modèle que j’ai retenu est celui-ci, c’est un Intex, et franchement il est super pratique (il s’ouvre facilement, est bien étanche et bien construit, et n’est qu’à 20€) :
L’idée initiale était de tester le système avec le circuit électronique d’origine. Le boitier se constitue d’un panneau solaire qui semble fournir 1,2W à 5-6V, et d’une batterie 18650 en 3,7V 2000mah.
Je teste, un peu violemment, de souder directement le 5V/GND de l’esp sur la batterie. Logiquement, le CPU de l’esp est en 3,3V même si on l’alimente avec le 5V, car il y a un régulateur juste derrière (mais pas sur tous les modèles).
Résultat : eh… ben ça fonctionne en l’état.
Je fais donc un trou dans le fond de la cuve avec un foret de 6mm, j’y fais passer la sonde, et coule de l’epoxy dans le fond.. on laisse sécher une nuit. C’est parfait ça fait un peu de poid (il lui est reproché de se retourner avec le vent). Plus qu’à revisser le tout et tester en live.
Moralité de la version : ben… une fois à l’eau, adieu !
Pourquoi : le wifi et l’eau ça fait pas bon ménage. Globalement la portée du wifi par ici est déjà un peu limite, donc autour de quelques m3 de flotte, c’est foutu.
Deuxième version
Après avoir tenté désespéremment de bouger mes bornes wifi dans l’idée d’avoir un ESP qui est connecté en vain, je pars dans une autre idée.
J’ai la chance d’avoir un Shelly 1PM qui gère l’allumage de ma pompe de piscine, et il est juste à côté. Dans les derniers firmwares a été ajouté une fonctionnalité bien sympa : “Range Extender”.
Le but ? Le shelly génère un hotspot wifi, pour y connecter à la base, d’autres shelly, et étendre le réseau.
Du pain béni dans mon cas : j’y connecte l’ESP, et me permet d’avoir un wifi bien plus proche, bien que faible, mais surtout qui fonctionne.
Le hic : le shelly donne une IP DHCP, aléatoire (on pourrait la fixer dans l’esp), dans un plan d’adressage différent (j’aurais préféré un bridge), et surtout avec du NAT (seul le port 443 semble naté sur un port aléatoire).
Ce que cela implique :
- l’esp ne sera plus joignable par esphome
- homeassistant ne le verra plus non plus via l’intégration esphome
La solution dans ce cas : passer par MQTT.
Plutôt que d’aller y chercher les données, on va dire à l’esp de pousser en MQTT dans mon serveur mosquitto
, les données qui m’intéressent. Ainsi ce réseau bridé du shelly n’est plus un souci.
De plus, pour avoir plus de détails, et éviter les soucis en cas de décrochage, on va ajouter à la conf :
- quelques sondes (uptime, portée du wifi)
- un reboot auto si le wifi décroche
- un clignotement lent de la led (pour voir s’il est vivant)
Ceci porte donc la conf esphome comme ceci :
esphome:
name: esp-pool-temp
esp8266:
board: d1_mini
logger:
level: INFO
wifi:
ssid: !secret wifi_pool_ssid
password: !secret wifi_password
power_save_mode: light
reboot_timeout: 120s
on_disconnect:
then:
- delay: 120s
- logger.log: "Wifi perdu, redémarrage..."
- lambda: |-
ESP.restart();
one_wire:
- platform: gpio
pin: D3
sensor:
- platform: dallas_temp
name: "Température Piscine"
- platform: wifi_signal
name: "Signal Wifi"
- platform: uptime
name: "Uptime"
switch:
- platform: restart
name: "Redémarrer le capteur"
mqtt:
broker: "IP de mon serveur MQTT"
username: mon super username
password: !secret mqtt_password
topic_prefix: esp-pool-temp
output:
- platform: gpio
pin: D4
id: led_builtin
inverted: true
interval:
- interval: 30s
then:
- output.turn_on: led_builtin
- delay: 100ms
- output.turn_off: led_builtin
Conclusion : nous voilà sur une version exploitable et stable après plusieurs jours.
Troisième version
Un truc me chaffouine avec la version 2. On peut allumer les leds du flotteur, mais la batterie meurt en 2H. Et surtout, la lumière s’allume automatiquement la nuit s’il est actif.
De plus, j’aimerais ne pas griller l’esp avec les tensions variables de la batterie. L’idée est donc de virer tout le circuit, et d’utiliser autre chose.
Je commande donc :
- un TP4056 : il permet la charge d’une batterie lithium avec un panneau solaire, et fourni une sortie pour un équipement
- un régulateur 3.3V MCP1700-3302E/TO-92 : pour fournir une sortie 3.3V à l’esp stable
- un condensateur céramique 1uF : pour stabiliser le régulateur
On ouvre donc la boite, et je vire tout, ne gardant que le panneau et sa batterie.
On soude sur le TP4056, les sorties pour la batterie et pour l’esp. En entrée on y mets le panneau solaire.
On sort le petit régulateur. Attention dans ce modèle, avec les écritures visibles, les pins en bas :
- Gauche : GND
- Centre : VIN (entrée)
- Droite : VOUT (sortie 3.3v)
Selon les specs, il faut le stabiliser avec un condensateur 1uF entre GND et VOUT.
On soude le tout, totalement à l’arrache (ouais c’est une V3, c’est pas la finale) et on obtient un plat de spaghetti :
J’en ai profité pour reprendre le bouton sur le boitier, qui me permet d’éteindre ou allumer l’esp. Pratique surtout quand je vais vouloir le mettre à jour, il faut que je coupe son alimentation de la batterie quand je le branche en USB.
Le plat de spaghetti fourni un 3,25V qui semble stable à l’ESP, que je place le système au soleil ou à l’ombre. Le TP4056 s’allume en rouge pendant la charge, et un voyant bleu s’affiche quand la batterie est chargée.
Conclusion :
- ça fonctionne :D
- l’esp semble moins stable, il redémarre plus fréquemment. Je ne sais pas si c’est lié au wifi qui le fait reboot, ou un autre souci
Le signal wifi parait chelou mais en fait c’est normal : la pompe de la piscine fait du courant et le flotteur se balade :D
Quatrième version
Poppoppop… déjà 3 versions c’est pas mal. L’idée néanmoins pour cette future version :
- diagnostiquer la cause des reboot
- proprifier le câblage (pour que la police de l’internet puisse dormir)
Le tout dans un prochain article ;)