Soyosource GTN-1000/1200 - Register/Protokoll

Moin Allerseits, vielleicht übersehe ich es - aber in einer Reihe von Threads habe ich über die Register/Protokoll des Soyosource hier gelesen aber was ich nicht finde ist eine Zusammenstellung der Möglichkeiten die man hat um den Inverter auszulesen.

In meinem Fall habe ich einen Soyosource GTN1000 mit Display (ohne WiFi) Dongle (mir fehlt der komplette USB-Anschluß. Möchte aber gerne via Python den Inverter auslesen/einstellen. (genau so mache es auch schon mit meinem DalyBMS und meinem EPEVER Charger).

Gibt es eine Zusammenfassung aller Register und/oder eine Protokollbeschreibung für das Gerät ? Ich bin wohl zu bl--d das zu finden :-/

Leider steht der Sourcecode für den ESP von @bavarian supergut nicht zur Verfügung - zumindest nicht auf dem Github den ich kenne.

Kann mir vielleicht einer helfen?

Vielen Dank schon mal für die ein oder andere Hilfe :slight_smile:

LunaX

Die neueren Geräte geben keinen Status mehr aus!

@e-t0m : supi - Danke !

ui - da hoffe ich doch mal das mein Soyosource noch was ausgibt :open_mouth:

Ich hab das Teil mal aufgemacht und auf dem Mainboard noch einen RS485 Anschluß gefunden - der liegt zu dem RS485 an dem der Limiter angeschlossen ist parallel. Den versuche ich mal "weiter zu verwenden" für mein Vorhaben - Mal schauen was dabei so rauskommt :slight_smile:

Euch allen einen guten "Rutsch ins Neue Jahr" und viel Sonnenenergie für 2023 :slight_smile:

Die beste (kompakte) Beschreibung des Protokolls findest Du im Quellcode hier ab Zeile 62:

Meine Soyos reagieren aber auch nicht auf die Anfragen mit 0x23... Ich hatte die Vermutung, dass die RS-485 Adapterplatine schuld sein könnte. Die ältere Version ist nicht galvanisch getrennt, die aktuelle hat eine galvanische Trennung mit 2 Optokopplern und einem DCDC-Wandler. In meinem Soyo habe ich die Adapterplatine ganz raus geschmissen und einen D1 mini direkt verdrahtet (der Sockel hat gleich noch Spannungsversorgung mit dabei, der ESP (WLAN) ist damit die galvanische Trennung der Daten :wink:

Trotzdem geht bei mir (zur Zeit) nur die Leistungsvorgabe per MQTT. Immerhin etwas.

Der (seltsame) Checksummen-Algorithmus (264-Byte[4]-Byte[5] und if...) ist eine verkürzte Berechnung. Der Soyo erwartet 8 Bytes und liefert 8 Bytes. Das erste Byte [0] ist wohl eine Geräteadresse (vielleicht hat die sich in einer aktuelle FW-Version geändert?!?). Das letzte Byte [7] ist die Prüfsumme. In den Bytes [5] und [6] wird die gewünschte Leistung übertragen. Mein Checksummen-Algorithmus ist

Check = (0XFF - Byte[1] - Byte[2] - Byte[3] - Byte[4] - Byte[5] - Byte[6] ) % 256; 

Bei den Beispielen, die man im Netz findet, erfolgt die Abfrage des Soyo mit der Bytefolge {0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}. Mit "meiner" Berechnung müsste da eigentlich {0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF} rauskommen. Vielleicht reagiert die aktuelle Firmware nur allergisch auf Prüfsummenfehler??

Muss mal wieder an mein bestehendes Projekt ran gehen... vielleicht einfach mal in einer Schleife alle möglichen Checksummen übertragen (sind ja nur 256 Möglichkeiten) und sehen, ob eine Antwort kommt :wink:

@e-baer : sehr gut - das hilft definitiv - ich werde mal sehen, was so bei mir aus dem Inverter rauskommt :slight_smile:

Vielen Dank für die Hilfe !

Viele Grüße Luna

@joehuebner hat auch die serielle Schnittstelle hinter dem RS485 angezapft:

@e-t0m - so ich hab hab gestern und heute mit meinem Inverter experimentiert - also wie befürchtet er ist stumm :-(.

Was aber putzig ist : der Inverter sendet 2x Sekunde mir die Wattzahl die aktuell anliegt (ausgegeben wird) über die RS485 zurück. Immerhin etwas und somit kann ich dann letztendlich das auch an mein ioBROKER weiter leiten.

Der Inverter ist derzeit im Schaltschrank verbaut - und um nun an andere interne Schnittstellen noch ranzukommen, müsste ich alles wieder zerlegen. Da weiß ich nicht nicht ob ich das mache. Mal sehen

Macht er das immer oder als Reaktion auf etwas?

Welche firmware hat dein soyo?

@e-t0m Also:
wenn der Limiter angeschlossen ist - wie gesagt - dann sendet der limiter 2x Sekunden folgende Bytes
Bei 0-Watt : 24 56 00 21 00 00 80 08

Bei 316-Watt: 24 56 00 21 01 3C 80 CB

Bei 400-Watt: 24 56 00 21 01 8F 80 78

CRC passt auch zu den 2-Bytes

Der Inverter antwortet generell nicht.

Im Display erscheint dann RS-485 (unten rechts)

Sende ich (ohne den Limiter) z.B. die gleiche Byte-Folge wie oben und ich es so 2-3 x pro Sekunde schaffe, dann erscheint auch RS-485 im Display. Mache ich es zu langsam passiert nix - keine Anzeige.

Auch hier antwortet der Inverter nicht.

Inverter:

FW: STC8-2022-801

Nachtrag:

Hab es sowohl mit der Einstellung GRID_LIMITER (oder wie das jetzt genau heißt :wink: ) Y und N ausprobiert. Macht keine Änderung

Nachtrag - uh - mist in meinem Post von 16:47 schrieb ich

Was aber putzig ist : der Inverter sendet 2x Sekunde mir die Wattzahl die aktuell anliegt (ausgegeben wird) über die RS485 zurück. Immerhin etwas und somit kann ich dann letztendlich das auch an mein ioBROKER weiter leiten.
QUATSCH: der LIMITER sendet 2x / Sekunde - ups sorry ein typischer Typo :-(
1 „Gefällt mir“

@lunax

hi

kannst du einem anfänger bitte helfen ??

folgender log

24 56 00 21 0000 80 08
24 56 00 21 0000 80 08
24 56 00 21 0000 80 08
24 56 00 21 0000 80 08
24 56 00 21 0000 80 08
24 56 00 21 003C 80 CC
24 56 00 21 003C 80 CC
24 56 00 21 011A 80 ED
24 56 00 21 021D 80 E9
24 56 00 21 021F 80 E7
24 56 00 21 021F 80 E7
24 56 00 21 021F 80 E7
24 56 00 21 026C 80 9A
24 56 00 21 03FC 80 09
24 56 00 21 03FC 80 09
24 56 00 21 03FC 80 09
24 56 00 21 03FC 80 09
24 56 00 21 03FC 80 09
24 56 00 21 031A 80 EB
24 56 00 21 031A 80 EB
24 56 00 21 021F 80 E7
24 56 00 21 021F 80 E7
24 56 00 21 021F 80 E7
24 56 00 21 01B7 80 50
24 56 00 21 003F 80 C9
24 56 00 21 0040 80 C8
24 56 00 21 0040 80 C8
24 56 00 21 003E 80 CA
24 56 00 21 003E 80 CA
24 56 00 21 003E 80 CA
24 56 00 21 003E 80 CA

die watt habe ich zusammengelassen

aber der rest ??

24 ?

56 ?

00 ?

21 ?

00 00 = watt

80 ?

CA

soyosource log

verschiedene verbraucher(aber siehst du ja selbst)

danke

achso, die daten kommen vom ac power meter

Hier mal ein Beispiel, wie man die Daten der Soyo-Zähler-Unit mittels ESP32 auslesen kann.

// Zwischen Soyo-Zähler-Unit und ESP32 einen RS485-TTL-Converter einschleifen !!!
#define RX13 13 // Import vom digitalen Soyo-Zähler-Unit (AC Power Meter)
#define TX14 14 // frei
void setup() {
Serial.begin(115200);
// Über Serial1 wird der Zähler eingelesen, Zähler bringt alle 500ms neue Werte
Serial1.begin(4800, SERIAL_8N1, RX13, TX14); //13 vom Zähler; 14 frei
}
void loop() {
// Import vom digitalen Soyo-Zähler-Unit (AC Power Meter) Rx13
if (Serial1.available() >= 8) {
// Warten, bis genügend Daten empfangen wurden (8 Bytes)
byte data[8];
for (int i = 0; i < 8; i++) {
data[i] = Serial1.read(); // Daten einlesen
}
// Überprüfen, ob die ersten 4 Bytes gleich sind
if (data[0] == 0x24 && data[1] == 0x56 && data[2] == 0x00 && data[3] == 0x21) {
byte chk = (byte)(264 - data[1] - data[0]);
// Leistung in Watt extrahieren
uint16_t Power = (data[4] << 8) | data[5];
// Serieller Monitor
Serial.print("Power: ");
Serial.print(Power);
}
}

Und hier noch ein Beispiel wie man die Daten mittels ESP32 wieder in den Soyo einlesen kann.

//Zwischen Soyosource und ESP32 einen RS485-TTL-Converter einschleifen !!!
#define RX13 13 // frei
#define TX14 14 // Export zum RS485-TTL-Converter
int Power;
void setup() {
Serial.begin(115200);
// Über Serial1 werden die Daten an den RS485-TTL-Converter
Serial1.begin(4800, SERIAL_8N1, RX13, TX14); //13 ftei; 14 Export
}
void loop() {
Power = 666; // 666 Watt
// Daten für Wechselrichter Tx14
byte message[8] = { 36, 86, 0, 33, 0, 0, 128, 8 };
// Der Arduino ist mit bit shifts am schnellsten
message[4] = (byte)((Power >> 8) & 0xff);
// hier schneiden wir einfach das höherwertige byte weg
message[5] = (byte)(Power & 0xff);
// Prüfsumme berechnen
message[7] = (byte)(264 - message[4] - message[5]);
Serial1.write(message, 8); // Ausgabe über seriellen Port Tx14
}

Hi Leute, ich bin neu hier und durch Zufall auf diesen Thread gestoßen. Vor einiger Zeit habe ich auf Basis eines STM32F4 Mikrocontrollers einen Modbus-Adapter für die Wechselrichter gebaut. Drei Stück habe ich seit einem halben Jahr ohne Probleme in Betrieb. Ich wollte eine solide, funkfreie und nach Modbusprotokoll arbeitende Anbindung an den Rest der PV Komponenten haben. Über die bereitgestellte Modbusregister können alle Werte ausgelesen werden. Zusätzlich kann die Einspeiseleistung vorgegeben werden.

Wenn Interesse besteht, stelle ich die Lösung zum Nachbau gerne zur Verfügung.

@fl0

Hallo

ja, jetzt habe ich das Problem. Habe nen Soyosource grid tie inverter mit Limiter und möchte das Gerät in meine Elektronik integrieren und dazu per uC mit dem Inverter "reden", also dem mitteilen, welche leistung benötigt wird. habe dazu die Kimmunikation zwischen dem Inverter und dem RS485-Gerät mit Stromsensor "mitgehört" und gesehen, dass da ne CRC am Ende eines datensatzes übertragen werden muss. ds ist wohl CRC8, aber wi berechne ich die? Bin da nicht so firm? hast du nen Link oder direkt nen CCode dafür?

Danke und Gruß

Gerhard

In meinen Beiträgen "Soyo-Zähler-Unit mittels ESP32 auslesen" und "Daten mittels ESP32 wieder in den Soyo einlesen" ist das Prinzip geklärt.

Statt Power=666; // 666 Watt kannst du auch Daten von einem Web-Client oder über Serial1 (Rx13) einlesen um die Leistung vom Soyo vorzugeben.

Ich habe ein Bild über den Aufbau beigefügt.

Das ist doch genau, was du suchst.

void loop() {

Power = 666; // 666 Watt

// Daten für Wechselrichter Tx14
byte message[8] = { 36, 86, 0, 33, 0, 0, 128, 8 };

// Der Arduino ist mit bit shifts am schnellsten
message[4] = (byte)((Power >> 8) & 0xff);
// hier schneiden wir einfach das höherwertige byte weg
message[5] = (byte)(Power & 0xff);

// Prüfsumme berechnen (Checksumme)
message[7] = (byte)(264 - message[4] - message[5]);

Serial1.write(message, 8); // Ausgabe über seriellen Port Tx14
}

@sgssn

Hallo Gerhard,

anbei der C-Code für die Erzeugung des Datenpakets incl. CRC-Berechnung für die Leistungsvorgabe über die RS485-Schnittstelle:

uint8_t pack[] = {0x24, 0x56, 0x00, 0x21, 0x00, 0x00, 0x80 ,0x00}; //Prototyp
uint16_t power = 123; //Soll-Leistung hier in Watt angeben
// Leistung in Paket ablegen
pack[4] = power >> 8;
pack[5] = power & 0xff;
// CRC Berechnen und setzen
uint8_t crc = (uint8_t)(0xff + 0x24);
for (uint8_t i=0; i<7; i++)
crc -= pack[i];
pack[7] = crc;

Viele Grüße

Flo

@fl0 wenn du den loop von 1 bis 6 machst kannst du das 0x24 sparen.

uint8_t crc = 0xff;
for (uint8_t i=1; i<7; i++)
crc -= pack[i];
pack[7] = crc; 

Hallo

danke an Alle! Es geht voran. Bau gerade nen RS485-Adapter an meinen uC und tests das mal.

Gruß

Gerhard