Deye WR CAN-Bus mit Arduino auslesen

Hallo Freunde,

Da wir ja festgestellt haben, dass die Smartload Funktion nicht verfügbar ist wenn der GEN-Port für Mikrowechselrichter benutzt wird, möchte ich das dadurch umgehen, dass ein Arduino Controller ersatzweise ein Relais schaltet wenn die Bedingungen entsprechend sind.

Dazu muss ich den CAN-Bus des Deye WR auslesen, kenne aber die genaue Vorgehensweise nicht.

Es tauchen hier diverse Fragen auf.

Sendet der WR seine Daten permanent oder muss man gezielt Daten anfordern?

Welche Befehle gibt es für die Anforderung von Daten?

Hat jemand eine Liste der IDs unter denen die Daten zu finden sind? Hier z.B. PV-Leistung, SOC, Home-Load, ... für all das müsste es Adressen geben, ich glaube im HEX Format.

Wenn ich das hinkriege, könnte man für ganz kleines Geld die Smartload Funktionalität nachrüsten.

Danke für eure Hilfe!

LG Benjamin

1 „Gefällt mir“

Um welchen Wechselrichter geht es überhaupt?

Der heißt glaube ich deye sun-12k-sg05lp3-eu

Dann glaube ich, dass die Liste passen würde. Aber ich weiß es nicht. Du musst das Rad nicht neu erfinden, denn es gibt bereits alles. Schau dir z. B. die Home-Assistent- und die Solarman-Integration von David Rapan auf Github an.

Deye Orginal Modbus RTU Liste V105.1-20231006.pdf (483,7 KB)

Die Liste schaut gut aus. Danke dafür!

Die Lösung mit dem Arduino soll eine minimal Variante werden, deswegen frage ich danach.

Vielleicht kann noch jemand Tips zu den eingangs gestellten Fragen geben hinsichtlich der Befehle und so...

Wenn ich das ans laufen bekomme und getestet habe wird der Code natürlich hier gepostet. Das kann dann jeder nachbauen.

Ich kenne mich mit Arduino nicht aus, weiß aber, wie die Befehle für Modbus zusammengesetzt werden. Das sollte auch in der Dokumentation beschrieben sein.

Ein Beispiel wie die Befehle aufgebaut sind

Kommando um das Register 104 ZeroExport power auf den Wert -20Watt setzen

01100068000102FFEBAF07

01 - Device Nr. 01

10 - function code: 03 - lesen oder 10 - schreiben (1 byte, 2 Stellen)

0068 - die Adresse des ersten zu lesenden oder zu schreibenden Registers wird in Hex eingegeben. (2 Byte, 4 Stellen)

0001 - Anzahl der zu lesenden oder zu schreibenden Register (2 Byte, 4 Stellen)

02 - byte count, Anzahl der zu lesenden oder zu schreibenden Bytes (1 Byte, 2 Stellen)

FFEB - Wert für das Register in Hex (2 Byte, 4 Stellen)

AF07 - CRC Code, wird für jede Befehl berechnet

Wenn du das Register 214 Li-bat SOC nur auslesen willst, dann siehet das Kommando so aus

010300D60001 + CRC Code

mit CRC Code

010300D6000165F2

2 „Gefällt mir“

Danke für die Erklärungen.

Das müsste doch so ähnlich auch in Arduino zu programmieren sein.

So wie ich das verstanden habe, wird dort das Datenpaket auch aus einzelnen Teilen gebaut.