Smart Manufacturing

Strom-Submetering mit IoT: Modbus-Energiezähler an MQTT

Verbinden Sie Modbus-Energiezähler für die Hutschiene an einem RS-485-Bus mit einem Gateway, dekodieren Sie die Register in Python und veröffentlichen Sie kWh pro Maschine an einen MQTT-Broker, sodass jede Maschine ihren eigenen Energiewert erhält.

Aufbau für Strom-Submetering mit IoT: Modbus-Energiezähler auf der Hutschiene an einem RS-485-Bus, ein Gateway und MQTT-Daten auf dem Weg zu einem Cloud-MQTT-Broker
Probieren Sie es auf Ihrem eigenen MQTT-Broker ausHolen Sie sich im Free-Tarif einen privaten, verwalteten MQTT-Broker und starten Sie mit fertigen Codebeispielen.
Kostenlos testen Codebeispiele Keine Kreditkarte erforderlich

Strom-Submetering mit IoT-Zählern ordnet den Stromverbrauch des Werks einzelnen Maschinen, Linien und Versorgungsanlagen zu, statt alles über einen einzigen Hauptzähler zu erfassen. In diesem Tutorial verbinden Sie Modbus-Energiezähler für die Hutschiene an einem RS-485-Bus mit einem kleinen Gateway, lesen Spannung, Strom, Leistung und Energiezähler mit Python aus und veröffentlichen die Werte per MQTT, sodass jede Maschine ihren eigenen Live- und historischen Energiewert hat.

Warum auf Maschinenebene unterzählen

Der Hauptzähler beantwortet die Frage „wie viel“; Unterzähler beantworten „wo“ und „wann“. Sobald jede große Maschine ihren eigenen Zähler hat, sehen Sie den Leerlaufverbrauch zwischen Aufträgen, können baugleiche Maschinen vergleichen, die Wirkung eines neuen Antriebs oder eines geänderten Sollwerts nachweisen und den Energieverbrauch pro Teil berichten. Submetering ist zudem das messtechnische Rückgrat eines werksweiten Energiemonitorings in der Fabrik und eines Datenerfassungsplans nach ISO 50001.

Zähler und Gateway auswählen

Komponente Gängige Wahl Hinweise
Drehstromzähler Multifunktionszähler für die Hutschiene mit RS-485 Modbus RTU und Stromwandlereingängen (z. B. Eastron SDM630 MCT, ähnliche Modelle anderer Hersteller) Prüfen, ob die Registerbelegung veröffentlicht ist
Stromwandler Aufklappbare Stromwandler passend zum Abgang oder Rogowski-Spulen Aufklappbare Wandler erlauben die Nachrüstung ohne Abklemmen der Kabel
Bus Verdrilltes RS-485-Paar in Linientopologie, 120-Ohm-Abschluss an beiden Enden Bis zu 32 Unit Loads pro Segment ohne Repeater
Gateway Raspberry Pi mit USB-RS485-Adapter, industrieller Edge-PC oder Modbus-TCP-zu-RTU-Umsetzer Benötigt einen zuverlässigen Netzwerkpfad zum Broker
Software Python mit pymodbus und paho-mqtt oder Node-RED Python im Beispiel unten

Geben Sie jedem Zähler eine eindeutige Modbus-Adresse (1, 2, 3 usw.) sowie dieselbe Baudrate und Parität, eingestellt über das Bedienfeld des Zählers. Die Beispiele verwenden 9600 Baud, 8 Datenbits, keine Parität, 1 Stoppbit.

Die elektrische Installation von Zählern und Stromwandlern muss von einer Elektrofachkraft gemäß den örtlichen Vorschriften durchgeführt werden. Stromwandler mit Sekundärausgang dürfen niemals offen betrieben werden, solange die Primärseite Strom führt – es sei denn, es handelt sich um die sichere Ausführung mit Spannungsausgang.

Registerbelegung

Multifunktionszähler stellen Messwerte als 32-Bit-Gleitkommazahlen nach IEEE 754 bereit, verteilt auf zwei 16-Bit-Input-Register. Für die SDM630-Familie sind einige nützliche Input-Register (Funktionscode 04):

Wert Register (dezimal) Einheit
Spannung Phase 1 0 V
Strom Phase 1 6 A
Gesamtwirkleistung 52 W
Gesamtleistungsfaktor 62 -
Frequenz 70 Hz
Gesamte bezogene Wirkenergie 72 kWh

Andere Zähler verwenden andere Adressen, Funktionscodes oder Wortreihenfolgen. Arbeiten Sie immer mit der Registerdokumentation des Herstellers; eine falsche Wortreihenfolge erzeugt Zahlen, die plausibel aussehen, aber völlig danebenliegen.

