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:
-
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?
-
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!
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.
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
Andererseits ... gehts nun problemlos, und die Kabel kosten ja auch nicht die Welt
2 Stück 8 K Deye mit 25 kwp und 24 kwh Pylontech, Solarassistant auf RS232 und HA auf Raspi4, Go-E WB
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 :).
2 Stück 8 K Deye mit 25 kwp und 24 kwh Pylontech, Solarassistant auf RS232 und HA auf Raspi4, Go-E WB
... 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
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).
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 🙂
@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,
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 :).
Nur zur Info ...meine Konfiguration rennt seit Monaten absolut fehlerfrei, kann alles immer aktuell offline einsehen und einstellen.
2 Stück 8 K Deye mit 25 kwp und 24 kwh Pylontech, Solarassistant auf RS232 und HA auf Raspi4, Go-E WB