Sledování Epeveru pomocí ESP 32

Home Assistant, Arduino, SDS, Raspberry, Linux, vzdálený dohled, automatizace, měření, opensource, closedsource, hotová řešení, DIY, stavebnice, komponenty, software, postupy, návody, schémata, rady, zkušenosti ...
Keraj
Příspěvky: 185
Registrován: čtv dub 21, 2022 7:15 pm
Lokalita: Poblíž Hradce Králové
Systémové napětí: 48V

Sledování Epeveru pomocí ESP 32

Příspěvek od Keraj »

Ahoj měl bych prosbu,
není tu někdo s funkční komunikací rs485 mezi ESP 32 a regulátorem Epever Tracer AN či měničem IPower, kdo by byl ochoten se podělit o binarku ?
Nějak se v tom plácám a nemůžu se hnout z místa.
Předem děkuji.
Pěkný den všem.
16 panelů DHM-72L9-450 Wp = 7200Wp jih, sklon 17°
2 regulátory EPever Tracer 6415 AN = 6000W
Paralelní adaptér PAL-ADP-50AN
měniče 5 + 3 kW
EPever IP5000-42-plus-T a IP 3000-42-plus-T
135 + 135 + 230 = 500Ah LiFePo na 48V
3* BMS a Balancer Seplos
Soban
Příspěvky: 3467
Registrován: pon úno 07, 2022 10:11 pm
Lokalita: Zlaté Hory / Olomouc
Systémové napětí: 24V
Výkon panelů [Wp]: 3600
Kapacita baterie [kWh]: 16
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Zlaté Hory

Re: Sledování Epeveru pomocí ESP 32

Příspěvek od Soban »

Tak pokud ti to pomůže měl jsem ESP32 s převodníčkem na RS485 ovšem vyčítání příkazů je pro RTU modbus mustu.

Kód: Vybrat vše

// github link: https://github.com/4-20ma/ModbusMaster
#include <ModbusMaster.h>
#include <WiFi.h>
//#include <WiFiClient.h>
#include <WebServer.h>
//#include <ESPmDNS.h>
#include <Update.h>
#include <NTPClient.h>

#define VERZE "v2.6"
#define NAZEV_1 "Menič č.1 (horní)"
#define NAZEV_2 "Menič č.2 (dolní)"
#define MENIC_1 5016248
#define MENIC_2 6171960
#define LEDPIN 2
#define NTP_SERVER "0.cz.pool.ntp.org"

#define LETNI_CAS 0


// části www stránek
#define WWW_UVOD "<!doctype html><div style=\"text-align: center\">\n"

#define WWW_ODDELOVAC "<hr align=\"center\" width=\"95%\">\n"
#define WWW_PATICKA "<p><table style=\"margin: auto;\"><tr><td><form action=\"/\"><input style=\"color: green; font-size: large;\" type=\"submit\" value=\"Data\"/></form></td><td><form action=\"/config\"><input style=\"color: green; font-size: large;\" type=\"submit\" value=\"Config\"/></form></td><td><form action=\"/setup\"><input style=\"color: green; font-size: large;\" type=\"submit\" value=\"Setup\"/></form></td></tr></table></p>\n" WWW_ODDELOVAC "<p>&copy; " __DATE__ " Petr Šobáň " VERZE " (" __TIME__ ") <a href=\"/help\">pomoc</a></p></div>"
#define SERVERFIRMWARE WWW_UVOD"<p>Upgrade firmware!</p><p style=\"color: red\">Update špatného souboru může znefunkčnit zařízení!!!!</p>"WWW_ODDELOVAC"<form method='POST' action='/update' enctype='multipart/form-data'><input style='color: green; font-size: large' type='file' name='update'> <input style='color: red; font-size: large' type='submit' value='Update'></form>"WWW_ODDELOVAC WWW_PATICKA
#define RESTART         "<p style=\"color: red\">......Restart......</p>"

// Podprogramy pro NTP

#ifdef LETNI_CAS

  const long utcOffsetInSeconds = 7200; //posunuti casove zony 2h
#else
  const long utcOffsetInSeconds = 3600; //posunuti casove zony 1h
#endif


  const char daysOfTheWeek[7][16] = {"Neděle", "Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota"};

// Define NTP Client to get time
  WiFiUDP ntpUDP;
  NTPClient timeClient(ntpUDP, NTP_SERVER, utcOffsetInSeconds);


// konec NTP


// Replace the next variables with your SSID/Password combination
const char* ssid = "ssid";
const char* password = "heslo";

//WiFiClient espClient;

// reconect wifi
unsigned long previousMillis = 0;
unsigned long interval = 30000;

// incializace webserveru na portu 80

WebServer server(80);

// Nazev měniče

/* The true ESP32 chip ID is essentially its MAC address.
This sketch provides an alternate chip ID that matches 
the output of the ESP.getChipId() function on ESP8266 
(i.e. a 32-bit integer matching the last 3 bytes of 
the MAC address. This is less unique than the 
MAC address chip ID, but is helpful when you need 
an identifier that can be no more than a 32-bit integer 
(like for switch...case).

created 2020-06-07 by cweinhofer
with help from Cicicok */
	

String nazev_menice(void) {
  uint32_t chipId = 0;
  String message;

  for(int i=0; i<17; i=i+8) {
	  chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
	}
  switch (chipId) {
    case MENIC_1:
    message = NAZEV_1;
    break;
    case MENIC_2:
    message = NAZEV_2;
    break; 

    default:
    message = "Měnič č. ";
    message += String(chipId);
    break;
  }

  return message;
}


// wifi

void reconnect_wifi() {
  unsigned long currentMillis = millis();
  // if WiFi is down, try reconnecting every CHECK_WIFI_TIME seconds
  if ((WiFi.status() != WL_CONNECTED) && (currentMillis - previousMillis >=interval)) {
    Serial.print(millis());
    Serial.println("Reconnecting to WiFi...");
    WiFi.disconnect();
    WiFi.reconnect();
    previousMillis = currentMillis;
  }
}

void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
}


/* Modbus stuff */
#define MODBUS_DIR_PIN  4 // connect DR, RE pin of MAX485 to gpio 4
#define MODBUS_RX_PIN 18 // Rx pin  
#define MODBUS_TX_PIN 19 // Tx pin 
#define MODBUS_SERIAL_BAUD 19200 // Baud rate for esp32 and max485 communication Must 

//Initialize the ModbusMaster object as node
ModbusMaster node;

// Pin 4 made high for Modbus transmision mode
void modbusPreTransmission()
{
  digitalWrite(MODBUS_DIR_PIN, HIGH);
  delay(20);
}
// Pin 4 made low for Modbus receive mode
void modbusPostTransmission()
{ 
  digitalWrite(MODBUS_DIR_PIN, LOW);
  delay(20);
}

