Sofar logo
Sofar logo
App
Externe Signale
DSO

Abschnitt 14a IntegrationAgrolaAutarcoAxpoBEE EnergieBlumeCompanion EnergyDexterDiagnosetestsDNO RelaissteuerungDynamischer EnergiehandelEdmijElia
Elindus
Energie-Flexibilitätslösungen (EFS)EnervalisEngieEPEX Spot SolarErneuertEuropäische RohstoffeFleco PowerFrank EnergieGreenchoiceHallostroomImbyKratTrade
Mqtt
Geplante MQTT-SteuerungGrundlinienLive MQTT controlOnboarding-AblaufVirtuelles Kraftwerk
Neue IntegrationenNext EnergyOpinumPlan-ahead APIPleeviScholtSicherungskastenTrevion
Überwachung
VGT EnergieYuso - Batterie-SteuerungYuso - Solarbegrenzung
Fehlerbehebung
Geräte
Installation
Konfiguration von A bis Z
Kundenspezifisch
LizenzNetzwerkReglerSchnellstartSicherheits-, Wartungs- und RechtshinweiseSpezifikationenStatus-LEDsSteuerungsreaktionszeitVerlege- und AnschlussrichtlinienZertifikate
Zubehör
Externe SignaleMqtt

[!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

  1. EMS
    Image 1
    mit Internetverbindung.
  2. MQTT-Zugangsdaten: Diese können Sie bei unserem Support Team anfordern.
  3. 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

Image 1
Image 1
ermöglicht. Ihre Anlagen sind in die Gruppen Solar, Batterie, EV und HVAC unterteilt.

Ersteinrichtung (Startpunkt für neue Nutzer)

Ich habe ein

Image 1
Sofar, das ich für die MQTT-Fernsteuerung einrichten möchte.

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 1883

Wenn 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

Image 1
Image 1
Image 1

4. Aktivieren Sie das MQTT-Fernsignal

Wählen Sie alle Geräte aus, die Sie in die MQTT-Fernsteuerung aufnehmen möchten.

Image 1

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):

Feedback-Payload-Struktur

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

  1. Ü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_overlap beim Erstellen eines neuen Zeitplans auf True gesetzt ist.
  2. 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)
  3. Die Startzeit muss vor der Endzeit liegen
  4. Wenn die Startzeit in der Vergangenheit liegt, wird sie automatisch auf jetzt gesetzt
  5. Zeitpläne dürfen nur gelöscht werden, wenn sie noch nicht begonnen haben. Aktive Zeitpläne können nicht gelöscht werden.
  6. Zeitpläne können unabhängig für verschiedene Gerätetypen gesetzt werden
  7. Das System wendet automatisch die passende Richtlinie an, wenn ein Zeitplan aktiv wird

Mqtt

Previous Page

Grundlinien

Next Page

On this page

Was Sie benötigenZusätzliche InformationenErsteinrichtung (Startpunkt für neue Nutzer)1. Überprüfen Sie Ihr Netzwerk2. Fügen Sie Ihre Geräte hinzu3. Fügen Sie das MQTT-Externalsignal hinzu4. Aktivieren Sie das MQTT-Fernsignal5. Fernsignal ist hinzugefügtPython-Demo-SkriptMQTT-Dokumentation für das Senden von BefehlenMQTT-ThemenMQTT-Nachrichtentypen1. Zeitplan festlegen (set_schedule)2. Zeitpläne festlegen (general_error)3. Zeitplan abrufen (general_error)4. Aktiven Zeitplan abrufen (general_error)5. Nächsten Zeitplan abrufen (general_error)6. Zeitpläne abrufen (general_error)7. Zukünftige Zeitpläne abrufen (general_error)8. Zeitplan entfernen (general_error)9. Standort-Rückmeldung abrufen (general_error)10. Standorttopologie (general_error)Standard-Antwortformat für ZeitpläneKomponententypen und RichtlinienFehlerbehandlungRegeln für das Zeitplanmanagement