Growatt SPH 4000-10000 TL3 BH UP MQTT über ESP

Begonnen von Teamdrachen, 18 März 2023, 18:24:08

Vorheriges Thema - Nächstes Thema

Teamdrachen

Den Ansatz dazu habe ich im Growatt Wechselrichter / ShineWiFi einbinden Thread #88 gefunden.
Link: https://forum.fhem.de/index.php/topic,98637.msg1260611.html#msg1260611

Um den Thread nicht zu kapern, könnte es ja hier weitergehen.

GROWATT SPH 10000 TL3 BH UP hab ich heute installiert und das von Tobias beschriebene Interface in Betrieb genommen.
https://github.com/tobiasfaust/SolaxModbusGateway

Daten bekomme ich rein, aber es ist ein reines Datenkauderwelsch.
Dabei ist es ganz egal welchen WR ich wähle.

Laut Growatt wäre folgendes für die SPH Reihe interessant
03 register range: 0-124, 1000-1124
04 register range: 0-124, 1000-1124

Zusätzlich laut PV Forum noch Register 608 für den STOP SOC.

Jetzt ist mein Modubus Wissen leider sehr gering.
Ich hab versucht über die RAW Data Funktion mal ein bestimmtes Register abzufragen, die Werte passen dann allerdings nicht zu den Erwartungen.

Wie unterscheide ich bei der Abfrage zwischen Register 4.1 Holding Reg und 4.2 Input Reg?






Aurel_B

Mit dem Gateway selbst kenne ich mich nicht aus, mit Modbus allerdings ein wenig :-) Ich würde zuerst einmal QModMaster https://sourceforge.net/projects/qmodmaster/ verwenden. Ist eine GUI um Modbus Anfragen tätigen zu können. Der Vorteil ist, du kannst sehr rasch Register, Datentypen etc. ändern und bekommst so in der Regel rasch ein Verständnis dafür, wie das Gateway funktioniert.

Wenn ich das richtig verstehe, so sollte z.B. die Abfrage vom Holding Register 5 die aktuelle Leistung in Watt ausgeben. In QModMaster würde das gemäss Screenshot eingestellt werden. ACHTUNG: FHEM zählt die Register ab 0, in der Anleitung (https://github.com/tobiasfaust/SolaxModbusGateway/blob/master/docs/growatt-inverter-modbus-rtu-protocolii-v120-english.pdf) die ich gefunden habe beginnt die Zählweise anscheinend auch bei 0. QModMaster beginnt allerdings bei 1, dort musst du also Register #6 einstellen. Probier das doch mal aus und berichte, ob es funktioniert.


Tobias

wie ich schon sagte,
stell mal bitte von RAW-Data ein Screenshot und als Codetext hier rein.
Dann kann man es relativ schnell sehen.
Im Wiki ist auch genau beschrieben wie man eigene Register findet. Das geht über die raw-data Seite sehr einfach. Die gefunden Registergruppen muss man dann einfach nur in der register.h einstellen, über gitpod neu kompilieren und fertig

Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Teamdrachen

O.K. ich hab mich mal am Beispiel Grid Frequenz aus Github versucht.

Modbus Version sollte 1.20 sein.
Grid frequency = 37
Example
Growatt Inverter, you are looking for the item "GridFrequency" in live-data, GridFrequency is at position 37 in Growatt modbus documentation, datatype is uint16

uint16 means 2 Bytes
(position) 37 x 2 (byte) = (position) 74
(position) 74 + 3 (byte header)) = (position) 77
look in Rawdata at position 77 and 78

ich bekomme aber nur "undefined"
Ab Pos 54 kommen keine Werte mehr.


Tobias

Dein RAW datastring sieht komisch aus. Der ist nicht korrekt. Welche Modbus ClientID hat dein Growatt eingestellt? Passt die Baudrate überein?

Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Teamdrachen

Client ID ist 01 und Baudrate bei Growatt ist Standard 9600.
Ich hab so langsam den SP3485 in Verdacht.
Es dauert manchmal bis überhaupt Daten kommen und manchmal blockiert er den ESP komplett.
Hab mal paar HW-0519 geordert, die sollten morgen da sein und dann teste ich weiter.

Tobias

Wenn die clientid 01 ist muss als erstes Byte in der Antwort ein 0x01 zurückkommen, danach ein 0x04 da die Anfrage für LiveDaten das InputRegister 04 ist

Blinkt der SP3484 immer ordentlich wenn eine Anfrage geschickt bzw. eine Antwort erhalten wird? Der Direction Pin ist auch korrekt konfiguriert?

Im Zweifelsfall bitte mal mit dem example Programm testen
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Teamdrachen

Direction Pin ist richtig definiert, ich hatte D5 genutzt.
Die Blinkintervalle waren nicht so richtig sauber erkennbar.
Wie erwähnt hatte ich gerade das Phänomen: Der ESP war "blockiert" und über Wifi nicht erreichbar, nach dem trennen des SP3484 war das Problem weg.
ESP ist nicht schuld, ein zweiter zeigte ein ähnliches verhalten.

War schon vorher "seltsam" es sollten ja alle paar Sekunden Werte aus dem WR kommen und ich musste manchmal 10 Minuten warten eh nach dem anstecken was passierte.

Möglicherweise ärgere ich mich wirklich gerade mit einem faulen Stück Hardware rum, daher wird der Wandler morgen getauscht.
Dann kann ich das zumindest ausschließen.

Teamdrachen

Zurück aus dem Keller.....
Mit dem neuen Adapter kommen endlich plausible Daten rein  :)