String modbus_chyba(int chyba)
{
  String message = "ERROR: ";
  switch (chyba) {
    case 0x01:
      message += "Modbus protocol illegal function exception.";
    break;
    case 0x02:
      message += "Modbus protocol illegal data address exception.";
    break;
    case 0x03:
      message += "Modbus protocol illegal data value exception.";
    break;
    case 0x04:
      message += "Modbus protocol slave device failure exception.";
    break;
    case 0x00:
      message += "ModbusMaster success.";
    break;
    case 0xE0:
      message += "ModbusMaster invalid response slave ID exception.";
    break;
    case 0xE1:
      message += "ModbusMaster invalid response function exception.";
    break;
    case 0xE2:
      message += "ModbusMaster response timed out exception.";
    break;
    case 0xE3:
      message += "ModbusMaster invalid response CRC exception.";
    break;
    default:
      message += "Neznámá chyba.";
    break;
  } 
  return message;
}


// Bez opakování
int ReadModbusMust(int registr, int pocet) {

  uint8_t result;

  // Zapnutí led
  digitalWrite(LEDPIN, HIGH);
  
  // Přečtení dat do buferru
  result = node.readHoldingRegisters(registr, pocet);
  if (result == node.ku8MBSuccess) {
    Serial.println("Success, Received data: ");
  }
  else {
    Serial.print("Failed, Response Code: ");
    Serial.print(result, HEX);
    Serial.println("");
  }
  
  // vypnutí led
  digitalWrite(LEDPIN, LOW);
  return result;   
}
/*
// S opakováním po neúspěchu
int ReadModbusMust(int registr, int pocet) {

  uint8_t result;

  int pruchody = 0;
  
  // maximální počet pokusu o cteni
  const int max_pruchody = 5;

  // Zapnutí led
  digitalWrite(LEDPIN, HIGH);
  
  do {
  // Přečtení dat do buferru
  result = node.readHoldingRegisters(registr, pocet);

  if (result == node.ku8MBSuccess) {
    Serial.println("Success, Received data: ");
  }
  else {
    Serial.print("Failed, Response Code: ");
    Serial.print(result, HEX);
    Serial.println("");
    delay(300);
  }
  
  
  ++pruchody;
  if (pruchody > max_pruchody) break;
  } while (result != node.ku8MBSuccess);

  
  // vypnutí led
  digitalWrite(LEDPIN, LOW);
  return result;   
}
*/

int WriteModbusMust(int registr, int hodnota) {
  uint8_t result;

  // Zapnutí led
  digitalWrite(LEDPIN, HIGH);
  
  // Zapis dat
  result = node.writeSingleRegister(registr, hodnota);
  if (result == node.ku8MBSuccess) {
    Serial.println("Success, Write data OK");
  }
  else {
    Serial.print("Failed, Response Code: ");
    Serial.print(result, HEX);
    Serial.println("");
  }
  // vypnutí led
  digitalWrite(LEDPIN, LOW);
  return result;   
}



// přečtení registru
// parametry registr a pocet
// http://menic1.soban.cz/read?registr=20000&pocet=1
void www_read_must() {
  
  int registr_must;
  int pocet_must;
  int chyba;
  int i;

  String nazev = "registr";
  String pocet = "pocet";
  String arg_nazev;
  String arg_hodnota;
  String message;
  
  // default hodnoty
  pocet_must = 1;
  registr_must = 20000;
  message = " ";
  
  // načtení parametrů
  for (i = 0; i < server.args(); i++) {
    arg_nazev = server.argName(i);
    arg_hodnota = server.arg(i);
    if ( nazev == arg_nazev ) {
      registr_must = arg_hodnota.toInt();
    }
    if ( pocet == arg_nazev ) {
      pocet_must = arg_hodnota.toInt();
    }
    
  }

  // precteni dat

  // static const uint8_t ku8MaxBufferSize= 64;   ///< size of response/transmit buffers

  if (pocet_must > 64)
  {
    pocet_must = 64;
  }
  chyba = ReadModbusMust(registr_must, pocet_must);
  if( chyba == 0) {
   //data ok 
   for (int i = 0; i < pocet_must; i++)
    {
    message += String(node.getResponseBuffer(i));
    message += ",";
    }
    message += "END\n";
    server.sendHeader("Cache-Control","no-store, max-age=0");
    server.send(200, "text/plain", message); 
   }
   else {
   // chyba
    message = modbus_chyba(chyba);
    server.sendHeader("Cache-Control","no-store, max-age=0");
    server.send(504, "text/plain", message);
   }
  
}

// zapis registru
// parametry registr a hodnota
// http://menic1.soban.cz/read?registr=20000&hodnota=1
void www_write_must() {
  
  int registr_must;
  int hodnota_must;
  int chyba;
  int i;
  bool nastav_registr;
  bool nastav_hodnota;

  String nazev = "registr";
  String pocet = "hodnota";
  String arg_nazev;
  String arg_hodnota;
  String message;
  
  // default hodnoty
  nastav_registr = false;
  nastav_hodnota = false;
  
  // načtení parametrů
  for (i = 0; i < server.args(); i++) {
    arg_nazev = server.argName(i);
    arg_hodnota = server.arg(i);
    if ( nazev == arg_nazev ) {
      registr_must = arg_hodnota.toInt();
      nastav_registr = true;
    }
    if ( pocet == arg_nazev ) {
      hodnota_must = arg_hodnota.toInt();
      nastav_hodnota = true;
    }
    
  }
  if (nastav_hodnota & nastav_registr) {
  // zapis dat

  chyba = WriteModbusMust(registr_must, hodnota_must);
  if( chyba == 0) {
   //data ok 
    message = "OK,END\n"; 
   }
   else {
   // chyba
   message = modbus_chyba(chyba);
   }
  }
  else message = "Nesprávné argumenty,END\n";

  server.sendHeader("Cache-Control","no-store, max-age=0");
  server.send(200, "text/plain", message);
}

// Stránky www

// Nenalezena stránka
void handleNotFound() {
  String message = "File Not Found\n\n";
  message += "URI: ";
  message += server.uri();
  message += "\nMethod: ";
  message += (server.method() == HTTP_GET) ? "GET" : "POST";
  message += "\nArguments: ";
  message += server.args();
  message += "\n";
  for (uint8_t i = 0; i < server.args(); i++) {
    message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
  }
  server.sendHeader("Cache-Control","no-store, max-age=0");
  server.send(404, "text/plain", message);
}


