Sun GTIL2-1000 RS485 Interface

Hallo Sunseeker,

vielen Dank, dass Du deine Frage nochmal umgearbeitet hast und ins Forum gestellt hast.

Der auf GitHub veröffentlichte Arduino Code dient nur dazu meine Platine zu Testzwecken über RS485/Uart anzusteuern. D.h. der Testcode kann alle 6 Register (Set AC, Read AC, VGrid, VBat, DAC u. Calibration Step) auslesen und SetAC, DAC und Calibration schreiben. Es ist kein Code enthalten, um den Hausverbrauch zu ermitteln.

Dein Ansatz ist grundsätzlich richtig. Ein Arduino/Raspberry soll den aktuellen Netzbezug von einem z.B. Shelly3EM oder auch einem SDM630 holen und an meine Platine via UART/RS485 weiterschicken. Mehr Details zum "Weiterschicken" weiter unten.

Da ich keine Ahnung hätte wie ich mit einem Arduino/ESP8266 den Shelly3EM auslesen sollte, würde ich auch den Raspberry vorziehen. Zumal Du dich mit der Programmierung davon schon auskennst. Nein, ich kenne leider keine Phython ModBus lib.

Richtig, die Kalibrierung kannst Du einmal mit MBPoll starten. Oder auch mit einem Arduino mit oben genanntem Testprogramm. Oder einem USB RS485/Uart Adapter und dem Programm ModLinkDemo64.exe .

Der Raspberry ist sicher langsamer als ein Arduino. D.h. er wird seltener den Netzbezug auslesen können und an die RS485 Platine weiterleiten können. Wenn im Haus ein starker Verbraucher eine Weile lief und dann abgeschaltet wird, dann wird vom Wechselrichter noch solange zuviel Leistung eingespeißt, bis der Raspberry den neusten Netzbezug an den Wechselrichter geschickt hat. Es wird also für ca. 1-5s Strom ins Netz geschickt. Wenn das nicht weiter stört, dann spricht nichts gegen den "langsameren" Raspberry. In jedem Fall ein guter Weg um mal zu starten.

Ich habe bei mir eine Regelung mit einem Arduino und einem SDM630 Smartmeter aufgebaut. Der Arduino holt den Netzbezug vom SDM630 und leitet ihn an den Wechselrichter weiter. Liegt der Netzbezug zwischen 25W-75W passiert garnichts. D.h. der Wechselrichter speißt weiter mit der zuletzt geforderten Leistung ein. Ist der Netzbezug größer als 75W, dann wird der über die letzten 120s ermittelte Netzbezug an den Wechselrichter weitergegeben. Genauer gesagt wird der gemittelte Netzbezug -50W weitergegeben, damit ich wieder im Bereich 25W bsi 75W lande. Ist der Netzbezug kleiner als 25W dann wird sofort der aktuelle Netzbezug an den Wechselrichter geschickt, damit so wenig wie möglich Strom ins Netz gespeißt wird.

Warum so kompliziert und träge beim Hochfahren? Mir ist eine möglichst geringe Netzeinspeißung wichtig. Verbraucher wie z.B. der Backofen schalten fortlaufend an und aus. Dadurch würde permanent beim Abschalten des Backofens Strom zurück ins Netz gespießt. Deshalb das träge Hochfahren des Wechselrichters über 120s und das schnelle Runterfahren in ca. 1s.

Noch ein kleines Detail: Wie im vorherigen Post schon geschrieben kann man sich nie sicher sein, ob der Wechselrichter wirklich das einspeißt was man als Soll-Wert gesetzt hat. Das ist der Grund warum meine Platine den Ist-Wert aus dem Display ausließt. Natürlich regelt der uC auf der Platine auch gemäß dem letzten aus dem Display ausgelesenem Wert nach. Diese Nachregelung ist aber auch eher langsam. Aus diesem Grund berechene ich den Soll Wert den der Arduino an den Wechselrichter schickt so:

Soll-Wert = Ist-Wert + Netzbezug - 50W

...
So dann mal los mit der Kritik :wink: Ich weiß, dass das sicher nicht die optimalste Art der Nulleinspeißung ist. Dennoch hat sich dieser Alogrithmus über die letzten 3 Jahre so bei mir entwickelt und läuft jetzt so stabil, dass ich Zeit für kleine RS485 Interface Platinen habe.

