Sunny tripower 8.0

SUNNY TRIPOWER 8.0

#include <ESP8266WiFi.h>
#include <WiFiClient.h>

const char* ssid = "ssid";
const char* password = "pw";

// Funktion zum Konvertieren von hexadezimaler in Textform
String hexToText(String hexString) {
  String text = "";
  
  for (int i = 0; i < hexString.length(); i += 2) {
    String hexByte = hexString.substring(i, i + 2);
    byte byteValue = strtol(hexByte.c_str(), NULL, 16);
    text += (char)byteValue;
  }
  
  return text;
}

void setup() {
  Serial.begin(115200);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Verbindung zum WLAN herstellen...");
  }
  Serial.println("Verbunden mit WLAN");
}

void loop() {
  WiFiClient client;

  // IP-Adresse und Port des Wechselrichters
  const char* host = "192.168.xxxx.xxxxx";
  const uint16_t port = 502;

  // Hexadezimale Modbus-Anfrage
  uint8_t request[] = {0x8D, 0xCD, 0x00, 0x00, 0x00, 0x06, 0x03, 0x04, 0x78, 0x91, 0x00, 0x0A};

  // Verbindung zum Wechselrichter herstellen
  if (client.connect(host, port)) {
    Serial.println("Verbunden mit Wechselrichter");

    // Modbus-Anfrage senden
    client.write(request, sizeof(request));
    delay(100); // Eine kurze Verzögerung, um sicherzustellen, dass die Anfrage vollständig gesendet wird

    // Antwort empfangen
    String hexResponse = "";
    while (client.available()) {
      uint8_t response = client.read();
      hexResponse += String(response, HEX) + " ";
    }

    Serial.println("Antwort empfangen");

    // Hexadezimalen String in Text umwandeln
    String textResponse = hexToText(hexResponse);

    // Textausgabe
    Serial.println("Hexantwort: " + hexResponse);
    Serial.println("Textantwort: " + textResponse);

    // Bezugswert und Einspeisewert extrahieren
    int bezug = textResponse.substring(25, 29).toInt();
    int einspeisung = textResponse.substring(29, 33).toInt();

    // Ausgabe der Bezugswerte und Einspeisewerte
    Serial.print("Bezug: ");
    Serial.print(bezug);
    Serial.println(" W");
    Serial.print("Einspeisung: ");
    Serial.print(einspeisung);
    Serial.println(" W");

    // Verbindung trennen
    client.stop();
    Serial.println("Verbindung getrennt");
  } else {
    Serial.println("Verbindung zum Wechselrichter fehlgeschlagen");
  }

  delay(5000); // Warten, bevor die nächste Anfrage gesendet wird
}

Antwort von WR : 18:43:42.479 -> Verbindung zum WLAN herstellen...
18:43:42.479 -> Verbunden mit WLAN
18:43:42.479 -> Verbunden mit Wechselrichter
18:43:42.572 -> Antwort empfangen
18:43:42.572 -> Hexantwort: 8d cd 0 0 0 17 3 4 14 0 0 0 0 0 0 1 e3 80 0 0 0 ff ff ff ff 80 0 0 0
18:43:42.572 -> Textantwort: ⸮

Und was erwartest du in den empfangenen (oder auch nicht) Bytes 25 .. 33 ?

Was ist der Sinn der mehrfachen substring- "Fummelei" ?

erzeugt ein oder zwei Zeichen. Das macht es schwer wieder zurückzuwandeln. Dein hexToText kann es jedenfalls nicht.

Hallo Michael Mit Programmieren kenne ich mich nicht so aus das kommt von chat gpt.
ich möchte das esp8266 über modbus die werte für einspeise und bezug vom wechselrichter kriegt und für mich lesbar darstellt .
Das kommt als antwort 16:04:38.562 -> 8D CD 0 0 0 B 3 4 8 0 0 0 0 0 0 8 DF Antwort empfangen
Die lezten 4 zeichen sind Einspeise wert ( 08DF ) = 2271 Wh. die 4 zeichen davor sind bezugs wert ( 0000 ) = 0 Wh
Wie ich das machen soll weis ich nicht .kannst du mir helfen?

