NEWS
[HowTo] Huawei SUN2000 WR Modbus mit node-red (read + write)
-
@badsnoopy667
Bleibt Port 502 ?@geo-ioan Ja, der sollte passen
-
@geo-ioan Ja, der sollte passen
@badsnoopy667 - leidet auch nichts gebracht ... ich muss mich nochmal absichern dass im WR das Protokoll aktiviert wurde
-
@badsnoopy667 - leidet auch nichts gebracht ... ich muss mich nochmal absichern dass im WR das Protokoll aktiviert wurde
-
Hallo,
ich habe die Vorschläge hier benutzt aber wollte bei den Abfageintervallen etwas flexibler sein da ich zunächst gar nich wusste was ich alles abfragen möchte.
Mir hat die NodeRed Info gesagt ich solle bei mehrern Abfragen den flex getter nutzen. Das habe ich gemacht und das läuft seit ein paar Wochen problemlos. Ist jetzt nichts neues nur ein paar Ideen aus diversen Beiträgen hier vermischt damit es für mich passt.

Hier der Flow zum importieren:
flow_FlexGetter_Olli_v1.jsonAnbei auch nochmal die Modbus Register Definitions
Solar Inverter Modbus Interface Definitions.pdf -
Hallo,
ich habe die Vorschläge hier benutzt aber wollte bei den Abfageintervallen etwas flexibler sein da ich zunächst gar nich wusste was ich alles abfragen möchte.
Mir hat die NodeRed Info gesagt ich solle bei mehrern Abfragen den flex getter nutzen. Das habe ich gemacht und das läuft seit ein paar Wochen problemlos. Ist jetzt nichts neues nur ein paar Ideen aus diversen Beiträgen hier vermischt damit es für mich passt.

Hier der Flow zum importieren:
flow_FlexGetter_Olli_v1.jsonAnbei auch nochmal die Modbus Register Definitions
Solar Inverter Modbus Interface Definitions.pdfHallo, ich versuche gerade meinem Akku beizubringen, dass er Laden soll. Das klappt auch soweit, jedoch habe ich noch nicht herausgefunden, wie ich es schaffe, dass ich ihm die maximale Ladeleistung sagen kann.
[Energ y storag e]Max imum chargi ng power
RW
UIN T32
W
1
47075
2
[0, Upper thres hold]
Defau lt value: 3500;
√Kann mit jemand erklären, wie ich das Register 47075 mit der Zahl 3000 schreiben kann im Format UINT32?
ich habe ein inject als string mit dem Wert 3000. Wie bekomme ich nun am ende das richtige ins register?
Das wird mir angezeigt, wenn ich das register auslese.
08d78b3f162110b7 : msg.payload : Object object data: array[2] 0: 0 1: 5000 buffer: buffer[4] 0: 0x0 1: 0x0 2: 0x13 3: 0x88Vielen Dank schon mal
-
Hi,
ich nutze auch den Flow für die Auswertung meines Huawei. Danke dafür, klappt soweit erst mal einwandfrei.Leider ist immer mal wieder so, dass der Flow seine Arbeit einstellt. D.h. die Werte werden dauerhaft nicht mehr aktualisiert. "Flow neu starten" löst das Problem sofort, allerdings ist dies ja keine produktive Lösung. Fehlermeldungen sehe ich keine.
Gibt es einen Tipp, was dies verursachen könnte oder noch besser Lösungen?
-
Hallo zusammen
ich habe es tatsächlich geschafft, mich mit mit der Huawei PV zu verbinden. Das Modell vom Inverter wird schon einmal ausgegeben. Insofern müssen ja IP und ID ( in meinem Fall 1) stimmen. Ich habe 2 WR.
Die DTU liefert mir allerdings bei dem Register 37113 nur eine 0
auch die anderen Werte wie Frequenz oder Grid Voltage der Phasen liefert eine 0
Jemand ne Idee, woran es liegen könnte?
Oder Stimmen die Register nicht mehr.....oder liegt es evtl daran, dass ich 2 WR habe?
P.s. wenn ich in dem flow oben beim Node Model eine 2 als ID eintrage, spuckt er mir das selbe WR Modell aus....obwohl ich einen 8ktl und einen 6 ktl habe
-
Hi,
ich nutze auch den Flow für die Auswertung meines Huawei. Danke dafür, klappt soweit erst mal einwandfrei.Leider ist immer mal wieder so, dass der Flow seine Arbeit einstellt. D.h. die Werte werden dauerhaft nicht mehr aktualisiert. "Flow neu starten" löst das Problem sofort, allerdings ist dies ja keine produktive Lösung. Fehlermeldungen sehe ich keine.
Gibt es einen Tipp, was dies verursachen könnte oder noch besser Lösungen?
-
@cksoft
Hast du einen Intervall laufen?

