SunnyBoyReader mit ESP8266 Daten auslesen

Hat schon mal jemand den SmaSunnyBoyReader ausprobiert?:thinking:

Ich bekomme keine Daten. Getting Values: fail

WĂ€hle ich mich mit IP und PW per Browser ein funktioniert es.

Debugging

Debugging can be turned on by setting DEBUG_SMAREADER_ON. Uncomment the following line in SMAReader.h:

#define DEBUG_SMAREADER_ON 1

1 Like

Hmm, IP ok & das verwendete PW ist richtig. Der SMA zuckt aber nicht...

..WiFi connected
IP address: 192.168.100.111
Number of tries: 7
Connecting time (microseconds): 4229892
Try: 0
[HTTP] POST... URL: http://192.168.0.72/dyn/login.json
[HTTP] POST... message: {"right":"usr", "pass":"*****"}
[HTTP] POST... failed, error: -1: connection failed
Try: 1
[HTTP] POST... URL: http://192.168.0.72/dyn/login.json
[HTTP] POST... message: {"right":"usr", "pass":"*****"}
[HTTP] POST... failed, error: -1: connection failed
Try: 2
[HTTP] POST... URL: http://192.168.0.72/dyn/login.json
[HTTP] POST... message: {"right":"usr", "pass":"*****"}
[HTTP] POST... failed, error: -1: connection failed
Try: 3
[HTTP] POST... URL: http://192.168.0.72/dyn/login.json
[HTTP] POST... message: {"right":"usr", "pass":"*****"}
[HTTP] POST... failed, error: -1: connection failed
Try: 4
[HTTP] POST... URL: http://192.168.0.72/dyn/login.json
[HTTP] POST... message: {"right":"usr", "pass":"*****"}
[HTTP] POST... failed, error: -1: connection failed
Getting values: fail

Wen rein zufÀllig die Seite https verwendet wird das nichts.
Mal genau schauen auf Telefon oder Browser.

Die ist im lokalen Netz, da ist https eher ungewöhnlich.

Gruß Tommy

Stimmt.

Frage warum wird hier die 192.168.0.72 und nicht die 192.168.100.111?
wo bei im dem Example wir noch eine andere verwendet

/**
 * Example: SMAReader_Demo.ino
 *
 */


#ifdef ESP8266
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#endif

#ifdef ESP32
#include <WiFi.h>
#include <HTTPClient.h>
#endif


#include <ArduinoJson.h>

#include <SMAReader.h>

// Fill in appropriate values
#define WLANSSID "..."
#define WLANPWD "..."
#define INVERTERPWD "..."
IPAddress inverterIP(192,168,0,100);

#define DEBUG_LEVEL 3
#define DEBUG_ERROR 1
#define DEBUG_MIN_INFO 2
#define DEBUG_MAX_INFO 3
#define DEBUG_OUT(level, fmt, ...) if(DEBUG_LEVEL>=level) Serial.printf_P( (PGM_P)PSTR(fmt), ## __VA_ARGS__ )

SMAReader smaReader(inverterIP, SMAREADER_USER, INVERTERPWD, 5); 


void setup() {
  Serial.begin(9600);
  connectWifi(true);
}

int connectWifi(bool firstConnect) {
  unsigned long startwifi=micros();
  unsigned int retryCount = 0;

  if(!firstConnect) {
    WiFi.reconnect();
  } else {
    WiFi.mode(WIFI_STA);
    WiFi.begin(WLANSSID, WLANPWD); // Start WiFI
  }

  DEBUG_OUT(DEBUG_MIN_INFO, "%sonnecting to %s\n", firstConnect?"C":"Rec", WLANSSID);

  while ((WiFi.status() != WL_CONNECTED) && (retryCount < 40)) {
    delay(500);
    DEBUG_OUT(DEBUG_MIN_INFO, ".");
    retryCount++;
  }
  int success=WiFi.status();
  if(success==WL_CONNECTED) {
    DEBUG_OUT(DEBUG_MIN_INFO, "WiFi connected\nIP address: %s\n", WiFi.localIP().toString().c_str());
  } else {
    DEBUG_OUT(DEBUG_ERROR, "Failed to connect\n");
  }
  DEBUG_OUT(DEBUG_MIN_INFO, "Number of tries: %d\n", retryCount);
  DEBUG_OUT(DEBUG_MIN_INFO, "Connecting time (microseconds): %lu\n", micros()-startwifi);

  return success;
}






