La station météo parfaite

  1. Construction
  2. Stockage des données

Construction

Probablement la partie qui me torture le plus : comment construire ma station en fonction de mes contraintes environnementales (je n'ai pas le terrain qui permettrait de prétendre disposer d'une station météo professionnelle) et des risques que je suis prêt à prendre (sachant que monter sur le toit n'en fait pas partie) ?

Actuellement, ma station est composée de deux boîtiers :

  • le premier contient toute l'électronique dont le micro-contrôleur, et est situé sous le toit de la véranda
  • le second est une construction faite de tubes PVC située à l'extérieur de la véranda et contient un BME280

Le second boîtier est distant du premier d'environ 2 mètres. Ils sont reliés par un câble RJ45 Cat.6 qui fait transiter le signal I2C et l'alimentation pour le BME280.

Normalement, I2C n'est pas prévu pour fonctionner avec un câble aussi long à cause de sa capacitance. Mais en pratique, je n'ai rencontré - presque - aucune difficulté en cinq ans d'exploitation, probablement parce que j'ai équipé ma station de résistances pull-up sur le bus I2C et parce que j'ai employé un câble de très bonne qualité (blindé). En tout cas, ça, c'est ce que j'ai appris récemment.

Je n'ai jamais pu faire fonctionner correctement l'AS3935 (le capteur d'orage) avec cette configuration. J'ai mis ça sur le compte de l'impossibilité de le calibrer manuellement via ESPHome. Rétrospectivement, et grâce à mes nouvelles connaissances sur le sujet, je pense que c'est précisément dû à la capacitance de mon câble.

En outre, l'ESP8266 à l'intérieur du boîtier principal, pourtant le plus proche de la maison, a occasionnellement quelques difficultés à accrocher le Wifi (on parle d'une ou deux fois par semaine).

Du coup, je réfléchi à trois options :

  1. Reprendre la même infrastructure, en espérant que le problème de l'AS3935 ne soit pas lié à la capacitance du câble

Avantages :

  • Moins de prise de tête, tout est déjà en place, je n'ai qu'à enlever l'ancienne électronique et mettre la nouvelle à la place

Inconvénients :

  • Si la capacitance de mon câble est réellement un problème, je ne le constaterai qu'une fois que tout sera en place, et je devrai tout réfléchir à nouveau
  • Ça ne résoud pas les quelques coupures de réseau
  • J'ai besoin d'un troisième boîtier pour les capteurs de lumière, donc je devrai tirer un second câble

En passant par cette solution, je n'élimine aucun de mes problèmes actuels (température du boîtier principal élevée en été, humidité relative bloquée à 100% toute l'année sur le BM280 sauf par temps très sec avec du vent, etc.)

De plus, si j'ai l'intention d'utiliser un panneau solaire ou une éolienne pour alimenter le projet, je risque d'avoir quelques problèmes en terme d'installation, et ensuite de stockage des accus car le boîtier sera trop petit pour gérer tout ça.

  1. Mettre tous les capteurs dans la même "boîte" à l'extérieur de la véranda

Avantages :

  • Ça résoud le problème de capacitance du câble qui fait transiter l'I2C
  • Un seul boîtier où tout est centralisé, maintenance facilitée
  • Optimisation de la précision des capteurs de lumière

Inconvénients :

  • Ça aggraverait le problème de connexion au Wifi (mais du coup j'aurais une bonne raison d'explorer d'autres solutions comme la transmission par RF)
  • L'alimentation posera problème (en l'absence de prise électrique, j'amène du 230V ou du 5V au boîtier ?)
  • Je devrai réfléchir à une construction intelligente pour l'intégration des capteurs

C'est la solution que j'étudie actuellement. Elle consisterait en l'achat d'un panneau électrique étanche de bonnes dimensions, dotés d'un disjoncteur différentiel et de deux blocs d'alimentation sur rail DIN (un qui délivre du 5V au micro-contrôleur et éventuellement un second qui fournit du 12V pour des périphériques tiers comme les ventilateurs).

Je peux tirer un câble de 230V jusqu'à l'emplacement du boîtier de façon sécurisée avec une bonne gaine et en passant sous le toit de la véranda. Je pourrais monter ce boîtier sur un support d'antenne satellite à 90° positionné sur le côté de la véranda afin de limiter l'inertie thermique.

Sur le dessus de ce boîtier prendrait place un boîtier à couvercle transparent, toujours étanche, dans lequel seraient placés les trois capteurs de luminance + UV + couleur. J'y mettrais sans doute un petit ventilateur et un capteur de température pour m'assurer que, même en pleine canicule, la température du boîtier reste dans des seuils acceptables.

En bas du panneau électrique se trouverait un nouveau boîtier construit avec des tuyaux en PVC, comme à l'heure actuelle, mais de dimensions réduites. Un ventilateur y prendrait place, avec le BME280 pas loin, et fonctionnerait au plus bas régime possible. Trop rapide, il fausserait la lecture de la température. Trop lent, il ne corrigerait pas le problème de lecture de l'humidité relative bloquée à 100%.

Même si j'arrive à faire tout ça, il faudra résoudre la question du Wifi. Mettre un point d'accès sous la véranda a déjà été tenté, mais n'est pas pratique. Il reste exposé à des températures très basses l'hiver et très élevées l'été.

Je pense que je vais devoir passer par un émetteur RF, ce qui implique de disposer d'un récepteur à l'intérieur de la maison, qui va transmettre les données à mon serveur principal (ou d'utiliser directement un récepteur USB, par exemple). Ce sont des choses que je n'ai encore jamais fait donc il me faudra un peu d'expérimentations.

Je pourrais aussi passer par LoRa, mais le ticket d'entrée est assez cher (compter une trentaine d'euros pour une paire de modules, et il faut une passerelle - comme un point d'accès sans-fil Wifi - qui n'est pas donnée).

Autre problème : peut-être que le positionnement de la station ne sera pas convenable. Le boîtier serait situé entre la véranda et une immense haie de laurier, un espace de moins de deux mètres les séparant. L'utilisation d'un bras pour antenne satellite permettrait de minimiser quelque peu ce problème, mais un autre surviendra : celui de la fixation du boîtier au bras, et sa stabilité en cas de coups de vents. Néanmoins, ce bras me permettra d'installer l'anémomètre, la girouette et autres capteurs du même genre assez facilement et sans devoir tirer des kilomètres de câbles.

  1. Séparer la station

Je garderai les deux boîtiers actuels, en remplaçant simplement les connecteurs du câble pour le rendre compatible avec STEMMA QT (en gros, passer à des JST-SH). La station extérieure ne comprendrait qu'un ESP8266 et le BME280 (et ultérieurement, les autres capteurs exclusivement extérieurs comme l'anémomètre, la girouette, etc.).

Une deuxième station, placée à l'intérieur de la maison, serait équipée de l'ESP32 et de tous les autres capteurs pouvant fonctionner en intérieur (les trois capteurs de lumières, le GPS, etc.)

Avantages :

  • Pas de prise de tête, notamment pour l'alimentation, ou la fabrication ou l'achat d'un nouveau boîtier

Inconvénients :

  • Maintenance logicielle accrue (deux micro-contrôleurs à programmer au lieu d'un seul)
  • Réduction mécanique de la précision des capteurs de lumière puisqu'ils seront positionnés à une fenêtre, derrière une vitre
  • Pas vraiment possible d'avoir un ensemble à 100% indépendant du réseau électrique (à terme) sans multiplier par deux le matériel nécessaire, pas forcément abordable de base

Je partais sur un boîtier de type "pupitre" à placer devant une fenêtre, avec un panneau transparent. Ainsi, les capteurs de luminance + UV + couleur pourraient faire leur travail. Mais la présence d'une fenêtre, l'angle du pupitre et l'orientation des capteurs vont indubitablement altérer de façon importante la précision et l'utilité des données récoltées. Typiquement, il suffit que mon épouse allume la lumière dans le bureau (là où le boîtier serait placé) pour que mes mesures n'aient plus aucun intérêt (et que ça coupe les lumières partout ailleurs dans la maison...).

Placer ce boîtier à l'extérieur n'est pas envisageable, n'étant pas étanche. Cela reviendrait à partir sur l'option #2 ci-dessus.

Stockage des données

Je réfléchi à deux possibilités évidentes :

  • une base de données time-series du genre InfluxDB
  • une base de données "traditionnelle" du genre PostgreSQL

À l'heure actuelle, les données sont périodiquement récupérées par un serveur Prometheus. Ce système présente quelques défauts, selon moi et pour stocker des données météo :

  • pas de temps réel : le serveur fait la demande (selon ma configuration, une fois par minute) des données à la station météo ; c'est un problème pour les capteurs "nécessitant" une lecture "immédiate" (typiquement, le capteur d'orage : je peux savoir combien de décharges ont eu lieu dans les dernières 60 secondes, mais pas d'avertissement en temps réel dès qu'une décharge est détectée)
  • pas prévu pour le stockage à long terme : dans la théorie, une time-series database supprime les anciennes données ("anciennes" étant une valeur paramétrable), alors qu'une base de données traditionnelle stocke ses données "éternellement"

Je me fais aussi quelques réflexions sur la question des transferts réseau. À l'heure actuelle, à chaque changement de valeur d'un capteur, un message est émis sur MQTT, auquel il faut ajouter les accès du serveur Prometheus (chaque minute, donc). Je trouve que ça fait beaucoup pour de l'électronique embarquée.

A priori, les stations professionnelles ont "résolu" le problème en envoyant les données des capteurs via un réseau RF à une console de logging, qui, elle, permet d'accéder aux données. J'ignore toutefois comment ces données y sont stockées.

J'utilise MQTT pour son immédiateté et Prometheus parce que son intégration avec Grafana est facile : je peux générer des graphiques facilement et naviguer temporellement dans ces graphiques. Cela implique de faire tourner un serveur web sur la station météo (l'endpoint pour Prometheus), ce qui a un coût en terme d'énergie (et dans une moindre mesure pour un ESP32, en terme d'utilisation CPU).