Am Anfang ein Input Node das alle x Sekunden sendet. -
@cksoft
Hast du einen Intervall laufen?

Am Anfang ein Input Node das alle x Sekunden sendet. -
Hallo zusammen
ich habe es tatsächlich geschafft, mich mit mit der Huawei PV zu verbinden. Das Modell vom Inverter wird schon einmal ausgegeben. Insofern müssen ja IP und ID ( in meinem Fall 1) stimmen. Ich habe 2 WR.
Die DTU liefert mir allerdings bei dem Register 37113 nur eine 0
auch die anderen Werte wie Frequenz oder Grid Voltage der Phasen liefert eine 0
Jemand ne Idee, woran es liegen könnte?
Oder Stimmen die Register nicht mehr.....oder liegt es evtl daran, dass ich 2 WR habe?
P.s. wenn ich in dem flow oben beim Node Model eine 2 als ID eintrage, spuckt er mir das selbe WR Modell aus....obwohl ich einen 8ktl und einen 6 ktl habe
@fragmike Hallo Mike,
Ich habe auch zwei Wechselrichter. Bei mir muss ich für den Wechselrichter eins, die ID:1 eintragen. Auf dem Wechselrichter hängt auch mein dtu und meine Luna, also bei denen auch die ID:1
Bei dem 2. Wechselrichter lese ich nur den WEchselrichter selber aus. sind die selben register und die selbe IP-Adresse, allerdings mit der Unit ID:2.Schau mal bei deinen Nodes durch ob die daten richtig hinterlegt sind. Evtl. sind es bei dir auch andere ID Nummern. Bei dem tread ersteller ist es, wenn ich es noch richtig im Kopf habe, durch einen Wechselrichtertausch die ID:2 und die ID:1 gibt es bei ihm gar nicht mehr.
-
@fragmike Hallo Mike,
Ich habe auch zwei Wechselrichter. Bei mir muss ich für den Wechselrichter eins, die ID:1 eintragen. Auf dem Wechselrichter hängt auch mein dtu und meine Luna, also bei denen auch die ID:1
Bei dem 2. Wechselrichter lese ich nur den WEchselrichter selber aus. sind die selben register und die selbe IP-Adresse, allerdings mit der Unit ID:2.Schau mal bei deinen Nodes durch ob die daten richtig hinterlegt sind. Evtl. sind es bei dir auch andere ID Nummern. Bei dem tread ersteller ist es, wenn ich es noch richtig im Kopf habe, durch einen Wechselrichtertausch die ID:2 und die ID:1 gibt es bei ihm gar nicht mehr.
@doom-86 danke für deine Info. Die IP habe ich nicht geändert. Sollte ja immer die von dongle sein, soweit ich das verstanden habe. Bei den IDs habe ich schon mal alles von 0-4 in der node (und auch nur dort)probiert. Ansonsten habe ich nichts geändert.
-
@spexx sagte in [HowTo] Huawei SUN2000 WR Modbus mit node-red (read + write):
@mickym
Ist schon eine Weile her als ich das gemacht habe. Ganz verstanden habe ich es noch nicht, könntest du mal ein Beispiel erstellen?
Vermutlich wird das dann nicht gehen, wenn die Werte noch eine zusätzliche Umrechnung benötigen (wie z.B. die Uhrzeit) oder wenn ich bei einigen Werten direkt noch ein Text hinterlege, z.B. beim "Device Status"? Dennoch würde mich dein Vorschlag interessieren.So ich habe mich mal ein paar Stunden hingesetzt und - klar da musste ich selbst bissi rumprobieren - wie folgt vereinfacht.
Ich habe kein Modbus - deswegen habe ich einfach einen Forumstext genommen und nur die Bytes die ggf. modifiziert werden müssen zum Testen entsprechend angepasst.
So ich habe mal Deinen ersten Kasten "Inverter" vereinfacht!!

Der ganze "gelbe Kasten" schrumpft also auf den "grünen Kasten" - ohne dass Du was an Funktionalität einbüßt.
Grundsätzlich ist es meist nicht sinnvoll die Werte als beschreibbar zu exportieren - auch wenn du value genommen hast. Aber kann man machen (muss man in meiner Lösung nur umstellen, dann werden alle neu angelegten States beschreibbar). Die Werte sind natürlich Käse - ich habe nur darauf geachtet, dass bei der Zeit was sinnvolles rauskommt und beim Device-Status.

Letztlich hast Du ein paar nette Formatierungen eingebaut - wie den State-Name und State-Units. Ich habe das jeweils in einer eigenen Change Node abgefüttert - da das ja im Grunde optional ist.
So nun zur Erläuterung der Vereinfachungen und dem Flow im Detail:

Kernpunkt ist, dass Du den Namen in der Parser-Node bereits so benennst wie die States später heißen sollen - da diese zum Topic werden:

