Zum Hauptinhalt springen

Geplante MQTT-Steuerung

tipp

Die geplante MQTT-Steuerung ist für geplante Nachrichten im Voraus gedacht. Für die Live-Steuerung siehe stattdessen Live MQTT Control.

Dieser Leitfaden hilft Ihnen bei der Konfiguration von MQTT auf Ihrem DemoBrandName ControllerDemoName, um Batterie- und Solarpanelinstallationen aus der Ferne zu steuern und zu überwachen.

Was Sie benötigen

  1. DemoBrandName ControllerDemoName mit Internetverbindung.
  2. MQTT-Anmeldedaten: Diese können angefordert werden, indem Sie eine E-Mail an support@eniris.be senden.
  3. Python-Entwicklungsumgebung (oder jeden anderen MQTT-Client). Dieser Leitfaden verwendet ein einfaches Beispiel, das in Python geschrieben ist, um Ihnen den Einstieg in MQTT und das Senden von Befehlen zu erleichtern. Wir empfehlen die Verwendung von Python aufgrund der Benutzerfreundlichkeit, aber jeder andere MQTT-Client wird unterstützt.

Zusätzliche Informationen

MQTT ist ein schnelles Kommunikationsprotokoll über das Internet. Es ist ein Publish/Subscribe-Nachrichtensystem, das eine direkte Verbindung zwischen Ihrer Maschine und der DemoBrandName ControllerDemoName ermöglicht. Ihre Vermögenswerte sind in Gruppen für Solar, Batterie, EV und HVAC klassifiziert. Derzeit ermöglicht diese Integration die Steuerung nach Gruppe, nicht nach Gerät.

Erstkonfiguration (Ausgangspunkt für neue Benutzer)

Ich habe eine DemoBrandName ControllerDemoName, die ich für die MQTT-Fernsteuerung einrichten möchte.

1. Überprüfen Sie Ihr Netzwerk

Stellen Sie sicher, dass Ihr Netzwerk den MQTT-Datenverkehr über Port 1883 zulässt. Sie können dies mit folgendem Befehl tun:

nc -zv mqtt.eniris.be 1883

Wenn dieser Befehl nicht verfügbar ist, können Sie alternativ diesen Python-Code herunterladen und ausführen.

Im Zweifelsfall konsultieren Sie Ihren Netzwerkadministrator oder verwenden Sie vorübergehend den 4G/5G-Hotspot Ihres Handys, wenn Verbindungsfehler auftreten.

hinweis

Wenn Port 1883 von Ihrem Netzwerk nicht zugänglich ist, bieten wir eine Sicherung unter Port 80 an. Dies kann zu einem späteren Zeitpunkt in Ihrem MQTT-Client in diesem Handbuch konfiguriert werden.

2. Fügen Sie Ihre Geräte hinzu

Loggen Sie sich in die Inbetriebnahmeoberfläche ein und stellen Sie sicher, dass die Geräte hinzugefügt wurden zur DemoBrandName ControllerDemoName.

3. Fügen Sie das MQTT-Außensignal hinzu

Bild 1
Bild 1
Bild 1

4. Aktivieren Sie das MQTT-Fernsignal

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

Bild 1

5. Das Fernsignal ist hinzugefügt

Die MQTT-Fernsteuerungsoberfläche wurde nun auf der DemoBrandName ControllerDemoName aktiviert.

Wir sind nun bereit, einige grundlegende Befehle mit einem einfachen Beispiel zu senden. Die Statusspalte zeigt Ihnen an, ob ein Befehl aktiv ist.

Python-Demo-Skript

Ein guter erster Ausgangspunkt wäre es, Ihre neu eingerichtete Integration mit einem einfachen Beispiel zu testen.

Dieser Testcode erledigt eine einfache Aufgabe, indem er kontinuierlich den folgenden Zeitplan sendet:

  • Batterie: Laden bei 5 kW für 15 Minuten in 10 Minuten
  • Solar: Leistung auf 0 kW für eine Stunde in 30 Minuten setzen

Die DemoBrandName ControllerDemoName reagiert mit einer Bestätigungsnachricht, die den einzigartigen Zeitplan-Identifikator enthält oder mit einer Fehlermeldung.

Wir holen dann den nächsten Zeitplan für beide Gerätetypen ab und bestätigen, dass der Befehl erfolgreich war.

Bitte laden Sie die Datei unten in Ihrer bevorzugten Python-IDE herunter. Füllen Sie Ihre Seriennummer und die MQTT-Anmeldedaten aus und führen Sie das Skript aus:

Wenn dies erfolgreich ist, können Sie mit dem Senden anderer Arten von Nachrichten fortfahren. Alle Nachrichten sind 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 Netzwerk der DemoBrandName ControllerDemoName.

MQTT-Themen

  • Abonnieren des Themas: standard1/rp_one_s/remoteScheduleMetrics/<controller SN>
  • Feedback-Thema: standard1/outbound/remoteScheduleMetrics/feedback/<controller SN>

Wobei <controller SN> durch die tatsächliche Seriennummer der DemoBrandName ControllerDemoName ersetzt werden sollte, die 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": "<Device Type>",
"node_id": "<Node ID>" (Optional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint in watts>,
"site_import": <Site Import in Watts>,
"site_export": <Site Export in Watts>,
"remove_overlap": <True/False> (Optional) (default=False),
"tag": <Tag String> (Optional) (default=None),
}
}