À partir du moment où j'émets la valeur des capteurs en temps réel sur MQTT, je n'ai pas fondamentalement besoin d'un endpoint pour Prometheus sur la station météo : il suffit que, sur une autre machine (typiquement, mon serveur principal), je dispose d'une application qui se connecte à MQTT et enregistre chaque changement de valeur des capteurs, et éventuellement, effectue une action (par exemple, envoyer une alerte lorsqu'un impact de foudre est détecté). Cette application serait donc responsable de la collecte et du stockage des données, ainsi que de l'exécution de séquences de code pré-définies. Rien ne l'empêche d'exporter ces données vers Prometheus, ceci-dit.

Il y a évidemment un point que j'ignore volontairement, c'est la périodicité d'interrogation des capteurs. J'ai fait le choix conscient de laisser une période d'interrogation de 60s (définie par défaut par ESPHome), mais en pratique cette période change en fonction des recommandations que l'on choisit de suivre (celles de Météo-France ou de la WMO) et de la donnée mesurée. Cela dépend aussi de la précision que l'on cherche à atteindre.

En ce qui me concerne, je ne cherche pas une précision de laboratoire (sinon je n'utiliserai probablement pas des capteurs aussi abordables). Par conséquent, je pourrais réduire cette périodicité afin d'économiser de l'espace de stockage et de la consommation électrique. Et même, définir des plages horaires où des mesures plus régulières sont intéressantes : en journée, je n'ai que peu d'intérêt pour la luminance par exemple, à partir du moment où elle dépasse un certain seuil. C'est lorsque la luminance approche de ce seuil que la précision des mesures devient intéressante (dans mon cas d'usage).

Mais je pense que là, ça serait faire de l'overengineering 😁 Néanmoins, je trouve ces réflexions intéressantes.

Pour en revenir au coeur du sujet, la stack évidente c'est Telegraf qui se place entre MQTT et InfluxDB. Je n'aime pas cette solution pour différentes raisons :

  • j'aimerais simplifier l'infrastructure en limitant les applications intermédiaires
  • il est possible de se passer de Telegraf si je payais une plus-value, ce qui ne m'intéresse pas (je rappelle que je fais ça en tant que hobby)

Mais quoiqu'il arrive, j'ai de toute façon besoin d'un pont entre MQTT et une time-series database...