Gateway sur Raspberry Pi¶
Un Raspberry Pi 4 avec les bons composants et une configuration rigoureuse devient une gateway industrielle capable de gérer des centaines de capteurs avec une disponibilité supérieure à 99,5 %.
Pourquoi le Raspberry Pi comme gateway¶
Le Raspberry Pi 4 (et a fortiori le Raspberry Pi 5) offre un rapport capacité/coût imbattable pour les gateways de terrain en environnement non critique. Avec 4 à 8 GB de RAM, un processeur quad-core ARM Cortex-A72 à 1,8 GHz, USB 3.0, Gigabit Ethernet et deux sorties HDMI, il héberge confortablement tous les services d'une gateway complète.
Pour les environnements industriels exigeants (température étendue, vibrations, DIN rail), des alternatives existent : Raspberry Pi Compute Module 4 intégré dans un boîtier industriel (Waveshare CM4-IO-POE, Toradex Colibri), ou des SBC dérivés (Banana Pi BPI-M5, ROCK Pi S).
Le système d'exploitation recommandé est Raspberry Pi OS Lite (Debian Bookworm, 64 bits, sans interface graphique) — minimal, stable, bien supporté.
Architecture logicielle cible¶
graph TB
subgraph HW ["Matériel — Raspberry Pi 4"]
ETH[Ethernet\nGigabit]
USB1[USB — Dongle Zigbee\nCC2652P / SONOFF]
USB2[USB — Dongle LoRa\nRAK7268 HAT]
GPIO[GPIO — RS-485\nMAX485 + UART]
end
subgraph SW ["Espace utilisateur (systemd services)"]
Z2M[zigbee2mqtt\n:1883 southbound Zigbee]
CS[ChirpStack\n:8080 LoRaWAN NS]
MOSQ[Mosquitto broker\n:1883 / :8883 TLS]
NR[Node-RED\n:1880 logique métier]
PROM[Prometheus\n:9090 métriques]
GRAF[Grafana\n:3000 dashboards]
EXPORTER[node_exporter\n:9100 OS métriques]
end
USB1 --> Z2M
USB2 --> CS
GPIO --> NR
Z2M -- MQTT --> MOSQ
CS -- MQTT --> MOSQ
NR -- MQTT sub/pub --> MOSQ
NR -- HTTP/MQTT --> CLOUD[(Cloud /\nServeur central)]
EXPORTER --> PROM
MOSQ -- metrics --> PROM
PROM --> GRAF Installation et configuration de Mosquitto¶
Mosquitto est le broker MQTT open-source de référence. Léger (< 5 MB RAM), il gère sans peine 10 000 connexions persistantes sur un Raspberry Pi 4.
Installation¶
Configuration /etc/mosquitto/mosquitto.conf¶
# Listener local non authentifié (réseau privé uniquement)
listener 1883 127.0.0.1
allow_anonymous true
# Listener TLS pour connexions externes
listener 8883
allow_anonymous false
cafile /etc/mosquitto/certs/ca.crt
certfile /etc/mosquitto/certs/server.crt
keyfile /etc/mosquitto/certs/server.key
require_certificate true
# Persistence des messages QoS 1/2
persistence true
persistence_location /var/lib/mosquitto/
# Logging
log_dest file /var/log/mosquitto/mosquitto.log
log_type error
log_type warning
log_type notice
# Limites
max_connections 1000
max_inflight_messages 100
Générer les certificats TLS avec une PKI locale (openssl ou step-ca) est fortement recommandé pour les connexions northbound.
Installation et configuration de zigbee2mqtt¶
Prérequis¶
# Node.js LTS (v20+)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo bash -
sudo apt install -y nodejs
# Dépendances système
sudo apt install -y git make g++ libdbus-1-dev
Installation¶
sudo mkdir /opt/zigbee2mqtt
sudo chown $(whoami) /opt/zigbee2mqtt
git clone --depth 1 https://github.com/Koenkk/zigbee2mqtt.git /opt/zigbee2mqtt
cd /opt/zigbee2mqtt && npm ci
Configuration /opt/zigbee2mqtt/data/configuration.yaml¶
homeassistant: false
permit_join: false # Désactiver après appairage initial
mqtt:
base_topic: zigbee2mqtt
server: mqtt://127.0.0.1:1883
serial:
port: /dev/ttyUSB0
adapter: ember # pour CC2652 avec firmware EmberZNet
advanced:
network_key: GENERATE # clé réseau Zigbee — générée au premier démarrage
channel: 25 # éviter canaux Wi-Fi 1, 6, 11
pan_id: GENERATE
log_level: warning
transmit_power: 9 # dBm, max légal EU : 14 dBm EIRP
frontend:
enabled: true
port: 8099 # Interface web d'administration
# Mapping custom pour devices non-standard
devices:
"0x00124b001234abcd":
friendly_name: "capteur_temperature_salle_A"
retain: true
Service systemd /etc/systemd/system/zigbee2mqtt.service¶
[Unit]
Description=zigbee2mqtt
After=network.target mosquitto.service
[Service]
ExecStart=/usr/bin/node /opt/zigbee2mqtt/index.js
WorkingDirectory=/opt/zigbee2mqtt
StandardOutput=inherit
StandardError=inherit
Restart=on-failure
RestartSec=10s
User=pi
Environment=NODE_ENV=production
[Install]
WantedBy=multi-user.target
Installation et configuration de Node-RED¶
Node-RED est l'outil de logique métier visuelle. Sur la gateway, il gère les règles de routage, de transformation et d'alerte.
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
sudo systemctl enable nodered
Modules recommandés¶
cd ~/.node-red
npm install node-red-contrib-mqtt-broker # broker embarqué (tests)
npm install node-red-contrib-influxdb # écriture directe InfluxDB
npm install node-red-contrib-prometheus # exposition métriques Prometheus
npm install node-red-node-sqlite # buffer local SQLite
Exemple de flux : Zigbee → filtre → InfluxDB¶
Un flux typique en Node-RED sur la gateway :
- MQTT in — abonnement à
zigbee2mqtt/+/+(tous les devices, tous les messages) - Function — extraction des champs, conversion d'unités, ajout de métadonnées site
- Switch — routage selon le type de mesure (température / humidité / mouvement)
- Filter (RBE) — Report By Exception : ne passe que si la valeur change
- InfluxDB out — écriture locale dans la base time-series
- MQTT out — retransmission vers le broker northbound
Supervision avec Prometheus et node_exporter¶
Installation Prometheus¶
# Télécharger le binaire ARM64
PROM_VER="2.52.0"
wget "https://github.com/prometheus/prometheus/releases/download/v${PROM_VER}/prometheus-${PROM_VER}.linux-arm64.tar.gz"
tar xf prometheus-*.tar.gz
sudo mv prometheus-*/prometheus /usr/local/bin/
sudo mv prometheus-*/promtool /usr/local/bin/
Configuration /etc/prometheus/prometheus.yml¶
global:
scrape_interval: 30s
evaluation_interval: 30s
scrape_configs:
- job_name: node
static_configs:
- targets: ["localhost:9100"]
- job_name: mosquitto
static_configs:
- targets: ["localhost:9234"] # mosquitto-exporter
- job_name: zigbee2mqtt
static_configs:
- targets: ["localhost:9099"] # z2m prometheus plugin
- job_name: nodered
static_configs:
- targets: ["localhost:1880"] # /metrics endpoint activé dans settings.js
Alertes critiques à configurer¶
| Alerte | Condition | Sévérité |
|---|---|---|
| Gateway CPU surchargée | cpu_usage > 85 % pendant 5 min | Warning |
| Disque presque plein | disk_free < 2 GB | Critical |
| Broker MQTT injoignable | up{job="mosquitto"} == 0 | Critical |
| Device Zigbee silencieux | Pas de message depuis 10 min | Warning |
| Température CPU élevée | rpi_temp > 75 °C | Warning |
| Mémoire insuffisante | mem_available < 200 MB | Critical |
Durcissement système¶
Un gateway de terrain est exposée. Les mesures minimales à appliquer :
# Désactiver les services inutiles
sudo systemctl disable bluetooth # si non utilisé
sudo systemctl disable avahi-daemon
# Pare-feu avec ufw
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp # SSH — restreindre à l'IP de gestion si possible
sudo ufw allow 1883/tcp # MQTT local uniquement — via 127.0.0.1
sudo ufw allow 8883/tcp # MQTT TLS externe
sudo ufw allow 3000/tcp # Grafana (optionnel, sinon tunnel SSH)
sudo ufw enable
# Watchdog système — redémarre si le kernel freeze
echo "RuntimeWatchdogSec=30" | sudo tee -a /etc/systemd/system.conf
echo "ShutdownWatchdogSec=2min" | sudo tee -a /etc/systemd/system.conf
# Système de fichiers en lecture seule pour la partition root (overlayfs)
# → protège la carte SD contre la corruption en cas de coupure électrique
sudo raspi-config nonint enable_overlayfs
Ce qu'il faut retenir¶
- Raspberry Pi OS Lite + Mosquitto + zigbee2mqtt + Node-RED forment un stack complet et éprouvé pour les gateways de terrain.
- Tous les services doivent être gérés par systemd avec
Restart=on-failurepour garantir la disponibilité. - Le durcissement (ufw, watchdog, overlayfs) est indispensable avant tout déploiement terrain.
- Prometheus + Grafana permettent de superviser la gateway elle-même depuis l'infrastructure centrale.
Chapitre suivant : Devices managés et GrapheneOS — transformer un smartphone Pixel en device IoT sécurisé et gérable à distance.