// hlavní stránka
void handleRoot() {

  int hodnota;
  float i;
  int chyba;

  float proud_baterie;

  chyba = ReadModbusMust(25274, 1);

    i = node.getResponseBuffer(0);
    if (i > 32767) i = ( i - float(65536) );
    proud_baterie = i;

  // načtení hodnoty času
  timeClient.update();
  String den = daysOfTheWeek[timeClient.getDay()];
  String cas = String (timeClient.getFormattedTime());

  delay(300);
  chyba = ReadModbusMust(25201, 33);

  String message = "<html><head><meta http-equiv=\"refresh\" content=\"30\"></head><body>";
  
  message += WWW_UVOD;
  message += "<h1>";
  message += nazev_menice();
  message += "</h1>";
  message += WWW_ODDELOVAC;

  message += "<p>Dnes je ";
  message += den;
  message += " ";
  message += cas;
  message += "</p>";
  message += WWW_ODDELOVAC;

  message += "<h3>Invertor</h3>";
  message += WWW_ODDELOVAC;
  
  if (chyba == 0 ) {

    message += "<p>Stav: ";
    hodnota = node.getResponseBuffer(0x00);

    switch (hodnota) {
      case 0:
        message += "<span style=\"color: fuchsia;\">Zapnut</span>";
      break;
      case 1:
        message += "<span style=\"color: fuchsia;\">Test</span>";
      break;
      case 2:
        message += "<span style=\"color: green;\">OffGrid</span>";
      break;
      case 3:
        message += "<span style=\"color: green;\">Grid-Tie</span>";
      break;
      case 4:
        message += "<span style=\"background-color: black; color: yellow;\"> ByPass </span>";
      break;
      case 5:
        message += "<span style=\"color: red;\">Stop</span>";
      break;
      case 6:
        message += "<span style=\"background-color: black; color: yellow;\"> Nabíjení ze sítě </span>";
      break;
      default:
        message += "<span style=\"color: red;\">Neznámý</span>";
      break;
    }
    message += "</p>\n";

    message += "<p>Napětí DS: ";
    message += String(node.getResponseBuffer(6)/10.0);
    message += " V</p>\n";

    message += "<p>Napětí Inverter: ";
    message += String(node.getResponseBuffer(5)/10.0);
    message += " V</p>\n";

    message += "<p>Napětí baterie: ";
    message += String(node.getResponseBuffer(4)/10.0);
    message += " V</p>\n";
        
    message += "<p>Proud z baterie: ";
    message += String(proud_baterie);
    message += " A</p>\n";

    message += "<p>Výkon měniče: ";
    message += String(node.getResponseBuffer(12));
    message += " W</p>\n";

    message += "<p>Výkon DS: ";
    message += String(node.getResponseBuffer(13));
    message += " W</p>\n";

    message += "<p>Zatížení měniče: ";
    message += String(node.getResponseBuffer(14));
    message += " W</p>\n";

    message += "<p>Výkon měniče: ";
    message += String(node.getResponseBuffer(16));
    message += " VA</p>\n";

    message += "<p>Výkon DS: ";
    message += String(node.getResponseBuffer(17));
    message += " VA</p>\n";

    message += "<p>Zatížení měniče: ";
    message += String(node.getResponseBuffer(18));
    message += " VA</p>\n";

    message += "<p>Zatížení měniče: ";
    message += String(node.getResponseBuffer(15));
    message += " %</p>\n";

    message += "<p>Teplota: ";
    message += String(node.getResponseBuffer(32));
    message += " °C</p>\n";

    }
  else 
    { 
    message += "<p>";
    message += modbus_chyba(chyba);
    message += "</p>";
    }

  message += WWW_ODDELOVAC;

  // uložená data
  
  delay(300);
  chyba = ReadModbusMust(25245, 16);
  if (chyba == 0 ) {

    if(node.getResponseBuffer(1)|node.getResponseBuffer(0)|node.getResponseBuffer(2)|node.getResponseBuffer(3)|node.getResponseBuffer(4)|node.getResponseBuffer(5)|node.getResponseBuffer(6)|node.getResponseBuffer(7)|node.getResponseBuffer(8)|node.getResponseBuffer(9)|node.getResponseBuffer(10)|node.getResponseBuffer(11)|node.getResponseBuffer(12)|node.getResponseBuffer(13)|node.getResponseBuffer(14)|node.getResponseBuffer(15) != 0) {

      message += "<h3>Výroba:</h3>";
      message += WWW_ODDELOVAC;
      // Accumulated charger power
      if (node.getResponseBuffer(1)|node.getResponseBuffer(0) != 0) {
      message += "<p>Nabíjení baterie (charger): ";
      message += String(node.getResponseBuffer(1)/10.0f + (node.getResponseBuffer(0) * 1000) );
      message += " kwh</p>\n";
      }

      // Accumulated discharger power
      if (node.getResponseBuffer(3)|node.getResponseBuffer(2) != 0) {
      message += "<p>Vybíjení baterie (discharger): ";
      message += String(node.getResponseBuffer(3)/10.0f + (node.getResponseBuffer(2) * 1000));
      message += " kwh</p>\n";
      }

      // Accumulated buy power
      if (node.getResponseBuffer(5)|node.getResponseBuffer(4) != 0) {
      message += "<p>Koupě (buy): ";
      message += String(node.getResponseBuffer(5)/10.0f + (node.getResponseBuffer(4) * 1000));
      message += " kwh</p>\n";
      }

      // Accumulated sell power
      if (node.getResponseBuffer(7)|node.getResponseBuffer(6) != 0) {
      message += "<p>Prodej (sell): ";
      message += String(node.getResponseBuffer(7)/10.0f + (node.getResponseBuffer(6) * 1000));
      message += " kwh</p>\n";
      }

      // Accumulated load power
      if (node.getResponseBuffer(9)|node.getResponseBuffer(8) != 0) {
      message += "<p>Výkon (load): ";
      message += String(node.getResponseBuffer(9)/10.0f + (node.getResponseBuffer(8) * 1000));
      message += " kwh</p>\n";
      }

      // Accumulated self_use power
      if (node.getResponseBuffer(11)|node.getResponseBuffer(10) != 0) {
      message += "<p>Vyrobená vlastní baterie+PV (self use): ";
      message += String(node.getResponseBuffer(11)/10.0f + (node.getResponseBuffer(10) * 1000));
      message += " kwh</p>\n";
      }

      // Accumulated PV_sell power
      if (node.getResponseBuffer(13)|node.getResponseBuffer(12) != 0) {
      message += "<p>PV prodej (sell): ";
      message += String(node.getResponseBuffer(13)/10.0f + (node.getResponseBuffer(12) * 1000));
      message += " kwh</p>\n";
      }

      // Accumulated grid_charger power
      if (node.getResponseBuffer(15)|node.getResponseBuffer(14) != 0) {
      message += "<p>Nabíjení ze sítě (grid charger): ";
      message += String(node.getResponseBuffer(15)/10.0f + (node.getResponseBuffer(14) * 1000));
      message += " kwh</p>\n";
      }
      message += WWW_ODDELOVAC;
    }
  }
  else 
    { 
    message += "<p>";
    message += modbus_chyba(chyba);
    message += "</p>";
    message += WWW_ODDELOVAC;
    }

  // konec uložených dat

  

  message += "<h3>MPPT</h3>";
  message += WWW_ODDELOVAC;

  delay(300);
  chyba = ReadModbusMust(15201, 21);
  
  if (chyba == 0 ) {

    message += "<p>Stav: ";
    hodnota = node.getResponseBuffer(0x00);

    switch (hodnota) {
      case 0:
        message += "<span style=\"color: fuchsia;\">Inicializace</span>";
      break;
      case 1:
        message += "<span style=\"color: fuchsia;\">Test</span>";
      break;
      case 2:
        message += "<span style=\"color: green;\">Pracuje</span>";
      break;
      case 3:
        message += "<span style=\"color: red;\">Stop</span>";
      break;
      default:
        message += "<span style=\"color: red;\">Neznámý</span>";
      break;
    }
    message += "</p>\n";

    message += "<p>Mppt Status: ";
    hodnota = node.getResponseBuffer(1);

    switch (hodnota) {
      case 0:
        message += "<span style=\"color: red;\">Stop</span>";
      break;
      case 1:
        message += "<span style=\"color: green;\">Pracuje</span>";
      break;
      case 2:
        message += "<span style=\"background-color: black; color: yellow;\"> Omezení proudu </span>";
      break;
      default:
        message += "<span style=\"color: red;\">Neznámý</span>";
      break;
    }
    message += "</p>\n";

    message += "<p>Stav nabíjení: ";
    hodnota = node.getResponseBuffer(2);

    switch (hodnota) {
      case 0:
        message += "<span style=\"color: red;\">Stop</span>";
      break;
      case 1:
        message += "<span style=\"color: green;\">Absorbce</span>";
      break;
      case 2:
        message += "<span style=\"background-color: black; color: yellow;\"> Float </span>";
      break;
      case 3:
        message += "<span style=\"color: fuchsia;\">Eqalize</span>";
      break;
      default:
        message += "<span style=\"color: red;\">Neznámý</span>";
      break;
    }
    message += "</p>\n";

    message += "<p>Napětí baterie (MPPT): ";
    message += String(node.getResponseBuffer(5)/10.0);
    message += " V</p>\n";
        
    message += "<p>Napětí panelů: ";
    message += String(node.getResponseBuffer(4)/10.0);
    message += " V</p>\n";

    message += "<p>Proud z panelů do baterky: ";
    message += String(node.getResponseBuffer(6)/10.0);
    message += " A</p>\n";

    message += "<p>Výkon panelů: ";
    message += String(node.getResponseBuffer(7));
    message += " W</p>\n";

    message += "<p>Teplota: ";
    if (node.getResponseBuffer(8) == 0) message += "--";
    else message += String(node.getResponseBuffer(8));
    message += " °C</p>\n";

    message += "<p>Baterka: ";
    if (node.getResponseBuffer(10)) message += "<span style=\"color: green;\">Připojená</span>";
    else message += "<span style=\"color: red;\">Odpojená</span>";
    message += "</p>\n";

    message += "<p>Panely: ";
    if (node.getResponseBuffer(11)) message += "<span style=\"color: green;\">Připojené</span>";
    else message += "<span style=\"color: red;\">Odpojené</span>";
    message += "</p>\n";
    
    // uložená data mppt
    if (node.getResponseBuffer(17)|node.getResponseBuffer(16) != 0) {
    message += WWW_ODDELOVAC;
    message += "<h3>Výroba:</h3>";
    message += WWW_ODDELOVAC;

    // Accumulated PV power
    message += "<p>Panely (PV): ";
    message += String(node.getResponseBuffer(17)/10.0f + (node.getResponseBuffer(16) * 1000) );
    message += " kwh</p>\n";
    }
    // konec uložená data mppt

    }
  else 
    { 
    message += "<p>";
    message += modbus_chyba(chyba);
    message += "</p>";
    }

  message += WWW_ODDELOVAC;
  message += WWW_PATICKA;
  message += "</body></html>";

  server.sendHeader("Cache-Control","no-store, max-age=0");
  server.send(200, "text/html;charset=utf-8", message);
}