void loop() {
    // wait for WiFi connection
    if(WiFi.status() == WL_CONNECTED) {
      // getValues int example
      String keys[2]={KEY_POWER, KEY_ENERGY_TODAY};
      int values[2];
      bool isSuccess=smaReader.getValues(2, keys, values);
      Serial.printf("Getting values: %s\n", isSuccess?"success":"fail");
      if(isSuccess) {
         for(int val: values) {
            Serial.printf("Value: %d\n", val);
         }
      }
      // getValues String example
      String keys_string[2]={KEY_WLAN_IP, KEY_WLAN_DNS_IP};
      String values_string[2];
      isSuccess=smaReader.getValues(2, keys_string, values_string);
      Serial.printf("Getting values: %s\n", isSuccess?"success":"fail");
      if(isSuccess) {
         for(String& val: values_string) {
            Serial.printf("Value: %s\n", val.c_str());
         }
      }
      // getLog example
      tm startTime;
      strptime("2020-10-19 16:00:00", "%Y-%m-%d %T", &startTime);
      uint32_t startTimestamp = mktime(&startTime);
      Serial.printf("Timestamp: %lu\n", startTimestamp);

      uint32_t values_log[100];
      uint32_t timestamps[100];
      int numValues=smaReader.getLog(startTimestamp, startTimestamp+1000, values_log, timestamps);
      Serial.printf("Logger: %s\n", numValues==-1?"fail":"success");
      for(int i=0;i<numValues;i++) {
        Serial.printf("Timestamp: %sTotal energy production: %lu Wh\n", asctime(localtime((time_t *)&timestamps[i])), values_log[i]);
      }
      //Serial.printf("All values, succes: %d\n", smaReader.getAllValues());
    }

    
    delay(10000);
}
type or paste code here

Der holt entweder seine Netzdaten via DHCP oder wird im Interface festgelegt.
Wenn das Hausnetz die 192.168.0/24 ist, passt das schon.

Die IP vom Inverter ist 192.168.100.72
Die IP vom ESP ist 192.168.100.111

Arrrrgggghhhh, schei....!:fearful:
Mindestens 10x kontrolliert und doch ĂŒbersehen: Ich habe im Code 192.168.0.72 verwendet.

Jetzt klappt es.:upside_down_face:

Vier Augen sind immer besser als zwei :wink:

Da drauf bin spÀter gekommen.
So am Rande hab im Router die Adressen fĂŒr meine ESP fest vergeben den je nach Routertyp neigen die die Adressen stĂ€ndig Ă€ndern, zB Netgear.

Hat der keine Einstellmöglichkeit, der gleichen MAC immer die gleiche IP zuzuweisen, wie die Fritzbox?

Gruß Tommy

Ja... So ist es, wenn man mal schnell was machen will...
DafĂŒr ist das debugging ja :wink:

Leider nein, ist sehr gĂŒnstiger ziemlich alter (10J oder sogar mehr) Router, OpenWirt kennt den auch nicht. Ist mir jetzt aber egal habe einen Fritz damit beschĂ€ftigt :wink:

if(isSuccess) {
         for(int val: values) {
            Serial.printf("Value: %d\n", val);
         }
      }

Wie bekomme ich die Werte einzeln in Variablen?

Ich versteh die Frage nicht:

int values[2];
value[0] und value[1] sind Deine beiden Werte.

Was bedeutet %d\n ?

https://de.wikipedia.org/wiki/Printf

1 Like

neue Zeile, Zeilenvorschub (des Fernschreibers)

1 Like

Der Reader funktioniert jetzt sehr gut. :+1:Wollte schon immer mal die Solardaten in mein E-ZĂ€hler-Auslesemodul einfĂŒgen. Eröffnet ganz neue Möglichkeiten. :wink:

Schade das der Code nicht beim ESP32 funktioniert...:disappointed:

Von wegen!
Eigentlich steht in der Beschreibung von GitHub das es auf dem ESP32 noch nicht funktioniert.
Macht es aber: Ich habe es an einem M5Stack getestet.

[code]
#include <M5Stack.h>
#include "WiFi.h"
#include <HTTPClient.h>
#include "Free_Fonts.h"                       // Include the header file attached to this sketch
#include "ezTime.h"

#include <ArduinoJson.h>
#include <SMAReader.h>

