Seite 1 von 2

Sungrow Wechselrichter unter NodeRed auslesen

Verfasst: 10.07.2022, 13:51
von ersthelfer
Hallo,

hat jemand von Euch schon mal versucht einen Sungrow Wechselrichter (Serie SHxRT) mit hilfe von NodeRed auszulesen und kann mich an seinem Wissen teilhaben lassen?

Ich habe mal versucht erste Schritte mit dem Programm QModMaster zu machen.
Ein erster Connect klappt auch

Code: Alles auswählen

Sys > 13:48:44:829 - Connecting to IP : 192.168.002.072:502 OK
Das war es dann aber auch schon....

Vielen Dank

Re: Sungrow Wechselrichter unter NodeRed auslesen

Verfasst: 07.09.2022, 10:44
von ersthelfer
Hallo,

ich habe es mittlerweile geschafft mich mit dem Wechselrichter über ModBus TCP zu verbinden.

Dazu habe ich die node-red-contrib-modbustcp Bibliothek verwendet.

Damit lese ich nun das Register 5031 aus, welches laut Beschreibung die aktuell erzeugte Leistung enthält.
ModBus-Reg.JPG
ModBus-Reg.JPG (12.6 KiB) 3839 mal betrachtet
Von dem Node bekomme ich nun ein Array als payload
Debug.JPG
Debug.JPG (17.68 KiB) 3839 mal betrachtet
Kann mir jemand sagen, wie ich das Array jetzt in einen "richtigen" Wert umwandeln kann? (Ich hoffe Ihr wisst, was ich meine. Ich muss ja die beiden Teile des Arrays zu einer Zahl zusammen setzen)


Vielen Dank für Eure Mühe....

Re: Sungrow Wechselrichter unter NodeRed auslesen

Verfasst: 07.09.2022, 15:37
von ptweety
Dazu müsste man die Berechnungsmethode kennen.

Re: Sungrow Wechselrichter unter NodeRed auslesen

Verfasst: 12.10.2022, 16:06
von PV_tom
Hallo ersthelfer,
das zurückgegebene Array ist meines Erachtens mit Messwerten der Leistung in Hexadezimaler Form vom Wechselrichter gekommen.
Array_0: 2706 ist das niederwertigere Byte und hat den Dezimalwert 9990
Array_1: 0 ist das höherwertige Byte ; dieses müsstest du im dezimalen mit 65536 multiplizieren und zum Array_0 addieren.
Aber wahrscheinlich kommt bei einer kleinen PV-Anlage dieser Fall nicht vor.
Du müsstest also die hexadezimalen Werte in dezimale Werte konvertieren.

Eine Frage an dich:
Wie bist du mit Sungrow zufrieden? Ich überlege, ob ich mir eine SHxxRT mit Speicher zulege und den Ersatzstrom bei Netzausfall nutze. Ich hätte auch Interesse an der Einstellung der Node "WR Power".

Re: Sungrow Wechselrichter unter NodeRed auslesen

Verfasst: 17.10.2022, 17:16
von PV_tom
ersthelfer hat geschrieben:
07.09.2022, 10:44
Hallo,

ich habe es mittlerweile geschafft mich mit dem Wechselrichter über ModBus TCP zu verbinden.

Dazu habe ich die node-red-contrib-modbustcp Bibliothek verwendet.

Damit lese ich nun das Register 5031 aus, welches laut Beschreibung die aktuell erzeugte Leistung enthält.

ModBus-Reg.JPG

Von dem Node bekomme ich nun ein Array als payload

Debug.JPG

Kann mir jemand sagen, wie ich das Array jetzt in einen "richtigen" Wert umwandeln kann? (Ich hoffe Ihr wisst, was ich meine. Ich muss ja die beiden Teile des Arrays zu einer Zahl zusammen setzen)


Vielen Dank für Eure Mühe....
Hallo ersthelfer,
ich hatte dir eine kurze Antwort am 12.10.2022 geschickt ohne Bezug auf diese Notiz

Re: Sungrow Wechselrichter unter NodeRed auslesen

Verfasst: 01.12.2022, 11:13
von Tobi001
Hallo ersthelfer,
ich versuche das Selbe wie du, es will aber einfach nicht klappen. (es erscheint immer sofort Disconnected)
Wärst du so nett und würdest einen Screenshot von der Konfiguration des modbustcp Node posten?
Vielen Dank dafür!

Re: Sungrow Wechselrichter unter NodeRed auslesen

Verfasst: 03.12.2022, 09:16
von ersthelfer
Hallo Tobi,

sorry, dass ich mich erst jetzt melde.

Meine Node sieht so aus:
WR-Node.JPG
Hier noch ein paar Hinweise.
1.) Wenn Deine Node ähnlich aussieht, starte Node-Red mal neu.
Ich habe die Erfahrung gemacht, dass wenn ich was an der TCP-Node ändere ich auch häufig einen Disconnect bekomme. Nach einem Neustart von Node Red klappt es dann meisst.

2.) Bist Du über WLAN oder über LAN mit dem Wechselrichter verbunden?
Probier es auf jeden Fall auch mal über LAN aus. Ich kenne ein paar Leute (mich eingeschlossen) bei denen es über WLAN nicht richtig läuft.

Ich hoffe das hilft erstmal.

Re: Sungrow Wechselrichter unter NodeRed auslesen

Verfasst: 29.01.2023, 10:23
von Uwceurope
Hallo zusammen,

Bin beim suchen auf diesen Artikel gestoßen.

Bin jetzt auch Besitzer eines Sungrow Wechselrichters und würde diese gerne auch aufschalten. Ich benutze Node Red bei mir eher als Gateway zu meinem KNX.

