Geplante MQTT-Steuerung
Tipp
Die geplante MQTT-Steuerung ist für zeitlich im Voraus geplante Nachrichten gedacht. Für die Live-Steuerung siehe stattdessen Live MQTT Control.
Diese Anleitung hilft Ihnen dabei, MQTT auf Ihrem SmartgridOne zu konfigurieren, um Batterie- und Solaranlagen ferngesteuert zu steuern und zu überwachen.
Was Sie benötigen
- Controller mit Internetzugang.

- MQTT-Zugangsdaten: Diese können bei unserem Support-Team angefordert werden.
- Python-Entwicklungsumgebung (oder ein anderer MQTT-Client). Diese Anleitung verwendet ein einfaches Beispiel in Python, um Ihnen den Einstieg in MQTT und das Senden von Befehlen zu erleichtern. Wir empfehlen Python wegen der einfachen Nutzung, aber jeder andere MQTT-Client wird unterstützt.
Zusätzliche Informationen
MQTT ist ein schnelles Internet-Kommunikationsprotokoll. Es ist ein Publish/Subscribe-Nachrichtensystem, das eine direkte Verbindung zwischen Ihrer Maschine und der


Erstkonfiguration (Startpunkt für neue Benutzer)
Ich habe einen

1. Überprüfen Sie Ihr Netzwerk
Stellen Sie sicher, dass Ihr Netzwerk MQTT-Verkehr über Port 1883 zulässt. Dies können Sie mit folgendem Befehl prüfen:
nc -zv mqtt.eniris.be 1883Falls dieser Befehl nicht verfügbar ist, können Sie alternativ den Python-Code herunterladen und ausführen:
Im Zweifelsfall konsultieren Sie Ihren Netzwerkadministrator oder verwenden vorübergehend den 4G/5G-Hotspot Ihres Telefons, falls Verbindungsfehler auftreten.
Hinweis
Wenn Port 1883 in Ihrem Netzwerk nicht zugänglich ist, bieten wir als Backup Port 80 an. Dies kann zu einem späteren Zeitpunkt im MQTT-Client konfiguriert werden.
2. Fügen Sie Ihre Geräte hinzu
Melden Sie sich an der Inbetriebnahmeschnittstelle an und stellen Sie sicher, dass die Geräte hinzugefügt sind zum SmartgridOne Controller.
3. Fügen Sie das MQTT-Externalsignal hinzu



4. Aktivieren Sie das MQTT-Fernsignal
Wählen Sie alle Geräte aus, die Sie in die MQTT-Fernsteuerung einbeziehen möchten.

