Fabrication intelligente

Sous-comptage électrique IoT : des compteurs Modbus vers MQTT

Raccordez des compteurs d'énergie Modbus sur rail DIN via un bus RS-485 à une passerelle, décodez les registres en Python et publiez les kWh de chaque machine vers un broker MQTT pour que chaque machine dispose de son propre bilan énergétique.

Installation de sous-comptage électrique IoT avec des compteurs Modbus sur rail DIN reliés par un bus RS-485, une passerelle et des données MQTT envoyées vers un broker cloud
Essayez-le sur votre propre broker MQTTObtenez un broker MQTT privé et managé avec l’offre Free et partez d’exemples de code prêts à l’emploi.
Essayer gratuitement Exemples de code Aucune carte bancaire requise

Le sous-comptage électrique avec des compteurs IoT répartit l'électricité de l'usine entre les machines, les lignes et les utilités, au lieu de tout regrouper sur un seul compteur général. Dans ce tutoriel, vous allez raccorder des compteurs d'énergie Modbus sur rail DIN via un bus RS-485 à une petite passerelle, lire en Python la tension, le courant, la puissance et les index d'énergie, puis les publier en MQTT afin que chaque machine dispose de ses propres valeurs énergétiques, en direct et en historique.

Pourquoi sous-compter au niveau machine

Le compteur général répond à « combien » ; les sous-compteurs répondent à « où » et « quand ». Dès que chaque grosse machine a son propre compteur, vous voyez la consommation à vide entre deux ordres de fabrication, vous comparez des machines identiques, vous vérifiez l'effet d'un nouveau variateur ou d'une consigne modifiée et vous calculez l'énergie par pièce. Le sous-comptage est aussi l'ossature de mesure du suivi énergétique de l'usine et d'un plan de collecte de données ISO 50001.

Choisir les compteurs et la passerelle

Composant Choix courant Remarques
Compteur triphasé Compteur multifonction sur rail DIN avec Modbus RTU en RS-485 et entrées TC (par ex. Eastron SDM630 MCT, modèles équivalents d'autres fabricants) Vérifiez que la table des registres est publiée
Transformateurs de courant TC à noyau ouvrant dimensionnés selon le départ, ou bobines de Rogowski Le noyau ouvrant permet une installation sans débrancher les câbles
Bus RS-485 en paire torsadée, chaîné, terminaison 120 ohms aux deux extrémités Jusqu'à 32 charges unitaires par segment sans répéteur
Passerelle Raspberry Pi avec adaptateur USB-RS485, PC edge industriel ou convertisseur Modbus TCP vers RTU Doit disposer d'un chemin réseau fiable vers le broker
Logiciel Python avec pymodbus et paho-mqtt, ou Node-RED Python présenté ci-dessous

Attribuez à chaque compteur une adresse Modbus unique (1, 2, 3, etc.) avec la même vitesse et la même parité, réglées depuis la face avant du compteur. Les exemples utilisent 9600 bauds, 8 bits de données, sans parité, 1 bit de stop.

L'installation électrique des compteurs et des TC doit être réalisée par un électricien qualifié, conformément à la réglementation locale. Un TC à sortie courant ne doit jamais avoir son secondaire ouvert lorsque le primaire est parcouru par un courant, sauf s'il s'agit d'un modèle sécurisé à sortie tension.

Table des registres

Les compteurs multifonctions exposent leurs mesures sous forme de flottants IEEE 754 32 bits répartis sur deux registres d'entrée de 16 bits. Pour la famille SDM630, quelques registres d'entrée utiles (code fonction 04) :

Grandeur Registre (décimal) Unité
Tension phase 1 0 V
Courant phase 1 6 A
Puissance totale du système 52 W
Facteur de puissance total 62 -
Fréquence 70 Hz
Énergie active importée totale 72 kWh

D'autres compteurs utilisent des adresses, des codes fonction ou un ordre des mots différents. Travaillez toujours à partir du document de registres du fabricant : un mauvais ordre des mots produit des valeurs plausibles en apparence, mais complètement fausses.

Câbler la passerelle

  1. Reliez les bornes A et B (parfois D+ et D-) de l'adaptateur USB-RS485 aux bornes A et B du premier compteur, puis chaînez les autres compteurs. Évitez les topologies en étoile.
  2. Posez des résistances de terminaison de 120 ohms aux deux extrémités physiques du bus si les compteurs ou l'adaptateur n'en intègrent pas.
  3. Raccordez la masse de référence si l'adaptateur en propose une, surtout sur les grandes longueurs.
  4. Branchez l'adaptateur sur le Raspberry Pi et vérifiez que le périphérique apparaît :
ls -l /dev/ttyUSB*
sudo usermod -aG dialout $USER     # se déconnecter puis se reconnecter ensuite

python3 -m venv ~/meter-env
source ~/meter-env/bin/activate
pip install "pymodbus>=3.10" paho-mqtt pyserial

Le script de passerelle de sous-comptage électrique IoT

Le script interroge chaque compteur tour à tour, décode les flottants et publie un message JSON par compteur sur un topic qui porte le nom de la machine alimentée. Il utilise le serveur MQTT public gratuit pour la démonstration ; la variante de production est présentée ensuite.

#!/usr/bin/env python3
"""Electrical sub-metering gateway: Modbus RTU meters -> MQTT."""
import json
import struct
import time

import paho.mqtt.client as mqtt
from pymodbus.client import ModbusSerialClient

BROKER = "broker.connectmq.com"
PREFIX = "connectmq/demo/subm-4q9z/plant1"
POLL_SECONDS = 10

# Modbus address -> topic path of the machine it measures
METERS = {
    1: "molding/imm-01",
    2: "molding/imm-02",
    3: "utilities/comp-1",
}

REGISTERS = {               # name: input register address (float32, 2 words)
    "v_l1": 0,
    "i_l1": 6,
    "kw": 52,
    "pf": 62,
    "hz": 70,
    "kwh_total": 72,
}


def read_float(modbus, address, unit):
    rr = modbus.read_input_registers(address, count=2, device_id=unit)
    if rr.isError():
        raise IOError(f"Modbus error unit {unit} reg {address}: {rr}")
    return struct.unpack(">f", struct.pack(">HH", *rr.registers))[0]


def read_meter(modbus, unit):
    values = {name: read_float(modbus, reg, unit) for name, reg in REGISTERS.items()}
    values["kw"] = values["kw"] / 1000.0        # meter reports watts
    return {k: round(v, 3) for k, v in values.items()}


def on_connect(client, userdata, flags, reason_code, properties):
    print("MQTT connected:", reason_code)
    client.publish(f"{PREFIX}/gateway/status", "online", qos=1, retain=True)


def main():
    modbus = ModbusSerialClient(
        port="/dev/ttyUSB0", baudrate=9600, bytesize=8, parity="N", stopbits=1, timeout=1
    )
    if not modbus.connect():
        raise SystemExit("Cannot open serial port")

    mqttc = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="subm-gw-4q9z")
    mqttc.will_set(f"{PREFIX}/gateway/status", "offline", qos=1, retain=True)
    mqttc.on_connect = on_connect
    mqttc.connect(BROKER, 1883, keepalive=60)
    mqttc.loop_start()

    while True:
        cycle_start = time.time()
        for unit, path in METERS.items():
            topic = f"{PREFIX}/{path}/energy"
            try:
                payload = {"ts": int(time.time()), "meter": unit, **read_meter(modbus, unit)}
                mqttc.publish(topic, json.dumps(payload), qos=1)
                print(topic, payload)
            except IOError as err:
                mqttc.publish(f"{topic}/error", str(err), qos=1)
                print(err)
            time.sleep(0.05)                         # short gap between meters on the bus
        time.sleep(max(0, POLL_SECONDS - (time.time() - cycle_start)))


