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.