Deye über Modbus auslesen

Hallo zusammen,

Ich möchte ein Projekt starten, das anscheinend noch nicht viele umgesetzt (oder zumindest nicht geteilt) haben: den Deye mittels Modbus auszulesen und die Daten per JSON oder auf einer eigenen HTML-Plattform bereitzustellen. Natürlich sind Lösungen wie der IO-Broker, Home Assistant oder openHAB toll, aber sie sind nicht in jedem Szenario ideal. In meinem speziellen Fall möchte ich einem Kunden ein einfaches Display anbieten, das lediglich von einem ESP32 gesteuert wird. Ein Server für IO-Broker oder ähnliche Lösungen wäre hier overkill.

Allerdings habe ich bereits am Anfang einige Fragen:

  1. Welcher Port ist der richtige, um den 3-Phasigen Deye 12k auszulesen? Es macht wahrscheinlich nur Sinn, den RJ45 Modbus-Port zu verwenden. Hier habe ich aber 2x A, B, GND (auf 123 und 678).
    • Funktionieren beide? Ist das der richtige Ansatz?
    • Oder arbeitet der Modbus Full-Duplex über alle vier Leitungen - und wenn ja, welche sind dann IN und welche OUT?
  2. Gibt der Deye seine Informationen von sich aus heraus, oder muss ich diese explizit abfragen? Ich habe bereits mehrere Listen mit Commands gefunden.
Sobald das Projekt fertig ist, freue ich mich darauf, die Schematik, Einstellungen und den Code zu teilen. Wenn es bereits ähnliche Projekte gibt, die ich übersehen habe, wäre ich sehr dankbar für einen Verweis.

Vielen Dank im Voraus und viele Grüße!

1 „Gefällt mir“

Je nachdem was für ein Backend du hast, könnte das hier als erste Idee ganz hilfreich sein. Ist in Python/PHP programmiert und schreibt die Daten in eine SQL Datenbank. Alles extrem simpel aufgebaut. Das kannst du recht leicht auf eine JSON Ausgabe ändern oder Scripte zum Auslesen der Datenbank erstellen.

https://github.com/piecler/energy-monitor

Am Wechselrichter mußt du die Daten am BMS Port abgreifen. Dazu kannst du dir einen Y Verbinder bauen und die CAN Pins zum Akku leiten und die Modbus Pins zu deinen Auslesegerät.

1 „Gefällt mir“

Ich häng mich mal an die Frage mit an. Wie krieg ich den die Daten aus dem Deye 12k raus. Was kommt den z.B. über das WLAN an? Ich beabsichtige eine Steuerung für das Laden meines E-Autos zu etablieren. Die Software dazu fragt Schnittstellen ab und je nach dem was gerade vom Dach kommt oder noch in der Batterie ist lädt dann das Auto.

Mit fehlt hier nur das Verständnis wie ich mit was für einen Schnittstelle den an die Daten des Deye komme. Es gibt ja die unterschiedlichen RJ45 Ausgänge. Die kann ich aber sicher nicht einfach an einen Switch anschließen und das Gerät dann im Netz finden. Was kann den das WLan des Deye 12K. Ich hab noch keinen WR drin, soll erst bis Ende des Jahres eingebaut werden. Will das nur mal abklären damit ich evtl. gleich noch Hardware dazu kaufen kann.

Der Deye gibt Modbus RTU aus. Das musst halt an deine Software anbinden. Gibt ja 1000 Möglichkeiten.

@larado Das ist sehr interessant, gibt es irgendwo eine Beschreibung ? konnte bei github nichts weiter finden.

Eigentlich wollte ich schon lange das mal "Veröffentlichen" ...
ich habe hier mal zum Test nen Code "hingerotzt" das ist sicher so nicht wirklich ernsthaft verwendbar - aber um sich vorzustellen wie man an die Daten vom Deye kommt reicht das ^^