Jetzt geht es ans Wertesammeln.
4.2 Input Reg .... damit dürften die Live Daten gemeint sein.

Pos 46  VAC3  3Phase Grid Voltage  0.1V

46x2 (byte) = 92
92 + 3 (byte header) = 95

Da wir beide brauchen 95,96
Raw Data spuckt 4016 aus..... x0.1 = 401,6V

Klingt plausibel.

Pos 47  VAC3  3Phase Output curr.  0.1VA
47x2+3 =97

97,98 = 0X00, 0X06 = 6 .... kann ich wohl nur bei Sonne testen.

Zumindest läuft das System schon mal.



Tobias

Super!
Kompiliert mal bitte neu aus dem git. Hab heute 2 Änderungen eingecheckt. Incl Anpassungen an den Growatt Items
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Teamdrachen

#10
Super, noch mehr Daten.

Was mir auffällt:  Wenn der Inverter im Standby ist und man den ESP rebootet.... darf man in Keller laufen und den Cat Stecker kurz ziehen.
Sonst kommt der ESP nicht richtig in Gang. Ist zu 85% einfach nicht erreichbar, zu 15% bauen die Seiten zumindest teilweise auf, eh er dann wieder nicht erreichbar ist.


Frage: Wie sieht es mit den Registern >250 aus?
Ab Position 485 ist ja wieder alles "undefined"
input Register 1021:1022 -> AC power to user total, da erhoffe ich mir die durchgeschliffenen Daten vom EMeter zu finden.

Tobias

Zitat von: Teamdrachen am 20 März 2023, 20:11:37Super, noch mehr Daten.

Was mir auffällt:  Wenn der Inverter im Standby ist und man den ESP rebootet.... darf man in Keller laufen und den Cat Stecker kurz ziehen.
Sonst kommt der ESP nicht richtig in Gang. Ist zu 85% einfach nicht erreichbar, zu 15% bauen die Seiten zumindest teilweise auf, eh er dann wieder nicht erreichbar ist.
hab ich gestern abend gecheckt und kein Problem festgestellt. Alles super.
Im Zweifelsfall bitte mal über die Arduino IDO oder PlatformIO an den Rechner hängen und den Seriellen Monitor beobachten wo er hängt.

ZitatFrage: Wie sieht es mit den Registern >250 aus?
Ab Position 485 ist ja wieder alles "undefined"
input Register 1021:1022 -> AC power to user total, da erhoffe ich mir die durchgeschliffenen Daten vom EMeter zu finden.
Kannst du alles selbst einstellen WAS er abfragt. registers.h -> config -> RequestLiveData

In der aktuellen Growatt Registereinstellung sieht es so aus:
["#ClientID", "0x04", "0x00", "0x00", "0x00", "0x77"],
["#ClientID", "0x04", "0x03", "0xE8", "0x00", "0x77"]

Der erste fragt die ersten 119 Register ab, der zweite die Register 1000 - 1119

Wenn du also zusätzlich noch die Register 3000 - 3119 abfregen willst musst du dieses hinzufügen:
["#ClientID", "0x04", "0x0B", "0xB8", "0x0C", "0x2F"]
In der RawData sind alle Ergebnisse hintereinander dargestellt, du musst die Positionen also korrekt ausrechnen.

Bedenke aber bitte, jeder zusätzliche Eintrag dort (aktuell sind es ja 2) bedeutet eine Verarbeitungszeit von 1sek. Das ist vom Inverter festgelegt. Dementsprechend kannst du das permanente Abfrageintervall nicht zu weit herunterdrücken.

Also 3 Anfragen an den Inverter bedeutet ein Daten Updateintervall > 3sek
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Teamdrachen

Registerabfragen muss ich später noch mal genauer schauen.
Momentan ist da noch ein Knoten warum 3001-3119 und wieso ich da mit
["#ClientID", "0x04", "0x0B", "0xB8", "0x0C", "0x2F"]drauf Abfrage.

Generelles Problem ist momentan die Stabilität des ESP
Der schmiert immer wieder ab.
Trenne ich die 485 Verbindung startet er sauber, irgendwann ist er dann aber wieder weg.

Tobias

War nur ein Beispiel, je nachdem was du abfragen willst. I.d.R. Passt die aktuelle Anfrage so ;)
Ich übernehme gerne neue Items die du anhand der Modbus Protokoll Doku herausgefunden hast, allerdings erstmal keinen 3. Request da viele ein sehr kleines Invervall wollen.
Maintainer: Text2Speech, TrashCal, MediaList

Meine Projekte: https://github.com/tobiasfaust
* PumpControl v2: allround Bewässerungssteuerung mit ESP und FHEM
* Ein Modbus RS485 zu MQTT Gateway für SolarWechselrichter

Teamdrachen

Mit der aktuellen Anfrage komme ich aber nicht über Position 485 hinaus, bzw bekomme nur noch "undefined"

Aber da geh ich die Tage noch mal mit nem USB Stick ran um die Register zu ermitteln.
Das Reset Problem ist erst mal das größere.

Nach ziemlich genau einer Stunde geht der ESP in eine Reset Schleife.
Meldet sich im 3-5 Sekunden Takt beim Router an/ab
Wenn man mal Glück hat ist er lange genug da um rudimentär das Webinterface zu zeigen und da steht dann UPTIME: 0:0:0
Ist also kein reiner Wifi Verlust, sondern er ist in einer Bootschleife gefangen.


Abhilfe schafft nur das RS485 Kabel zu entfernen, dann bootet er durch und eine Stunde später fängt es wieder an.
Manueller Reboot innerhalb der Stunde führt auch zur Schleife.