Une station météo DIY : Raspberry Pi, ZigBee et Home Assistant

Dans cet article, je raconte com­ment se fabri­quer une sta­tion météo autour d’un Rasp­ber­ry pi équi­pé du logi­ciel Home Assis­tant et de cap­teurs com­mu­ni­cants grâce au pro­to­cole ZigBee.

Motivation initiale

En cet été 2026, alors que nous enchaî­nions une série de cani­cules pas à piquer des han­ne­tons, j’ai pro­fi­té de mon exper­tise crois­sante en ther­mique du bâti­ment pour gérer au mieux la tem­pé­ra­ture dans mon logement : 

  • pas de soleil qui rentre direc­te­ment, on ferme les volets quand c’est nécessaire
  • on n’ouvre jamais les fenêtres s’il fait plus chaude dehors que dedans
  • on aère quand la tem­pé­ra­ture le per­met, en uti­li­sant un ven­ti­la­teur si nécessaire
  • on n’u­ti­lise pas d’ap­pa­reils qui pro­duisent de la cha­leur sauf si c’est nécessaire

Avec les incen­dies est arri­vée une nou­velle contrainte : consi­dé­rer la qua­li­té de l’air pour évi­ter de faire ren­trer de l’air pol­lué aux micro-particules.

En plus des ther­mo­mètres ins­tal­lés à l’in­té­rieur et à l’ex­té­rieur, j’a­vais donc ras­sem­blé un cer­tain nombre de ressources :

  • la carte wea­ther­map des cap­teurs de tem­pé­ra­ture (il y en a for­cé­ment près de chez vous), qui en ville per­met d’a­voir la vraie tem­pé­ra­ture la nuit, car les mesures four­nies par Météo France et les sites offi­ciels sont issues de cap­teurs pla­cés à l’ex­té­rieur des villes, et l’i­ner­tie ther­mique urbaine n’est donc pas prise en compte,
  • les pré­vi­sions météo des heures à venir sur Meteociel
  • les rele­vés horaires d’un cap­teur de qua­li­té de l’air de proxi­mi­té, avec les don­nées des par­ti­cules PM2.5 et PM10,
  • le site feux­gi­ronde pour avoir une idée de l’in­ten­si­té des incen­die en Gironde, et du panache de fumée qui tra­ver­sait la France, secon­dé par fla­map,
  • une ima­ge­rie radar des nuages, pour suivre pré­ci­sé­ment le panache de fumées 

Quand la cha­leur était impor­tante, et qu’il ne res­tait que très peu d’heures dans la nuit où on pou­vait ouvrir les fenêtres, je croi­sais toutes ces infos, et je met­tais un réveil pour ouvrir les fenêtres, en esti­mant l’heure où les tem­pé­ra­tures inté­rieures et exté­rieures allaient s’in­ver­ser chez moi.

Mais je me suis très vite dit qu’a­vec une cen­trale météo, on aurait pu pilo­ter tout ça pour avoir un réveil automatisé.

Installation matérielle

On peut ache­ter des cen­trales météo exis­tantes, mais elles sont peu confi­gu­rables, et sou­vent le logi­ciel pro­prié­taire est assez ver­rouillé. On peut aus­si fabri­quer une solu­tion mai­son, soit à par­tir d’un Ardui­no et de quelques cap­teurs, soit à base d’un Rasp­ber­ry Pi.

Pour aller vers une solu­tion plu­tôt exten­sible, j’ai donc choi­si une solu­tion basée sur un Rasp­ber­ry Pi, cou­plé à quelques cap­teurs de tem­pé­ra­ture connectés.

Les cap­teurs connec­tés s’ap­puient en géné­ral sur un pro­to­cole ouvert de com­mu­ni­ca­tion : rare­ment le Blue­tooth, sou­vent le WiFi, par­fois le Zig­Bee. L’in­té­rêt de ce der­nier pro­to­cole est qu’il consomme très peu d’éner­gie, ce qui est par­fait pour une ins­tal­la­tion durable, sans avoir besoin d’a­me­ner le 220V aux cap­teurs. Cepen­dant, comme le Zig­Bee n’est pas un pro­to­cole uti­li­sé sur les ordi­na­teurs en géné­ral, il faut ajou­ter à la confi­gu­ra­tion une antenne Zig­Bee pour le Rasp­ber­ry Pi, connec­tée sur port USB.