Seit ihr mit dem Auslesen der Werte weiter gekommen?

Wie habt ihr die Konvertierung des Leistungswertes gemacht?

Werde mich die Tage mal daran versuchen.

Gruß Olli

Re: Sungrow Wechselrichter unter NodeRed auslesen

Verfasst: 29.01.2023, 11:21
von ersthelfer
Also auslesen klappt mittlerweile.

Vorab:
1.) Nach Möglichkeit über LAN an den Sungrow (per WLAN-Stick soll mittlerweile auch klappen wenn die neueste FW drauf ist, habe ich aber noch nicht intensiv getestet)
2.) Angeblich unterstützt der Sungrow NUR EINE Modbus Verbindung

Re: Sungrow Wechselrichter unter NodeRed auslesen

Verfasst: 25.02.2023, 10:08
von fl1922
Danke für die Hinweise hier im Forum.

Ich habe das noch mal etwas anders gelöst, da ich unterschiedliche Adressen brauche, die teilweise weit auseinander liegen (und ich kann ja nicht tausende Adressen abfragen). Außerdem wollte ich kein polling, sondern einfach manuell die Daten abfragen. (man könnte mit dem Konstrukt auch pollen, dazu müsste man nur den ping node mit dem set payload node verbinden).

Um die Verbindung wiederzuverwenden, habe ich auch nur einen modbus node, der allerdings nur einen ping erzeugt (damit die Verbindung sich nicht schließt). Auf die daraus resultierenden Daten kommt es gar nicht an. Stattdessen habe ich einen node vorangestellt, der die passende payload erzeugt. Man muss leider immer ein interval definieren, daher habe ich hier das JavaScript-Maximum gewählt. Beim nächsten Aufruf wird das plugin das interval clearen und damit kommt es nie zum erneuten Aufruf (solange ich sie ca. alle 24 Tage einmal aufrufe - wenn nicht ists aber auch nicht schlimm).

Anschließend habe ich noch einen parsing node, der die Werte gleich passend umwandelt.

Hier der flow:
Bildschirmfoto von 2023-02-25 09.46.51.png
Bildschirmfoto von 2023-02-25 09.46.51.png (18.8 KiB) 2726 mal betrachtet
Der modbus node:
Bildschirmfoto von 2023-02-25 09.47.18.png
Hier noch der code der payload function. Ich habe ein paar Argumente definiert, um u.a. das Ergebnis gleich richtig konvertieren zu können und zwischen den verschiedenen Datentypen zu unterscheiden. Die data points sind natürlich nur ein Beispiel, man kann das natürlich auf den eigenen Bedarf zuschneiden. Ich benutze msg.topic, um ein paar der Infos über den modbus node hinaus zu transportieren.

Code: Alles auswählen

const addDataPoint = (name, multiplier, unit, startAddress, quantity = 1, doubleWord = null, register = 'FC4') => {
  if (doubleWord === null) {
    doubleWord = quantity === 2;
  }

  return {
    name,
    topic: `${name}:${doubleWord ? 'double' : 'single'}:${unit}*${multiplier}`,
    multiplier,
    unit,
    address: startAddress,
    quantity,
    dataType: register,
    ieeeType: 'off',
    interval: 2147483647 // max interval
  };
};

msg.payload = [
  addDataPoint('dcPower', 1, 'W', 5016, 2), // * 1W
  addDataPoint('loadPower', 1, 'W', 13007, 2), // * 1W
  addDataPoint('exportPower', 1, 'W', 13009, 2), // * 1W
  addDataPoint('totalActivePower', 1, 'W', 13033, 2), // * 1W
  addDataPoint('batteryPower', 1, 'W', 13021), // * 1W
  addDataPoint('batteryLevel', 0.1, '%', 13022), // * 0.1%
  addDataPoint('runningState', 1, '', 13000), // documentation appendix 1.2
  addDataPoint('mppt1Voltage', 0.1, 'V', 5010), // * 0.1V
  addDataPoint('mppt1Current', 0.1, 'A', 5011), // * 0.1A
  addDataPoint('mppt2Voltage', 0.1, 'V', 5012), // * 0.1V
  addDataPoint('mppt2Current', 0.1, 'A', 5013), // * 0.1A
  addDataPoint('directConsumptionToday', 0.1, 'kWh', 13016), // * 0.1kWh
  addDataPoint('directConsumptionPerDay', 0.1, 'kWh', 6385, 31), // * 0.1kWh; 01. - 31. of month
  addDataPoint('directConsumptionPerMonth', 0.1, 'kWh', 6416, 12), // * 0.1kWh; Jan - Dez
];

return msg;
Und hier noch der Code der parsing function:

Code: Alles auswählen

const { payload } = msg;
const [name, wordLength, conversion] = msg.topic.split(':');
const isDoubleWord = wordLength === 'double';
const [unit, multiplier] = conversion.split('*');

const valuesCount = Math.floor((payload?.length ?? 0) / (isDoubleWord ? 2 : 1));
let values = isDoubleWord
    ? new Array(valuesCount).fill(null).map((_, index) => (payload[index * 2 + 1] << 16) + payload[index * 2])
    : payload;
values = values.map(value => parseFloat((value * parseFloat(multiplier)).toFixed(1)));

msg.topic = name;

msg.payload = {
  name,
  unit,
  value: values.length > 1 ? values : values[0] ?? null,
  raw: payload
};

return msg;
Und hier ein Beispiel-Screenshot der Ausgabe:
Bildschirmfoto von 2023-02-25 09.49.23.png
Vielleicht hilfts ja jemandem weiter :) Gruß