Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Source de mesure Fronius
#1
Bonjour à tous,

Je souhaite tout d'abord présenter mes plus grands remerciements à André, ainsi qu'à tous les contributeurs de ce magnifique projet de routeur solaire F1ATB. C'est du super boulot !

Je viens de réaliser mon routeur solaire en utilisant la version V14.23.
J'ai légèrement modifié le code source pour y ajouter une source de mesure compatible avec mon onduleur de la marque Fronius (avec Smart Meter Fronius). Vous pouvez trouver le code source complet en pièce jointe "Solar_Router_V14_24_Source_Fronius.zip".

Je me suis basé sur la documentation de l'API fournie par la marque Fronius (API Fronius Solar V1).
Téléchargeable en utilisant le lien suivant :
https://www.fronius.com/~/downloads/Sola...0,2012.pdf


Pour ma part j'utilise un onduleur et un smart meter Fronius triphasé.
Mais dans le code j'ai essayé de prendre les variables communes aux compteurs fronius monophasé et triphasé, afin que cela puisse convenir au plus grand nombre. (voir page 46 et 47 de la documentation)


Détail du code source pour la Source de mesure "Source_Fronius.ino"

Code :
// ******************************
// * Client d'un onduleur Fronius GEN24/Tauro/Verto *
// ******************************
void LectureFronius() {
  String S = "";
  String Fronius_Data = "";
  String Gr[4];
  String data_[20];

  Pva_valide=false;
  // Use WiFiClient class to create TCP connections
  WiFiClient clientESP_RMS;
  String host = IP2String(RMSextIP);
  if (!clientESP_RMS.connect(host.c_str(), 80)) { 
    StockMessage("connection to Fronius Solar failed : " + host);
    delay(200);
    return;
  }
  //
  String url = "/solar_api/v1/GetMeterRealtimeData.cgi?Scope=System";
  clientESP_RMS.print(String("GET ") + url + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (clientESP_RMS.available() == 0) {
    if (millis() - timeout > 5000) {
      StockMessage(">>> client Fronius Timeout ! : " + host);
      clientESP_RMS.stop();
      return;
    }
  }
  timeout = millis();
  // Lecture des données brutes distantes
  while (clientESP_RMS.available() && (millis() - timeout < 5000)) {
    Fronius_Data += clientESP_RMS.readStringUntil('\r');
  }
  int p = Fronius_Data.indexOf("{");
  Fronius_Data = Fronius_Data.substring(p+1);
 
  // On utilise pas la librairie ArduinoJson.h, pour décoder message Json, qui crache sur de grosses données
  float PactReseau = PfloatMax(ValJsonFrFloat("PowerReal_P_Sum", Fronius_Data));
  if (PactReseau < 0) {
    PuissanceS_M_inst = 0;
    PuissanceI_M_inst = int(-PactReseau);
  } else {
    PuissanceI_M_inst = 0;
    PuissanceS_M_inst = int(PactReseau);
  }
  float PappReseau = PfloatMax(ValJsonFrFloat("PowerApparent_S_Sum", Fronius_Data));
  if (PappReseau < 0) {
    PVAS_M_inst = 0;
    PVAI_M_inst = int(-PappReseau);
  } else {
    PVAI_M_inst = 0;
    PVAS_M_inst = int(PappReseau);
  }
  Tension_M = PfloatMax(ValJsonFrFloat("Voltage_AC_Phase_1", Fronius_Data));
  Intensite_M = PfloatMax(ValJsonFrFloat("Current_AC_Phase_1", Fronius_Data));
  PowerFactor_M = PfloatMax(ValJsonFrFloat("PowerFactor_Sum", Fronius_Data));

  Energie_M_Soutiree = ValJsonFrInt("EnergyReal_WAC_Sum_Consumed", Fronius_Data);
  Energie_M_Injectee = ValJsonFrInt("EnergyReal_WAC_Sum_Produced", Fronius_Data);

  Fr_dataBrute=Fronius_Data;
  Fr_dataBrute+="|PuissanceS_M_inst : " + String(PuissanceS_M_inst) + "W";
  Fr_dataBrute+="|PuissanceI_M_inst : " + String(PuissanceI_M_inst) + "W";
  Fr_dataBrute+="|PVAS_M_inst : " + String(PVAS_M_inst) + "VA";
  Fr_dataBrute+="|PVAI_M_inst : " + String(PVAI_M_inst) + "VA";
  Fr_dataBrute+="|Tension_M : " + String(Tension_M) + "V";
  Fr_dataBrute+="|Intensite_M : " + String(Intensite_M) + "A";
  Fr_dataBrute+="|PowerFactor_M : " + String(PowerFactor_M);
  Fr_dataBrute+="|Energie_M_Soutiree : " + String(Energie_M_Soutiree) + "Wh";
  Fr_dataBrute+="|Energie_M_Injectee : " + String(Energie_M_Injectee) + "Wh";

  filtre_puissance();
  PuissanceRecue=true;  //Reset du Watchdog à chaque trame du Fronuis Solar reçue
  EnergieActiveValide = true;
 
  if (cptLEDyellow > 30) {
    cptLEDyellow = 4;
  }
}


float ValJsonFrFloat(String nom, String Json) {
  int p = Json.indexOf(nom);
  Json = Json.substring(p);
  p = Json.indexOf(":");
  Json = Json.substring(p + 1);
  int q = Json.indexOf(",");
  p = Json.indexOf("}");
  p = min(p, q);
  float val = 0;
  if (p > 0) {
    Json = Json.substring(0, p);
    val = Json.toFloat();
  }
  return val;
}


float ValJsonFrInt(String nom, String Json) {
  int p = Json.indexOf(nom);
  Json = Json.substring(p);
  p = Json.indexOf(":");
  Json = Json.substring(p + 1);
  int q = Json.indexOf(".");
  p = Json.indexOf("}");
  p = min(p, q);
  long val = 0;
  if (p > 0) {
    Json = Json.substring(0, p);
    val = Json.toInt();
  }
  return val;
}


J'utilise le routeur F1ATB, depuis une semaine et ça a l'air de plutôt bien fonctionné.



En espérant que cette petite contribution puisse être utile à d'autres personnes.

Bien Cordialement,
Ludovic


Pièces jointes
.zip   Solar_Router_V14_24_Source_Fronius.zip (Taille : 115.14 Ko / Téléchargements : 2)
.txt   Source_Fronius.txt (Taille : 3.78 Ko / Téléchargements : 3)
Installation PV 3kWc : 8 panneaux Voltec Solar Tarka 126 VSMS 385W (Made in Alsace)
Onduleur : Fronius Symo Gen24 4.0 Plus triphasé avec Smart Meter TS 65A-3
Routeur F1ATB en V14.23 (modifié pour utiliser l'API Fronius), avec Relais Statique Celduc  (Made in France)
Intégration à HomeAssistant via MQTT
Répondre
#2
Bonjour Ludovic,

Merci pour l’ajout de la source Fronius dans le code. J’étais justement sur le point d'entreprendre la modification quand j’ai vu ton post. Smile

J’ai pris le temps de reporter tes modifications pour ajouter la source de Fronius en version 15.08 : diff entre ta version et la V14 puis patch manuel sur la V15.0.8 .

Je viens de tester sur un kit de développement ESP32, et je récupère bien les informations d'un SmartMeter Fronius monophasé en Modbus avec l’onduleur GEN24.
En revanche, je n’ai pas encore réalisé le montage complet, donc je n’ai pas pu tester la partie routage. Mais a priori, il n’y a pas eu de modifications de ce côté.

@F1ATB : Merci pour ce super projet. Projet HW en cours de réalisation de mon coté.
Possible d'intégrer la source Fronius dans la source principale ? Je peu aider pour de l'intégration ou du test si besoin.

Merci beaucoup,


Pièces jointes
.zip   Solar_Router_V15_08_With_Fronius.zip (Taille : 123.35 Ko / Téléchargements : 0)
Répondre


Atteindre :


Utilisateur(s) parcourant ce sujet : 1 visiteur(s)