Viele Grüße,
Trucki

@ DerBuchner: Ja das geht. Theoretisch. Jetzt nach 3 Jahren Erfahrung und einem geschrottetem Wechselrichter, der mir um die Ohren geflogen ist achte ich auf galvanische Trennung und Überspannungsschutzdioden.
Welche Sperrdioden verwendest Du? Und wo genau schaltest Du die dazwischen? Wenn eine am Ausgang vom DAC hängt, dann ändert sich doch die Spannung (also der Wert für den Regler) dramatisch, nicht?
Zudem habe ich das Gefühl, dass nicht nur meine Schaltung, sondern auch der Analogeingang des Wechselrichters driftet und das Rücklesen und Regeln der tatsächlich eingespeisten Leistung durchaus sinnvoll sein kann.
Guter Punkt. Ich habe/hatte die Hoffnung, dass ich die Regelung rein mittels meines Shelly 3EM hinbekomme. Ich müsste mal schauen wie oft der Shelly mir per MQTT Updates schickt. Dieses "Solar" ist noch alles #neuland für mich :D

Hallo Trucki,

vielen Dank dass du dir die Zeit genommen hast, diese lange Antwort zu schreiben!

Ich kann die Strategie deiner Leistungsjustierung durchaus verstehen! Ich denke, so einen Weg werde ich auch gehen. Im Zweifel habe ich immer einen höheren Strombedarf über den Tag als ich mit meiner kleinen Anlage liefern kann, deswegen ist es auch für mich die beste Strategie, möglichst nichts ins Netz zu speisen.

Ich werde mich also die Tage daran machen, deine Platine einzubauen und auszuprobieren. Da ich schon einen Raspberry Pi dort hängen habe, der den Inselwechselrichter ausliest, kann der auch noch die Steuerung vom Sun 1000 übernehmen. Vielleicht probiere ich anschließend mal, ob ich es aber nicht auch mit einem ESP8266 D1 mini hinbekomme.

Nur weil du das noch genannt hast.. der Shelly3EM hat eine REST API, die alle aktuellen Daten liefert. Wenn man sie z.B. aufruft über http://<shelly3em-hostname>/status bekommt man ein JSON zurück, der unter dem Schlüssel "emeters" alle gemessenen Volt und Watt der Phasen enthält. Die Gesamtleistung steht unter dem Schlüssel "total_power".
Der Arduino kann per REST Api Client wie dem hier (noch nicht getestet) https://github.com/robbie-remote/RESTClient die Shelly API abfragen und per deserializeJson() auf die Werte aus dem JSON String zugreifen. So werde ich das mal versuchen.

Viele Grüße!

... der Shelly3EM hat eine REST API, die alle aktuellen Daten liefert. Wenn man sie z.B. aufruft über http://<shelly3em-hostname>/status bekommt man ein JSON zurück, der unter dem Schlüssel "emeters" alle gemessenen Volt und Watt der Phasen enthält. Die Gesamtleistung steht unter dem Schlüssel "total_power".
Super! Danke. Das wusste ich noch nicht. Kann ich gut gebrauchen, der Wert wird sehr oft upgedated und ist immer aktuell. Kann ich zusätzlich zu MQTT benutzen (Fallback/gegenchecken).

... ob ich es aber nicht auch mit einem ESP8266 D1 mini hinbekomme.
Ich halte den ESP8266/ESP32, der mit dem SUN kommuniziert, so dumm wie möglich. Der bekommt nur einen REST-Server drauf, der den Power Wert empfägt und dann auf dem SUN setzt. Den Rest, also das Gehirn mit der Regelung, lasse ich wo anders laufen. Das kann ich dann in Python machen, ist mir viel lieber als C. Vielleicht kann ich da, in Zukunft, sogar bisschen was mit Mustererkennung/Machine Learning einbauen, damit z.B. erkannt wird "OK, das ist jetzt der Herd, der schaltet zyklisch ein/aus" oder "OK, das ist jetzt der Fön, der zieht permanent 1500W" - und entsprechend darauf reagieren.