// setup
void www_config_must() {

  int hodnota;
  float i;
  int chyba;

  // načtení hodnoty času
  timeClient.update();
  String den = daysOfTheWeek[timeClient.getDay()];
  String cas = String (timeClient.getFormattedTime());

  String message = WWW_UVOD;
  message += "<h1>";
  message += nazev_menice();
  message += "</h1>";
  message += WWW_ODDELOVAC;

  message += "<p>Dnes je ";
  message += den;
  message += " ";
  message += cas;
  message += "</p>";
  message += WWW_ODDELOVAC;

  
  message += "<h3>Inverter</h3>";
  message += WWW_ODDELOVAC;

  chyba = ReadModbusMust(20101, 44);
  
  if (chyba == 0 ) {

    message += "<p>Inverter offgrid work enable (20101): ";
    hodnota = node.getResponseBuffer(0);

    switch (hodnota) {
      case 0:
        message += "<span style=\"color: red;\">OFF</span>";
      break;
      case 1:
        message += "<span style=\"color: green;\">ON</span>";
      break;
      default:
        message += "<span style=\"color: red;\">Neznámý</span>";
      break;
    }
    message += "</p>\n";

    message += "<p>Inverter output voltage Set (20102): ";
    message += String(node.getResponseBuffer(1)/10.0);
    message += " V</p>\n";

    message += "<p>Inverter output frequency Set (20103): ";
    message += String(node.getResponseBuffer(2)/100.0);
    message += " Hz</p>\n";

    message += "<p>Inverter search mode enable (20104): ";
    hodnota = node.getResponseBuffer(3);

    switch (hodnota) {
      case 0:
        message += "<span style=\"color: red;\">OFF</span>";
      break;
      case 1:
        message += "<span style=\"color: green;\">ON</span>";
      break;
      default:
        message += "<span style=\"color: red;\">Neznámý</span>";
      break;
    }
    message += "</p>\n"; 

    message += "<p>Inverter discharger to grid enable (20108): ";
    hodnota = node.getResponseBuffer(7);

    switch (hodnota) {
      case 0:
        message += "<span style=\"color: red;\">OFF</span>";
      break;
      case 1:
        message += "<span style=\"color: green;\">ON</span>";
      break;
      default:
        message += "<span style=\"color: red;\">Neznámý</span>";
      break;
    }
    message += "</p>\n"; 

    message += "<p>Energy use mode (20109): ";
    hodnota = node.getResponseBuffer(8);

    switch (hodnota) {
      case 1:
        message += "SBU";
      break;
      case 2:
        message += "SUB";
      break;
      case 3:
        message += "UTI";
      break;
      case 4:
        message += "SOL";
      break;
      default:
        message += "<span style=\"color: red;\">Neznámý</span>";
      break;
    }
    message += "</p>\n";

    message += "<p>Grid protect standard (20111): ";
    hodnota = node.getResponseBuffer(10);

    switch (hodnota) {
      case 0:
        message += "VDE4105";
      break;
      case 1:
        message += "UPS";
      break;
      case 2:
        message += "APL";
      break;
      case 3:
        message += "GEN";
      break;
      default:
        message += "<span style=\"color: red;\">Neznámý</span>";
      break;
    }
    message += "</p>\n";

    message += "<p>SolarUse Aim (20112): ";
    hodnota = node.getResponseBuffer(11);

    switch (hodnota) {
      case 0:
        message += "LBU";
      break;
      case 1:
        message += "BLU";
      break;
      default:
        message += "<span style=\"color: red;\">Neznámý</span>";
      break;
    }
    message += "</p>\n";

    message += "<p>Inverter max discharger current (20113): ";
    message += String(node.getResponseBuffer(12)/10.0);
    message += " A</p>\n";

    message += "<p>Battery stop discharging voltage (20118): ";
    message += String(node.getResponseBuffer(17)/10.0);
    message += " V</p>\n";

    message += "<p>Battery stop charging voltage (20119): ";
    message += String(node.getResponseBuffer(18)/10.0);
    message += " V</p>\n";

    message += "<p>Grid max charger current set (20125): ";
    message += String(node.getResponseBuffer(24)/10.0);
    message += " A</p>\n";

    message += "<p>Battery low voltage (20127): ";
    message += String(node.getResponseBuffer(26)/10.0);
    message += " V</p>\n";

    message += "<p>Battery high voltage (20128): ";
    message += String(node.getResponseBuffer(27)/10.0);
    message += " V</p>\n";

    message += "<p>Max Combine charger current (20132): ";
    message += String(node.getResponseBuffer(31)/10.0);
    message += " A</p>\n";

    message += "<p>Charger source priority (20143): ";
    hodnota = node.getResponseBuffer(42);

    switch (hodnota) {
      case 0:
        message += "Soalr first";
      break;
      case 2:
        message += "Solar and Utility";
      break;
      case 3:
        message += "Only Solar";
      break;
      default:
        message += "<span style=\"color: red;\">Neznámý</span>";
      break;
    }
    message += "</p>\n";

    message += "<p>Solar power balance (20144): ";
    hodnota = node.getResponseBuffer(43);

    switch (hodnota) {
      case 0:
        message += "<span style=\"color: red;\">SBD</span>";
      break;
      case 1:
        message += "<span style=\"color: green;\">SBE</span>";
      break;
      default:
        message += "<span style=\"color: red;\">Neznámý</span>";
      break;
    }
    message += "</p>\n";

    }
  else 
    { 
    message += "<p>";
    message += modbus_chyba(chyba);
    message += "</p>";
    }

  message += WWW_ODDELOVAC;
  message += "<h3>Mppt</h3>";
  message += WWW_ODDELOVAC;

  delay(300);
  chyba = ReadModbusMust(10103, 9);
  
  if (chyba == 0 ) {

    message += "<p>Napětí Float (10103): ";
    message += String(node.getResponseBuffer(0)/10.0);
    message += " V</p>\n";

    message += "<p>Napětí Absorpce (10104): ";
    message += String(node.getResponseBuffer(1)/10.0);
    message += " V</p>\n";

    message += "<p>Nízké napětí baterie (10105): ";
    message += String(node.getResponseBuffer(2)/10.0);
    message += " V</p>\n";

    message += "<p>Vysoké napětí baterie (10107): ";
    message += String(node.getResponseBuffer(4)/10.0);
    message += " V</p>\n";

    message += "<p>PV max charger current (10108): ";
    message += String(node.getResponseBuffer(5)/10.0);
    message += " A</p>\n";

    message += "<p>Typ baterky (10110): ";
    hodnota = node.getResponseBuffer(7);

    switch (hodnota) {
      case 0:
        message += "no choose";
      break;
      case 1:
        message += "Use defined";
      break;
      case 2:
        message += "lithium";
      break;
      case 3:
        message += "SEALED_LEAD";
      break;
      case 4:
        message += "AGM";
      break;
      case 5:
        message += "GEL";
      break;
      case 6:
        message += "FLOODED";
      break;
      default:
        message += "<span style=\"color: red;\">Neznámý</span>";
      break;
    }
    message += "</p>\n";

    message += "<p>Battery (10111): ";
    message += String(node.getResponseBuffer(8));
    message += " Ah</p>\n";

    }
  else 
    { 
    message += "<p>";
    message += modbus_chyba(chyba);
    message += "</p>";
    }

  message += WWW_ODDELOVAC;
  message += WWW_PATICKA;

  server.sendHeader("Cache-Control","no-store, max-age=0");
  server.send(200, "text/html;charset=utf-8", message);
}