Das Aufsplitten in einzene Ausgänge habe ich also nicht gemacht (kein fan out).
Die Namen - sollten den State Namen entsprechen, diese werden vorerst zum topic
Den Device Status habe ich als Hexstring ausgeben lassen - muss man nicht - aber Du hast in Deiner function Node mit Hex-Strings gearbeitet, deswegen habe ich es auch gemacht - wobei ich aber die Buffer Node umrechnen lasse.Die Units in den States, die Du ja gesetzt hast, werden in der 1. Change Node gesetzt. Den StateName noch solange der topic unmodifiziert aus der Parser Node rauskommt. 1. und 2. Change Node kann man natürlich in eine Change Node zusammenfassen - das dient hier nur der Demonstration.
Vermutlich wird das dann nicht gehen, wenn die Werte noch eine zusätzliche Umrechnung benötigen (wie z.B. die Uhrzeit) oder wenn ich bei einigen Werten direkt noch ein Text hinterlege, z.B. beim "Device Status"? Dennoch würde mich dein Vorschlag interessieren.
Wie Du siehst geht es - man fischt halt die Nachrichten über das topic raus, die man noch modifizieren möchte (s. switch Node).

Die anderen lässt man durchflutschen und macht halt nichts mehr.
Es wurde bewusst auf Javascript und function Nodes verzichtet und alles mit JSONATA gemacht - da dies halt weniger Code-Schreiberei ist und in meinen Augen sehr elegant - auch wenn man sich da erst reinfuchsen muss.
Zu Schluss wird halt das Topic um den ganzen Pfad erweitert, um die States in die richtigen Datenpunkte zu schreiben:

Also easy. Und somit ist nur noch eine iobroker-Out nötig und wie gesagt - ich würde die States auf Read-Only setzen - kannst natürlich auch ändern.

Alles andere wird ja in den Nachrichtenobjekten selbst gesetzt.
Hier der Flow zum Import:
Die Change Nodes sind glaube auch von allgemeinem Interesse - weil sie zeigen, wie schön und schnell man mit JSONATA über "Übersetzungsobjekte" eine payload anpassen kann.
@mickym, den von dir aufgezeigten Ansatz finde ich sehr interessant und würde diesen gerne verwenden.
Nur leider verstehe ich nicht wie du von den Modbus-Adressen auf die Bytes im Node inject kommst. :man-shrugging:
Könntest du dies bitte an den beiden ersten Werten im buffer-parser (PV1_voltage und PV1_current) mit den Adressen 32016 und 32017 erklären?Jetzt wünsche ich allen aber erstmal einen guten Rutsch ins neue Jahr.
-
@mickym, den von dir aufgezeigten Ansatz finde ich sehr interessant und würde diesen gerne verwenden.
Nur leider verstehe ich nicht wie du von den Modbus-Adressen auf die Bytes im Node inject kommst. :man-shrugging:
Könntest du dies bitte an den beiden ersten Werten im buffer-parser (PV1_voltage und PV1_current) mit den Adressen 32016 und 32017 erklären?Jetzt wünsche ich allen aber erstmal einen guten Rutsch ins neue Jahr.
@mage Nun wenn Du Dir den buffer mal als String im debug Fenster anschaust, dann steht da nur Schmarrn drin.

Den Buffer muss Dir schon Deine getter-Node liefern. Mein Ansatz beginnt da, wie die buffer Node dieser Puffer interpretiert.
Also vergiss den Inhalt der Inject Node selbst.
Wie Du mehrere Register ausliest, und also die 3 großen Blöcke machst oder diese sogar in einen Buffer abfrägst hat @Spexx ja beschrieben. Dieser Puffer wird nur mit meinem Ansatz anders aufbereitet, als dann zig-Ausgänge zu haben und diese einzeln zu schreiben.
Wie Du also x-Bytes aufeinmal in einen Puffer ausliest wurde hier beschrieben:
https://forum.iobroker.net/post/1007480Für die Interpretation der Bytes hat ja mal 2 Tabellen mit angehängt, das musst Du ggf. in eigener Doku nachlesen.
Für dieses Jahr mache ich aber auch erst mal Schluß hier und wünsche Dir und allen Lesern auch einen guten Rutsch. Antwort also bei Bedarf erst nächstes Jahr.

-
Hallo Zusammen,
Gibt es die Möglichkeit, die Wirkleistung auf den einzelnen Phasen (Grid) auszulesen, wenn ja, auf welche Register?
Die einzelnen Spannungen und die einzelnen Ströme bekommen ich auf den Register:
37101 - Grid voltage Phase 1 [V]
37103 - Grid voltage Phase 2 [V]
37105 - Grid voltage Phase 3 [V]37107 - Grid current Phase 1 [A]
37109 - Grid current Phase 2 [A]
37111 - Grid current Phase 3 [A]Habe die Regiester inzwischen gefunden:
37132 - Phase A ActivePower
37134 - Phase B ActivePower
37136 - Phase C ActivePower
-
@mage Nun wenn Du Dir den buffer mal als String im debug Fenster anschaust, dann steht da nur Schmarrn drin.