Hallo Trucki,
ich hätte auch Interesse an diesem Interface, PN habe ich gesendet, jedoch noch keine Antwort erhalten.

Guten Morgen,

jetzt sind alle Platinen verschenkt/verkauft/versprochen und ich habe einen neuen Satz nachbestellt.In 3-4 Wochen wird es dann wieder welche geben. Ich werde wohl den Preis um 5-8€ erhöhen, da Bauteile jetzt zwar wieder verfügbar, aber teuer sind.

Zur 2000W Variante gibt es noch nichts Neues. Bislang weiterhin ungetestet.

Könnte vielleicht jemand mal ein 10kOhm Poti an seinen analog Eingang seines SUN GTIL2-2000W anschließen und mit einem Multimeter die Spannung(!) an den beiden Poti-Pins bei verschiedenen Leistungen messen?

Achtung wie immer bitte darauf achten, dass die AC Phase am richtigen Pin des AC Eingangs angeschlossen ist!


Poti anschließen geht grundsätzlich so:
https://www.youtube.com/watch?v=8ktYNleQ7HE

Leistungen für die ich die Spannung an den beiden Poti-Pins bräuche sind:
37.0W = x.xV
42.0W = x.xV
47.0W = x.xV
52.0W = x.xV
55.0W = x.xV
60.0W = x.xV
67.0W = x.xV
75.0W = x.xV
80.0W = x.xV
94.0W = x.xV
110.0W = x.xV
120.0W = x.xV
134.0W = x.xV
150.0W = x.xV
160.0W = x.xV
188.0W = x.xV
220.0W = x.xV
250.0W = x.xV
370.0W = x.xV
390.0W = x.xV
700.0W = x.xV
1000.0W = x.xV
1200.0W = x.xV
1400.0W = x.xV
1600.0W = x.xV
1900.0W = x.xV
2000.0W = x.xV (bzw. statt 2kW die maximale Leistung)

Natürlich brauche ich die Leistungen nicht ganz genau. Am Ende wird sowieso interpoliert. Die kleineren Leistungen (beim Sun1000 bis 200W) müssen feiner abgetastet werden, da dort das Verhalten deutlich unlinearer ist als bei Leistungen >200W.

Das wäre super, dann hätte ich einen Ausgangswert für die 2000W Variante.

Danke
Gruß,
Trucki

Guten Morgen in die Runde und erstmal Danke an Trucki für die tolle Arbeit. Nachdem ich mich mit meinem sun2000 an diversen Regelungen über den externen limitereingang und selbstgebastelten Lösungen versucht habe kann ich bestätigen, dass die Platine auch an dem sun2000 ohne Probleme läuft. Ich habe dazu den jumper auf 2000w zusammengelötet und nutze für die Kommunikation die uart Schnittstelle (Widerstand auf der platine entfernt). Die Daten kommen per esphome an und der sun lässt sich auch auf vorgegebene Werte steuern. Großes Lob an Trucki. So stabil lief bisher keine andere Lösung.

- Platine angeschlossen und alle Kabel und Schrauben dabei, spitze
- sun 2000 lässt sich endlich steuern
- Auf dem wemos d1 Mini läuft auch ein kleiner Server, diensteuerung geht daher ohne installiertes esphome

Einziger Wermutstropfen und das liegt NICHT an der Platine, ich nutze seit Jahren iobroker und da klappt die Anbindung über den esphome Adapter leider nicht. Konnte nicht genau ausprobieren woran es liegt, der esp wird erkannt, die Verbindung ist aber (mit dem skript von github für homeassistant) immer wieder weg und eine Steuerung bzw. das Anzeigen der Daten ist so direkt (noch) nicht möglich.

Da ich aber gerade im Urlaub bin und keinen Zugriff auf die Daten und Hardware habe, kann ich diese erst später nachreichen.