if __name__ == "__main__":
    main()

Suivez la sortie depuis n'importe quel poste avec le client Mosquitto :

mosquitto_sub -h broker.connectmq.com -p 1883 -i subm-viewer-$RANDOM \
  -t "connectmq/demo/subm-4q9z/plant1/#" -v

Le serveur MQTT public gratuit est idéal pour ce premier test, mais il est lisible par tout le monde : passez à un broker privé avant de raccorder de vrais équipements de production.

Passer en production

Basculez la passerelle en TLS authentifié en remplaçant les lignes de connexion :

mqttc = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID")
mqttc.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
mqttc.tls_set()
mqttc.will_set(f"{PREFIX}/gateway/status", "offline", qos=1, retain=True)
mqttc.connect("broker.connectmq.com", 8883, keepalive=60)

Remplacez PREFIX par votre propre espace de noms, par exemple connectmq/plant1, pour suivre la hiérarchie ISA-95. ConnectMQ reconnaît ce type de structure et liste les appareils par site, zone et ligne dans son portail, ce qui rend quelques dizaines de compteurs faciles à parcourir. Exécutez le script comme service systemd pour qu'il redémarre en cas d'échec et au démarrage.

Affecter l'énergie aux machines

Avec un topic par machine, l'affectation est simple :

  1. Énergie par période : soustrayez l'index kwh_total du début du poste ou de la journée de la valeur de fin.
  2. Énergie à vide : combinez la puissance et l'état machine. L'énergie consommée pendant que la machine est à l'arrêt ou au repos, à partir des états de la surveillance de l'état des machines, est le chiffre le plus exploitable pour de nombreuses usines.
  3. Reste non mesuré : compteur général moins la somme des sous-compteurs. Un reste important ou croissant signale des charges non comptées ou une erreur de configuration d'un compteur.
  4. Énergie par pièce : divisez les kWh de la machine par le nombre de pièces bonnes sur la même période.

Stockez le flux dans une base de séries temporelles avec Telegraf ou un petit abonné, et calculez ces indicateurs à ce niveau ; le broker transporte les données en direct et les dernières valeurs en retained, pas l'historique.

