[!TIPP] Die geplante MQTT-Steuerung ist für zeitlich vorgeplante Nachrichten gedacht. Für die Live-Steuerung siehe stattdessen Live MQTT Control.
Diese Anleitung hilft Ihnen, MQTT auf Ihrem Sofar zu konfigurieren, um Batterien- und Solaranlagen remote zu steuern und zu überwachen.
Was Sie benötigen
- EMS mit Internetverbindung.

- MQTT-Zugangsdaten: Diese können Sie bei unserem Support Team anfordern.
- Python-Entwicklungsumgebung (oder einen anderen 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 Handhabung, aber jeder andere MQTT-Client wird unterstützt.
Zusätzliche Informationen
MQTT ist ein schnelles Kommunikationsprotokoll über das Internet. Es handelt sich um ein Publish/Subscribe-Nachrichtensystem, das eine direkte Verbindung zwischen Ihrer Maschine und dem


Ersteinrichtung (Startpunkt für neue Nutzer)
Ich habe ein

1. Überprüfen Sie Ihr Netzwerk
Stellen Sie sicher, dass Ihr Netzwerk MQTT-Datenverkehr über Port 1883 zulässt. Dies können Sie mit folgendem Befehl prüfen:
nc -zv mqtt.eniris.be 1883Wenn dieser Befehl nicht verfügbar ist, können Sie alternativ den Python-Code herunterladen und ausführen:
Im Zweifel konsultieren Sie Ihren Netzwerktechniker oder verwenden Sie vorübergehend den 4G/5G-Hotspot Ihres Smartphones, wenn Verbindungsfehler auftreten.
[!HINWEIS] Wenn Port 1883 in Ihrem Netzwerk nicht erreichbar ist, bieten wir als Backup Port 80 an. Dieser kann im MQTT-Client in einem späteren Schritt konfiguriert werden.
2. Fügen Sie Ihre Geräte hinzu
Melden Sie sich an der Inbetriebnahme-Schnittstelle an und stellen Sie sicher, dass die Geräte hinzugefügt wurden zum Sofar EMS.
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 aufnehmen möchten.

5. Fernsignal ist hinzugefügt
Die MQTT-Fernsteuerungsoberfläche wurde nun auf dem Sofar EMS aktiviert.
Wir sind jetzt bereit, einige grundlegende Befehle mit einem einfachen Beispiel zu senden. Die Spalte Status zeigt Ihnen an, ob ein Befehl aktiv ist.
Python-Demo-Skript
Ein guter erster Schritt ist, Ihre neu konfigurierte Integration mit einem einfachen Beispiel zu testen.
Dieses Testskript sendet fortlaufend folgenden Zeitplan:
- Batterie: Aufladung mit 5 kW für 15 Minuten ab in 10 Minuten
- Solar: Leistung auf 0 kW für eine Stunde ab in 30 Minuten setzen
Das Sofar EMS antwortet mit einer Bestätigungsnachricht, 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 unten die Datei in Ihre bevorzugte Python-IDE herunter. Füllen Sie Ihre Seriennummer und MQTT-Zugangsdaten ein und führen Sie das Skript aus:
Wenn dies erfolgreich war, können Sie mit dem Senden weiterer Nachrichtentypen fortfahren. Alle Nachrichten sind unten beschrieben.
MQTT-Dokumentation für das Senden von Befehlen
Dieser Abschnitt beschreibt das MQTT-Nachrichtenformat und die Payload-Anforderungen zur Einrichtung der geplanten Steuerung von Geräten im Netzwerk des Sofar EMS.
MQTT-Themen
- Abonnement-Thema:
general_error - Rückmeldungs-Thema:
remove_overlap
Dabei sollte True durch die tatsächliche Seriennummer des Sofar EMS ersetzt werden, das Sie steuern möchten.
MQTT-Nachrichtentypen
1. Zeitplan festlegen (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": "<Richtlinie>",
"power_setpoint_w": <Sollwert in Watt>,
"site_import": <Standort-Import in Watt>,
"site_export": <Standort-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 festlegen (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": "<Richtlinie>",
"power_setpoint_w": <Sollwert in Watt>,
"site_import": <Standort-Import in Watt>,
"site_export": <Standort-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": "<Richtlinie>",
"power_setpoint_w": <Sollwert in Watt>,
"site_import": <Standort-Import in Watt>,
"site_export": <Standort-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 abrufen (general_error)
Ruft einen spezifischen Zeitplan anhand der 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 abrufen (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 abrufen (general_error)
Ruft den nächsten bevorstehenden 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. Zeitpläne abrufen (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": "<Datumsstring 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 abrufen (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 spezifischen 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. Standort-Rückmeldung abrufen (general_error)
Ruft detaillierte Rückmeldungen zum Systemstatus ab.
{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_feedback",
"fields": {
"device": <Geräte- (Node-) Ebene>
}
}Antwort (Erfolg):
10. Standorttopologie (general_error)
Erhält die Topologie des Standorts.
{
"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": <Nennstrom>
"children": [{<ChildObject>}]
},
"responseCode": 0
}
}Standard-Antwortformat 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-Richtlinie>",
"power_setpoint_w": <Sollwert in Watt>,
"created_at": <Unix Timestamp>
}Komponententypen und Richtlinien
Details zu verfügbaren Komponenten und Richtlinien, 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 über das optionale Feld general_error gesendet werden, das sich auf die Node-ID des steuerbaren Geräts bezieht.
Fehlerbehandlung
Alle Nachrichten können bei Fehlern eine Fehlermeldung mit remove_overlap zurückgeben:
{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "<Nachrichten-Typ>_ack",
"error": <Fehlerinhalt>,
"responseCode": 1
}
}Bei nicht zugeordneten Fehlern lautet der Nachrichtentyp (general_error).
Häufige Fehler umfassen:
- Zeitplanüberschneidungen mit bestehenden Zeitplänen
- Ungültiger Zeitbereich
- Gerätetyp nicht gefunden
- Zeitplan-ID nicht gefunden
- Ungültige Richtlinie für Gerätetyp
Regeln für das Zeitplanmanagement
- Überschneidungsregeln
- Zeitpläne dürfen sich für denselben Gerätetyp nicht überschneiden
- Zeitpläne dürfen sich für dasselbe Gerät nicht überschneiden
- Zeitpläne für dasselbe Gerät und Gerätetyp dürfen sich nicht überschneiden
- Bestehende, überschneidende Zeitpläne werden gelöscht, wenn die Variable
remove_overlapbeim Erstellen eines neuen Zeitplans aufTruegesetzt ist.
- Jeder Zeitplan muss folgende Angaben haben:
- Einen gültigen Gerätetyp
- Eine Startzeit (Unix-Zeitstempel)
- Eine Endzeit (Unix-Zeitstempel)
- Eine Richtlinie (die zu den verfügbaren Richtlinien für den Gerätetyp passt)
- Einen Leistungssollwert (für Richtlinien, die dies erfordern)
- Die Startzeit muss vor der Endzeit liegen
- Wenn die Startzeit in der Vergangenheit liegt, wird sie automatisch auf jetzt gesetzt
- Zeitpläne dürfen nur gelöscht werden, wenn sie noch nicht begonnen haben. 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 Richtlinie an, wenn ein Zeitplan aktiv wird
