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
- 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.
- Setzen Sie 120-Ohm-Abschlusswiderstände an den beiden physischen Enden des Busses, falls Zähler oder Adapter keine eingebaut haben.
- Schließen Sie die Bezugsmasse an, sofern der Adapter eine bietet, besonders bei längeren Leitungen.
- 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:
- Energie pro Zeitraum: Ziehen Sie den Zählerstand
kwh_totalzu Beginn der Schicht oder des Tages vom Wert am Ende ab. - 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.
- 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.
- 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.



