himpler.com himpler.com

Wechselrichter Solarmax 3000s mit Node-RED abfragen

Zugegebener Maßen ist der Wechselrichter Solarmax 3000s inzwischen schon etwas in die Jahre gekommen. Dennoch verrichtet er noch immer zuverlässig seinen Dienst. Wer nicht auf einen der angebotenen Datenlogger zurückgreifen möchte, kann die Netzwerkschnittstelle des Wechselrichters zur Abfrage der Leistungsdaten verwenden.

Die Solarmax GmbH bietet etwas versteckt eine gute Dokumentation der Kommunikationsschnittstelle des Wechselrichters an. Zur Vorbereitung muss der Wechselrichter nur mit einem Netzwerkkabel in das Heimnetzwerk eingebunden und anschließend konfiguriert werden. Eine gerätespezifische Anleitung zur Netzwerkkonfiguration lässt sich auf der Homepage des Herstellers finden. Kurzanleitung für den Solarmax 3000s: Nach Einstellung einer IP-Adresse und der Auswahl eines Ports (> 1023) lässt sich der Wechselrichter bereits ansprechen.

Wer nun auf eine Weboberfläche mit einer Visualisierung der Leistungsdaten spekuliert hat, wird nun jedoch enttäuscht sein. So etwas bietet der Solarmax 3000s nicht. Die Daten müssen hier manuell abgefragt und ausgewertet werden. Doch wie macht man das?

TCP Requests mit Node-RED

Der Solarmax 3000s hat eine MaxComm Schnittstelle; die Kommunikation mit dem Wechselrichter erfolgt über das MaxComm Datenprotokoll. Ein Blick in das Protokoll zeigt schnell, dass sich hier je nach Modell erfreulich viele Daten auslesen lassen.

Zur Abfrage verwende ich eine Node-RED Instanz, die ohnehin schon im lokalen Netzwerk in Betrieb ist. Der übersichtliche Flow sendet einen TCP-Request (eine Anfrage über das lokale Netzwerk) an den Wechselrichter, empfängt die vom Wechselrichter zurückgegebene Antwort und speichert diese schließlich in einer Datenbank ab. Alternativ lässt sich der Datensatz aber auch einer CSV Datei hinzufügen, die dann ganz klassisch in einem Tabellenkalkulationsprogramm weiterverarbeitet werden kann.

Der gesamte Flow zur Abfrage eines Solarmax 3000s

Der gesamte Flow zur Abfrage eines Solarmax 3000s

Zunächst benötigen wir einen Inject Node, der unseren Flow alle fünf Minuten triggert. Eine typische Rückmeldung dauert hier rund 300ms, ein Timeout erfolgt nach 3 Sekunden. Eine häufigere Ausführung ist also problemlos machbar, aber für meinen Anwendungszweck nicht notwendig. Der Inject-Node enthält noch einen Payload mit der Nachricht, die an den Wechselrichter gesandt wird.

{FB;01;66|64:SWV;DDY;DMT;DYR;THR;TMI;KHR;KDY;KLD;KMT;KLM;KYR;KLY;KT0;UDC;UL1;IDC;IL1;PAC;PIN;PRL|1AAA}

Eine genaue Erklärung der Felder lässt sich im oben verlinkten MaxComm Protokoll nachschlagen. Neben Adressinformationen, der Nachrichtenlänge und einer Checksumme am Ende, beinhaltet die Nachricht an den Wechselrichter vor allem die abzufragenden Datenpunkte.

Der nächste Node ist ein Tcp-Request Node, der den Payload an den Solarmax Wechselrichter schickt. Hier geben wir die IP-Adresse und den Port des Wechselrichters an.

Konfiguration des TCP-Request Nodes

Konfiguration des TCP-Request Nodes

Nach dem Absetzen des TCP-Requests erwarten wir eine Antwort, welche wir zunächst mit einer Funktion in ihre Einzelteile zerlegen. Gleichzeitig wandeln wir die zurückgelieferten hexadezimalen Zahlen um.

let a = msg.payload.toString().split(';');
let data = {};

for (let i = 2; i < a.length; i++) {
    if (i == 2) {
        data[a[i].substr(6, 3)] = parseInt((a[i].substr(10)).replace(/[^a-f0-9]/gi, ''), 16);
    } else {
        data[a[i].substr(0, 3)] = parseInt((a[i].substr(4)).replace(/[^a-f0-9]/gi, ''), 16);
    }
}

msg.payload = data;

return msg;

Nun lassen sich die Werte des Wechselrichters weiter verarbeiten. In diesem Beispiel sollen die Werte in einer vorbereiteten MySQL Datenbank abgespeichert werden. Die nachstehende Funktion sorgt für die Erstellung des passenden SQL-Statements, welches im Anschluss an die MySQL Datenbank übergeben wird.

const o = msg.payload;

const now = new Date().toISOString()
    .replace('T', ' ')
    .replace(/\.\d{3}Z/, '');

const columns = `${Object.keys(o).join(',')}, created_at, updated_at`
const values = `${Object.values(o).join(',')}, '${now}', '${now}'`

msg.topic = `insert into solardata (${columns}) VALUES (${values})`

return msg;

Die Funktion nutzt die Attributnamen des Objekts, ergänzt diese noch um Werte und setzt sie als String zusammen. Dies sind dann die Spaltennamen der Tabelle. Ebenso werden die Objektwerte zu einem String zusammengesetzt und um zwei vorbereitete Timestamps ergänzt.

Wenn alles richtig konfiguriert wurde, erscheint nun alle fünf Minuten ein neuer Eintrag in der Tabelle der Datenbank. Die Daten lassen sich nun beliebig verwenden, z.B. für ein Webinterface mit einer Visualisierung.

Visualisierung der abgefragten Daten von einem Solarmax 3000s

Visualisierung der abgefragten Daten von einem Solarmax 3000s

Bonus: Verwendung der Daten im Energy Dashboard von HomeAssistant

Zusätzlich lassen sich die Daten auch im Energy Dashboard von HomeAssistant nutzen. Dazu muss der Flow nur ein klein wenig erweitert werden. Mit Hilfe des Sensor-Nodes, der im Paket node-red-contrib-home-assistant-websocket enthalten ist, erstellen wir vier Entitäten, die parallel zur Datenbank alle fünf Minuten mit den Werten des Wechselrichters aktualisiert werden.

Konfiguration des HomeAssistant Sensors für das Energy Dashboard

Konfiguration des HomeAssistant Sensors für das Energy Dashboard

Die Sensoren müssen so konfiguriert werden, dass sie sich als Entität im Energy Dashboard auswählen lassen. Wichtig sind hier die Device class, State class und die Unit of Measurement die hier im Beispiel der Monatswerte als energy, kWh und total increasing angegeben werden müssen. Worauf bei der Konfiguration zu achten ist, lässt sich auch auf dieser Troubleshooting-Seite nachlesen. Damit die Einheit bei den Tageswerten passt, müssen diese noch vor Übergabe an die Entität durch Zehn geteilt werden.

Übergabe der Daten an HomeAssistant Entitäten zur Darstellung im Energy Dashboard

Übergabe der Daten an HomeAssistant Entitäten zur Darstellung im Energy Dashboard

Das könnte dir auch gefallen