Antwort (Erfolg):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedule_ack",
"state": {
"schedule_id": <Schedule ID>,
"deleted_ids": <Schedulde IDs deleted if remove_overlap=True>
"tag": <Tag String> (default=None),
},
"responseCode": 0
}
}

2. Zeitpläne festlegen (set_schedules)

Erstellt mehrere neue Zeitpläne.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "set_schedules",
"fields":
"0": '{
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Optional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint in watts>,
"site_import": <Site Import in Watts>,
"site_export": <Site Export in Watts>,
"remove_overlap": <True/False> (Optional) (default=False),
}',
"1": '{
"device_type": "<Device Type>",
"node_id": "<Node ID>" (Optional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Policy>",
"power_setpoint_w": <Setpoint in watts>,
"site_import": <Site Import in Watts>,
"site_export": <Site Export in Watts>,
"remove_overlap": <True/False> (Optional) (default=False),
}',
...
}

Antwort (Erfolg):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "set_schedules_ack",
"state": {
"schedule_ids": <Schedule IDs>,
"deleted_ids": <Schedulde IDs deleted if remove_overlap=True>
},
"responseCode": 0
}
}

3. Zeitplan abrufen (get_schedule)

Ruft einen bestimmten Zeitplan nach ID ab.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_schedule",
"fields": {
"id": <Schedule ID>
}
}

Antwort:

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

4. Aktiven Zeitplan abrufen (get_active_schedule)

Ruft den derzeit 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": "<Knoten-ID>" (Optional),
}
}

Antwort (Erfolg):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_active_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

5. Nächsten Zeitplan abrufen (get_next_schedule)

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": "<Knoten-ID>" (Optional),
}
}

Antwort (Erfolg):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "get_next_schedule_ack",
"state": <Schedule>,
"responseCode": 0
}
}

6. Zeitpläne abrufen (get_schedules)

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": "<Datumszeichenfolge 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": [<Schedule>, ...]
},
"responseCode": 0
}
}

7. Zukünftige Zeitpläne abrufen (get_future_schedules)

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": [<Schedule>, ...]
},
"responseCode": 0
}
}

8. Zeitplan entfernen (remove_schedule)

Entfernt einen bestimmten Zeitplan nach ID.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "remove_schedule",
"fields": {
"id": <Schedule ID>
}
}

Antwort (Erfolg):

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "remove_schedule_ack",
"state": "Zeitplan <Schedule ID> erfolgreich entfernt",
"responseCode": 0
}
}

9. Standort-Feedback abrufen (get_feedback)

Ruft detailliertes Feedback zum Zustand des Systems ab.

{
"extraTags": {
"nodeId": "<Controller SN>_site_0"
},
"time": <Unix Timestamp>,
"message_type": "get_feedback",
"fields": {
"device": <Gerät (Knoten) Ebene>
}
}

Antwort (Erfolg):

Feedback-Payload-Struktur

10. Standorttopologie (get_toplogy)

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>,
"nodeType": <nodeType>,
"nomCurrent": <nominalCurrent>
"children": [{<ChildObject>}]
},
"responseCode": 0
}
}

Standard-Zeitplan-Antwortformat

{
"id": <Schedule ID>,
"device_type": "<Gerätetyp>",
"node_id": "<Knoten-ID>" (Optional),
"start_time": <Unix Timestamp>,
"end_time": <Unix Timestamp>,
"policy": "<Zeitplanrichtlinie>",
"power_setpoint_w": <Sollwert in Watt>,
"created_at": <Unix Timestamp>
}

Komponententypen und Richtlinien

Für Details zu verfügbaren Komponenten und Richtlinien, die geplant werden können, siehe den Abschnitt MQTT-Komponenten und Richtlinien in der Live MQTT Control-Dokumentation.

Gerätespezifische Zeitpläne können unter Verwendung des optionalen Feldes node_id gesendet werden, das sich auf die Knoten-ID des steuerbaren Geräts bezieht.

Fehlermanagement

Alle Nachrichten können bei Auftreten eines Fehlers eine Fehlerantwort mit responseCode: 1 zurückgeben:

{
"requestTime": <Unix Timestamp>,
"time": <Unix Timestamp>,
"siteNodeId": "<Controller SN>_site_0",
"data": {
"message_type": "<Nachrichtentyp>_ack",
"error": <Fehlertext>,
"responseCode": 1
}
}

Wenn ein nicht verwandter Fehler auftritt, wird der Nachrichtentyp (general_error) sein.

Häufige Fehler sind:

  • Zeitplankonflikt mit bestehenden Zeitplänen
  • Ungültiger Zeitrahmen
  • Gerätetyp nicht gefunden
  • Zeitplan-ID nicht gefunden
  • Ungültige Richtlinie für den Gerätetyp

Regeln zur Zeitplanverwaltung

  1. Ü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 denselben Gerätetyp dürfen sich nicht überlappen
    • Bestehende, sich überlappende Zeitpläne werden gelöscht, wenn die Variable remove_overlap beim Erstellen eines neuen Zeitplans auf True gesetzt ist.
  2. Jeder Zeitplan muss haben:
    • Einen gültigen Gerätetyp
    • Eine Startzeit (Unix-Zeitstempel)
    • Eine Endzeit (Unix-Zeitstempel)
    • Eine Richtlinie (die den verfügbaren Richtlinien des Gerätetyps entspricht)
    • Einen Sollwert (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 können 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 festgelegt werden
  7. Das System wendet automatisch die geeignete Richtlinie an, wenn ein Zeitplan aktiv wird