Intégration transparente de capteurs Modbus avec EdgeX Foundry sur Raspberry Pi
Intégration transparente de capteurs Modbus avec EdgeX Foundry sur Raspberry Pi
Les déploiements IIoT (Industrial Internet of Things) s'appuient de plus en plus sur des passerelles de périphérie pour connecter des périphériques Modbus à l'analytique cloud. Construire une passerelle propriétaire peut être coûteux et lent. Cette étude de cas montre comment un framework open source — EdgeX Foundry — peut être déployé sur un Raspberry Pi pour connecter un capteur température-humidité Modbus, transmettre les données vers le cloud et déclencher des actions en temps réel avec un effort minimal.
Pourquoi Modbus et EdgeX ?
Modbus est un protocole ouvert et léger qui fonctionne sur des liaisons RS-485 peu coûteuses. Il utilise des registres simples (entiers non signés 16 bits) pour les valeurs analogiques et des bobines pour les états binaires, le rendant idéal pour les appareils industriels. EdgeX Foundry, un middleware de périphérie open source, fait le pont entre les capteurs physiques et les systèmes IT, fournissant la gestion des appareils, la transformation des données et la connectivité cloud clé en main.
Pile matérielle
- Raspberry Pi 4 (passerelle de périphérie)
- Capteur Modbus RTU : SHT20 (température et humidité)
- Convertisseur RS-485 vers USB
- LED pour état visuel (GPIO-12 et GPIO-14)
- Alimentation USB
Figure 1 :
Figure 1. EdgeX Foundry – middleware de périphérie open source
Figure 2 :
Figure 2. Diagramme de haut niveau du déploiement EdgeX
Intégration étape par étape
- Configurer le Raspberry Pi
- Installer Ubuntu 20.04 LTS avec Docker et docker-compose.
- Cloner le dépôt EdgeX Foundry et lancer la pile via docker-compose.
- Simuler l'appareil Modbus
- Utiliser ModbusPal (GPL) pour émuler jusqu'à 247 esclaves Modbus.
- Configurer un esclave avec des registres de maintien pour la température (adresse 2) et l'humidité (adresse 3). Chaque registre correspond à un entier 16 bits qui sera mis à l'échelle en °C et %HR.
- Démarrer ModbusPal via TCP ou série (USB-RS485) pour vérifier la communication.
- Télécharger le profil de l'appareil
Envoyer une requête
POSTàhttps://localhost:48081/api/v1/deviceprofile/uploadfileavec le fichier YAML contenant le profil (voir ci-dessous). La réponse renvoie un ID de profil unique. - Enregistrer l'appareil
Publier le JSON suivant sur
https://localhost:48081/api/v1/devicepour créer l'entrée du capteur. La sectionprotocols.modbus-rtupointe vers/dev/ttyUSB0à 9600 bauds.{ "name": "TemperatureHumiditySensor", "description": "Industrial Grade Temperature & Humidity Transmitter SHT20", "adminState": "UNLOCKED", "operatingState": "ENABLED", "protocols": { "modbus-rtu": { "Address": "/dev/ttyUSB0", "BaudRate": "9600", "DataBits": "8", "StopBits": "1", "Parity": "N", "UnitID": "1" } }, "labels": ["TemperatureHumiditySensor","modbusRTU"], "service": {"name": "edgex-device-modbus"}, "profile": {"name": "TemperatureHumiditySensor"}, "autoEvents": [ {"frequency": "5s", "onChange": false, "resource": "TemperatureDegC"}, {"frequency": "5s", "onChange": false, "resource": "HumidityPercentRH"} ] } - Vérifier le flux de données
- Le service d'appareil EdgeX récupère les données toutes les 5 s et les écrit dans le service principal, qui les stocke dans Redis.
- Les services d'application transmettent les données vers IBM Cloud (ou tout cloud de choix).
- Exemples d'entrées de journal montrant les paquets de requête/réponse Modbus.
- Actionner les LED avec le moteur de règles Kuiper
- Définir les règles : si température > 30 °C allumer la LED rouge ; si < 30 °C l'éteindre ; de même pour la LED bleue à 28 °C.
- Kuiper pousse les commandes vers EdgeX core-command, qui met à jour le service d'appareil GPIO.
- Les sorties GPIO sont vérifiées via
/sys/class/gpio/gpio12/valueet/sys/class/gpio/gpio14/value.
Extraits de configuration clés
Profil d'appareil (YAML)
name: TemperatureHumiditySensor manufacturer: ROBOKITS model: RKI-4879 labels: - SHT20 description: Industrial Grade Temperature & Humidity Transmitter SHT20 Sensor High Precision Monitoring Modbus RS485 deviceResources: - name: TemperatureDegC description: Room Temperature in Degrees Celsius. attributes: { primaryTable: INPUT_REGISTERS, startingAddress: 2, rawType: INT16 } properties: value: { type: Float32, readWrite: R, scale: 0.1, floatEncoding: eNotation } units: { type: String, readWrite: R, defaultValue: degrees celsius } - name: HumidityPercentRH description: Room Humidity in %RH. attributes: { primaryTable: INPUT_REGISTERS, startingAddress: 3, rawType: INT16 } properties: value: { type: Float32, readWrite: R, scale: 0.1, floatEncoding: eNotation } units: { type: String, readWrite: R, defaultValue: %RH } deviceCommands: - name: TemperatureDegC get: [{ index: 1, operation: get, deviceResource: TemperatureDegC }] - name: HumidityPercentRH get: [{ index: 2, operation: get, deviceResource: HumidityPercentRH }] coreCommands: - name: TemperatureDegC get: path: /api/v1/device/{deviceId}/TemperatureDegC responses: - code: 200 description: Get the temperature in degrees C expectedValues: [TemperatureDegC] - name: HumidityPercentRH get: path: /api/v1/device/{deviceId}/HumidityPercentRH responses: - code: 200 description: Get the humidity in %RH expectedValues: [HumidityPercentRH]
Configuration TOML device-modbus (extrait)
[DeviceList] Name = "TemperatureHumiditySensor" Profile = "TemperatureHumiditySensor" Description = "Industrial Grade Temperature & Humidity Transmitter SHT20" labels = ["TemperatureHumiditySensor","modbusRTU"] [DeviceList.Protocols.modbus-rtu] Address = "/dev/ttyUSB0" BaudRate = 9600 DataBits = 8 StopBits = 1 Parity = "N" UnitID = 1 [[DeviceList.AutoEvents]] Frequency = "5s" OnChange = false Resource = "TemperatureDegC" [[DeviceList.AutoEvents]] Frequency = "5s" OnChange = false Resource = "HumidityPercentRH"
Résultats
Le flux de bout en bout montre des données de température et d'humidité en temps réel arrivant dans IBM Cloud, déclenchant des changements d'état de LED basés sur des règles, et démontrant les pleines capacités d'EdgeX sur un Raspberry Pi à faible coût.
Conclusion
EdgeX Foundry permet un déploiement rapide de solutions IIoT basées sur Modbus avec un surcoût de développement minimal. En abstraisant la gestion des appareils, le stockage des données et la connectivité cloud, il libère les ingénieurs pour se concentrer sur la logique métier et l'analytique.
Acronymes
| Acronyme | Définition |
|---|---|
| AOF | Append Only File |
| API | Application Program Interface |
| AWS | Amazon Web Services |
| BACnet | Building Automation and Control Network |
| BLE | Bluetooth Low Energy |
| CURL | Client Uniform Resource Locator |
| GPIO | General Purpose Input Output |
| HTTP | Hypertext Transfer Protocol |
| IBM | International Business Machines |
| IIoT | Industrial Internet of Things |
| IoT | Internet of Things |
| IT | Information Technology |
| LED | Light Emitting Diode |
| LTS | Long Term Support |
| M2M | Machine to Machine |
| MQTT | Message Queuing Telemetry Transport |
| RDB | Redis Database |
| Redis | REmote DIctionary Server |
| REST | Representational State Transfer |
| RS-485 | Recommended Standard – 485 |
| SCADA | Supervisory Control and Data Acquisition |
| SQL | Structured Query Language |
| TCP/IP | Transmission Control Protocol/Internet Protocol |
Technologie de l'Internet des objets
- Guide débutant de la terminologie open‑source
- Cisco dévoile les routeurs industriels Catalyst 5G pour connecter transparemment entreprise et edge
- AT&T et Tech Mahindra lancent Acumos : plateforme IA open-source pour déploiement rapide
- Élever l'excellence manufacturière avec l'Industrie 4.0 : l'essor de la Qualité 4.0
- Sécuriser l'open source dans l'IoT : atténuer les risques logiciels
- Élever l'Industrie 4.0 : exploiter l'analytics de bord pour une manufacture plus intelligente, plus rapide
- L'IIC et OpenFog fusionnent pour driver l'innovation en edge computing
- Outils de développement IoT open-source vs vendor-supported : choisir la bonne stack pour votre entreprise
- Pourquoi l'open source stimule l'innovation à la périphérie — eBook essentiel