Aller au contenu

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

sudo apt update && sudo apt install -y mosquitto mosquitto-clients
sudo systemctl enable mosquitto

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 :

  1. MQTT in — abonnement à zigbee2mqtt/+/+ (tous les devices, tous les messages)
  2. Function — extraction des champs, conversion d'unités, ajout de métadonnées site
  3. Switch — routage selon le type de mesure (température / humidité / mouvement)
  4. Filter (RBE) — Report By Exception : ne passe que si la valeur change
  5. InfluxDB out — écriture locale dans la base time-series
  6. 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-failure pour 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.