Einziger Wermutstropfen und das liegt NICHT an der Platine, ich nutze seit Jahren iobroker und da klappt die Anbindung über den esphome Adapter leider nicht. Konnte nicht genau ausprobieren woran es liegt, der esp wird erkannt, die Verbindung ist aber (mit dem skript von github für homeassistant) immer wieder weg und eine Steuerung bzw. das Anzeigen der Daten ist so direkt (noch) nicht möglich.
Benutzt du im ESPHome die api: oder mqtt: publication?
Über api hatte ich bei den 2866ern auch Verbindungsabbrüche in Homeassistant wen es viele sensordaten gibt.
au mqtt umgestellt liefen die dann wieder unterbrechungsfrei. Der Bug war reproduzierbar.
Weil HA und EspHome mqtt-discovery benutzen und dieselben Objektnamen wie bei api entstehen hatte ich damit auch keinen Aufwand.
Bei den 32ern habe ich das Problem bisher nicht gesehen, aber ein anderes.
Einer der Nodes konnte von Homeassistant gar nicht gefunden werden, http ging aber.
Dort hat "mdns: disabled: true" unter wifi geholfen, ist aber der einzige der das mal brauchte.

Wenn du mir nun noch sagen könntest, wie ich das mache, könnte ich es ausprobieren. Bis jetzt kannte ich esphome überhaupt nicht und weiß ehrlich gesagt nicht wie/was du meinst :shifty:

Hier übrigens noch n Screenshot vom wenos direkt mit Port 80, damit man es sich vorstellen kann... (die Werte sind auf 0 bis 2000 begrenzt um mit dem Handy und meinen dicken Fingern etwas auswählen zu können :wink: )

Das, was du da hast ist doch nicht von Himmel gefallen, das musst du doch irgendwie auf den esp gebracht haben. :wink:

Esphome hat Konifgdateien, mit denen esphome den Main Quelltext generiert um den dann zu kompilieren.
In den Konfigdateien yaml fomat (normal eine pro Node) steht dann so was wie:

wifi:
ssid: "ssid"
password: "dasdarfichniemandensagen"
mdns:
disabled: true
captive_portal:
ota:
api:
...

statt api kann man auch alles zum mqtt server schicken, alos api: raus und dafür mqtt rein,

mqtt:
broker: "servername"
username: "username"
password: "password"
id: "clientid"

wen man mehr wissen will, man findet ein gut dokumentiertes Projekt, wenn man googelt.

Hallo Zaimaen,
vielen Dank für das positive Feedback. Das freut mich wirklich sehr!

In deinem Screenshot sieht man, dass der Sun aktuell 407W einspeißt. Angefordert sind aber 1207W bzw. ein DAC Wert von 36927 (~2V).
Das ist genau der Teil mit der LUT der für die 2000W Variante noch optimiert werden muss. Anstelle von Analog-Spannungen würden mir auch DAC Werte helfen. D.h. einfach ein paar AC Output Werte (hier 407W) mit den zugehörigen DAC Werten (hier 36927).

Mich irritiert, dass Du bei ~2V am Sun Analogeingang nur 407W einspeißt. Beim einem unmodifizierten SUN1000 wird die maximal Leistung von ca. 967W bei ~1.67V eingespeißt.

Du hast ja schon mal geschrieben, dass Du 3.3V am Analogeingang des Sun2000 brauchst.
Hast Du an deinem Inverter etwas modifiziert? Z.B. R95 vom Sun2000 Controllboard ausgelötet?

Viele Grüße,
Trucki

@ und mehr

Das hört sich gut an, die yaml kann ich ota editieren bzw neu aufspielen. Das mit mqtt werde ich auf alle Fälle ausprobieren, mal sehen ob ich das wie die anderen Geräte an den sonoffadapter schicken kann...

@trucki

Die Werte sind original aus dem log. Ich kann gerne ein längeres log aufnehmen und dann mal posten oder ein paar Werte raussuchen.

Mein 2000er braucht wirklich mehr Spannung als die anscheinend üblichen 0 bis 1,6v. Er läuft ab 1,6 bis 3,3 volt. Den r95 habe ich nicht ausgelötet und auch sonst an dem keine Änderungen vorgenommen. Ich hatte ihn auch nachgemessen ob kaputt aber auch da Fehlanzeige.

Mein bastelprojekt kam aus einem discordforum oder wie man das nennt und dem inet zusammenkopiert und selber gefummelt, sah dann so aus:

Spannungswandler wemos d1 Mini der die Daten des momentsnverbrsuchs von einem anderen wemos d1 Mini am Stromzähler bekommt dann ein Display zur Anzeige ob überhaupt etwas geht und der DAC und dann an den sun2000...

