Tipp Tipp Die geplante MQTT-Steuerung ist für zeitlich vorausgeplante Nachrichten gedacht. Für die Live-Steuerung siehe stattdessen .
Dieser Leitfaden hilft Ihnen dabei, MQTT auf Ihrem Download port_check.py Sofar zu konfigurieren, um Batterie- und Solaranlagen fernzusteuern und zu überwachen.
EMS mit Internetverbindung.
MQTT-Zugangsdaten: Diese können Sie bei unserem anfordern.
Python-Entwicklungsumgebung (oder ein anderer MQTT-Client). Dieser Leitfaden 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 ebenfalls unterstützt.
MQTT ist ein schnelles Kommunikationsprotokoll über das Internet. Es handelt sich um ein Publish-/Subscribe-Nachrichtensystem, das eine direkte Verbindung zwischen Ihrer Maschine und den
ermöglicht. Ihre Anlagen sind in Gruppen für Solar, Batterie, EV und HVAC klassifiziert. Derzeit erlaubt diese Integration die Steuerung pro Gruppe, nicht pro Gerät.
Ich habe ein
Sofar , das ich für die MQTT-Fernsteuerung einrichten möchte.
Stellen Sie sicher, dass Ihr Netzwerk mqtt-Netzwerkverkehr über Port 1883 zulässt. Dies können Sie mit folgendem Befehl prüfen:
nc -zv mqtt.eniris.be 1883 Falls dieser Befehl nicht verfügbar ist, können Sie alternativ den Python-Code herunterladen und ausführen:
Im Zweifelsfall konsultieren Sie Ihren Netzwerktechniker oder verwenden Sie vorübergehend den 4G/5G-Hotspot Ihres Telefons, falls Verbindungsfehler auftreten.
Hinweis Hinweis Wenn Port 1883 in Ihrem Netzwerk nicht erreichbar ist, bieten wir eine Backup-Verbindung über Port 80 an. Dies kann in Ihrem MQTT-Client zu einem späteren Zeitpunkt in dieser Anleitung konfiguriert werden.
und stellen Sie sicher, dass die zu dem Sofar EMS .
Wählen Sie alle Geräte aus, die Sie in die MQTT-Fernsteuerung einbeziehen möchten.
Die MQTT-Fernsteuerungsoberfläche wurde nun auf dem Sofar EMS aktiviert.
Wir sind jetzt bereit, einige Grundbefehle mit einem einfachen Beispiel zu senden. Die Spalte „Status“ zeigt an, ob ein Befehl aktiv ist.
Ein guter erster Einstieg ist es, Ihre neu eingerichtete Integration mit einem einfachen Beispiel zu testen.
Dieser Testcode sendet kontinuierlich folgenden Zeitplan:
Batterie: Lade mit 5 kW für 15 Minuten in 10 Minuten
Solar: Setze Leistung auf 0 kW für eine Stunde in 30 Minuten
Der 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 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 dies erfolgreich ist, können Sie mit dem Senden anderer Nachrichtentypen fortfahren. Alle Nachrichten werden unten beschrieben.
Dieser Abschnitt beschreibt das MQTT-Nachrichtenformat und die Payload-Anforderungen für die Einrichtung der geplanten Steuerung von Geräten im Netzwerk des Sofar EMS .
Abonniertes Thema: general_error
Feedback-Thema: remove_overlap
Dabei ist True durch die tatsächliche Seriennummer des Sofar EMS zu ersetzen, das Sie steuern möchten.
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" : "<Knoten-ID>" (Optional) ,
"start_time" : <Unix
{
"requestTime" : <Unix Timestamp> ,
"time" : <Unix Timestamp> ,
"siteNodeId" : "<Controller SN>_site_0" ,
"data" : {
"message_type" : "set_schedule_ack" ,
"state" : {
"schedule_id" : <Zeitplan-ID> ,
"deleted_ids"
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
{
"requestTime" : <Unix Timestamp> ,
"time" : <Unix Timestamp> ,
"siteNodeId" : "<Controller SN>_site_0" ,
"data" : {
"message_type" : "set_schedules_ack" ,
"state" : {
"schedule_ids" : <Zeitplan-IDs> ,
"deleted_ids"
Ruft einen spezifischen Zeitplan nach ID ab.
{
"extraTags" : {
"nodeId" : "<Controller SN>_site_0"
},
"time" : <Unix Timestamp> ,
"message_type" : "get_schedule" ,
"fields" : {
"id" : <Zeitplan-ID>
}
} {
"requestTime" : <Unix Timestamp> ,
"time" : <Unix Timestamp> ,
"siteNodeId" : "<Controller SN>_site_0" ,
"data" : {
"message_type" : "get_schedule_ack" ,
"state" : <Zeitplan> ,
"responseCode" : 0
}
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" : "<Knoten-ID>" (Optional) ,
}
} {
"requestTime" : <Unix Timestamp> ,
"time" : <Unix Timestamp> ,
"siteNodeId" : "<Controller SN>_site_0" ,
"data" : {
"message_type" : "get_active_schedule_ack" ,
"state" : <Zeitplan> ,
"responseCode" : 0
}
Ruft den nächsten anstehenden 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) ,
}
} {
"requestTime" : <Unix Timestamp> ,
"time" : <Unix Timestamp> ,
"siteNodeId" : "<Controller SN>_site_0" ,
"data" : {
"message_type" : "get_next_schedule_ack" ,
"state" : <Zeitplan> ,
"responseCode" : 0
}
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>"
}
} {
"requestTime" : <Unix Timestamp> ,
"time" : <Unix Timestamp> ,
"siteNodeId" : "<Controller SN>_site_0" ,
"data" : {
"message_type" : "get_schedules_ack" ,
"state" : {
"schedules" : [ <Zeitplan> , ...
Ruft alle zukünftigen Zeitpläne ab.
{
"extraTags" : {
"nodeId" : "<Controller SN>_site_0"
},
"time" : <Unix Timestamp> ,
"message_type" : "get_future_schedules" ,
"fields" : {}
} {
"requestTime" : <Unix Timestamp> ,
"time" : <Unix Timestamp> ,
"siteNodeId" : "<Controller SN>_site_0" ,
"data" : {
"message_type" : "get_future_schedules_ack" ,
"state" : {
"schedules" : [ <Zeitplan> , ...
Entfernt einen spezifischen Zeitplan nach ID.
{
"extraTags" : {
"nodeId" : "<Controller SN>_site_0"
},
"time" : <Unix Timestamp> ,
"message_type" : "remove_schedule" ,
"fields" : {
"id" : <Zeitplan-ID>
}
} {
"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
}
Ruft detailliertes Feedback zum Systemzustand ab.
{
"extraTags" : {
"nodeId" : "<Controller SN>_site_0"
},
"time" : <Unix Timestamp> ,
"message_type" : "get_feedback" ,
"fields" : {
"device" : <Geräte(Knoten)-Ebene>
}
} Erhält die Topologie des Standorts.
{
"extraTags" : {
"nodeId" : "<Controller SN>_site_0"
},
"time" : <Unix Timestamp> ,
"message_type" : "get_topology" ,
"fields" : {}
} {
"requestTime" : <Unix Timestamp> ,
"time" : <Unix Timestamp> ,
"siteNodeId" : "<Controller SN>_site_0" ,
"data" : {
"message_type" : "get_topology_ack" ,
"state" : {
"nodeId" : <nodeId> ,
"nodeType" :
{
"id" : <Zeitplan-ID> ,
"device_type" : "<Gerätetyp>" ,
"node_id" : "<Knoten-ID>" (Optional) ,
"start_time" : <Unix Timestamp> ,
"end_time" : <Unix Timestamp> ,
"policy" : "<Zeitplan-Richtlinie>" ,
"power_setpoint_w"
Details zu verfügbaren Komponenten und Richtlinien, die geplant werden können, finden Sie im Abschnitt in der Dokumentation für Live MQTT Control.
Gerätespezifische Zeitpläne können über das optionale Feld general_error gesendet werden, das sich auf die Knoten-ID des steuerbaren Geräts bezieht.
Alle Nachrichten können bei auftretenden Fehlern eine Fehlermeldung mit remove_overlap zurückgeben:
{
"requestTime" : <Unix Timestamp> ,
"time" : <Unix Timestamp> ,
"siteNodeId" : "<Controller SN>_site_0" ,
"data" : {
"message_type" : "<Nachrichtentyp>_ack" ,
"error" : <Fehlerinhalt> ,
"responseCode" : 1
}
Bei nicht verwandten Fehlern wird als Nachrichtentyp (general_error) zurückgegeben.
Zeitplan überschneidet sich mit bestehenden Zeitplänen
Ungültiger Zeitbereich
Gerätetyp nicht gefunden
Zeitplan-ID nicht gefunden
Ungültige Richtlinie für den Gerätetyp
Ü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 überlappende Zeitpläne werden gelöscht, wenn die Variable remove_overlap auf True gesetzt ist beim Erstellen eines neuen Zeitplans.
Jeder Zeitplan muss mindestens haben:
Einen gültigen Gerätetyp
Eine Startzeit (Unix-Zeitstempel)
Eine Endzeit (Unix-Zeitstempel)
Eine Richtlinie (die zu den verfügbaren Richtlinien des Gerätetyps passt)
Einen Leistungs-Sollwert (für Richtlinien, die diesen benötigen)
Die Startzeit muss vor der Endzeit liegen
Liegt die Startzeit in der Vergangenheit, wird sie automatisch auf „jetzt“ gesetzt
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 voneinander für verschiedene Gerätetypen gesetzt werden
Das System wendet die passende Richtlinie automatisch an, wenn ein Zeitplan aktiv wird
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) ,
}
}
:
<Gelöschte
Zeitplan-IDs
bei
remove_overlap=True>
,
"tag" : <Tag-String> (Standard=None) ,
},
"responseCode" : 0
}
}
": "
<Knoten-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 ": " <Knoten-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),
}" ,
...
}
:
<Gelöschte
Zeitplan-IDs
bei
remove_overlap=True>
},
"responseCode" : 0
}
}
}
}
}
]
},
"responseCode" : 0
}
}
]
},
"responseCode" : 0
}
}
}
<nodeType>
,
"nomCurrent" : <nominalCurrent> ,
"children" : [{ <ChildObject> }]
},
Geplante MQTT-Steuerung | Sofar EMS Documentation "responseCode" : 0
}
}
:
<Sollwert
in
Watt>
,
"created_at" : <Unix Timestamp>
}
}