Das Gateway verdrahten

  1. Verbinden Sie A und B (manchmal D+ und D-) des USB-RS485-Adapters mit den Klemmen A und B des ersten Zählers und schleifen Sie den Bus dann zu den weiteren Zählern durch. Vermeiden Sie Sterntopologien.
  2. Setzen Sie 120-Ohm-Abschlusswiderstände an den beiden physischen Enden des Busses, falls Zähler oder Adapter keine eingebaut haben.
  3. Schließen Sie die Bezugsmasse an, sofern der Adapter eine bietet, besonders bei längeren Leitungen.
  4. Stecken Sie den Adapter in den Raspberry Pi und prüfen Sie, ob das Gerät erscheint:
ls -l /dev/ttyUSB*
sudo usermod -aG dialout $USER     # danach ab- und wieder anmelden

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

Das Gateway-Skript für Strom-Submetering mit IoT

Das Skript fragt die Zähler nacheinander ab, dekodiert die Gleitkommazahlen und veröffentlicht pro Zähler eine JSON-Nachricht auf einem Topic, das die versorgte Maschine benennt. Für die Demo nutzt es den kostenlosen Öffentlichen MQTT-Broker; die Produktionsvariante folgt danach.

#!/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-Adresse -> Topic-Pfad der gemessenen Maschine
METERS = {
    1: "molding/imm-01",
    2: "molding/imm-02",
    3: "utilities/comp-1",
}

REGISTERS = {               # Name: Input-Register-Adresse (float32, 2 Wörter)
    "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        # Zähler liefert Watt
    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)                         # kurze Pause zwischen Zählern auf dem Bus
        time.sleep(max(0, POLL_SECONDS - (time.time() - cycle_start)))


if __name__ == "__main__":
    main()

Verfolgen Sie die Ausgabe von jedem beliebigen Rechner aus mit dem Mosquitto-Client:

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

Der Öffentliche MQTT-Broker eignet sich ideal für diesen ersten Test, ist aber für jeden lesbar. Wechseln Sie daher auf einen privaten Broker, bevor Sie echte Produktionsanlagen anbinden.

Der Weg in die Produktion

Stellen Sie das Gateway auf authentifiziertes TLS um, indem Sie die Verbindungszeilen ersetzen:

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)

Ändern Sie PREFIX in Ihren eigenen Namensraum, zum Beispiel connectmq/plant1, damit er der ISA-95-Hierarchie folgt. So werden die Energie-Topics Teil eines Unified Namespace (UNS): Unternehmen → Standort → Bereich → Linie → Maschine, etwa acme/werk-stuttgart/spritzguss/imm-01/energy. ConnectMQ erkennt diese Art von Struktur und listet Geräte im Portal nach Standort, Bereich und Linie auf, sodass sich auch einige Dutzend Zähler leicht überblicken lassen. Betreiben Sie das Skript als systemd-Dienst, damit es bei Fehlern und beim Booten neu startet.

Energie den Maschinen zuordnen

Mit einem Topic pro Maschine ist die Zuordnung unkompliziert:

  1. Energie pro Zeitraum: Ziehen Sie den Zählerstand kwh_total zu Beginn der Schicht oder des Tages vom Wert am Ende ab.
  2. Leerlaufenergie: Kombinieren Sie Leistung mit dem Maschinenzustand. Die Energie, die verbraucht wird, während die Maschine im Leerlauf ist oder steht – ermittelt mit den Zuständen aus der Maschinenstatus-Überwachung –, ist für viele Werke die Kennzahl mit dem größten Handlungspotenzial.
  3. Nicht gemessener Rest: Hauptzähler minus Summe der Unterzähler. Ein großer oder wachsender Rest deutet auf ungemessene Verbraucher oder einen Konfigurationsfehler eines Zählers hin.
  4. Energie pro Teil: Teilen Sie die kWh der Maschine durch die Gutteile im selben Zeitraum.

Speichern Sie den Datenstrom mit Telegraf oder einem kleinen Subscriber in einer Zeitreihendatenbank und berechnen Sie diese Kennzahlen dort; der Broker transportiert Live-Daten und gespeicherte letzte Werte (Retained Messages), keine Historie.

Eine Submetering-Einführung planen

Messen Sie zuerst die größten Verbraucher. Ein kurzer Rundgang mit einer Stromzange oder ein Blick auf die Typenschilder von Motoren und Heizungen zeigt meist, dass eine Handvoll Maschinen und Versorgungsanlagen einen großen Teil der Last ausmacht. Hängen Sie diese an den ersten Bus, weisen Sie den Datenpfad durchgängig nach und erweitern Sie erst dann auf kleinere Verbraucher.