void www_help() {

  String message = WWW_UVOD;
  message += "<h1>";
  message += nazev_menice();
  message += "</h1>";
  message += WWW_ODDELOVAC;
  message += "<h2>Help:</h2>";
  message += WWW_ODDELOVAC;

  message += "<p><a href=\"/help\">Rozumím příkazu: SERVER/help</a></p>";
  message += "<p><a href=\"/\">Rozumím příkazu: SERVER/</a></p>";
  message += "<p><a href=\"/setup\">Rozumím příkazu: SERVER/config</a></p>";
  message += "<p><a href=\"/setup\">Rozumím příkazu: SERVER/setup</a></p>";
  message += "<p><a href=\"/inverter_display_message\">Rozumím příkazu: SERVER/inverter_display_message</a></p>";
  message += "<p><a href=\"/inverter_control_message\">Rozumím příkazu: SERVER/inverter_control_message</a></p>";
  message += "<p><a href=\"/pv_charger_control_message\">Rozumím příkazu: SERVER/pv_charger_control_message</a></p>";
  message += "<p><a href=\"/pv_charger_display_message\">Rozumím příkazu: SERVER/pv_charger_display_message</a></p>";
  message += "<p><a href=\"/restart\">Rozumím příkazu: SERVER/restart</a></p>";
  message += "<p><a href=\"/firmware\">Rozumím příkazu: SERVER/firmware</a></p>";
  message += "<p><a href=\"/read?registr=25201&pocet=26\">Rozumím příkazu: SERVER/read?registr=xxxxx&pocet=yy</a></p>";
  message += "<p>Rozumím příkazu: SERVER/write?registr=xxxxx&hodnota=yy</p>";

  message += WWW_ODDELOVAC;
  message += WWW_PATICKA;

  server.send(200, "text/html;charset=utf-8", message);
}

