Die Motorstrom-Überwachung macht das Stromkabel jedes Elektromotors zum Zustandssensor, ohne die Maschine selbst anzufassen. In diesem Tutorial legen Sie eine nicht-invasive Stromwandlerzange (CT-Zange) um eine Motorleitung, messen den Effektivstrom (RMS) mit einem ESP32, publizieren ihn per MQTT und betreiben einen Python-Dienst, der Überlast, zu viele Anläufe und auffällige Lastmuster meldet.
Warum der Motorstrom ein so nützliches Signal ist
Der Strom verrät, wie stark ein Motor arbeitet. Weil die Zange im Schaltschrank um das Kabel sitzt, können Sie auch alte Bestandsmaschinen ohne jede Datenschnittstelle nachrüsten und müssen nie etwas an rotierenden Teilen montieren.
Aus einem einzigen Stromwert pro Sekunde lässt sich erstaunlich viel ableiten:
- Betriebszustand: aus, Leerlauf (Motor dreht ohne Last) oder unter Last. Oft ist das der günstigste Weg, eine Stillstandserfassung zu speisen.
- Überlast: Strom über dem Bemessungsstrom laut Typenschild, länger als eine kurze Anlaufphase.
- Lastdrift: Ein Förderband, das allmählich mehr Strom zieht, hat womöglich ein schwergängiges Lager, einen schief laufenden Gurt oder Produktablagerungen. Eine Pumpe, die weniger zieht, läuft vielleicht trocken oder kavitiert.
- Anlaufhäufigkeit: Zu viele Anläufe pro Stunde überhitzen die Wicklungen, und ein plötzlicher Anstieg deutet oft auf ein Steuerungsproblem hin.
- Phasenunsymmetrie: Mit einer Zange pro Phase weisen ungleiche Ströme auf Versorgungsprobleme oder Wicklungsfehler hin.
Fortgeschrittene Verfahren wie die Motorstrom-Signaturanalyse (MCSA) betrachten das Frequenzspektrum des Stroms, um gebrochene Läuferstäbe und Lagerschäden zu erkennen. Sie benötigen eine deutlich schnellere Abtastung und spezielle Hardware. Alles in diesem Artikel funktioniert mit wenigen Effektivwerten pro Sekunde und erkennt dennoch die häufigsten betrieblichen Probleme.
Sicherheit zuerst
Eine Stromwandlerzange ist nicht-invasiv: Sie umschließt einen einzelnen isolierten Leiter und stellt nie einen elektrischen Kontakt her. Trotzdem wird sie in einem Schaltschrank mit spannungsführenden Teilen installiert. Lassen Sie sie von einer Elektrofachkraft bei freigeschaltetem Schrank montieren, legen Sie die Zange nur um einen Phasenleiter (nie um das gesamte mehradrige Kabel, bei dem sich die Felder aufheben) und führen Sie die Kleinspannungs-Sensorleitungen getrennt von den Leistungskabeln.
Hardware
| Bauteil | Zweck | Hinweise |
|---|---|---|
| ESP32 DevKit | Abtastung, RMS-Berechnung, WLAN und MQTT | Jeder ESP32 mit einem ADC1-Pin |
| Stromwandlerzange SCT-013-030 | Misst Ströme bis 30 A | Version mit Spannungsausgang, 1 V bei Nennstrom |
| 2 x 10-kOhm-Widerstände | Heben das Signal auf halbe Versorgungsspannung | Bilden einen Spannungsteiler an 3,3 V |
| 10-uF-Kondensator | Stabilisiert den Arbeitspunkt | Zwischen Teilermittelpunkt und GND |
| 3,5-mm-Klinkenbuchse | Anschluss der Zange | Optional, aber sauberer als das Abschneiden des Steckers |
Wählen Sie für die beste Auflösung eine Zange, deren Nennstrom knapp über dem Volllaststrom des Motors liegt. Eine 30-A-Zange an einem 3-A-Motor funktioniert zwar, aber das Signal ist klein und verrauscht.
Verdrahtung
Die Zange liefert eine um null zentrierte Wechselspannung, während der ADC des ESP32 nur positive Spannungen misst. Heben Sie das Signal daher in die Mitte des Messbereichs:
- Schalten Sie die beiden 10-kOhm-Widerstände in Reihe zwischen 3,3 V und GND.
- Schließen Sie den 10-uF-Kondensator vom Mittelpunkt nach GND an.
- Verbinden Sie eine Leitung der Zange mit dem Mittelpunkt und die andere mit GPIO 34.
GPIO 34 gehört zu ADC1, der auch bei aktivem WLAN weiterarbeitet. Die Anleitung ESP32 mit Stromsensor SCT-013 behandelt Kalibrierung und Verdrahtungsvarianten ausführlicher.
Firmware: Motorstrom-Überwachung auf dem ESP32
Der Sketch tastet den ADC 2.000-mal innerhalb von 200 ms ab, was zehn Netzperioden bei 50 Hz und zwölf bei 60 Hz abdeckt. Er entfernt den Gleichanteil durch Abzug des Mittelwerts, berechnet die Effektivspannung und rechnet sie in Ampere um. Jede Sekunde publiziert er den Strom und einen einfachen Zustand.
#include <WiFi.h>
#include <PubSubClient.h>
#include <math.h>
const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";
const char* MQTT_HOST = "broker.connectmq.com";
const char* CLIENT_ID = "motor-ct-9be2c4";
const char* TOPIC = "connectmq/demo/9be2c4/line1/conveyor1/current";
const int CT_PIN = 34;
const float AMPS_PER_VOLT = 30.0f; // SCT-013-030: 1 V RMS = 30 A
const float CAL = 1.00f; // nach Vergleich mit einer Strommesszange anpassen
const int SAMPLES = 2000;
const uint32_t SAMPLE_US = 100; // 10 kHz, 200-ms-Fenster
const float IDLE_A = 0.5f; // darunter ist der Motor aus
const float LOADED_A = 2.0f; // darüber läuft der Motor unter Last
WiFiClient net;
PubSubClient mqtt(net);
uint16_t samples[SAMPLES];
float measureAmps() {
uint32_t next = micros();
for (int i = 0; i < SAMPLES; i++) {
while ((int32_t)(micros() - next) < 0) { }
next += SAMPLE_US;
samples[i] = analogReadMilliVolts(CT_PIN);
}
double mean = 0;
for (int i = 0; i < SAMPLES; i++) mean += samples[i];
mean /= SAMPLES;
double sumSq = 0;
for (int i = 0; i < SAMPLES; i++) {
double d = samples[i] - mean;
sumSq += d * d;
}
double vrms = sqrt(sumSq / SAMPLES) / 1000.0;
return vrms * AMPS_PER_VOLT * CAL;
}
void ensureConnected() {
if (WiFi.status() != WL_CONNECTED) {
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) delay(250);
}
while (!mqtt.connected()) {
if (!mqtt.connect(CLIENT_ID)) delay(2000);
}
}
void setup() {
Serial.begin(115200);
analogSetPinAttenuation(CT_PIN, ADC_11db);
WiFi.mode(WIFI_STA);
mqtt.setServer(MQTT_HOST, 1883);
ensureConnected();
}
void loop() {
ensureConnected();
mqtt.loop();
static uint32_t lastPub = 0;
if (millis() - lastPub < 1000) return;
lastPub = millis();
float amps = measureAmps();
if (amps < 0.1f) amps = 0; // Rauschgrund unterdrücken
const char* state = amps < IDLE_A ? "off" : amps < LOADED_A ? "idle" : "loaded";
char payload[128];
snprintf(payload, sizeof(payload),
"{\"current_a\":%.2f,\"state\":\"%s\",\"uptime_s\":%lu}",
amps, state, millis() / 1000);
mqtt.publish(TOPIC, payload);
Serial.println(payload);
}
Kalibrieren Sie einmalig mit einer verlässlichen Strommesszange: Lassen Sie den Motor bei konstanter Last laufen, vergleichen Sie beide Werte und setzen Sie CAL auf das Verhältnis. Legen Sie anschließend IDLE_A und LOADED_A fest, indem Sie die reale Maschine im Leerlauf und unter Last beobachten.
Prüfen Sie den Datenstrom in einem beliebigen Terminal:
mosquitto_sub -h broker.connectmq.com -p 1883 -i ct-viewer-9be2c4 -t "connectmq/demo/9be2c4/#" -v
Überlast und auffällige Muster erkennen
Das Gerät meldet reine Fakten. Die Interpretation gehört in einen Dienst, der die Historie kennt. Der folgende Python-Subscriber (paho-mqtt 2.x) implementiert vier Prüfungen, die die meisten praktischen Anforderungen abdecken:
- Überlast: Strom über dem Typenschildwert länger als eine Toleranzzeit, die den normalen Anlaufstrom ignoriert.
- Anlaufzählung: Übergänge von aus nach laufend, gezählt über eine gleitende Stunde.
- Lastdrift: Der Mittelwert im Lastbetrieb der letzten zehn Minuten im Vergleich zu einem gelernten Normalwert.
- Veraltete Daten: 30 Sekunden ohne Nachricht bedeuten, dass Sensor oder Netzwerk ausgefallen sind.
import json
import time
from collections import deque
import paho.mqtt.client as mqtt
PREFIX = "connectmq/demo/9be2c4"
RATED_A = 8.5 # Bemessungsstrom laut Typenschild
OVERLOAD_GRACE_S = 10
MAX_STARTS_PER_HOUR = 6
DRIFT_LIMIT = 0.20 # 20 % Abweichung vom gelernten Normalwert
LEARN_SAMPLES = 1800 # 30 Minuten Lastbetrieb
over_since = None
last_state = "off"
starts = deque()
loaded = deque(maxlen=600) # letzte 10 Minuten im Lastbetrieb
learn = []
normal = None
last_seen = time.time()
def alert(client, kind, detail):
msg = {"ts": int(time.time()), "kind": kind, **detail}
client.publish(f"{PREFIX}/line1/conveyor1/alert", json.dumps(msg), qos=1)
print("ALERT", msg)
def on_connect(client, userdata, flags, reason_code, properties):
client.subscribe(f"{PREFIX}/line1/conveyor1/current", qos=1)
def on_message(client, userdata, msg):
global over_since, last_state, normal, last_seen
d = json.loads(msg.payload)
amps, state, now = d["current_a"], d["state"], time.time()
last_seen = now
if amps > RATED_A:
over_since = over_since or now
if now - over_since >= OVERLOAD_GRACE_S:
alert(client, "overload", {"current_a": amps, "rated_a": RATED_A})
over_since = now # höchstens einmal pro Toleranzzeit erneut alarmieren
else:
over_since = None
if last_state == "off" and state != "off":
starts.append(now)
while starts and now - starts[0] > 3600:
starts.popleft()
if len(starts) > MAX_STARTS_PER_HOUR:
alert(client, "frequent_starts", {"starts_last_hour": len(starts)})
starts.clear()
last_state = state
if state == "loaded":
if normal is None:
learn.append(amps)
if len(learn) >= LEARN_SAMPLES:
normal = sorted(learn)[len(learn) // 2]
print(f"learned normal loaded current: {normal:.2f} A")
else:
loaded.append(amps)
if len(loaded) == loaded.maxlen:
avg = sum(loaded) / len(loaded)
if abs(avg - normal) / normal > DRIFT_LIMIT:
alert(client, "load_drift", {"avg_a": round(avg, 2), "normal_a": round(normal, 2)})
loaded.clear()
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="motor-analytics-9be2c4")
client.on_connect = on_connect
client.on_message = on_message
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_start()
while True:
time.sleep(5)
if time.time() - last_seen > 30:
alert(client, "stale", {"seconds_silent": int(time.time() - last_seen)})
last_seen = time.time()
Für die reine Überlastregel brauchen Sie diesen Dienst nicht einmal. Eine Schwellwert-Alarmregel im ConnectMQ-Portal auf dem Feld current_a protokolliert jede Überschreitung im Alarmprotokoll. Behalten Sie den Python-Dienst für die zustandsbehafteten Prüfungen wie Drift und Anlaufzählung.
Was die Werte bedeuten
| Muster | Wahrscheinliche Ursachen | Typische Maßnahme |
|---|---|---|
| Strom steigt bei gleicher Last langsam an | Schwergängiges Lager, Fluchtungsfehler, Riemenspannung, Produktablagerungen | Mechanik prüfen, mit Schwingungsmessung bestätigen |
| Strom einer Pumpe sinkt | Trockenlauf, geschlossenes Ventil, verschlissenes Laufrad, Kavitation | Prozessbedingungen und Saugseite prüfen |
| Häufige kurze Überlasten | Blockaden, unterdimensionierter Motor, Prozessänderungen | Prozess und Motorauslegung überprüfen |
| Viele Anläufe pro Stunde | Schwingender Regelkreis, prellende Sensoren | Hysterese in der Steuerungslogik anpassen |
| Ungleiche Phasenströme | Versorgungsunsymmetrie, lockere Verbindung, Wicklungsfehler | Elektrische Prüfung |
Der Strom ist am aussagekräftigsten in Kombination mit anderen Signalen. Steigender Strom bei steigender Schwingung deutet auf die Mechanik hin, während steigender Strom bei normaler Schwingung und steigenden Werten der Lagertemperatur-Überwachung die Suche weiter eingrenzt. Der Artikel Predictive Maintenance mit IoT zeigt, wie sich diese Signale zu einer Instandhaltungsstrategie verbinden.
Sinnvolle Schwellwerte wählen
Gehen Sie vom Typenschild des Motors aus, nicht von Schätzungen. Der Bemessungsstrom ist die Obergrenze für den Dauerbetrieb, daher sollte die Überlastregel ihn direkt verwenden, mit einer Toleranzzeit, die lang genug ist, um den normalen Anlaufstrom abzudecken, den Sie an dieser Maschine beobachten. Direkt eingeschaltete Motoren ziehen für ein bis zwei Sekunden einen hohen Anlaufstrom, während Sanftanlasser und Frequenzumrichter langsam hochfahren; die richtige Toleranzzeit unterscheidet sich also je Motor.
Für die Drift lernen Sie den normalen Laststrom aus einem Zeitraum, in dem die Maschine nachweislich in Ordnung ist und der Produktmix typisch ist. Fertigt die Linie mehrere Produkte mit sehr unterschiedlicher Last, lernen Sie einen Normalwert pro Produkt oder Rezept und nehmen das aktive Rezept in die Payload auf. Andernfalls sieht jeder Produktwechsel wie eine Anomalie aus, das Bedienpersonal lernt, die Alarme zu ignorieren, und die Überwachung verfehlt ihren Zweck.
Der Weg in die Produktion
Der öffentliche MQTT-Broker eignet sich hervorragend für Tests, aber seine Topics sind für alle sichtbar. Für echte Motoren gilt:
- Erstellen Sie im ConnectMQ-Portal einen privaten Broker und verwenden Sie den generierten Benutzernamen, das Passwort und die Client-ID.
- Wechseln Sie mit
WiFiClientSecureauf TLS über Port 8883. - Verwenden Sie ISA-95-Topics wie
acme/plant1/packaging/line1/conveyor1/current, damit sich Anlagen in der Geräteansicht natürlich gruppieren. Diese Hierarchie (Enterprise, Site, Area, Line, Cell) ist zugleich die Struktur eines Unified Namespace (UNS), in dem Motorströme aller Werke neben Zuständen, Stückzahlen und Energiedaten an vorhersehbarer Stelle liegen. - Ergänzen Sie eine Last-Will-Nachricht, damit ein ausgefallener Sensor sofort als offline gemeldet wird.
Ein verwalteter MQTT-Broker hält diese Infrastruktur gepatcht und verfügbar, während Sie sich auf die Analyse konzentrieren. Wie sich die Motorstrom-Überwachung in eine vollständige Datenarchitektur für das Werk einfügt, lesen Sie im Leitfaden zu Smart Manufacturing.
Überwachen Sie Ihre Motoren mit ConnectMQ
ConnectMQ betreibt Ihren Cloud-MQTT-Broker mit TLS, MQTT 5, einem Live-Topic-Explorer und im Portal integrierten Schwellwertalarmen. Registrieren Sie sich unter app.connectmq.com für den kostenlosen Serverless-Plan, ohne Kreditkarte, und verbinden Sie noch heute Ihre erste Stromwandlerzange.
Häufig gestellte Fragen
Was kann die Motorstrom-Überwachung erkennen?
Sie erkennt zuverlässig Betriebszustand, Überlast, auffällige Anlaufhäufigkeit, Lastdrift und Phasenunsymmetrie. Um Läuferstab- oder Lagerschäden am Strom zu erkennen, sind schnelle Abtastung und Spektralanalyse nötig.
Ist es sicher, eine Stromwandlerzange an einem laufenden Motor zu installieren?
Die Zange ist nicht-invasiv, wird aber in einem Schaltschrank mit spannungsführenden Teilen installiert. Eine Elektrofachkraft sollte sie bei freigeschaltetem Schrank montieren.
Wie oft sollte ich Motorstromwerte publizieren?
Einmal pro Sekunde ist ein guter Standard für Zustands- und Überlasterkennung. Langsamere Raten wie alle 10 Sekunden genügen für reine Trendüberwachung.
Warum zeigt mein Messwert Strom an, obwohl der Motor aus ist?
Das ist der Rauschgrund des ADC. Unterdrücken Sie Werte unter einer kleinen Schwelle in der Firmware und führen Sie die Sensorleitungen fern von Leistungskabeln.