Führen Sie von Anfang an ein Zählerverzeichnis: Modbus-Adresse, Einbauort, Abgang, Wandlerverhältnis, Installationsdatum und das Topic, auf dem der Zähler veröffentlicht. Diese Liste ermöglicht es anderen, das System zu warten, und genau diese Art dokumentierter Information verlangt ein Energieaudit. Wird ein Zähler getauscht, notieren Sie den Endstand des alten und den Anfangsstand des neuen Zählers, damit die Periodenberechnungen korrekt bleiben.

Legen Sie schließlich die Abfrageintervalle nach Zweck fest. Zehn Sekunden reichen für Live-Dashboards und die Erkennung von Leerlaufenergie völlig aus; abrechnungsähnliche Berichte benötigen nur die Zählerstände, sodass auf einem langen Bus auch ein langsameres Intervall akzeptabel ist.

Fehlersuche bei Unterzählern

Symptom Wahrscheinliche Ursache Abhilfe
Timeouts bei jedem Zähler A und B vertauscht, falsche Baudrate oder Parität A/B tauschen, serielle Einstellungen auf allen Geräten angleichen
Ein Zähler meldet Timeouts Doppelte oder falsche Modbus-Adresse Adresse im Zählerdisplay prüfen
Werte wie 1.4e-38 oder riesige Zahlen Falsche Wortreihenfolge oder Registerversatz Registerbelegung prüfen; die beiden Register tauschen
Negative Leistung Stromwandler verkehrt montiert oder Phasenzuordnung falsch Wandler umdrehen oder Phasenzuordnung korrigieren
Leistung um einen konstanten Faktor zu hoch Falsches Wandlerverhältnis im Zähler eingestellt Korrektes Primär-/Sekundärverhältnis einstellen
Sporadische Fehler auf langen Bussen Fehlender Abschluss oder keine Bezugsmasse Beide Enden abschließen, Bezugsmasse anschließen

Mehr als kWh

Viele Multifunktionszähler stellen zusätzlich den Gesamtoberschwingungsgehalt (THD), Werte pro Phase und Leistungsmittelwert-Register bereit. Diese fließen direkt in die Überwachung der Netzqualität ein, die hilft, Fehlauslösungen und überhitzte Transformatoren zu erklären. Einen allgemeinen Blick auf die Anbindung beliebiger Modbus-RTU-Geräte bietet Modbus RTU zu MQTT. Der Leitfaden zu Smart Manufacturing ordnet Submetering in die übergeordnete Roadmap der vernetzten Produktion ein.

Verbinden Sie Ihre Zähler mit ConnectMQ

ConnectMQ ist ein verwalteter MQTT-Broker mit TLS, MQTT 5, Live-Topic-Explorer, einer ISA-95-Geräteansicht und Schwellwertalarmen auf Feldern wie kw oder pf. Erstellen Sie einen kostenlosen Serverless-Broker ohne Kreditkarte, fügen Sie die generierten Zugangsdaten ein, und Ihre Unterzähler sind online.

Häufig gestellte Fragen

Wie viele Energiezähler können sich einen RS-485-Bus teilen?

Ein Standard-RS-485-Segment unterstützt bis zu 32 Unit Loads, und viele moderne Transceiver stellen nur Bruchteile einer Last dar, sodass mehr Geräte passen. In der Praxis setzt die Abfragezeit die Grenze: Mehr Zähler pro Bus bedeuten einen längeren Zyklus für jeden Zähler.

Kann ich stattdessen Modbus-TCP-Zähler verwenden?

Ja. Ersetzen Sie ModbusSerialClient durch ModbusTcpClient und die IP-Adresse des Zählers; die Registerdekodierung und die MQTT-Veröffentlichung bleiben gleich.

Sollte das Gateway kWh aus Leistungswerten berechnen?

Nein. Veröffentlichen Sie das zählereigene kumulierte Energieregister. Es ist auch zwischen den Abfragen genau und übersteht Gateway-Neustarts und verlorene Nachrichten.

Sind Daten aus Strom-Submetering mit IoT über das Internet sicher?

Verwenden Sie TLS auf Port 8883 mit Zugangsdaten, die für jedes Gateway einzeln ausgestellt werden. Bei ConnectMQ sind Client-IDs an ihre Zugangsdaten gebunden, und wiederholte fehlgeschlagene Anmeldungen führen zur Sperrung der IP-Adresse.

Verwandte Artikel

OEE vs. TEEP vs. OOE: Welche Kennzahl sollten Sie verwenden?

OEE, OOE und TEEP teilen sich die Faktoren Leistung und Qualität, beziehen sich aber auf unterschiedliche Zeitbasen. Dieser Vergleich rechnet ein Beispiel durch und listet die MQTT-Signale, die jede Kennzahl benötigt.

7 Min. Lesezeit

Alle Artikel →

Ihr privater MQTT-Broker ist nur wenige Klicks entfernt

Konto anlegen, Broker-Zugangsdaten erhalten und das erste Gerät verbinden — ohne Server, die installiert, gepatcht oder skaliert werden müssen.