Je me suis donc équi­pé d’un Rasp­ber­ry Pi 8 de seconde main (envi­ron 100 euros pour 8Go de RAM, mais on aurait pu choi­sir moins, voir plus bas), d’une antenne Zig­Bee (16 euros), d’un thermomètre/hygromètre d’in­té­rieur avec écran (16 euros), et d’un thermomètre/hygromètre d’ex­té­rieur sans écran et qui sup­porte la pluie (23 euros) :

Configuration logicielle

J’ai ins­tal­lé sur la carte mémoire du Rasp­ber­ry Pi un Linux dédié en uti­li­sant Rasp­ber­ry Pi Ima­ger, puis j’ai sui­vi ce tuto­riel pour ins­tal­ler plu­sieurs logi­ciels dans des docker : Zigbee2MQTT et Home Assis­tant, ain­si que Mos­quit­to pour la com­mu­ni­ca­tion. C’est peut-être la par­tie la plus tech­nique de l’ins­tal­la­tion, mais tout me semble bien docu­men­té, excep­té qu’il manque une ligne restart: always pour mos­quit­to (sinon ce der­nier ne redé­marre pas quand le Rasp­ber­ry Pi redémarre).

En résu­mé, chaque logi­ciel joue son rôle : Zigbee2MQTT s’oc­cupe de col­lec­ter à inter­valle régu­lier les infor­ma­tions des cap­teurs, qu’il trans­forme en flux MQTT exploi­table par Home Assis­tant, le logi­ciel libre phare de la domo­tique. Grâce à ça, et comme on le ver­ra plus bas, on peut confi­gu­rer sim­ple­ment des tableaux de bord, noti­fi­ca­tion ou alarmes à par­tir des infor­ma­tions collectées.

Une fois tout ins­tal­lé, l’in­ter­face web de Zigbee2MQTT per­met d’as­so­cier les cap­teurs très faci­le­ment, ils sont d’ailleurs direc­te­ment recon­nus grâce à une base de don­nées très com­plète (et au fait que j’ai choi­si des cap­teurs de marques très répandues) :

interface Zigbee2MQTT

Une fois réa­li­sé ces asso­cia­tions, on n’au­ra plus besoin de reve­nir à cette inter­face. Je n’ai donc rien fait pour la rendre acces­sible depuis l’extérieur.

L’in­té­rêt d’a­voir sui­vi le tuto­riel, c’est que ces deux cap­teurs seront direc­te­ment dis­po­nibles dans l’in­ter­face web de Home Assis­tant, au moment d’a­jou­ter de nou­velles sources :

les sources MQTT dans Home Assistant

Chaque cap­teur phy­sique four­ni grâce au MQTT un flux de don­nées conte­nant dif­fé­rentes valeurs nom­mées et aug­men­tées de méta-don­nées, comme l’u­ni­té par exemple. Le cap­teur exté­rieur four­ni ain­si la tem­pé­ra­ture, l’hu­mi­di­té, et l’é­tat de sa bat­te­rie, et c’est Home Assis­tant qui s’oc­cupe d’en gar­der un his­to­rique, pour pou­voir notam­ment tra­cer des courbes de suivi.

J’ai éga­le­ment pris soin de confi­gu­rer ma box fibre pour que les connexions depuis l’ex­té­rieur soient redi­ri­gées vers l’in­ter­face de Home Assis­tant, ce qui me per­met d’y accé­der depuis n’im­porte où, soit par l’in­ter­face web, soit par l’ap­pli­ca­tion smart­phone. Bien sûr, ça n’est pas du tout obligatoire.