void www_setup_must() {

  String message = WWW_UVOD;
  message += "<h1>";
  message += nazev_menice();
  message += "</h1>";
  message += WWW_ODDELOVAC;
  message += "<h2>Nastavení:</h2>";

  message += WWW_ODDELOVAC;

  // Nastavení parametrů mustu
  // vypnuti menice
  message += "<p>Inverter offgrid work enable <a href=\"/write?registr=20101&hodnota=1\"> ON (Zapnuto) </a> &nbsp; <a href=\"/write?registr=20101&hodnota=0\"> OFF (Vypnuto) </a></p>";

  message += WWW_ODDELOVAC;

  // Režim SOL UTI
  message += "<p>Nastavení měniče režim: <a href=\"/write?registr=20109&hodnota=4\"> SOL </a> &nbsp; <a href=\"/write?registr=20109&hodnota=3\"> UTI </a></p>";

  message += WWW_ODDELOVAC;

  // Charger source priority
  message += "<p>Charger source priority: <a href=\"/write?registr=20143&hodnota=3\"> Only Solar </a> &nbsp; <a href=\"/write?registr=20143&hodnota=0\"> Solar first </a> &nbsp; <a href=\"/write?registr=20143&hodnota=2\"> Solar and Utility </a></p>";

  message += WWW_ODDELOVAC;

  // reset uložených hodnot výroby
  message += "<p><a href=\"/write?registr=20213&hodnota=1\">Remove the accumulated data (Inverter)</a></p>";
  message += "<p><a href=\"/write?registr=10112&hodnota=1\">Remove the accumulated data (PV)</a></p>";

  message += WWW_ODDELOVAC;

  //nabijeni
  // float
  message += "<p>Float voltage: <a href=\"/write?registr=10103&hodnota=268\"> 26.8V </a> &nbsp; <a href=\"/write?registr=10103&hodnota=270\"> 27V </a> &nbsp; <a href=\"/write?registr=10103&hodnota=273\"> 27.3V </a> &nbsp; <a href=\"/write?registr=10103&hodnota=274\"> 27.4V </a> &nbsp; <a href=\"/write?registr=10103&hodnota=275\">27.5V</a> &nbsp; <a href=\"/write?registr=10103&hodnota=276\"> 27.6V </a> &nbsp; <a href=\"/write?registr=10103&hodnota=277\"> 27.7V </a> &nbsp; <a href=\"/write?registr=10103&hodnota=278\"> 27.8V </a> &nbsp; <a href=\"/write?registr=10103&hodnota=279\"> 27.9V </a></p>";

  message += WWW_ODDELOVAC;
  //absorpce
  
  message += "<p>Absorption voltage: <a href=\"/write?registr=10104&hodnota=274\">27.4V</a> &nbsp; <a href=\"/write?registr=10104&hodnota=275\">27.5V</a> &nbsp;<a href=\"/write?registr=10104&hodnota=276\">27.6V</a> &nbsp; <a href=\"/write?registr=10104&hodnota=277\">27.7V</a> &nbsp; <a href=\"/write?registr=10104&hodnota=278\">27.8V</a> &nbsp; <a href=\"/write?registr=10104&hodnota=279\">27.9V</a> &nbsp; <a href=\"/write?registr=10104&hodnota=280\">28V</a> &nbsp; <a href=\"/write?registr=10104&hodnota=282\">28.2V</a></p>";
  message += WWW_ODDELOVAC;

  // typ baterky
  message += "<p>Battery type: <a href=\"/write?registr=10110&hodnota=1\">Use defined </a> &nbsp; <a href=\"/write?registr=10110&hodnota=2\">lithium</a> &nbsp; <a href=\"/write?registr=10110&hodnota=3\">SEALED_LEAD</a> &nbsp; <a href=\"/write?registr=10110&hodnota=4\">AGM</a> &nbsp; <a href=\"/write?registr=10110&hodnota=5\">GEL</a> &nbsp; <a href=\"/write?registr=10110&hodnota=6\">FLOODED</a></p>";


  message += WWW_ODDELOVAC;
  message += WWW_PATICKA;

  server.send(200, "text/html;charset=utf-8", message);
}


void www_Read_Inverter_Display_Message()
{
  int chyba;

  chyba = ReadModbusMust(25201, 40);

  String message;

  if (chyba == 0 ) {
    message = "Inverter Display Message 25201 + 79\n";
    for (int i = 0; i < 40; i++)
    {
    message += String(node.getResponseBuffer(i));
    message += ",";
    }

  }
  else {
    message = "Prvni čast ";
    message += modbus_chyba(chyba);
    message += "\n";
  }

  chyba = ReadModbusMust(25241, 39);


  if (chyba == 0 ) {
    for (int i = 0; i < 39; i++)
    {
    message += String(node.getResponseBuffer(i));
    message += ",";
    }
  message += "END\n";
  }
  else {
    message += "Druhá část ";
    message += modbus_chyba(chyba);
    message += "\n";
  }


  server.sendHeader("Cache-Control","no-store, max-age=0");
  server.send(200, "text/plain;charset=utf-8", message);
}


void www_Read_Inverter_Control_Message()
{
  int chyba;
  chyba = ReadModbusMust(20101, 44);

  String message;

  if (chyba == 0 ) {
    message = "Inverter Control Message 20101 + 44\n";
    for (int i = 0; i < 44; i++)
    {
    message += String(node.getResponseBuffer(i));
    message += ",";
    }
  message += "END\n";
  }
  else {
    message = modbus_chyba(chyba);
    message +="\n";
  }
  server.sendHeader("Cache-Control","no-store, max-age=0");
  server.send(200, "text/plain;charset=utf-8", message);
}

void www_Read_PV_Charger_Control_Message()
{
  int chyba;
  chyba = ReadModbusMust(10103, 9);

  String message;

  if (chyba == 0 ) {
    message = "PV Charger Control Message 10103 + 9\n";
    for (int i = 0; i < 9; i++)
    {
    message += String(node.getResponseBuffer(i));
    message += ",";
    }
  message += "END\n";
  }
  else {
    message = modbus_chyba(chyba);
    message += "\n";
  }
  server.sendHeader("Cache-Control","no-store, max-age=0");
  server.send(200, "t§ext/plain;charset=utf-8", message);
}

void www_Read_PV_Charger_Display_Message()
{
  int chyba ;
  chyba = ReadModbusMust(15201, 21);

  String message;

  if (chyba == 0 ) 
  {
    message = "PV Charger Display Message 15201 + 21\n";
    for (int i = 0; i < 21; i++)
    {
    message += String(node.getResponseBuffer(i));
    message += ",";
    }
  message += "END\n";
  }
  else
  {
    message = modbus_chyba(chyba);
    message += "\n";
  }
  server.sendHeader("Cache-Control","no-store, max-age=0");
  server.send(200, "text/plain;charset=utf-8", message);
}


// inicializace setup

