Benachrichtigungen
Alles löschen

Deye über Modbus auslesen

12 Beiträge
7 Benutzer
2 Likes
3,234 Ansichten
 baer
(@baer)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 72
Themenstarter  

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!


   
Auric reacted
Zitat
(@larado)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 30
 

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.


   
Dingsdada reacted
AntwortZitat
(@wolfih99)
Vorsichtiger Stromfühler
Beigetreten: Vor 11 Monaten
Beiträge: 18
 

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.


   
AntwortZitat
(@benni)
Autarkiekönig
Beigetreten: Vor 2 Jahren
Beiträge: 586
 

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

Gobelpower 2% Rabattcode auf alles XY7PB9Q2 klick mich

Gobelpower 12% auf diy_kit_280ah klick mich

Deye Lüfterblechbestellung: klick mich
https://www.gobelpower.com/?ref=fbtls4ao


   
AntwortZitat
(@stroka)
Newbie
Beigetreten: Vor 7 Monaten
Beiträge: 3
 

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


   
AntwortZitat
 baer
(@baer)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 72
Themenstarter  

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. 


   
AntwortZitat
(@stroka)
Newbie
Beigetreten: Vor 7 Monaten
Beiträge: 3
 

@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.


   
AntwortZitat
(@higgy)
Vorsichtiger Stromfühler
Beigetreten: Vor 3 Monaten
Beiträge: 107
 

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 Smile

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

2 Stück 8 K Deye mit 22 kwp und 24 kwh Pylontech, Solarassistant auf RS232


   
AntwortZitat
(@stroka)
Newbie
Beigetreten: Vor 7 Monaten
Beiträge: 3
 

@higgy bei welchem Modell ?


   
AntwortZitat
(@higgy)
Vorsichtiger Stromfühler
Beigetreten: Vor 3 Monaten
Beiträge: 107
 

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 22 kwp und 24 kwh Pylontech, Solarassistant auf RS232


   
AntwortZitat
(@terwi)
Vorsichtiger Stromfühler
Beigetreten: Vor 1 Jahr
Beiträge: 132
 

... 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 ?

 


   
AntwortZitat
 baer
(@baer)
Vorsichtiger Stromfühler
Beigetreten: Vor 2 Jahren
Beiträge: 72
Themenstarter  

@TERWI Ja, ich habe da von Waveshare mal 2-3 Module getestet... die beiliegende Software kann dann die Modbus nummern auslesen 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). 


   
AntwortZitat
Teilen: