Schémasfonctionnels

Chaque composant de la chaîne Ruche Sentinelle, vu comme une boîte : ce qui y entre, ce qu'il en fait, ce qui en sort. On part de la vue d'ensemble, puis on suit une mesure du capteur jusqu'à l'écran.

composant du serveur cœur de la fonction matériel ou élément hors dépôt flux de données refus, erreur
Infographie : 1 capteur micro:bit rouge qui mesure la lumière toutes les 3 s, 2 radio LoRa 868 MHz avec une trame de 13 octets, 3 passerelle micro:bit bleue reliée au PC par USB, 4 pont Python sur le PC qui joue le rôle de la WisGate et publie en MQTT, 5 serveur Docker avec Mosquitto, Node-RED, InfluxDB et Grafana, puis tableau de bord consulté par des élèves.
En images : le banc de test micro:bit du FabLab, de la carte capteur jusqu'au tableau de bord. Les schémas qui suivent détaillent chaque maillon. Cliquez sur l'image pour l'agrandir.
00

Vue d'ensemble

Synoptique

Six maillons en série. Les deux premiers sont du matériel installé au collège ; les quatre suivants sont des conteneurs Docker sur le serveur. Caddy n'existe que sur le serveur public (VPS).

Chaîne complète : capteur, WisGate, Mosquitto, Node-RED, InfluxDB, Grafana, avec le simulateur et Caddy Serveur · conteneurs Docker Capteur Dragino D22-LB WisGate passerelle Mosquitto courrier MQTT Node-RED décodage InfluxDB bucket ruches Grafana tableaux de bord radio MQTT MQTT écrit lit Simulateur ou pont micro:bit test influx-init crée les jetons d'écriture et de lecture Caddy HTTPS · profil vps Navigateur élèves

Entre

  • Trames radio des capteurs
  • Trames de test (simulateur, micro:bit)

Fonction

  • Recevoir, décoder, stocker, afficher
  • Chaque étape isolée dans un conteneur

Sort

  • Courbes de température par ruche
  • Historique interrogeable dans InfluxDB
01

Capteur Dragino D22-LB

Matériel · dans la ruche

Le capteur lit jusqu'à trois sondes de température et sa pile, range les valeurs dans une trame de 11 octets et l'émet par radio LoRaWAN.

Capteur : trois sondes et la pile entrent dans le microcontrôleur, qui produit une trame émise par la radio LoRaWAN Sonde blancheextérieur (hypothèse) Sonde rougecouvain (hypothèse) Sonde noire3ᵉ sonde, optionnelle Piletension en mV Microcontrôleur D22-LB 1 · mesure périodique 2 · Int16 en dixièmes de °C 3 · 0x7FFF si sonde absente 4 · trame 11 octets, FPort 2 5 · alarme sur 1 octet trame Radio LoRaWAN 868 MHz · chiffrée WisGate voir 02
0–1batteriemV
2–3temp_white°C × 10
4–5ignoré—
6alarme
7–8temp_red°C × 10
9–10temp_black°C × 10

Entre

  • 3 sondes de température
  • Tension de la pile

Fonction

  • Mesurer à intervalle régulier
  • Encoder en Int16 big-endian

Sort

  • Trame radio LoRaWAN de 11 octets (FPort 2)

Format de trame et rôle des sondes repris de l'ancienne documentation : à confirmer sur un capteur réel (constats N1 et N2 du dossier technique).

02

Passerelle WisGate

Matériel · au collège · hors dépôt

La passerelle reçoit la radio, joue le rôle de serveur réseau LoRaWAN (déchiffrement, identification du capteur) et dépose un message JSON dans Mosquitto avec le compte wisgate.

WisGate : concentrateur radio, serveur réseau intégré, client MQTT qui publie vers Mosquitto Capteurs trames radio WisGate Edge Lite 2 (RAK7268) Concentrateur réception radio 868 MHz, 8 canaux Serveur réseau intégré déchiffre la trame DevEUI, fCnt, RSSI Client MQTT compte wisgate trame en base64 publish Mosquitto port 1883
topic   application/<application>/device/<DevEUI>/rx
message { "data": "<trame base64>", "fPort": 2, "fCnt": 42,
          "rxInfo": [ { "rssi": -97, "loRaSNR": 7.5 } ] }

Entre

  • Trames radio LoRaWAN chiffrées

Fonction

  • Serveur réseau LoRaWAN intégré
  • Traduction radio → MQTT

Sort

  • Message JSON publié sur application/#

Fonctionne seulement si la WisGate est en mode « serveur réseau intégré ». En simple packet forwarder, il faudrait ajouter ChirpStack. Format du message non vérifié sur le matériel.

03

Mosquitto

Conteneur · eclipse-mosquitto 2.0.22

La boîte aux lettres. Chaque client s'identifie, l'ACL vérifie ce qu'il a le droit de publier ou de lire, puis le message est remis à ceux qui sont abonnés au sujet.

Mosquitto : authentification, ACL puis routage ; les clients inconnus et les publications interdites sont refusés wisgate · écritapplication/# simulateur · écritapplication/SIMULATEUR/# anonymeou mauvais mot de passe Mosquitto · port 1883 Authentification passwd (haché) ACL droits par compte Routage sujet → abonnés refusé hors droits : ignoré, sans erreur (R6) Node-RED lit application/#

Entre

  • Publications de wisgate et simulateur
  • mosquitto.conf, passwd, acl

Fonction

  • Refuser l'anonyme
  • Appliquer l'ACL
  • Distribuer par sujet

Sort

  • Messages remis à l'abonné nodered
  • Volume mosquitto_data, journaux sur stdout

Port 1883 sans chiffrement (constat R1) : identifiants et mesures circulent en clair.

04

Node-RED

Conteneur · ruche-nodered 5.0.9

Le traducteur. Il écoute tous les messages des capteurs, transforme les octets en températures, ajoute le nom de la ruche et écrit le résultat dans InfluxDB.

Flux Node-RED : nœud MQTT, décodeur D22-LB, sortie InfluxDB ; erreurs captées et journalisées Mosquitto compte nodered Node-RED · flux versionné dans Git Uplinks LoRaWAN nœud mqtt in application/+/device/+/rx Décodeur D22-LB base64 → octets → °C table RUCHES : DevEUI → nom InfluxDB nœud influxdb batch dragino_d22 InfluxDB jeton écriture exception Erreursnœud catch Journal des erreursnœud debug settings.js : identifiants ${MQTT_NODERED_PASSWORD} et ${INFLUXDB_TOKEN} jeton lu dans /secrets/nodered.token (volume influx_tokens)

Entre

  • Messages MQTT application/+/device/+/rx
  • Flux et réglages depuis Git

Fonction

  • Décoder la trame D22-LB
  • Nommer la ruche (table RUCHES)
  • Capter les erreurs

Sort

  • Points dragino_d22 écrits dans InfluxDB
  • Journal des erreurs
05

InfluxDB et influx-init

Conteneurs · influxdb 2.7.12

La mémoire. Chaque mesure y est rangée avec son heure. Au premier démarrage, influx-init fabrique deux jetons limités : Node-RED ne peut qu'écrire, Grafana ne peut que lire.

InfluxDB : Node-RED écrit dans le bucket ruches, Grafana lit ; influx-init dépose les deux jetons dans un volume partagé Node-RED écrit InfluxDB · bucket ruches measurement dragino_d22 tags device · ruche · application · model fields temp_white · temp_red · temp_black battery_mv · battery_v · battery_percent alarm · rssi · snr · fCnt time heure de réception Grafana lit (Flux) influx-init tâche ponctuelle · jeton admin crée les jetons volume influx_tokens nodered.token · grafana.token nodered.token : écriture seule grafana.token : lecture seule

Entre

  • Points écrits par Node-RED
  • Variables INFLUXDB_* du .env (1ᵉʳ démarrage)

Fonction

  • Stocker les séries temporelles
  • Séparer écriture et lecture par jetons

Sort

  • Résultats des requêtes Flux pour Grafana
  • Volumes influxdb_data, influx_tokens
06

Grafana

Conteneur · grafana 13.3.0

La vitrine. Grafana interroge InfluxDB et dessine le tableau de bord « Ruche – températures ». Source et dashboard sont fournis par des fichiers : rien à configurer à la main.

Grafana : source InfluxDB, variable ruche, six panneaux du tableau de bord, affichés dans le navigateur InfluxDB bucket ruches Grafana · provisionné Source InfluxDB Flux · grafana.token Variable ruche choix de la ruche Température couvain · 32–36 °C Température extérieure Batterie Dernière réception Tension RSSI / SNR (qualité radio) Navigateur élèves, enseignants

Entre

  • Données InfluxDB (lecture seule)
  • Fichiers de provisioning et ruche-temperatures.json

Fonction

  • Exécuter les requêtes Flux
  • Filtrer par ruche, colorer selon les seuils

Sort

  • Pages web : port 3000, ou grafana.{domaine} en VPS
07

Caddy

Conteneur · caddy 2.11.9 · profil vps

Le portier du serveur public. Seul point d'entrée web : il obtient les certificats HTTPS, aiguille chaque nom de domaine vers le bon service et protège l'éditeur Node-RED par mot de passe.

Caddy : redirige le port 80, termine TLS sur le port 443 et aiguille vers le site, Grafana et Node-RED Internet navigateurs Caddy Port 80 redirection HTTPS (308), défi ACME Port 443 · TLS certificats Let's Encrypt automatiques aiguillage selon le nom : {domaine} grafana.{domaine} nodered.{domaine} Site statiquesite/ → /srv/site Grafanagrafana:3000 Node-REDbasic_auth → nodered:1880 Hors Caddy Mosquitto 1883 publié sans TLS (R1) InfluxDB jamais exposé réseau interne

Entre

  • Requêtes HTTP / HTTPS (ports 80, 443)
  • Caddyfile, DOMAIN, ACME_EMAIL, NODERED_AUTH_*

Fonction

  • Obtenir et renouveler les certificats
  • Proxy inverse par nom de domaine
  • Mot de passe devant Node-RED

Sort

  • Pages chiffrées vers les navigateurs
  • Volumes caddy_data, caddy_config

En profils local et lan, Caddy n'est pas lancé : on accède directement aux ports 3000 (Grafana) et 1880 (Node-RED).

08

Banc de test sans capteur

micro:bit · scripts

Deux façons de faire vivre la chaîne sans matériel LoRaWAN : deux cartes micro:bit qui imitent capteur et passerelle, ou un script qui fabrique des trames. Dans les deux cas, les messages entrent dans Mosquitto avec le compte simulateur.

Banc de test : carte rouge, LoRa point à point, carte bleue, liaison USB, pont Python, Mosquitto ; le script simulateur publie aussi dans Mosquitto Carte rouge micro:bit V2 + LoRa-E5 capteur de lumière trame 13 octets toutes les 3 s LoRa P2P Carte bleue écoute 868,1 MHz SF7 renvoie sur l'USB : RX|rssi|snr|hex USB pont_passerelle.py lancé par pont-wisgate.bat scanne les micro:bit (USB) hex → base64 → JSON au format WisGate pub Mosquitto compte simulateur application/SIMULATEUR/ device/<DevEUI>/rx simulate-d22.sh simulateur.bat · 20 trames trames D22-LB simulées

Entre

  • Lumière ambiante (carte rouge)
  • Valeurs générées (script)

Fonction

  • Imiter capteur et passerelle
  • Publier via docker compose exec mosquitto mosquitto_pub

Sort

  • Messages au format WisGate, ruche simulateur

La lumière est placée dans les octets 4–5, que le décodeur D22-LB ignore. Les octets 11–12 portent un compteur, repris comme fCnt.

09

Démarrage et environnements

Docker Compose

Les conteneurs démarrent dans un ordre imposé : la base doit être prête et les jetons créés avant que Node-RED et Grafana ne s'y connectent. Le même socle sert aux trois environnements.

Ordre de démarrage : InfluxDB sain, influx-init terminé, puis Node-RED et Grafana, puis Caddy ; Mosquitto démarre seul mosquittodémarre seul influxdbsain : influx ping healthy influx-initse termine (code 0) terminé avec succès noderedsain : GET :1880 grafanasain : /api/health lancé caddyprofil vps uniquement
ProfilFichier ajoutéPorts publiésParticularités
localcompose.local.yaml1883, 8086, 3000, 1880 sur 127.0.0.1Ce poste uniquement ; flux Node-RED modifiables et enregistrés dans le dépôt
lancompose.lan.yaml1883, 3000, 1880 sur le réseauServeur du FabLab ; HTTP ; InfluxDB non publié ; Node-RED sans mot de passe
vpscompose.vps.yaml80, 443 (Caddy), 1883HTTPS ; Node-RED protégé ; flux en lecture seule (modifications par Git puis deploy.sh)