// Fill in appropriate values
#define WLANSSID "Repeater"
#define WLANPWD "*******"
#define INVERTERPWD "*******"
IPAddress inverterIP(192,168,100,72);

#define DEBUG_LEVEL 3
#define DEBUG_ERROR 1
#define DEBUG_MIN_INFO 2
#define DEBUG_MAX_INFO 3
#define DEBUG_OUT(level, fmt, ...) if(DEBUG_LEVEL>=level) Serial.printf_P( (PGM_P)PSTR(fmt), ## __VA_ARGS__ )

SMAReader smaReader(inverterIP, SMAREADER_USER, INVERTERPWD, 5); 


//Display 320x240

// Netzwerk Daten 
const char* ssid = "Speedlink-945";
const char* password = "xxxxxxxxxx";

unsigned long ulReqcount;

char myIpString[24];          //um IP Adresse in String umzuwandeln und anzuzeigen


// Set web server port number to 80
WiFiServer server(80);





void setup()
{
  M5.begin();                                           //Init M5Stack
  M5.Power.begin();                                     //Init power 
  M5.Lcd.println("mit WIFI vebinden");                        //Screen print string.  
  initWiFi();                                           //Unterprogramm um mit Wifi zu verbinden
  //Grafikanzeige
  M5.Lcd.fillScreen(TFT_BLACK);                          // Clear screen
  M5.Lcd.setTextDatum(MC_DATUM);                         // Set text datum to middle centre
  M5.Lcd.setTextColor(TFT_WHITE, TFT_BLACK);               // Set text colour to orange with black background
  M5.Lcd.drawString("SunnyBoyReader", 38, 21, GFXFF);
}







void loop()
{
    // wait for WiFi connection
    if(WiFi.status() == WL_CONNECTED) {
      // getValues int example
      String keys[2]={KEY_POWER, KEY_ENERGY_TODAY};
      int values[2];
      bool isSuccess=smaReader.getValues(2, keys, values);
      Serial.printf("Getting values: %s\n", isSuccess?"success":"fail");
      if(isSuccess) {
         for(int val: values) {
            Serial.printf("Value: %d\n", val);
         }
      }
      Serial.printf("Momentan: %d\n", values[0]);

      M5.Lcd.setFreeFont(FSS24);
      M5.Lcd.fillScreen(TFT_BLACK);                          // Clear screen
      M5.Lcd.drawString("Solar: " + String(values[0]) + "W", 76, 21, GFXFF);
      
      // getValues String example
      String keys_string[2]={KEY_WLAN_IP, KEY_WLAN_DNS_IP};
      String values_string[2];
      isSuccess=smaReader.getValues(2, keys_string, values_string);
      Serial.printf("Getting values: %s\n", isSuccess?"success":"fail");
      if(isSuccess) {
         for(String& val: values_string) {
            Serial.printf("Value: %s\n", val.c_str());
         }
      }
      // getLog example
      tm startTime;
      strptime("2020-10-19 16:00:00", "%Y-%m-%d %T", &startTime);
      uint32_t startTimestamp = mktime(&startTime);
      Serial.printf("Timestamp: %lu\n", startTimestamp);

      uint32_t values_log[100];
      uint32_t timestamps[100];
      int numValues=smaReader.getLog(startTimestamp, startTimestamp+1000, values_log, timestamps);
      Serial.printf("Logger: %s\n", numValues==-1?"fail":"success");
      for(int i=0;i<numValues;i++) {
        Serial.printf("Timestamp: %sTotal energy production: %lu Wh\n", asctime(localtime((time_t *)&timestamps[i])), values_log[i]);
      }
      //Serial.printf("All values, succes: %d\n", smaReader.getAllValues());
    }
    delay(5000);
}  
                                        










//Unterprogramm fĂŒr Wifi-Verbindung
void initWiFi() {
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();                                    //Turn off all wifi connections.
  delay(100);
  WiFi.begin(ssid, password);
  M5.Lcd.print("Call to " + String(ssid));
  while (WiFi.status() != WL_CONNECTED) {
    M5.Lcd.print('.');
    delay(1000);
  }
  M5.Lcd.println(" ");
  M5.Lcd.println(WiFi.localIP());
  M5.Lcd.print("Signalstearke: ");
  M5.Lcd.println(WiFi.RSSI());
  server.begin();
  delay(4000);
  M5.Lcd.clear();
}
[/code]

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