Hybrid Wechselrichter Sungrow SH10RT und Speicher Einbindung in IPS

Ja ich habe auch das DTSU666 aber ich befürchte da kommt man so über Modbus TCP nicht ran. Höchsten über einen direkten Abgriff.

Ich habe zwar was zum DTSU gefunden, aber ich denke, dass man hier direkt eine serielle Verbindung aufbauen müsste. Der DTSU ist ja an den WR angekoppelt, ich vermute, dass der die Register nicht 1zu1 durchreichen wird.
(https://github.com/bohdan-s/Sungrow-Inverter/blob/main/Modbus%20Information/DTSU666%20Meter%20Communication%20Protocol_20210601.pdf)

Das hatte ich befüchtet, schade.
Vielleicht ist das aber auch gar nicht notwendig, da ich an die wichtigen Werte wohl auch über den Wechselrichter dran komme.

Moin,

leider bin ich schon wieder auf ein bisher unüberwindbares Problem gestoßen.
Über die Adressen 6099 aufwärts, soll man eine Menge Statistikemn abrufen können.
Das klappt bei mir leider nicht.
Wann immer ich versuche, eine solche Adresse auszulesen (ich habe diversen im Bereich von 6099 bis 6825 probiert), erhalte ich die Fehlermeldung

Warning: NameDerVariablen: ILLEGAL_DATA_ADDRESS in /- on line 10

Hat jemand damit Erfahrungen oder eine Idee?

LG
Andreas

Hallo Kressi,

du hast geschrieben, dass man nicht die WiNet-LAN-Schnittstelle, sondern die feste nutzen solle.
Hast du die für den Modbus anders eingerichtet, als die WiNet Schnittstelle (Port, GeräteID)?
Ich habe es versucht und bin gescheitert. Meine WiNet Schnittstelle hat die interne Adresse 192.168.168.80, die feste hat die 192.168.1768.81. Wenn ich für die feste Schnittstelle ein Modbus Gatewas hinzufüge und mit der zweiten IP, anber demselben Port 502 einrichte, dann dauert es nur einige Sekunden und ich bekomme eine Fehlermeldung:

Client Socket Fehler beim Lesen: End of file

Hast du eine Idee?

LG
Andreas

Hm, merkwürdig. Ich habe keine Ahnung, was ich nun anders gemacht habe.
Nach der Umbenennung der Sockets für das WiNet- und das neue Gateway, läuft es!

Hallo Andreas,
sorry für die späte Rückmeldung. In IPSymcon benutze ich nur den festen Modbus Anschluss. Hat eine IP aus meinem Netz, Port 502 und ID 1. Das WiNet benutze ich in IPS überhaupt nicht, hat bei mir auch eine IP aus meinem Netz, macht aber nur Kommunikation zur ISolarCloud.
Lese derzeit ca. 80-90 Werte aus, auch den Wechselrichter Status und rechne diesen mittels eines Scripts von Ralamon Post 7 in diesem Thread Hybrid Wechselrichter Sungrow SH10RT und Speicher Einbindung in IPS - #7 von Ralamon um. Damit stelle ich dann die Flussrichtung der Energien da. Meine Modbus Vorlage kann ich gerne posten, wollte das eh schon mal für alle machen, allerdings habe ich dort noch eigene Beschriftungen die ich noch anpassen muss (Zeitmangel).

Grüße Torsten

1 „Gefällt mir“

Hallo Kressi,
danke für deine Rückmeldung. Grundsätzlich habe ich mittlerweile große Fortschritte gemacht. Auch die Statusmeldungen konnte ich auslesen und auswerten.
Und auch ich habe Daten nur noch über den zweiten LAN-Anschluss des Wechselrichters bekommen.
Leider treibt mich das Ding schier zur Verzweiflung. Erst lief es eine Weile ganz gut. Erst als ich wieder mal irgend eine Änderung an einem Modus-Gerät gemacht habe, lief alles aus dem Ruder. Der Modbus Socket liefert ständig Fehler (Client Socket. Fehler beim Lesen: End of File). Dazu muss noch nicht mal ein Modbus-Gerät mit diesem Socket und Gateway verbunden sein.
Und Daten lassen sich dann auch nicht aus den Registern des Wechselrichters lesen.
Ich habe schon diverse Dinge versucht: Symcon neu starten, Fritz!Box neu starten, Wechselrichter neu starten. Mal hilft das, momentan allerdings nicht.
Port 502 und Gerät 1 ist doch richtig, oder? Zumindest hat es damit schon mal funktioniert.

Das Auslesen des WiNet klappt übrigens tadellos. Leider bekomme ich hier bekanntlich einige wichtige Werte nicht geliefert (Stichwort: Status).

Dein Angebot, deine Modbus Vorlage einmal zu posten, nehme ich übrigens gerne und dankend an.

VG
Andreas

Hallo Andreas,

also Port 502 und Gerät 1 ist vollkommen richtig, ist bei mir auch so. Anbei noch meine Modbus Register zum importieren.

Gruß Torsten
SH10RT.json (31,1 KB)

Vieln Dank.
Ich schaue mir das mal an

Hallo zusammen
hat jemand ein Script um den Energie Fluss auszuwerten? so das hinterher die aktuellen zahlen in einer variable steht? z.B. Hausverbrauch usw.

gruss karsten

Hallo Zusammen,

ich habe aktuell noch ein Problem beim auslesen de Register 13000 Running State.
Könnte jemand von euch seine Instanzkonfiguration posten?
Bei mir kommen da immer nur wirre Zahlen an.

Danke euch schon mal für euren Support!

Grüße

mirank

Hallo Zusammen,

inzwischen habe ich es geschafft das Register auszulesen und auch entsprechen die Variablen bzw. Statis auszuwerten.

Für alle die möglicherweise auch Probleme mit dem Register 13000 haben hier ein Screenshot von meiner Konfig.

Ich lass mir dann die Variablen wie folgt füllen:

Ich musste das Script noch ein bisschen anpassen das ich aber gerne auch mit euch hier teilen möchte.

<?php


// Running state Wert abfragen aus IP-Symcon
    $abfrage=GetValue(21744);

//wert umwandeln in binär
    $binär=decbin($abfrage);

    //echo $binär;

//binär auffüllen auf 8 stellen mit nullen links auffüllen
    $binär8=str_pad($binär, 8, 0, STR_PAD_LEFT);

//echo $binär8;

//binär wert in einzele ziffer auflösen und in einem array schreiben
    $ziffern = str_split((string) $binär8);

print_r ($ziffern) ;


// binär8 einzele ziffern in einzele variablen schreiben
    $bit0=$binär8[7];
    $bit1=$binär8[6];
    $bit2=$binär8[5];
    $bit3=$binär8[4];
    $bit4=$binär8[3];
    $bit5=$binär8[2];
    $bit6=$binär8[1];
    $bit7=$binär8[0];

//ziffern mit namen versehen

//Bit0 PV power
    //Bit0 == 0 No power generated from PV
    //Bit0 == 1 Power generated from PV
    if($bit0==0){
        $bit0_name="No power generated from PV";
    }else   {
          $bit0_name="Power generated from PV";
        }

//Bit1 Battery charging
    //Bit1 == 0 Not charging
    //Bit1 == 1 Charging
    if($bit1==0){
        $bit1_name="Battery Not charging";
    }else {
        $bit1_name="Battery Charging";
    }

//Bit2 Battery discharging
    //Bit2 == 0 Not discharging
    //Bit2 == 1 Discharging
    if($bit2==0){
        $bit2_name="Battery Not discharging";
    }else {
        $bit2_name="Battery Discharging";
    }

//Bit3 Positive load power
	//Bit3 == 0 Load is reactive
	//Bit3 == 1 Load is active
    if($bit3==0){
        $bit3_name="Load is reactive";
    }else {
        $bit3_name="Load is active";
    }

//Bit4 Feed-in power
        //Bit4 == 0 No power feed-in the grid
        //Bit4 == 1 Power feed-in the grid
    if($bit4==0){
        $bit4_name="No power feed-in the grid";
    }else {
        $bit4_name="Power feed-in the grid";
    }

//Bit5 Import Power from grid
		//Bit5 == 0 No power imported from the grid
		//Bit5 == 1 Importing power from grid
    if($bit5==0){
        $bit5_name="No power imported from the grid";
    }else {
        $bit5_name="Importing power from grid";
    }

//Bit6 Reserved 
        //Bit6
    if($bit6==0){
        $bit6_name="Reserved 0";
    }else {
        $bit6_name="Reserved 1";
    }

//Bit7(Refitting System) Negative load power
        //Bit7 == 0 No power generated from “Load”
        //Bit7== 1 Power generated from“Load”
    if($bit7==0){
        $bit7_name="No power generated from “Load”";
    }else {
        $bit7_name="Power generated from“Load”";
    }
//umwandeln von integer in Boolean
//danach
//Schreiben in einer Variable
  //PV power
    $bit0ID ="25274";
    $bit0t= (bool) "$bit0";
    SetValueBoolean($bit0ID,$bit0t);
//Battery charging
    $bit1ID ="44038";
    $bit1t= (bool) "$bit1";
    SetValueBoolean($bit1ID,$bit1t);
//Battery discharging
	$bit2ID ="17544";
    $bit2t= (bool) "$bit2";
    SetValueBoolean($bit2ID,$bit2t);

    //Positive load power
	$bit3ID ="34454";
    $bit3t= (bool) "$bit3";
    SetValueBoolean($bit3ID,$bit3t);
//Feed-in power	
	$bit4ID ="53694";
    $bit4t= (bool) "$bit4";
    SetValueBoolean($bit4ID,$bit4t);
//Import Power from grid	
	$bit5ID ="38970";
    $bit5t= (bool) "$bit5";
    SetValueBoolean($bit5ID,$bit5t);
//Reserved	
//	$bit6ID ="32756";
//    $bit6t= (bool) "$bit6";
//    SetValueBoolean($bit6ID,$bit6t);
//(Refitting System) Negative load power	
	$bit7ID ="31788";
    $bit7t= (bool) "$bit7";
    SetValueBoolean($bit7ID,$bit7t);
    
?>

Ich hoffe ich kann vielleicht dem einen oder anderen mit meinem Beitrag weiterhelfen.

Grüße
mirank

Auslesen SHxxRT über WiNet immer möglich - Auslesen per LAN nicht möglich

Hallo zusammen,
das von APieroth am 21.Feb beschriebene Problem habe ich auch.
Ich habe drei SH10RT und einen SH08RT an IPSymcon hängen. Alle sind sowohl über WiNet, als auch über den lokalen LAN-Port mit eigener IP-Adresse erreichbar. Ein Wechselrichter ist im lokalen Netz die anderen per VPN aus einem entfernten Standort eingeklinkt. Dazu noch einen SBR-Speicher.

Am lokalen SH10RT kann ich problemlos stabil ständig über LAN alle Register lesen. Auch die des SBR-Speichers (dann halt mit ID 200).
Bei einem entfernten SH10RT ging das zunächst auch so. Als ich dann weitere Instanzen dazugefügt habe kam ständig die Fehlermeldung Zeitüberschreitung beim Warten auf Antwort". Die Schnittstelle wird als fehlerhaft markiert, obwohl vorher tagelang alles bestens lief.
Erst nach Umschalten auf die IP von WiNet kann ich dann wieder auslesen (nur eben nicht alle Register). Bei einem erneuten Versuch, kamen dann plötzlich per LAN wieder Daten. Dann wieder mal nicht.

Hat hier jemand schon eine Lösung gefunden? Oder kennt die Ursache?

Ich hab mir ein eigenes EMS mit unterschiedlichen Ladestrategien je nach PV-Ertragsvorhersage (hier ist PV-Forcast von stele99 echt genial. Danke dafür! :slight_smile: ) gebastelt, was ich gerne auch auf die VPN-Standorte ausdehnen will. Geht nur nicht in allen Details ohne Zugriff auf LAN.

Als Einstellung für die Byte-Reihenfolge bei den ModbusInstanzen verwende ich mittlerweile ausschließlich „Little Endian (Bytes vertauscht)“.
Laut Sungrow „CommunicationProtocol of Residential Hybrid Inverter“ hat man für U16 oder S16 big endian und für U32 oder S32 little endian für double-word data und big-endian für byte data zu verwenden. Diese Darstellung ist aber meine Meinung nach irreführend weil verkürzt dargestellt.

Bei 16-bit Werten geht big-endian oder little-endian (bytes vertauscht).
Bei 32-bit Werten kommt aber nur mit little-endian (bytes vertauscht) was Sinniges aus den Registern.

Hier mal eine kleine Übersicht, welche Byte-Reihenfolgen möglich sind:
abzuspeichernde Information (32bit) x12 x34 x56 x78
abgespeicherte Information
big-endian: x12 x34 x56 x78
big-endian (vertauscht): x34 x12 x78 x56
little-endian: x78 x56 x34 x12
litttle-endian (vertauscht): x56 x78 x12 x34

Bei 16-bit Werten ist big-endian und little-endian (vertauscht) identisch (ebenso big-endian (vertauscht) und litte-endian).

Daher kommt bei dem System wie sungrow Daten speichert bei 16-bit und 32-bit Daten bei little-endian (vertauscht) immer das Richtige raus. Also wozu hier noch groß unterscheiden.

Die V1.1.4 der Registerübersicht der Sungrow WR hab ich hier mal angehängt (Da steht zwar in der Überschrift noch V1.1.2, aber die Änderungen sind bis V1.1.4 berücksichtigt, was man auf Seite 3 oben sehen kann.

Communication Protocol of Residential Hybrid Inverter-V1.1.4.pdf (742,9 KB)

An die mit SBR: Könnt ihr bei den Speichern Ihre Nominalkapazität nutzen? Bei mir driftet V_max (Spannung der „vollsten Zelle“ ) und V_min (Spannung der „leersten“ Zelle) bei drei der Module gewaltig. Fünf Module sind ok. Die Interne Drift reduziert bei mir aber die nutzbare Kapazität um fast 20%. Hier bin ich am überlegen, ob ich die Module aufschraub und mit einem Labornetzteil extern balanciere, da der passive SungrowBalancer ganz offenbar wenig leistungsfähig ist.
Hier kann ich jedem nur empfehlen die SBR-Parameter für die Parameter V_min und V_max jedes der Module auszulesen und zu überwachen. Da sieht man dann was für Optimierungspotential für die nutzbare Kapazität beim SBR noch vorhanden ist. Die SBR sind leider bzgl. Balancierung nicht so wirklich toll.
Leider sind die Batterieregister nicht dokumentiert (Sungrow wird schon wissen warum :wink: ). Ich kann aber bei Interesse hier gerne posten, wie man diese Informationen dem SBR per IpSymcon entlocken kann.

VG Jürgen

Habe für meinen SH10RT auch ne Weile gebastelt und mehrere Vorlagen aus dem Web und hier aus dem Forum zusammen geführt und bin nun halbwegs zufrieden mit dem was so reinkommt an Werten. Ausgelesen wird über LAN-Buchse und das läuft fehlerfrei. (Ich habe allerdings auch nur einen Wandler)

Tatsächlich interessiert mich deine Aussage zu den Ladenständen der einzelnen Batterieblöcke. In welchen Registern stehen hier Werte? Dazu habe ich bislang nichts gefunden!

Hi Markus,

du kannst mit IP-Symcon die Spannung der einzelnen Module auslesen, genauer gesagt kann man von jedem Modul auslesen wie groß die Spannung der Zelle mit der höchsten Spannung ist und wie groß die Spannung der Zelle mit der niedrigsten Spannung ist.

Das ergibt dann z.B. folgende Grafik:

So kann man erkennen, ob einzelne Module gut balanciert sind und wie gut die Module selbst aufeinander abgestimmt sind. Für die Balancierung innerhalb des Moduls sollte der eingebaute passive TopBalancer sorgen. Für die Angleichung der Module zueinander sorgt er im Prinzip auch, da er aber zu schwach ausgelegt ist, geht das nur über sehr lange Zeiträume einigermaßen. Abhilfe für realtiv schlecht aufeinander abgestimmte Module kann man in vertretbarer Zeit nur durch „Tetris-Balancing“ erreichen.

Um die Spannungen (V_max und V_min) der einzelnen Module auszulesen, braucht man ein Modbusgateway als weitere Splitterinstanz mit ID 200. Die hier dann zugewiesene Schnittstelle ist der ClientSocket des Wechselrichters an dem die Batterie angeschlossen ist.

Dann definiert man sich weitere ModbusRegister-Instanzen mit folgenden Einstellungen:


Obige Einstellung liest „maxCellVoltage of Module 1“ aus.

Wie groß du das Updateintervall machst ist Ansichtssache. Ich fand 30 Sekunden einen prima Wert, so dass man auch am Ladeschluss (wenn dann die „vollsten“ Zellen gegen 3,65V laufen), noch aussagekräftige Kurven erhält.

Die Modbus-Adressen der einzelnen Module sind:
10765: maxCellVoltage of Module 1
10766: maxCellVoltage of Module 2
10767: maxCellVoltage of Module 3

10772: maxCellVoltage of Module 8

10773: minCellVoltage of Module 1
10774: minCellVoltage of Module 2

10780: minCellVoltage of Module 8

Je nachdem, ob du einen SBR096, einen SBR128, …, SBR256 hast, liest du dann eben die Werte von 3,4, … 8 Modulen aus.

Von den oben genannten Modusbusadressen muss man ja „sungrow-eigen“ jeweils noch 1 abziehen, so dass man z.B. in IPSymcon 10764 als Adresse für maxCellVoltage of Module 1 angeben muss.

Im obigen Bild (Ladeschluss des SBRs bei mir gestern) sieht man gut, dass die Module zueinander einigermaßen abgestimmt sind (Vmax bei vielen Modulen steigt am Ladeschluss gleichzeitig stark an), aber die Balancierung der Zellen innerhalb der Module noch zu wünschen übrig lässt.
Ich habe vor ein paar Tagen erst neue Module integriert und mittels TetrisBalancing die Module aufeinander abgestimmt. Nun ist der Balancer dran, die Unterschiede innerhalb der Module zu beseitigen. Das wird sicher ein paar Wochen (wenn es dumm läuft auch deutlich länger) brauchen. Die Zelle mit der niedrigsten Spannung hat erst 3,3824V erreicht. Hier ist noch Luft nach oben. Daher erreicht der Speicher aktuell nicht die volle Nominalspeicherkapazität.
Ganz doof ist es (so war es bei mir vor dem Modultausch), wenn eine Zelle in einem Modul relativ leer ist und die dann das Entladeende einläutet (erreicht die „leerste“ Zelle die Spannung von 2,7V, dann setzt Notladung des SBR ein, um die Zellen vor Schaden zu bewahren), obwohl alle anderen Zellen noch jede Menge Energie abgeben könnten. Wenn dann gleichzeitig ein Modul „voller“ ist als die anderen, wird das ganz schlimm, da die vollste Zelle dieses Moduls die Ladung vorzeitig beendet (erreicht die erste Zelle im SBR den Wert von 3,65V ist Ladeschluss). Viele Zellen der anderen Module sind dann u.U. noch lange nicht voll.
Da kann es schon mal vorkommen, dass nur noch 2/3 der Nominalkapazität nutzbar sind (im Extremfall bei Modulnachrüstungen auch noch deutlich weniger). Der passive SungrowBalancer ist leider nicht leistungsfähig genug, hier in vertretbarer Zeit (innerhalb eines halben Jahres) Abhilfe zu verschaffen. Mit den Daten von V_max und V_min und ein wenig TetrisBalancing kann man das aber in den Griff kriegen und seinen SBR effektiver nutzen.


P.S.
Ich habe mittlerweile die Lösung des Problems für die Fehlermeldung „Zeitüberschreitung beim Warten auf Antwort“ gefunden. Hier liefen zwei Wechselrichter im Client-Host-Betrieb. Der Client wird zwar mit seiner eigenen IP-Adresse angesprochen, aber es ist beim Client dann nötig beim Modbusgateway als ID die 2 zu setzen (Standard beim SHxxRT im Einzelbetrieb ist ja die ID 1). Das zusammen mit einer ab und an instabilen LTE-Verbindung war ein echter Zeitfresser.

Ich habe selbst nach ein paar Monaten Betrieb ein Batteriemodul dazu gesteckt. Ich war allerdings durch Threads im Photovoltaik-Forum vorgewarnt. Ich habe die Batterie vor dem Einbau auf den SOC von 25% gebracht, was etwa zur Gesamt-Voltzahl der neuen Batterie passte. Das hat dann gut funktioniert.

Das der Balancer in einer 2024 erworbenen Batterie nicht richtig balancen kann (1 % pro Tag bei Laden auf 100%) und der Hersteller trotzdem mit der Erweiterung der Batterie durch „Laien“ per Plug-and-Play wirbt, ist lächerlich!
Das das kein Problem sein soll, weil man ja nach 1-2 Sommer-Zyklen irgendwann mal die Nenn-Kapazität hat, ist komplett dumm.

Auch diese Geschichte mit den verschiedenen Akku-Zell-Typen, die untereinander nicht kombatibel sind, bei ein und dem gleichen Produkt - da hat sich Sungrow echt nicht mit Ruhm bekleckert. Keine Fehlermeldung - nix. Der ganze Akku geht einfach kaputt nach ein paar Monaten.

Dazu kommt ja: Wenn man einen Max-Soc auf sagen wir 80 % einstellt, um die Batterie zu schonen, wird überhaupt nicht mehr gebalanced, weil das nur zwischen 99 und 100% passiert. Das muss man sich mal vorstellen! Wenn der Akku dann irgendwann defekt ist, weil das alles aus dem Rahmen läuft, wäscht Sungrow die Hände in Unschuld. Die Elektriker sind ja angeblich geschult. (also meiner hatte überhaupt keine Ahnung von den Details)
Gleiches Problem droht, wenn die Anlage über den Winter über Monate nie vollgeladen wird.

@PaulSchorsch Man kann diese Modbus-Register-Einstellungen im Modul ja als Datei exportieren. Bitte exportiere doch mal bitte deine Settings für die Akku-Spannungs-Register und stell die Datei hier ein. Dann brauchen wir nicht alles nochmal neu abtippen.

@Markus_Arndt Hallo Markus, ich habe meine Modbusregister zu den SHxxRT und SBR in IPSymcon noch vor Version 7.0 erstellt. Diese sind also keinen Geräten zugeordnet, sondern „Einzelvariablen“. Gibt es hier einen schnellen Weg auch diese zu exportieren?

Ich denke nicht. Das „Modbus-Gerät“ scheint ja extra für diese Funktion geschaffen worden zu sein, um Sammlungen von Registern zu tauschen.

Ich habe die Felder mit Splitter auf ID 200 angelegt für meine 4 Module und es kommen tatsächlich Werte!
Ich hänge die Datei zum Importieren mal hier an, vielleicht kann das jemand ebenfalls brauchen.
Es gibt wohl noch weitere Register, wie eine Datei aus einem anderen Forum nahelegt, die interessieren mich aber nicht so sehr, weil SOC, SOH etc. auch der Wandler im normalen Modbus-Teil liefert. Hänge ich auch mal an.

2023-08-22_modbus_sungrow-korrigiert_nur-Batterieerweiterung-SBR_ab1726.txt (14,8 KB)
sungrow-sbr-modbus-kanal-200-akkuzellen.json (3,5 KB)

Hier das Ergebnis:




Danke für die zusätzlichen Batterieadressen. Hier wäre tatsächlich die Position der Zelle mit der Maximalspannung im Modul und die Position der Zelle mit der Minimalspannung im Modul interessant. Aus meiner Erfahrung mit dem Sungrowportal sollte das aber vermutlich nur für den ganzen Speicherturm und nicht für jedes Modul einzeln auslesbar sein.
Ersterer Wert sollte beim Balancieren (wenn das Modul im Vergleich zu den anderen nicht deutlich „voller“ ist) im Laufe der Tage wechseln. Letztere wird vermutlich nur bei einem exzellent gebalanctem Turm und Modulen mit sehr sehr geringer innerer Drift wechseln. Ich werd das mal ausprobieren.

Was mich bei deinem angehängten Bild ein wenig wundert ist die Prozentanzeige bei den Spannungswerten. Was sagt die aus? Der SOC wird ja vermutlich durch die Prozentwerte in der rechten der beiden Wertespalten angegeben, oder?
Und: War dein Speicher auf 0% (ab ca 14Uhr) und die Zellenspannung nimmt dann (trotzt fehlender Entladung) ab dem Zeitpunkt, wo Werte ausgespuckt werden (ab ca 20Uhr) weiterhin ab?