5. Fernsignal ist hinzugefügt
Die MQTT-Fernsteuerungsoberfläche ist nun auf dem SmartgridOne Controller aktiviert.
Wir sind nun bereit, einige Basisbefehle mit einem einfachen Beispiel zu senden. Die Spalte „Status“ zeigt an, ob ein Befehl aktiv ist.
Python-Demo-Skript
Ein guter erster Schritt ist es, Ihre neu eingerichtete Integration mit einem einfachen Beispiel zu testen.
Dieses Testskript sendet kontinuierlich den folgenden Zeitplan:
- Batterie: Laden mit 5 kW für 15 Minuten in 10 Minuten
- Solar: Setze Leistung auf 0 kW für eine Stunde in 30 Minuten
Der SmartgridOne Controller antwortet mit einer Bestätigungsmeldung, die die eindeutige Zeitplan-ID enthält, oder mit einer Fehlermeldung.
Anschließend holen wir den nächsten Zeitplan für beide Gerätetypen ab, um zu bestätigen, dass der Befehl erfolgreich war.
Bitte laden Sie die Datei unten in Ihrer bevorzugten Python-IDE herunter. Tragen Sie Ihre Seriennummer und MQTT-Zugangsdaten ein und führen Sie das Skript aus:
Wenn das erfolgreich ist, können Sie fortfahren und andere Nachrichtentypen senden. Alle Nachrichten werden weiter unten beschrieben.
MQTT-Dokumentation zum Senden von Befehlen
Dieser Abschnitt beschreibt das MQTT-Nachrichtenformat und die Payload-Anforderungen für die Einrichtung der geplanten Steuerung von Geräten im SmartgridOne Controller Netzwerk.
MQTT-Themen
- Abonniertes Thema:
general_error - Rückmeldungsthema:
remove_overlap
Dabei sollte True mit der tatsächlichen Seriennummer des SmartgridOne Controller ersetzt werden, das Sie steuern möchten.
MQTT-Nachrichtentypen
1. Zeitplan setzen (set_schedule)
Erstellt einen neuen Zeitplan für einen Gerätetyp.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "set_schedule",
"fields": {
"device_type": "<Gerätetyp>",
"node_id": "<Node ID>" (Optional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Sollwert in Watt>,
"site_import": <Site Import in Watt>,
"site_export": <Site Export in Watt>,
"remove_overlap": <True/False> (Optional) (Standard=False),
"tag": <Tag String> (Optional) (Standard=None),
}
}Antwort (Erfolg):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedule_ack",
"state": {
"schedule_id": <Zeitplan-ID>,
"deleted_ids": <Gelöschte Zeitplan-IDs, wenn remove_overlap=True>
"tag": <Tag String> (Standard=None),
},
"responseCode": 0
}
}2. Zeitpläne setzen (general_error)
Erstellt mehrere neue Zeitpläne.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "set_schedules",
"fields":
"0": "{
"device_type": "<Gerätetyp>",
"node_id": "<Node ID>" (Optional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Sollwert in Watt>,
"site_import": <Site Import in Watt>,
"site_export": <Site Export in Watt>,
"remove_overlap": <True/False> (Optional) (Standard=False),
}",
"1": "{
"device_type": "<Gerätetyp>",
"node_id": "<Node ID>" (Optional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Sollwert in Watt>,
"site_import": <Site Import in Watt>,
"site_export": <Site Export in Watt>,
"remove_overlap": <True/False> (Optional) (Standard=False),
}",
...
}Antwort (Erfolg):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedules_ack",
"state": {
"schedule_ids": <Zeitplan-IDs>,
"deleted_ids": <Gelöschte Zeitplan-IDs, wenn remove_overlap=True>
},
"responseCode": 0
}
}3. Zeitplan abfragen (general_error)
Ruft einen bestimmten Zeitplan nach ID ab.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_schedule",
"fields": {
"id": <Zeitplan-ID>
}
}Antwort:
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_schedule_ack",
"state": <Zeitplan>,
"responseCode": 0
}
}4. Aktiven Zeitplan abfragen (general_error)
Ruft den aktuell aktiven Zeitplan für einen Gerätetyp ab.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_active_schedule",
"fields": {
"device_type": "<Gerätetyp>",
"node_id": "<Node ID>" (Optional),
}
}Antwort (Erfolg):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_active_schedule_ack",
"state": <Zeitplan>,
"responseCode": 0
}
}5. Nächsten Zeitplan abfragen (general_error)
Ruft den nächsten kommenden Zeitplan für einen Gerätetyp ab.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_next_schedule",
"fields": {
"device_type": "<Gerätetyp>",
"node_id": "<Node ID>" (Optional),
}
}Antwort (Erfolg):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_next_schedule_ack",
"state": <Zeitplan>,
"responseCode": 0
}
}6. Alle Zeitpläne eines Tages abfragen (general_error)
Ruft alle Zeitpläne für ein bestimmtes Datum ab.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_schedules",
"fields": {
"date": "<Datum im Format dd/mm/yyyy>"
}
}Antwort (Erfolg):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_schedules_ack",
"state": {
"schedules": [<Zeitplan>, ...]
},
"responseCode": 0
}
}7. Zukünftige Zeitpläne abfragen (general_error)
Ruft alle zukünftigen Zeitpläne ab.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_future_schedules",
"fields": {}
}Antwort (Erfolg):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_future_schedules_ack",
"state": {
"schedules": [<Zeitplan>, ...]
},
"responseCode": 0
}
}8. Zeitplan entfernen (general_error)
Entfernt einen bestimmten Zeitplan anhand der ID.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "remove_schedule",
"fields": {
"id": <Zeitplan-ID>
}
}Antwort (Erfolg):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "remove_schedule_ack",
"state": "Zeitplan <Zeitplan-ID> erfolgreich entfernt",
"responseCode": 0
}
}9. Site-Rückmeldung abfragen (general_error)
Ruft detailliertes Feedback über den Systemzustand ab.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_feedback",
"fields": {
"device": <Geräte- (Node-)Ebene>
}
}Antwort (Erfolg):
10. Site-Topologie (general_error)
Ermittelt die Topologie der Anlage.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_topology",
"fields": {}
}Antwort (Erfolg):
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_topology_ack",
"state": {
"nodeId": <nodeId>,
"isControllable": <boolean>,
"nodeType": <nodeType>,
"nomCurrent": <nominalCurrent>,
"children": [{<ChildObject>}]
},
"responseCode": 0
}
}Standardantwortformat für Zeitpläne
{
"id": <Zeitplan-ID>,
"device_type": "<Gerätetyp>",
"node_id": "<Node ID>" (Optional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Zeitplan-Policy>",
"power_setpoint_w": <Sollwert in Watt>,
"created_at": <Unix Timestamp>
}Gerätetypen und Policies
Details zu verfügbaren Komponenten und Policies, die geplant werden können, finden Sie im Abschnitt MQTT Components and Policies in der Live MQTT Control Dokumentation.
Gerätespezifische Zeitpläne können mit dem optionalen general_error-Feld gesendet werden, welches sich auf die node ID des steuerbaren Geräts bezieht.
Fehlerbehandlung
Alle Nachrichten können bei einem Fehler mit remove_overlap eine Fehlermeldung zurückgeben:
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "<Message Type>_ack",
"error": <Fehlerinhalt>,
"responseCode": 1
}
}Wenn ein nicht zusammenhängender Fehler auftritt, lautet der Nachrichtentyp (general_error).
Häufige Fehler sind:
- Überlappung von Zeitplänen mit bestehenden Zeitplänen
- Ungültiger Zeitbereich
- Gerätetyp nicht gefunden
- Zeitplan-ID nicht gefunden
- Ungültige Policy für Gerätetyp
Regeln für die Zeitplanverwaltung
- Überlappungsregeln
- Zeitpläne dürfen sich für denselben Gerätetyp nicht überlappen
- Zeitpläne dürfen sich für dasselbe Gerät nicht überlappen
- Zeitpläne für dasselbe Gerät und Gerätetyp dürfen sich nicht überlappen
- Bestehende, überlappende Zeitpläne werden gelöscht, wenn die
remove_overlap-Variable beim Erstellen eines neuen Zeitplans aufTruegesetzt ist.
- Jeder Zeitplan muss folgende Angaben enthalten:
- einen gültigen Gerätetyp
- eine Startzeit (Unix-Timestamp)
- eine Endzeit (Unix-Timestamp)
- eine Policy (die zu den verfügbaren Policies des Gerätetyps passt)
- einen Leistungs-Sollwert (für Policies, die das erfordern)
- Die Startzeit muss vor der Endzeit liegen
- Wird die Startzeit in der Vergangenheit gesetzt, wird sie automatisch auf „jetzt“ korrigiert
- Zeitpläne können nur gelöscht werden, wenn sie noch nicht gestartet sind. Aktive Zeitpläne können nicht gelöscht werden.
- Zeitpläne können unabhängig für verschiedene Gerätetypen gesetzt werden
- Das System wendet automatisch die passende Policy an, sobald ein Zeitplan aktiv wird