Den Buffer muss Dir schon Deine getter-Node liefern. Mein Ansatz beginnt da, wie die buffer Node dieser Puffer interpretiert.
Also vergiss den Inhalt der Inject Node selbst.
Wie Du mehrere Register ausliest, und also die 3 großen Blöcke machst oder diese sogar in einen Buffer abfrägst hat @Spexx ja beschrieben. Dieser Puffer wird nur mit meinem Ansatz anders aufbereitet, als dann zig-Ausgänge zu haben und diese einzeln zu schreiben.
Wie Du also x-Bytes aufeinmal in einen Puffer ausliest wurde hier beschrieben:
https://forum.iobroker.net/post/1007480Für die Interpretation der Bytes hat ja mal 2 Tabellen mit angehängt, das musst Du ggf. in eigener Doku nachlesen.
Für dieses Jahr mache ich aber auch erst mal Schluß hier und wünsche Dir und allen Lesern auch einen guten Rutsch. Antwort also bei Bedarf erst nächstes Jahr.

@mickym, vielen lieben Dank. Da lag ich wohl komplett daneben.

Ich habe die Abfrage mal für die Adressen vom Dongle erstellt.
bsp.jsonDie Abfrage funktioniert auch.

Nur verstehe ich nicht weshalb bei der Load_power und Total_Battery_power so große Werte ausgegeben werden.
Laut der Doku ist der Faktor der Gleiche.

Bei der einzelnen Abfrage bekomme ich die Werte richtig angezeigt.
bsp2.json

-
@mickym, vielen lieben Dank. Da lag ich wohl komplett daneben.

Ich habe die Abfrage mal für die Adressen vom Dongle erstellt.
bsp.jsonDie Abfrage funktioniert auch.

Nur verstehe ich nicht weshalb bei der Load_power und Total_Battery_power so große Werte ausgegeben werden.
Laut der Doku ist der Faktor der Gleiche.

Bei der einzelnen Abfrage bekomme ich die Werte richtig angezeigt.
bsp2.json

Grundsätzlich solltest nichts in den Node-Red adapter reinschrieben, sondern immer unter 0_userdata.0

Ich denke ich habe Deinen Fehler gefunden:

Wenn Du Dir meinen Flow anschaust - dann sind 32bit Zahlen 4 Bytes groß und nicht 2 Bytes. Bei Deinen Registern mag 2 stimmen - weil die immer in Modbus glaub jedes Register aus 2 Bytes besteht (als 16 bit) und nicht ein Byte - also müsstest Du den Offset neu berechnen.
Probiere es also mal bei Deiner Sammelabfrage mit dieser Buffer Node:
Wenn die Buffer-Node verwendest:

Dann sollten alle 32 Bit Zahlen die korrekten Byte Offset von 4 enthalten. Also Register im Modbus (16 bit) - Offset im Bufferparse 1 Byte (8 bit)
-
Grundsätzlich solltest nichts in den Node-Red adapter reinschrieben, sondern immer unter 0_userdata.0

Ich denke ich habe Deinen Fehler gefunden:

Wenn Du Dir meinen Flow anschaust - dann sind 32bit Zahlen 4 Bytes groß und nicht 2 Bytes. Bei Deinen Registern mag 2 stimmen - weil die immer in Modbus glaub jedes Register aus 2 Bytes besteht (als 16 bit) und nicht ein Byte - also müsstest Du den Offset neu berechnen.
Probiere es also mal bei Deiner Sammelabfrage mit dieser Buffer Node:
Wenn die Buffer-Node verwendest:

Dann sollten alle 32 Bit Zahlen die korrekten Byte Offset von 4 enthalten. Also Register im Modbus (16 bit) - Offset im Bufferparse 1 Byte (8 bit)
-
@mage das kann ich nicht beantworten- schaut aber erst mal so aus, als ob da die Node noch nicht bereit ist- warum liest man aber nicht alles auf einmal aus? Das würde den Bus viel weniger belasten? Du kannst wieder eine Delay dazwischen hängen, aber warum liest man nicht 100 Register auf einmal? Oder halt mit einer debug node schauen, wo die Nachricht verschluckt wird.
-
@mage das kann ich nicht beantworten- schaut aber erst mal so aus, als ob da die Node noch nicht bereit ist- warum liest man aber nicht alles auf einmal aus? Das würde den Bus viel weniger belasten? Du kannst wieder eine Delay dazwischen hängen, aber warum liest man nicht 100 Register auf einmal? Oder halt mit einer debug node schauen, wo die Nachricht verschluckt wird.