Hallo zaimaen,

ich bin mir nicht sicher, dass dein SUN2000 anders ist. Es könnte ja auch sein, dass alle SUN2000 am Analogeingang 1.67V...3.3V brauchen.
Der äußere Pin des RT1 Analogeingangs ist übringens direkt der ADC Pin des Controllers. Der Widerstand R95 ist ein 10kOhm PullUp-Widerstand gegen 3.3V auf der Unterseite des Controllboards. D.h. Du kannst ganz leicht messen ob Du einen R95 hast: Einfach bei ABGESCHALTETEM Wechselrichter den Widerstand zwischen RT1 Analogeingang und +3.3V messen. Der Widerstand sollte 10kOhm sein:

Was allerdings dagegen spricht, dass dein Wechselrichter normal ist, ist der Kommentar von Walter Steinchen unter diesem Youtube Video (https://www.youtube.com/watch?v=8ktYNleQ7HE) :

Walter Steinchen vor 12 Tagen (bearbeitet)
Hab mal mit einem Wendeltrimmpoti -so gut es ging das "wackelt" alles etwas - für meinen Sun-2000 V2 folgende Werte bestimmt:
0 Ohm=72Watt, 47O Ohm=80 Watt, 116 Ohm=100Watt,153 Ohm=150Watt,248 Ohm=200Watt,493 Ohm=300Watt,940 Ohm=400Watt,1360 Ohm=500Watt,2360 Ohm=700Watt (mehr gibt grad mein Netzteil nicht her) Bei den kleinen Werten macht die Kurve eine "Biege" .. so ab 300 Watt wirds dann relativ linear... passt eigentlich. Plane einen mit SolidState Relais schaltbaren Wiederstand ..
Falls es jemandem hilft ..
0Ohm Widerstand müssen einer Spannung von ca. 0V am RT1 Eingang entsprechen. D.h. demnach würde der SUN2000 bei 0V..1.67V auch Leistung rausgeben.

Viele Grüße,
Trucki

Hallo Zusammen,
ein User meiner Platine hat mir geschrieben, dass es ungüstig ist, dass die Platine auf Register[0] den AC Setpoint empfängt, weil die Siemens Logo mit Modbus RTU nicht auf das Register[0] schreiben kann. Siemens scheint erst Registerzugriffe ab Register[1] zuzulassen.

Ich bin kein Logo Nutzer. Kann das noch jemand bestätigen? Falls das der Fall ist, dann würde ich in das 2000W Update mit aufnehmen, dass man den AC_Setpoint auch auf Register 6 schreiben kann.

Viele Grüße,
Trucki

Ich frage an der Stelle einfach mal komplett Dumm und Naiv: Das muss doch sicher auch einfacher, mit weniger Komponenten und vor allem ohne ein extra MCU funktionieren, oder? Zumindest wenn man den "Luxus" die tatsächlich erzeugte Leistung zu kriegen weglässt, und somit manuell eine Kalibrierung durchführen müsste. Wo ist in diesem Fall die Schwierigkeit?

Explizit auf die Schnelle gefunden habe ich das hier, würde man dann aber halt eben nicht als input nutzen, sondern an einem PWM Pin als output: https://www.electronics-lab.com/project/optically-isolated-analog-input-module-for-arduino/

Hallo Diwhy,

selbstverständlich kann man eine 3Phasen Nulleinspeisung auch ohne Platine und extra Mikrocontroller bauen!
Ich denke die Platine bietet einfach nur ein paar Vorteile und Erfahrungen die ich in den letzten Jahren gemacht habe:
- Die galvanische Trennung schützt den Wechselrichter und die eignene Schaltung
- Die Überspannungsschutzdioden schützen den Analogeingang des Wechselrichters
- Das Rücklesen der aktuell eingespeißten Leistung ermöglicht eine schnellere Regelung der Nulleinspeißung bei Messgeräten mit langsamer Updaterate (>1s) .
- Man hat nur digitale Interfaces zu Smartmeter, Wechselrichter, usw...
Es gibt ja schon viele veröffentliche Projekte zu dem Thema. Und auch viele dokumentiere Probleme. Defekte Controllerplatinen, defekte Digitalpotis, defekte Weselrichter, ...
Muss jeder selber wissen und entscheiden an welchem Punkt er in sein Projekt einsteigen will.
VIele Grüße,
Trucki

Ja die galvanische Trennung und eine Hard-Limitierung der Spannung die in den ADC Pin geht ist auf jeden Fall etwas, das ich auch beabsichtigen würde - Da ich jedoch keine tatsächlich perfekte 0-Einspeisung bzw. schnelles Feedback brauche würde ich mich an einer simpleren Lösung probieren welche letzendlich einfach nur ein isolierter D/A wandler ist und eben über ein ESP gesteuert wird (Und dann hierauf zurück kommen wenn ich scheiter :lol:), war mir einfach nur nicht sicher ob der Wechselrichter irgendwas besonderes macht was eine simple Lösung verhindert. Danke für deine Bemühungen!

Meine Platine ist anscheinend schon da! :smiley:
Danke Trucki :thumbup:
Nächste Woche gehen ich die Umbauten und Tests an.
Melde mich dann...

Hallo Jarek,

Vielen Dank für die Rückmeldung. Da hat der Versand aber lange gedauert. Ich bin gespannt was Du daraus baust.
Viel Erfolg,
Gruß
Trucki

Hallo Trucki,

zuerst einmal Kompliment zu deiner Lösung! Sieht nach einer intelligenten und professionellen Lösung aus.

Ich kämpfe nun schon über ein Jahr mit einer zuverlässigen Limitierung/Nulleinspeisung des SUN1000 GTIL2. Ich habe es zuerst mit Digitalpotis versucht: funktionieren einige Monate; sie fallen dann aber aus, da vermutlich der Strom auf Dauer zu hoch ist. Im Moment habe ich eine Lösung mit einem Servo (am arduino), welches ein Poti steuert. Funktioniert ganz gut einige Wochen, bis das Servo defekt ist (starkes Zittern, vermutlich internes Poti verschlissen). Heute wieder Servo ausgetauscht. Aber diese Lösung ist eigentlich "von hinten durch die Brust ins Auge".
Ich bin dabei auch die Lösung mit der Ansteuerung über den externen Limitereingang (Optokoppler) zu versuchen.

Aber nachdem ich nun auf deine Lösung gestossen bin, wäre ich sehr daran interessiert diese zu integrieren.
Ich erfasse alle wichtigen Daten über die Volkszaehler/vzlogger Software (Zählerstände für Verbrauch und Einspeisung) und eigene Software (nodejs/typescript), über die ich z.B. vom Solarcontroller (Epever XTRA 4415N: Solarleistung, Batteriespannung, Ladestrom) über modbus auslese und auch in die Volkszaehler-DB schreibe. Der SUN1000 hängt über eine FRTIZ!DECT210 am Hausnetz, über die ich die Leistung von Wechselrichter erfasse (-> Volkszaehler-DB) und über die ich den Wechselrichter trenne, sobald der Akkustand zu niedrig ist; damit verbraucht der Wechselrichter praktisch keinen Standby Strom.

Leider ist die Leistungsmessung mit FRTIZ!DECT210 recht träge und läuft ca. 2min nach. Damit kann man schnelle Lastwechsel praktisch nicht erfassen.
Ich bin jetzt allerdings vor einiger Zeit auf eine andere Steuerung umgestiegen und verwende die von vzlogger über mqtt veröffentlichten Zählerwerte, die ich im Sekundentakt erhalte. Ich schaue eigentlich nur mehr auf die aktuellen Leistungen für Verbrauch und Einspeisung und regle die Limiterleistung inkrementell hoch bzw. runter. Damit verschenke ich Strom nur noch im unteren Prozentbereich (< 5%) im Vergleich zur von mir ins Haus eingespeisten Leistung.

Aber wie gesagt, ich würde sehr gerne deine Lösung integrieren und über raspberry pi/modbus deine Platine ansteuern. Dann gäb es endlich keine "Verschleissteile" mehr und ich wäre auch für die Zukunft gerüstet, da die neuen SUN-Wechselrichter ja keinen externen Limitereingang mehr haben.

Wie komme ich an Deine Platine :wink: ?

Viele Grüße,
Walter