void setup()
{
  //  esp serial communication
  Serial.begin(115200);
  // led pin
  pinMode(LEDPIN, OUTPUT);
  // modbus pin
  pinMode(MODBUS_DIR_PIN, OUTPUT);
  digitalWrite(MODBUS_DIR_PIN, LOW);

  //Serial2.begin(baud-rate, protocol, RX pin, TX pin);.
  Serial2.begin(MODBUS_SERIAL_BAUD, SERIAL_8N1, MODBUS_RX_PIN, MODBUS_TX_PIN);
  //Serial2.setTimeout(300);
  
  //modbus slave ID 4
  node.begin(4, Serial2);

  setup_wifi();

  //  callbacks allow us to configure the RS485 transceiver correctly
  node.preTransmission(modbusPreTransmission);
  node.postTransmission(modbusPostTransmission);

  // definice stránek www
  server.on("/", handleRoot);
  server.on("/help", www_help);
  server.on("/inverter_display_message", www_Read_Inverter_Display_Message);
  server.on("/inverter_control_message", www_Read_Inverter_Control_Message);
  server.on("/pv_charger_control_message", www_Read_PV_Charger_Control_Message);
  server.on("/pv_charger_display_message", www_Read_PV_Charger_Display_Message);
  server.on("/read", www_read_must);
  server.on("/write", www_write_must);
  server.on("/setup", www_setup_must);
  server.on("/config", www_config_must);


  // restart

  server.on("/restart", []() {
    String zprava = WWW_UVOD;
    zprava += "<h1>";
    zprava += nazev_menice();
    zprava += "</h1>";
    zprava += WWW_ODDELOVAC;
    zprava += RESTART;
    zprava += WWW_ODDELOVAC;
    zprava += WWW_PATICKA;
    
    server.sendHeader("Cache-Control","no-store, max-age=0");
    server.send(200,"text/html;charset=utf-8", zprava);
    delay(1000);
    ESP.restart();
  });

  //update
  server.on("/firmware", HTTP_GET, []() {
    server.sendHeader("Connection", "close");
    server.send(200, "text/html;charset=utf-8", SERVERFIRMWARE);
  });
  /*handling uploading firmware file */
  server.on("/update", HTTP_POST, []() {
    server.sendHeader("Connection", "close");
    server.send(200, "text/html;charset=utf-8", (Update.hasError()) ? WWW_UVOD"<p>Upgrade FAIL</p>"WWW_ODDELOVAC WWW_PATICKA : WWW_UVOD"<p>Upgrade OK</p>"WWW_ODDELOVAC WWW_PATICKA);
    ESP.restart();
  }, []() {
    HTTPUpload& upload = server.upload();
    if (upload.status == UPLOAD_FILE_START) {
      Serial.printf("Update: %s\n", upload.filename.c_str());
      if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size
        Update.printError(Serial);
      }
    } else if (upload.status == UPLOAD_FILE_WRITE) {
      /* flashing firmware to ESP*/
      if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) {
        Update.printError(Serial);
      }
    } else if (upload.status == UPLOAD_FILE_END) {
      if (Update.end(true)) { //true to set the size to the current progress
        Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize);
      } else {
        Update.printError(Serial);
      }
    }
  });

  server.onNotFound(handleNotFound);
  
  // zahájení aktivity HTTP serveru
  server.begin();

}

// Hlavní smyčka

void loop()
{
  //btStop();
  server.handleClient();

  delay(100);//Normální čekání
  reconnect_wifi();

}
3,6kWp ::pv:: 600Wp (4x 150Wp 4S) + 1kWp (2x 500Wp 2S) + 2kWp (4x 500Wp 2S2P) | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt* (2x 12V/200Ah AGM) + 25.6V/120Ah + 25.6V/125Ah + 25.6V/230Ah LiFePO4 | Jak nepostavit FVE Zlaté Hory :home:
Lubosfb
Příspěvky: 14
Registrován: úte bře 14, 2023 4:11 pm
Lokalita: Decin

Re: Sledování Epeveru pomocí ESP 32

Příspěvek od Lubosfb »

ja pouzivam ESP12 s tasmotou a prevodnik RS485
Keraj
Příspěvky: 185
Registrován: čtv dub 21, 2022 7:15 pm
Lokalita: Poblíž Hradce Králové
Systémové napětí: 48V

Re: Sledování Epeveru pomocí ESP 32

Příspěvek od Keraj »

Já mám toto:
https://www.laskakit.cz/laskakit-esplan ... ntId=12167

Ale zatím v tom tápu, přijde že každý kód stejnou věc řeší jinak, a to se pak blbě učí nějaké závislosti a postupy.
Navíc jsem zatím odkázaný pouze na sériový monitor u Arduino IDE...

Soban děkuji, mě by stačilo něco jednoduššího do začátku, abych viděl cestu, ale máš to pěkný, popsaný, třeba mě to nakopne
16 panelů DHM-72L9-450 Wp = 7200Wp jih, sklon 17°
2 regulátory EPever Tracer 6415 AN = 6000W
Paralelní adaptér PAL-ADP-50AN
měniče 5 + 3 kW
EPever IP5000-42-plus-T a IP 3000-42-plus-T
135 + 135 + 230 = 500Ah LiFePo na 48V
3* BMS a Balancer Seplos
PetrV2
Příspěvky: 121
Registrován: pát úno 17, 2023 6:08 pm
Lokalita: Praha

Re: Sledování Epeveru pomocí ESP 32

Příspěvek od PetrV2 »

Epever je použit přímo jako příklad na ESPHOME https://esphome.io/components/modbus_controller.html
Just PoC (proof of concept) "FVE" pro odzkoušení a doplnění si vzdělání
1x panel 180Wp, MPPT EPever 5415, EPever IPower+ 500-12, LifePo4 30Ah 12V, JK BMS, HomeAssistant
Keraj
Příspěvky: 185
Registrován: čtv dub 21, 2022 7:15 pm
Lokalita: Poblíž Hradce Králové
Systémové napětí: 48V

Re: Sledování Epeveru pomocí ESP 32

Příspěvek od Keraj »

To je asi v .yaml ... a s tím si neporadím. Nemám HA ani stroj na kterém bych ho spustil
16 panelů DHM-72L9-450 Wp = 7200Wp jih, sklon 17°
2 regulátory EPever Tracer 6415 AN = 6000W
Paralelní adaptér PAL-ADP-50AN
měniče 5 + 3 kW
EPever IP5000-42-plus-T a IP 3000-42-plus-T
135 + 135 + 230 = 500Ah LiFePo na 48V
3* BMS a Balancer Seplos
dusanmsk
Příspěvky: 315
Registrován: pát říj 15, 2021 10:41 am
Lokalita: Stredocesky kraj
Systémové napětí: 48V
Výkon panelů [Wp]: 11250
Kapacita baterie [kWh]: 9.6
Chci prodávat energii: NE
Chci/Mám dotaci: NE

Re: Sledování Epeveru pomocí ESP 32

Příspěvek od dusanmsk »

To ESPHome je kuzelne, namiesto toho, aby si to clovek musel programovat v C-cku, kde mu ten jeho vytvor aspon skontroluje compiler tak nejak hned, tak musi najprv spravit giganticky konfigurak v yamli, riadenom indentom (na cokolvek riadene indentom som fakt, ale fakt extremne alergicky), no a potom tam do toho yamlu napise ...... tramdadadaaaaaaaa .... c-ckovy kod :D

To nevymyslis :D
30*375 Wp JJZ, 2xXTM4000, 2xVT-80, 2xUS5000
Uživatelský avatar
TomHC
Příspěvky: 1282
Registrován: pát lis 11, 2022 8:14 am
Lokalita: Hlohovec, SR
Systémové napětí: 48V
Výkon panelů [Wp]: 5520
Kapacita baterie [kWh]: 14
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Hlohovec, SR

Re: Sledování Epeveru pomocí ESP 32

Příspěvek od TomHC »

Na milión iných vecí v esphome netreba lambdy v céčku, iba yaml. A netreba písať každú blbosť v C, riešiť polia, typy, pointery, konverzie... V C viem čo to porobiť, ale ak nemusím, tak s radosťou použijem esphome, Tasmotu alebo niečo podobné.