#include <ESP8266WiFi.h>
#include <WiFiClient.h>

const char* ssid = "ssid";
const char* password = "pw";

void setup() {
 Serial.begin(115200);

 WiFi.begin(ssid, password);
 while (WiFi.status() != WL_CONNECTED) {
   delay(1000);
   Serial.println("Verbindung zum WLAN herstellen...");
 }
 Serial.println("Verbunden mit WLAN");
}

void loop() {
 WiFiClient client;

 // IP-Adresse und Port des Wechselrichters
 const char* host = "192.168.178.20";
 const uint16_t port = 502;

 // Hexadezimale Modbus-Anfrage
 uint8_t request[] = {0x8D, 0xCD, 0x00, 0x00, 0x00, 0x06, 0x03, 0x04, 0x78, 0x91, 0x00, 0x04};

 // Verbindung zum Wechselrichter herstellen
 if (client.connect(host, port)) {
   Serial.println("Verbunden mit Wechselrichter");

   // Modbus-Anfrage senden
   client.write(request, sizeof(request));
   delay(100); // Eine kurze Verzögerung, um sicherzustellen, dass die Anfrage vollständig gesendet wird

   // Antwort empfangen
   while (client.available()) {
     uint8_t response = client.read();
     Serial.print(response, HEX);
     Serial.print(" ");
   }

   Serial.println("Antwort empfangen");

   // Extrahieren und konvertieren der Werte
   uint16_t position4 = (request[9] << 8) | request[10];
   uint16_t position5 = (request[11] << 8) | request[12];

   // Ausgabe der Werte
   Serial.print("Position 4: ");
   Serial.println(position4);
   Serial.print("Position 5: ");
   Serial.println(position5);

   // Verbindung trennen
   client.stop();
   Serial.println("Verbindung getrennt");
 } else {
   Serial.println("Verbindung zum Wechselrichter fehlgeschlagen");
 }

 delay(5000); // Warten, bevor die nächste Anfrage gesendet wird
}



16:04:28.252 -> Verbindung zum WLAN herstellen...
16:04:28.252 -> Verbunden mit WLAN
16:04:28.252 -> Verbunden mit Wechselrichter
16:04:28.346 -> 8D CD 0 0 0 B 3 4 8 0 0 0 0 0 0 8 E0 Antwort empfangen
16:04:28.346 -> Position 4: 37120
16:04:28.346 -> Position 5: 1208
16:04:28.346 -> Verbindung getrennt
16:04:33.360 -> Verbunden mit Wechselrichter
16:04:33.454 -> 8D CD 0 0 0 B 3 4 8 0 0 0 0 0 0 8 E3 Antwort empfangen
16:04:33.454 -> Position 4: 37120
16:04:33.454 -> Position 5: 1208
16:04:33.454 -> Verbindung getrennt
16:04:38.469 -> Verbunden mit Wechselrichter
16:04:38.562 -> 8D CD 0 0 0 B 3 4 8 0 0 0 0 0 0 8 DF Antwort empfangen
16:04:38.562 -> Position 4: 37120
16:04:38.609 -> Position 5: 1208
16:04:38.609 -> Verbindung getrennt
16:04:43.587 -> Verbunden mit Wechselrichter
16:04:43.681 -> 8D CD 0 0 0 B 3 4 8 0 0 0 0 0 0 8 DE Antwort empfangen
16:04:43.681 -> Position 4: 37120
16:04:43.681 -> Position 5: 1208
16:04:43.681 -> Verbindung getrennt
16:04:48.717 -> Verbunden mit Wechselrichter
16:04:48.810 -> 8D CD 0 0 0 B 3 4 8 0 0 0 0 0 0 8 E6 Antwort empfangen
16:04:48.810 -> Position 4: 37120
16:04:48.810 -> Position 5: 1208
16:04:48.810 -> Verbindung getrennt

Da kommt die Antwort, wird protokolliert und ist danach weg.
Danach versuchst du, statt der Antwort, den Aufruf (request) auszuwerten.

Du kannst chatgpt relativ leicht dazu bringen, dass es antwortet: "You are right. Apologies for my mistake".
Oder es selbst versuchen :slight_smile:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.