#include <Arduino.h>
#include <WiFi.h>
#include <AsyncTCP.h>
#include "ESPAsyncWebServer.h"
#include <ModbusMaster.h>
ModbusMaster node;
AsyncWebServer server(80);
AsyncWebSocket ws("/ws");
const char* ssid = "wifi-ssid";
const char* password = "wifi-password";
WiFiServer server(80);
struct RegisterInfo {
uint16_t Register;
const char* RegisterName;
const char* Unit;
float Multiplier;
uint16_t Value;
};
RegisterInfo registers[] = {
{146, "Solar Sell", "W", 1, 0},
{589, "Batterie Kapazität", "%", 1, 0},
{530, "Tages-Energie", "kW", 0.1, 0},
{591, "Ausgangsleistung der Batterie", "W", 1, 0},
{599, "Netzphasenspannung L1", "V", 0.1, 0},
{600, "Netzphasenspannung L2", "V", 0.1, 0},
{601, "Netzphasenspannung L3", "V", 0.1, 0},
{603, "Netzleistung L1", "W", 1, 0},
{604, "Netzleistung L2", "W", 1, 0},
{605, "Netzleistung L3", "W", 1, 0},
{606, "Netzleistung", "W", 1, 0},
{519, "Grid einkauf heute", "kWh", 0.1, 0},
{520, "Grid verkauf heute", "kWh", 0.1, 0},
{611, "Netzphasenstrom L1", "A", 0.01, 0},
{612, "Netzphasenstrom L2", "A", 0.01, 0},
{613, "Netzphasenstrom L3", "A", 0.01, 0},
{651, "Loadleistung2 L1", "W", 1, 0},
{652, "Loadleistung2 L2", "W", 1, 0},
{653, "Loadleistung2 L3", "W", 1, 0},
{654, "GesamtLoad", "W", 1, 0},
{673, "String1", "W", 1, 0},
{674, "String2", "W", 1, 0},
{515, "Test", "?", 1, 0},
{535, "Gesamt-PV-Leistung", "kwh", 1, 0},
{521, "Gekaufter Strom Heute", "kwh", 0.1, 0},
{522, "Verkaufter Strom Heute", "kwh", 0.1, 0},
{588, "Batteriespannung", "V", 0.01, 0},
{639, "Frequenz", "Hz", 0.01, 0},
{590, "Batterie Strom", "W", 1, 0},
{513, "Batterie Charge Today", "kWh", 0.1, 0},
{514, "Batterie Discharge Today", "kWh", 0.1, 0},
{515, "Batterie Charge Total", "kWh", 0.1, 0},
{593, "Batteriekapazität?", "Ah", 1, 0}
};
void onWsEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, AwsEventType type, void *arg, uint8_t *data, size_t len){
if(type == WS_EVT_CONNECT){
Serial.println("Websocket client connection received");
} else if(type == WS_EVT_DISCONNECT){
Serial.println("Client disconnected");
}
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
ws.onEvent(onWsEvent);
server.addHandler(&ws);
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send(200, "text/html", "WebSocket Server");
});
server.begin();
Serial2.begin(9600, SERIAL_8N1, 16, 17); // Baudrate, Modus, RX, TX
node.begin(1, Serial2); // Modbus-Adresse und Serielle Schnittstelle setzen
Serial.println("Setup abgeschlossen.");
}
void loop() {
uint8_t result;
ws.cleanupClients();
for (int i = 0; i < sizeof(registers) / sizeof(RegisterInfo); ++i) {
result = node.readHoldingRegisters(registers[i].Register, 1);
if (result == node.ku8MBSuccess) {
registers[i].Value = node.getResponseBuffer(0);
Serial.print(registers[i].RegisterName);
Serial.print(": ");
Serial.println(registers[i].Value);
} else {
Serial.println("Fehler beim Lesen des Registers.");
}
}
delay(1000);
}