Ale s formátom yaml musím súhlasiť s tebou, je to na hlavu. Aj samotný popis na webe esphome je dosť mätúci, nekompletný. Ale dá sa s tým naučiť žiť.
MUST PV1800 VHM 48V 5.5kW, 5.52kWp (12x TPL mono 460W, 2S2P východ, 2S4P juh), 16x 280 Ah LiFePO4 (14.3 kWh) BMS JBD-AP21S001-L21S-200A-B, SW: Home Assistant na Synology DS923+ ku tomu ESPHome, Tasmota, MariaDB, InfluxDB, Telegraf, Grafana, Zigbee2MQTT..., HW: ESPlan (ESP32 + LAN 8720 + RS485 + UART). Nejaké moje projekty: MUST-ESPhome, ELTEK Flatpack2 ESPhome, ESP32-EMON, PZEM-017@WiFi, diyBMS-CurrentShunt-ESPhome
Soban
Příspěvky: 3467
Registrován: pon úno 07, 2022 10:11 pm
Lokalita: Zlaté Hory / Olomouc
Systémové napětí: 24V
Výkon panelů [Wp]: 3600
Kapacita baterie [kWh]: 16
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Zlaté Hory

Re: Sledování Epeveru pomocí ESP 32

Příspěvek od Soban »

Keraj píše: ned pro 17, 2023 12:56 pm Soban děkuji, mě by stačilo něco jednoduššího do začátku, abych viděl cestu, ale máš to pěkný, popsaný, třeba mě to nakopne
Tak ono stačí když budeš ve smyčce číst nějaký registr a posílat si ho na výstup - usb a zobrazovat v ide prozatím.

Já tam mám generování hromadu www stránek přes které jsem četl údaje.
3,6kWp ::pv:: 600Wp (4x 150Wp 4S) + 1kWp (2x 500Wp 2S) + 2kWp (4x 500Wp 2S2P) | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt* (2x 12V/200Ah AGM) + 25.6V/120Ah + 25.6V/125Ah + 25.6V/230Ah LiFePO4 | Jak nepostavit FVE Zlaté Hory :home:
Keraj
Příspěvky: 185
Registrován: čtv dub 21, 2022 7:15 pm
Lokalita: Poblíž Hradce Králové
Systémové napětí: 48V

Re: Sledování Epeveru pomocí ESP 32

Příspěvek od Keraj »

Chtěl bych web server se zobrazenými live daty a nějaká tlačítka, ale zatím to se mnou nemluví ..
16 panelů DHM-72L9-450 Wp = 7200Wp jih, sklon 17°
2 regulátory EPever Tracer 6415 AN = 6000W
Paralelní adaptér PAL-ADP-50AN
měniče 5 + 3 kW
EPever IP5000-42-plus-T a IP 3000-42-plus-T
135 + 135 + 230 = 500Ah LiFePo na 48V
3* BMS a Balancer Seplos
Soban
Příspěvky: 3467
Registrován: pon úno 07, 2022 10:11 pm
Lokalita: Zlaté Hory / Olomouc
Systémové napětí: 24V
Výkon panelů [Wp]: 3600
Kapacita baterie [kWh]: 16
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Zlaté Hory

Re: Sledování Epeveru pomocí ESP 32

Příspěvek od Soban »

No máš ten RS485 převodník připojen stejně na té desce?

V první chvíli si rozchoď vyčtení jednoho registru z toho epeveru.

Co třeba změnit?

Kód: Vybrat vše

// Replace the next variables with your SSID/Password combination
const char* ssid = "sofia-bezrucova";
const char* password = "satyricon";
Zde zadat název tvé wifi a heslo k ní.

Pak ESP dostane IP z tvého routeru a můžeš k němu přistupovat http:/IP_toho ESP

Taky změnit na jaké piny je připojen ten převodník a parametry komunikace

Kód: Vybrat vše

/* Modbus stuff */
#define MODBUS_DIR_PIN  4 // connect DR, RE pin of MAX485 to gpio 4
#define MODBUS_RX_PIN 18 // Rx pin  
#define MODBUS_TX_PIN 19 // Tx pin 
#define MODBUS_SERIAL_BAUD 19200 // Baud rate for esp32 and max485 communication Must 
Ten převodník je připojen k Serial2

Kód: Vybrat vše

//Serial2.begin(baud-rate, protocol, RX pin, TX pin);.
  Serial2.begin(MODBUS_SERIAL_BAUD, SERIAL_8N1, MODBUS_RX_PIN, MODBUS_TX_PIN);
  //Serial2.setTimeout(300);
  
ID zařízení mustu je 4 jaké je epeveru nevím takže tu 4 ku třeba změnit.

Kód: Vybrat vše

  //modbus slave ID 4
  node.begin(4, Serial2);
A pokud se z epeveru čtou data jako holding registry tak by mělo fungovat:

V prohlížeči zadáš http://IP_toho_ESP/read?registr=20000&pocet=1

Jaký budeš chtít přečíst registr zadáš místo té číslovky 20000 (toto je registr 20000).
3,6kWp ::pv:: 600Wp (4x 150Wp 4S) + 1kWp (2x 500Wp 2S) + 2kWp (4x 500Wp 2S2P) | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt* (2x 12V/200Ah AGM) + 25.6V/120Ah + 25.6V/125Ah + 25.6V/230Ah LiFePO4 | Jak nepostavit FVE Zlaté Hory :home:
Keraj
Příspěvky: 185
Registrován: čtv dub 21, 2022 7:15 pm
Lokalita: Poblíž Hradce Králové
Systémové napětí: 48V

Re: Sledování Epeveru pomocí ESP 32

Příspěvek od Keraj »

Děkuji, vyzkouším to.
Epever se vyčítá z input reg.
16 panelů DHM-72L9-450 Wp = 7200Wp jih, sklon 17°
2 regulátory EPever Tracer 6415 AN = 6000W
Paralelní adaptér PAL-ADP-50AN
měniče 5 + 3 kW
EPever IP5000-42-plus-T a IP 3000-42-plus-T
135 + 135 + 230 = 500Ah LiFePo na 48V
3* BMS a Balancer Seplos
Soban
Příspěvky: 3467
Registrován: pon úno 07, 2022 10:11 pm
Lokalita: Zlaté Hory / Olomouc
Systémové napětí: 24V
Výkon panelů [Wp]: 3600
Kapacita baterie [kWh]: 16
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Zlaté Hory

Re: Sledování Epeveru pomocí ESP 32

Příspěvek od Soban »

Jinak ta adresa registru je v desítkové soustavě takže jak máš tabulku v šestnáctkové tak si to musíš převést.

Jinak samozřejmě ostatní stránky budou zobrazovat nesmysly protože tam mám zadané adresy mustu.
3,6kWp ::pv:: 600Wp (4x 150Wp 4S) + 1kWp (2x 500Wp 2S) + 2kWp (4x 500Wp 2S2P) | 2x MUST PV18-3024 VHM, 3kW/24V | 16kWh *batt* (2x 12V/200Ah AGM) + 25.6V/120Ah + 25.6V/125Ah + 25.6V/230Ah LiFePO4 | Jak nepostavit FVE Zlaté Hory :home:

  • Podobná témata
    Odpovědi
    Zobrazení
    Poslední příspěvek