Home Assis­tant a été conçu dans l’i­dée de la mai­son connec­tée. On peut faire plein de choses avec ça, comme pilo­ter son chauf­fage ou son éclai­rage auto­ma­ti­que­ment, il est donc pour­vu d’un grand nombre de faci­li­tés d’au­to­ma­ti­sa­tion, comme nous le ver­rons plus bas. Il est par exemple pos­sible de suivre son smart­phone pour iden­ti­fier si on est à la mai­son ou pas1, et ain­si chan­ger le com­por­te­ment du dis­po­si­tif sui­vant la situation.

Au final, l’ins­tal­la­tion consomme moins de 1Go sur le Rasp­ber­ry Pi car j’ai assez peu de sources inté­grées et le CPU est très peu sol­li­ci­té. La machine est un peu sur-dimen­sion­née, mais ça me per­met de voir venir et de faire évo­luer l’ins­tal­la­tion sui­vant les besoins.

Intégrer d’autres sources

Afin de com­plé­ter mon dis­po­si­tif, et dans l’i­dée d’a­voir une infor­ma­tion aus­si com­plète que ce que je fai­sais à la main, j’ai donc regar­dé com­ment inté­grer d’autres infor­ma­tions. Il existe un nombre très impres­sion­nant de sources pos­sibles d’in­té­gra­tions déjà mises en place par la com­mu­nau­té, pour en quelques clics ajou­ter des res­sources très diverses à Home Assistant.

Voi­ci ci-des­sous deux exemples de mise en pratique.

Agréger une information externe

courbes PM2.5 et PM10

Je n’ai pas de cap­teur PM2.5 ou PM10 à domi­cile, mais la don­née que pro­duit Atmo AuRA est mise à jour une fois par heure, et pas très loin de chez moi. Ça suf­fit donc ample­ment. Il n’y a pas à pro­pre­ment par­lé de flux en Open­Da­ta, juste une inter­face de visua­li­sa­tion pro­po­sées aux internautes.

En regar­dant les connexions que fait le site, j’ai remar­qué que des fichiers au for­mat json étaient récu­pé­rés, qui cor­res­pon­daient exac­te­ment aux don­nées pré­sen­tées dans le graphe. Or, il existe dans Home Assis­tant un outil d’in­té­gra­tion dédié au trai­te­ment de ce type de sources : RES­T­ful.

Mal­heu­reu­se­ment, sur le site d’At­mo, l’a­dresse à consul­ter change chaque jour (il faut mettre la date du jour dans l’url), et le fichier contient toutes les infor­ma­tions de la journée. 

J’ai donc implé­men­té un petit ser­vice léger en python, qui tourne dans une image docker, et qui lorsque RES­T­ful l’in­ter­roge récu­père les don­nées depuis le site d’At­mo, la refor­mate, et la ren­voie pour inté­gra­tion. Je peux four­nir sur demande ce code source, mais il n’y a rien de révo­lu­tion­naire dedans.

On a donc main­te­nant en temps réel et mis à jour une fois par heure (comme sur le site d’At­mo) le taux de par­ti­cules PM2.5 et PM10 dis­po­nible dans Home Assistant.

Monitorer la santé de l’infrastructure

J’hé­berge chez moi plu­sieurs ser­vices infor­ma­tiques, dont l’a­gen­da cultu­rel par­ti­ci­pa­tif pommesdelune.fr. J’aime bien suivre l’é­tat de san­té du ser­veur et du rou­teur. J’ai donc trou­vé une solu­tion très légère : ins­tal­ler glances sur ces machines, puis uti­li­ser le sup­port de Glances dans Home Assis­tant pour ajou­ter autant de ser­vices que de machines :

ajouter un service Glances dans Home Assistant

Les infor­ma­tions ain­si col­lec­tées contiennent le taux d’u­sage de la RAM, du CPU, du disque, ou encore la tem­pé­ra­ture des capteurs.

Tableau de bord

Le tableau de bord de Home Assis­tant est com­plè­te­ment confi­gu­rable, et on peut ajou­ter de nom­breuses vues com­plé­men­taires de manière très modu­lable, à la fois sur le fil­trage des don­nées et sur le type de repré­sen­ta­tion choi­sie. Il existe même un store de la com­mu­nau­té, que l’on peut ins­tal­ler à ses risques et périls, pour aug­men­ter les pos­si­bi­li­tés de l’outil.