Fragen kann ich gerne beantworten...
Klar ist, dass ich noch einen RS-485-Transceiver hingetüdelt habe.
Ich habe das Modul nicht dafür aufgebaut um das jetzt mit einem Homeassi oder iobroker zu verbinden sondern um hier einfach einen Datenlogger zu bauen bzw. um mal mit dem Smartphone schnell auf den Deye zu schauen und "Cloudfrei" zu sein (ohne extra Server)...
Aber ich habe seit Monaten keine Zeit das ganze weiterzuentwickeln und das mal "fertig" zu machen.
Aber evtl. hilft das ja den ein oder anderen.

@baer vielen Dank! Die Schnittstelle wäre dann RS pin im BMS Port(z.B. Hybrid) ? ich habe noch einige ESP8266 liegen, damit sollte es theoretisch gehen, RS-484 wandler vorausgesetzt.

Ich habe es über die "netzwerkstecker" nicht geschafft auch zu schreiben.

Das klappte erst, als ich unten die RS232 Stecker nutzte .... aber vielleicht war ich auch nur zu doof :slight_smile:

Andererseits ... gehts nun problemlos, und die Kabel kosten ja auch nicht die Welt :slight_smile:

@higgy bei welchem Modell ?

Modell ? Also das Auslesen und schreiben mache ich mit dem SolarAssitant Raspi, habe dort das fertige Paket gekauft vor ca 5 Monaten.

Perfekter Support, und die Kiste rennt 1A...
Mit Homeassistant und MQTT gehe ich dann (neuerdings) weiter auf einen weiteren Raspi4, da bin ich aber derzeit noch voll dabei mich einzuarbeiten :).

... ich häng mich mal mit an.

Würde auch gerne - so wie @baer sich das vorstellt - einfach den Deye (erstmal nur) lesen.

Gerne auch zusätzlich einen SDM630 (informativ, zum Vergeich, Kontrolle)

Daten sammeln, auswerten mache ich selber - KEIN HomeAssistent, Broker, MQTT usw. !

Es gibt ja zahlreich die niedlichen Modbus-RJ45-WLAN Dinger (ESPhome ?) für kleines Geld, die aber eben genau das "promoten".

Rücken diese Teile als AP auch RAW-Daten auf Anfrage raus ?

@TERWI Ja, ich habe da von Waveshare mal 2-3 Module getestet... die beiliegende Software kann dann die Modbus nummern auslesen :slight_smile:
z.B.:
RS485 TO ETH (B) - Waveshare Wiki
Ich habs getestet habs mit n bisschen Fummelei hinbekommen will aber hier nicht meine Hand ins Feuer legen (man kann da viel Konfigurieren).

@baer

Hallo baer, bist Du hier weiter gekommen?

Ich möchte meinen Hybriden gerne mit einem ESP/Arduino auslesen. Mir geht es aktuell nur um den (Lese-)Zugriff, die Weiterverarbeitung der Daten ist kein Problem. Hätte gerne eine Übersichtsseite in meiner Haussteuerung erweitert :slight_smile:

@mingo Hallo Baer,
Hast du eine Lösung gefunden und erfolgreich die Daten von Deye über Modbus RTU ausgelesen? Jegliche Informationen oder Erfahrungen, die du teilen könntest, wären sehr willkommen.
Vielen Dank im Voraus für deine Hilfe!
Mit freundlichen Grüßen,

Nur zur Info ...meine Konfiguration rennt seit Monaten absolut fehlerfrei, kann alles immer aktuell offline einsehen und einstellen.

Da klinke ich mich mal ein. Ich lese meinen 12K seit Monaten über den Modbus Port über ein Esp32 RS485 Board aus (Lilygo t poe pro), das über 'esphome for deye' in Home Assistant integriert ist. Werte wie V, W, und A lese ich alle 5 sekunden aus, alles andere alle 30 sekunden. Leider gibt es bei den werten, die alle 5 Sekunden ausgelesen werden, immer wieder Spikes nach oben (30607W zB), was das ganze etwas unschön macht leider.

Batterie hab ich noch keine am Deye hängen. Aber warum benutzt hier niemand den gesonderten Modbus Port? Das sind doch dieselben Leitungen intern wie am BMS Port? Oder hab ich das wo falsch aufgenommen?