Planifier le déploiement du sous-comptage

Commencez par les plus gros consommateurs. Un rapide tour avec une pince ampèremétrique, ou un coup d'œil aux plaques signalétiques des moteurs et des résistances, montre généralement qu'une poignée de machines et d'utilités représentent une grande part de la charge. Placez-les sur le premier bus, validez la chaîne de données de bout en bout, et seulement ensuite étendez aux charges plus petites.

Tenez un registre des compteurs dès le départ : adresse Modbus, emplacement physique, départ, rapport de TC, date d'installation et topic de publication. C'est cette liste qui permet à quelqu'un d'autre de maintenir le système, et c'est exactement le type d'information documentée qu'exige un audit énergétique. Lors du remplacement d'un compteur, notez l'index final de l'ancien et l'index initial du nouveau pour que les calculs par période restent justes.

Enfin, définissez les intervalles d'interrogation selon l'usage. Dix secondes suffisent largement pour les tableaux de bord en direct et la détection de l'énergie à vide ; les rapports de type facturation n'ont besoin que des index, donc un intervalle plus lent sur un long bus est acceptable.

Dépannage des sous-compteurs

Symptôme Cause probable Solution
Timeouts sur tous les compteurs A et B inversés, mauvaise vitesse ou parité Inversez A/B, alignez les paramètres série sur tous les appareils
Un seul compteur en timeout Adresse Modbus en double ou erronée Vérifiez l'adresse sur l'afficheur du compteur
Valeurs du type 1.4e-38 ou énormes Mauvais ordre des mots ou décalage de registre Vérifiez la table des registres ; essayez d'inverser les deux registres
Puissance négative TC monté à l'envers ou phases mal associées Retournez le TC ou corrigez l'affectation des phases
Puissance trop élevée d'un facteur constant Mauvais rapport de TC configuré dans le compteur Réglez le bon rapport primaire/secondaire
Erreurs intermittentes sur les longs bus Terminaison absente ou pas de masse de référence Terminez les deux extrémités, raccordez la masse de référence

Au-delà des kWh

De nombreux compteurs multifonctions exposent aussi le taux de distorsion harmonique, les valeurs par phase et des registres de puissance appelée. Ces données alimentent directement la surveillance de la qualité de l'énergie, qui aide à expliquer les déclenchements intempestifs et les transformateurs qui chauffent. Pour une approche générique du raccordement de n'importe quel équipement Modbus RTU, voir Modbus RTU vers MQTT. Le guide de l'industrie intelligente situe le sous-comptage dans la feuille de route plus large de la production connectée. À terme, ces mesures par machine nourrissent aussi un jumeau numérique énergétique de l'atelier.

Connecter vos compteurs à ConnectMQ

ConnectMQ est un broker MQTT managé avec TLS, MQTT 5, un explorateur de topics en direct, une vue des appareils selon ISA-95 et des alertes de seuil sur des champs comme kw ou pf. Créez un broker Serverless gratuit sans carte bancaire, collez les identifiants générés, et vos sous-compteurs sont en ligne.

Questions fréquentes

Combien de compteurs d'énergie peuvent partager un même bus RS-485 ?

Un segment RS-485 standard accepte jusqu'à 32 charges unitaires, et de nombreux transceivers récents ne représentent qu'une fraction de charge, ce qui permet d'en raccorder davantage. En pratique, c'est le temps d'interrogation qui fixe la limite : plus il y a de compteurs par bus, plus le cycle de chacun s'allonge.

Puis-je utiliser des compteurs Modbus TCP à la place ?

Oui. Remplacez ModbusSerialClient par ModbusTcpClient avec l'adresse IP du compteur ; le décodage des registres et la publication MQTT restent identiques.

La passerelle doit-elle calculer les kWh à partir des mesures de puissance ?

Non. Publiez le registre d'énergie cumulée du compteur lui-même. Il reste exact entre deux interrogations et résiste aux redémarrages de la passerelle comme aux messages perdus.

Les données de sous-comptage électrique IoT sont-elles sécurisées sur Internet ?

Utilisez TLS sur le port 8883 avec des identifiants propres à chaque passerelle. Sur ConnectMQ, les client ID sont liés à leurs identifiants et les échecs de connexion répétés entraînent un blocage de l'adresse IP.

Articles liés

TRS (OEE) vs TEEP vs OOE : quel indicateur utiliser ?

Le TRS (OEE), l'OOE et le TEEP partagent les mêmes facteurs de performance et de qualité, mais se mesurent sur des bases de temps différentes. Ce comparatif déroule un exemple unique et liste les signaux MQTT nécessaires à chaque indicateur.

7 min de lecture

Tous les articles →

Votre broker MQTT privé, à quelques clics

Créez un compte, récupérez les identifiants de votre broker et connectez votre premier appareil — aucun serveur à installer, mettre à jour ou dimensionner.