Domotique : Réseau de thermomètres et graphes de température

Les capteurs de température à installer chez soi en domotique sont pratiques mais les solutions commerciales sont chères. J’ai décidé de concevoir mon propre système qui a les avantages d’être peu cher tout en stockant les données récoltées chez moi et non sur le cloud d’une société privée. Le budget final est de moins de 6 francs par sonde de température WiFi.

Capteurs numériques

Je me sers de capteurs ds18b20 de Maxim qui sont intégrés dans un boîtier TO220 à 3 pattes : Alim, Ground et Data. Ces capteurs ont une résolution de ± 0.5°C entre -10°C et +85°C. Il suffit de lire la température depuis un microcontrôleur via le protocole 1-Wire. Chaque thermomètre possède un numéro de série ce qui fait qu’on peut en mettre plusieurs le long d’un bus 1-Wire et accéder à chaque température. Un exemple concret de lecture depuis un microcontrôleur suit. Un ds18b20 coûte environ 1$ chez des fournisseurs asiatiques.

Microcontrôleur

Je compte utiliser des ESP8266 pour fabriquer des modules thermomètres qui envoient leurs données à une base de données sur le WiFi. Les modules les plus petits, les ESP-01 coûtent environ 3$, je me procure aussi des adaptateurs à 2$ pour facilement brancher et alimenter mes ESP-01.
J’ai branché le ds18b20 sur GPIO0 avec un pullup de 3.3k.

ESP-01 avec thermomètre ds18b20 et pull-up

Adaptateur pour la programmation : j’ai rajouté sur cet adaptateur les boutons Reset et Program qui permettent de démarrer l’ESP8266 en mode programmation.

A l’aide de la librairie DallasTemperature j’accède facilement au thermomètre depuis le microcontrôleur.

#include "OneWire.h"
#include "DallasTemperature.h"
[...]
// Data wire is plugged into port GPIO0
#define ONE_WIRE_BUS 0
// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);
// Pass our oneWire reference to Dallas Temperature. 
DallasTemperature sensors(&oneWire);
[...]
void setup(){
  // Start up the library
  sensors.begin();
}
[...]
float getTemp(){
  // Send the command to get temperatures
  sensors.requestTemperatures(); 
  //we have only one ds18b20, index 0
  float temp = sensors.getTempCByIndex(0);
  return temp;  
}

Les esp8266 ont une fonctionnalité intéressante : le deep sleep. Cela permet d’endormir le microcontrôleur pendant un certain temps puis de le réveiller lorsqu’on en a besoin. Lors du deep sleep, le microcontrôleur ne consomme plus que 78 micro ampères ! Le comportement que je désire est le suivant : démarrer, lire la température, l’envoyer sur le WiFi à une base de données et se mettre en deep sleep pour les prochaines 15 minutes. Cela me donnera 1 point tous les 15 minutes, c’est ce que j’ai choisi arbitrairement. Pour réveiller le microcontrôleur après le deep sleep, j’ai dû connecer le pin XPD_DCDC (8) sur reset, en allant souder un fil entre une patte du boîtier et le pin reset de l’ESP-01 comme suggéré ici. J’ai déssoudé la led rouge d’indication de fonctionnement qui elle consomme plus que le microcontrôleur lors du deep sleep ! Je peux ensuite endormir le microcontrôleur comme suit :

  // Deep Sleep de 15 minutes
  ESP.deepSleep(15*60*1000000, WAKE_RF_DEFAULT);

Base de données InfluxDB

Mes thermomètres envoient mes données sur le réseau local sur mon NAS où j’ai installé la base de données InfluxDB, une base de données temporelle. Chaque donnée est un chiffre accompagné d’un timestamp. Le moyen le plus simple de nourrir la base de données est d’envoyer un paquet UDP depuis le microcontrôleur, c’est une requête facile à programmer mais sans authentification. Sur le microcontrôleur, ça ressemble à ceci avec une requête de la forme temp_module value=26.34 (temp_module est le nom d’une série de données sur le serveur InfluxDB.

  String line = "temp_module value="+String(getTemp());
  // send the packet
  udp.beginPacket(host, port);
  udp.print(line);
  udp.endPacket();

Graphiques avec Graphana

J’ai installé ensuite sur mon NAS un serveur Web avec l’outil Graphana qui va chercher les données dans InfluxDB pour les afficher sous forme de graphiques, indicateurs. On paramètre des requêtes de style MySQL pour extraire des séries de données, dans une belle interface graphique moderne. Depuis l’interface graphique, on peut créer ses indicateurs et modifier les plages des graphiques par périodes (12h, 24h, 7 jours, 1 mois, etc…).

Température de 3 sondes sur 7 jours

Température de 3 sondes sur 6 mois