Weil er je nach Firmwareversion nicht funktioniert. Bei meinem SunSynk 12k LP3 (Deye OEM) ist die "ModeBus" Buchse ebenfalls unbrauchbar. Ich gehe an die BMS Buchse. Dort habe ich einen Splitter für CAN zur JK-BMS Master Akku und RS485 über isolierten 4 fach USB-RS485 von WaveShare -> Proxmox -> Home Assiatant.
Dh. an der BMS Buchse zwei Anschlüsse benutzt.

In HA benutze ich das "Sunsynk/Deye Inverter Add-on (multi)" Configuration | Deye/Sunsynk.
Für das JK-BMS habe ich in HA eigene ModBus YAML codiert. Falls Interesse besteht kann ich das ja mal posten (sollte aber hier im Forum schon koursieren)

Edit: https://www.akkudoktor.net/forum/bms-batterie-management-monitoring-system/jk-bms-und-venus-os-einzelne-zellspannungen-bereitstellen/paged/2/#post-241435

Korrekt diese Erfahrung habe ich auch gemacht. Sowohl mit einem ESPHome auf einem ESP32, an RS232 Port (WiFi Dongle) wie auch RS485 am BMS Port. Und auch die direkte Abfrage per ModBus in Home Assiatant zeigte dieses Verhalten. Nun, beides stammt ja von dem gleichen Entwicklerteam.

Mit dem oben angesprochenen SunSynk AddOn, direkt in Python programmiert, das ebenfalls die gleiche ModBus Python Bliblithek wie HomeAssiatent nutz, habe ich diese Spikes nicht!

Ich habe einen 12k mit FW 1150, da ist auch der Modbus Port voll funktionsfähig. Ich kann per Modbus so ziemlich alles auslesen - Register sind ja bekannt.
Eine Frage hätte ich aber trotzdem: Da wir bei dieser Installation ein Batterie mit JKBMS nutzen, ist aktuell keine BMS Kommunikation vorhanden (=> Batterie spannungsgeregelt).

Da der RPi, auf dem das ganze läuft, auch zyklisch das BMS abfrägt (per BT), würde ich auch gerne die BMS Werte über Modbus in den WR schreiben (Register 210-240) und hätte somit eine komplette BMS Kommunikation laufen.

Hat das schon jemand gemacht bzw. hat jemand Codeschnipsel für mich?
Könnte mir vielleicht jemand freundlicherweise mal Register 210 bis 240 von einem DEYE mit angeschlossenem BMS auslesen?
Da bei uns ja kein BMS dran hängt, stehen da natrürlich nur 0en drinnen.

Also ich habe das am laufen, allerdings bischen anders als du. Ich benutze 2x 16kWh Akkus mit JK-BMS an SunSynk/Deye 12kW.

1.) LiBMS Modus im Deye und an BMS Buchse den CAN-Bus an Master-Akku CAN-Port. Im JK-BMS eingestellt dazu das PylonTech Protokoll, nichts das Deye Protokoll.
Mit dieser Methode kann der Deye selber alle Daten vom JK-BMS abholen, so wie er das brauch und deine Idee von oben wird hinfällig. JK-BMS ist super geeignet am Deye.
2.) Deine Idee wird nicht funktionieren da du ja am Deye den AGM/Spannungsmodus benutzt und selbst wenn du nun per ModBus diese Register befüllen könntest wird der Deye die nicht benutzen. Erst im LiBMS Modus aber dann holt der Deye diese Daten selbst vom BMS ab.
3.) Das BMS habe ich per RS485 an meinem Server auf dem Home Assistant läuft. Dort frage ich meine Akkus per ModBus ab. Dazu habe ich in HA eine YAML, mehr nicht.
Hier meine Dateien: JK BMS und Venus OS: Einzelne Zellspannungen bereitstellen - #29 von pv-soko - BMS Batterie Management/Monitoring System - Akkudoktor Forum
Falls du das benutzen willst dann frage mich wie du das installieren musst (falls du auch HA nutzt)