Voi­ci donc quelques vues que j’ai confi­gu­rées, ici consul­tées depuis l’ap­pli­ca­tion Android, mais dont la mise en page s’a­dapte très bien sur l’é­cran d’un ordinateur.

Il existe même sur Android des wid­gets qui per­mettent d’af­fi­cher la valeur d’un cap­teur sans avoir à ouvrir l’application.

Notification et alarmes

Création d’une notification

Les noti­fi­ca­tions sont com­plè­te­ment auto­ma­ti­sables depuis l’in­ter­face de Home Assis­tant, en créant des règles par une série de choix, avec trois grandes étapes : l’élé­ment déclen­cheur (quand), les condi­tions sup­plé­men­taires (et si), puis la ou les actions (faire). On peut aus­si écrire tout ou par­tie dans un lan­gage décrit en yaml, et un LLM type Chat GPT sau­ra très bien vous épau­ler au besoin.

Ci-des­sous, on envoie une alerte sur le smart­phone si le taux de PM2.5 est plus éle­vé qu’un seuil choi­si, et le yaml correspondant : 

alterte PM2.5
alias: Seuil pollution PM2.5 (25)
description: ""
triggers:
  - trigger: air_quality.pm25_crossed_threshold
    target:
      entity_id: sensor.atmo_pm2_5
    options:
      behavior: each
      for:
        hours: 0
        minutes: 0
        seconds: 0
      threshold:
        type: above
        value:
          active_choice: number
          number: 25
conditions: []
actions:
  - action: notify.mobile_app_galaxy_s23
    metadata: {}
    data:
      title: ℹ️ Alerte Pollution
      message: "Alerte pollution : les particules PM2.5 ont dépassé 25µg/m3"
      data:
        importance: low
        channel: silent_channel
mode: single

Configuration des notifications

Ce qui est inté­res­sant, c’est qu’on peut défi­nir autant de canaux de com­mu­ni­ca­tion que l’on veut. Côté smart­phone, on peut alors ajus­ter le type d’a­lerte pour chaque canal : type de son­ne­rie, noti­fi­ca­tion simple ou alarme, etc. 

Illustration

J’ai ain­si pu écrire des règles plus éla­bo­rées, du type : si la tem­pé­ra­ture exté­rieure dépasse la tem­pé­ra­ture inté­rieure, qu’il fait plus de 23 degrés à l’in­té­rieur, que je suis à la mai­son, et que l’air n’est pas trop pol­lué, alors envoyer une alerte pour sug­gé­rer de fer­mer les fenêtres. On reçoit donc une noti­fi­ca­tion sur le smart­phone, que j’ai réglée pour faire vibrer le smart­phone, lan­cer une petite son­ne­rie, et affi­cher une notification :

Et après ?

L’in­té­rêt du sys­tème, c’est qu’il est très faci­le­ment exten­sible : on peut ajou­ter de nou­veaux cap­teurs s’ils sup­portent le pro­to­cole Zig­Bee, mais aus­si inté­grer d’autres sources exté­rieures pour com­plé­ter et aug­men­ter les infor­ma­tions col­lec­tées et traitées. 

Par exemple, je m’é­tais équi­pé il y a quelques temps d’un cap­teur de C02 qui uti­lise un pro­to­cole pro­prié­taire pour com­mu­ni­quer avec une appli­ca­tion spé­ci­fique. Et bien un tra­vail d’in­gé­nie­rie inverse a été réa­li­sée par une per­sonne de la com­mu­nau­té Home Assis­tant sur un appa­reil de la même marque, qui me per­met­tra peut-être d’in­té­grer les mesures de ce cap­teur à mon interface.

  1. à noter que cette fonc­tion­na­li­té de géo­lo­ca­li­sa­tion n’existe pas dans la ver­sion mini­male de l’ap­pli­ca­tion dis­po­nible sur F‑Droid, il fau­dra alors pri­vi­lé­gier la ver­sion dis­po­nible sur le Store de Google. ↩︎