Note de ce sujet :
  • Moyenne : 5 (4 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Plus d'accès aux données de la passerelle Enphase Envoy
(20-06-2026, 09:48 AM)michy a écrit : Bonjour, 

  Question aux utilisateurs de système Enphase:

  Y a t'il encore des passerelles qui tourne avec un firmware V5 ? (=> en mode http (sans s) donc sans utilisation de Token)

  De ce que je comprend : A ce jour on est sur firmware V8 et les mises a jour sont piloté par Enphase ...

  => l'exception serait une passerelle non connecté a internet, ou une version hardware ancienne qui ne permet pas de monter en firmware V8

Bonjour,
Je me souviens que lorsque nous étions encore en V5, Enphase avait demandé l'approbation des utilisateurs avant le passage en V7. Depuis, les mises à jour ne sont plus contrôlables par l'utilisateur et nous sommes désormais en V8, plus précisément en version V8.3.5528.

Visiblement, le déploiement de cette dernière mise à jour prend du temps. Pour ma part, je suis resté en version 5167 qui, avec la 5169, est la dernière version qui  fonctionne. Certains utilisateurs ont reçu dès le mois de mai la version 5422, laquelle s'est également révélée aussi problématique que la 5528 reçue au mois de juin.
Répondre

(20-06-2026, 11:50 AM)algorytmix a écrit :  je vous joint le .json renvoyé par ma passerelle en triphasé du coup Wink

dans le bloc [0], votre production :
Vous produisez "activePower": 1872.131,
la phase 1 produit "activePower": 535.044,
la phase 2 produit "activePower": 805.062,
La phase 3 produit "activePower": 534.794,

dans le bloc [1], votre consommation :
Vous soutirez "activePower": 322.399, depuis le réseau (le signe est positif / vous n'injectez pas)
la phase 1 "activePower": -656.35, injecte sur le réseau
la phase 2 "activePower": -647.718, injecte sur le réseau
la phase 3 "activePower": 1593.873, soutire depuis le réseau
1593-647-656 ~= 322  le compte est presque bon (a cause des facteurs de puissance différent ce n'est pas réellement une somme

Le routeur a besoin de la valeur 322.399 pour travailler, le reste c'est du cas particulier (pour gérer la charge VE à puissance maxi admise par exemple sans dépasser les limites sur chacune des phases)

Si on veut faire le bilan, vous produisez 1872W qui ne suffise pas a couvrir le besoin donc, a ce moment vous habitation consommait (1872 + 322 =)  2194 W
Merci André Smile ,
Routeur V17.19 (since V2.01) / Source UxI / 5 actions

Si les réponses que je propose bénévolement sur ce forum ne vous plaisent pas, ignorez-les simplement sans me jeter la pierre ! (Ou ne posez pas de question)
Répondre

Modification proposée par Michy faite, ça tourne

Code :
Données Enphase Envoy-S Metered
Le525
Tension efficace
256.94
V
Courant efficace
4.10
A
Puissance réseau public (Pw)
591
W
Facteur de puissance
0.62
Energie active soutirée
26
Wh
Energie active injectée
1
Wh
Puissance produite (Pw)
2315
W
Puissance consommée (Pw)
2906
W
Session Id
Ok Received from Enphase
Token
Ok Received from Enphase

Toutes les puissances semblent ok (bi phasé).
Je ne sais pas vérifier sir les energie active/soutirée sont cohérentes ou pas ! Sad

Merci à tous ceux qui codent pour toutes ces avancées
Répondre

bon je galere a compiler avec arduino IDE il me plante dans les pattes a chaque fois voici la correction proposée par gemini pour le fichier enphase en triphasé
Code :
void LectureEnphase() {
  // 1. Définition du filtre pour économiser la RAM
  StaticJsonDocument<2048> filter;
  filter[0]["activePower"] = true; // Production
  for(int i=0; i<3; i++) {
    filter[1]["channels"][i]["activePower"] = true;
    filter[1]["channels"][i]["apparentPower"] = true;
    filter[1]["channels"][i]["voltage"] = true;
    filter[1]["channels"][i]["current"] = true;
    filter[1]["channels"][i]["freq"] = true;
    filter[1]["channels"][i]["actEnergyDlvd"] = true;
    filter[1]["channels"][i]["actEnergyRcvd"] = true;
  }

  // 2. Préparation du client réseau
  WiFiClientSecure client;
  client.setInsecure();
  IPAddress ip( (RMSextIP >> 24) & 0xFF, (RMSextIP >> 16) & 0xFF, (RMSextIP >> 8) & 0xFF, RMSextIP & 0xFF );
 
  if (!client.connect(ip, 443)) {
    TelnetPrintln("Erreur connexion Envoy");
    return;
  }

  // 3. Envoi de la requête
  client.println("GET /ivp/meters/readings HTTP/1.1");
  client.println("Host: " + String(ip.toString()));
  client.println("Authorization: Bearer " + TokenEnphase);
  client.println("Connection: close");
  client.println();

  if (!client.find("\r\n\r\n")) {
    TelnetPrintln("Erreur headers");
    return;
  }

  // 4. Désérialisation
  DynamicJsonDocument doc(20000);
  DeserializationError error = deserializeJson(doc, client, DeserializationOption::Filter(filter));
  client.stop();

  if (error) {
    TelnetPrintln("JSON ERR: " + String(error.c_str()));
    return;
  }

  // 5. Calcul des valeurs triphasées
  PactProd = doc[0]["activePower"] | 0.0f;
 
  float PactReseau = 0.0f;
  float PvaReseau = 0.0f;
  float Tension_Tmp = 0.0f;
  float Intensite_Tmp = 0.0f;
  double whDlvdTotal = 0.0;
  double whRcvdTotal = 0.0;

  if (doc[1].containsKey("channels")) {
    for(int i = 0; i < 3; i++) {
      PactReseau   += (float)(doc[1]["channels"][i]["activePower"] | 0.0f);
      PvaReseau    += (float)(doc[1]["channels"][i]["apparentPower"] | 0.0f);
      whDlvdTotal  += (double)(doc[1]["channels"][i]["actEnergyDlvd"] | 0.0);
      whRcvdTotal  += (double)(doc[1]["channels"][i]["actEnergyRcvd"] | 0.0);
      Tension_Tmp  += (float)(doc[1]["channels"][i]["voltage"] | 0.0f);
      Intensite_Tmp += (float)(doc[1]["channels"][i]["current"] | 0.0f);
    }
   
    PactConso_M   = (int)(PactReseau + PactProd);
    Tension_M     = Tension_Tmp / 3.0f;
    Intensite_M   = Intensite_Tmp;
    Frequence     = doc[1]["channels"][0]["freq"] | 50.0f;

    // 6. Correction du calcul de puissance avec signe (Logique demandée)
    // On suppose que PfloatMax est une macro ou fonction locale existante
    PactReseau = PfloatMax(PactReseau);
    PvaReseau  = PfloatMax(PvaReseau);

    if (PactReseau < 0) {
      PuissanceS_M_inst = 0;
      PuissanceI_M_inst = int(-PactReseau);
      PVAS_M_inst = 0;
      PVAI_M_inst = int(PvaReseau);
    } else {
      PuissanceI_M_inst = 0;
      PuissanceS_M_inst = int(PactReseau);
      PVAI_M_inst = 0;
      PVAS_M_inst = int(PvaReseau);
    }
    Pva_valide = true;

    // 7. Calcul des deltas pour votre routeur
    static long LastwhDlvdCum = 0L;
    static long LastwhRcvdCum = 0L;
   
    long currentDlvd = (long)whDlvdTotal;
    long currentRcvd = (long)whRcvdTotal;

    if (LastwhDlvdCum != 0) {
       DeltaWhSoutire = currentDlvd - LastwhDlvdCum;
       DeltaWhInjecte = currentRcvd - LastwhRcvdCum;
    }
   
    LastwhDlvdCum = currentDlvd;
    LastwhRcvdCum = currentRcvd;
  }
}
je n'arrive malheureusement pas a le tester ....
Répondre

Salut,

Je poste donc le code corrigé qui fonctionne pour moi sur un sysème non triphasé.
Je constate que l'Enphase donne de mauvais résultat dans le topic global et non pas sur les données de la Phase L1 .... J'ai des données sur la Phase L2 et L3 qui faussent les vraies valeurs que donne L1 dans le topic global. Du coup mon code donne des valeurs en provenance de la Phase L1

Ce code fonctionne mais présente encore une amélioration à faire dans la partie de code qui récupère les données JSON juste après avoir reçu la ligne de status HTTP 200.

Aujourd'hui je récupère les datas JSON avec le code suivant:

    client.setTimeout(500);
    //TelnetPrintln("Waiting JSON data ...");
    jsonPayload = client.readString();
    client.stop();

Quelques fois les données sont mal récupérées et le décodage par deserialisation du packet JSON renvoie une erreur.
Cela n'empeche pas la régulation de travailler car il y a une lecture par seconde environ. Mais ce n'est pas propre....

D'autre par, depuis que la récupération des données est devenue plus lourde avec cette nouvelle api, je constate un ralentissement notable voir quelques blocages dans la navigation des pages Web.
Si quelqu'un à une idée d'où cela peut venir je suis preneur !!

Sinon attention il faut aussi rajouter la variable
                  long LastwhRcvdCum = 0;    //Dernière valeur cumul Wh injecté
dans le fichier Solar_Router.ino
Egalement la fréquence de raffraichissement des data avec Enphase est passé à 1000ms (1s) au lieu de 600ms

Je mets les 2 fichiers sources à modifier pour compiler .....

Merci pour vos retour et infos ;-)


Pièces jointes
.txt   Source_EnphaseEnvoy.txt (Taille : 24.39 Ko / Téléchargements : 1)
.txt   Solar_Router.txt (Taille : 78.49 Ko / Téléchargements : 1)
Répondre

Thumbs Up 
(20-06-2026, 12:53 PM)michy a écrit : L'erreur est dans l'interprétation de :
PvaReseau = puissance apparente
PVAS_M_inst = PVAS_M_inst si positive
PVAI_M_inst = - PVAS_M_inst si negative

La puissance apparente retournée par /ips/meters/readings est toujours positive, il faut se baser sur le signe de la puissance active

Code :
PactReseau = PfloatMax(PactReseau);
  if (PactReseau < 0) {
    PuissanceS_M_inst = 0;
    PuissanceI_M_inst = int(-PactReseau);
  } else {
    PuissanceI_M_inst = 0;
    PuissanceS_M_inst = int(PactReseau);
  }
  PvaReseau = PfloatMax(PvaReseau);
  if (PvaReseau < 0) {
    PVAS_M_inst = 0;
    PVAI_M_inst = int(-PvaReseau);
  } else {
    PVAI_M_inst = 0;
    PVAS_M_inst = int(PvaReseau);
  }
  Pva_valide = true;


à remplacer par
Code :
  PactReseau = PfloatMax(PactReseau);
  PvaReseau = PfloatMax(PvaReseau);
  if (PactReseau < 0) {
    PuissanceS_M_inst = 0;
    PuissanceI_M_inst = int(-PactReseau);
    PVAS_M_inst = 0;
    PVAI_M_inst = int(PvaReseau);
  } else {
    PuissanceI_M_inst = 0;
    PuissanceS_M_inst = int(PactReseau);
    PVAI_M_inst = 0;
    PVAS_M_inst = int(PvaReseau);
  }
  Pva_valide = true;
Bonjour,

J'ai appliqué cette modif sur les autres proposées sur ce fil (config monophasé avec la dernière version d'Envoy) et ca fonctionne très bien !
Bravo à vous !!!

N'hesitez pas à fournir les ino à tester ... (suivre le fil des modif à l'interieur des ino n'est pas facile à suivre ) ...

Bravo et merci
Répondre

(20-06-2026, 03:44 PM)Ploufdanlo a écrit :
(20-06-2026, 12:53 PM)michy a écrit : L'erreur est dans l'interprétation de :
PvaReseau = puissance apparente
PVAS_M_inst = PVAS_M_inst si positive
PVAI_M_inst = - PVAS_M_inst si negative

La puissance apparente retournée par /ips/meters/readings est toujours positive, il faut se baser sur le signe de la puissance active

Code :
PactReseau = PfloatMax(PactReseau);
  if (PactReseau < 0) {
    PuissanceS_M_inst = 0;
    PuissanceI_M_inst = int(-PactReseau);
  } else {
    PuissanceI_M_inst = 0;
    PuissanceS_M_inst = int(PactReseau);
  }
  PvaReseau = PfloatMax(PvaReseau);
  if (PvaReseau < 0) {
    PVAS_M_inst = 0;
    PVAI_M_inst = int(-PvaReseau);
  } else {
    PVAI_M_inst = 0;
    PVAS_M_inst = int(PvaReseau);
  }
  Pva_valide = true;


à remplacer par
Code :
  PactReseau = PfloatMax(PactReseau);
  PvaReseau = PfloatMax(PvaReseau);
  if (PactReseau < 0) {
    PuissanceS_M_inst = 0;
    PuissanceI_M_inst = int(-PactReseau);
    PVAS_M_inst = 0;
    PVAI_M_inst = int(PvaReseau);
  } else {
    PuissanceI_M_inst = 0;
    PuissanceS_M_inst = int(PactReseau);
    PVAI_M_inst = 0;
    PVAS_M_inst = int(PvaReseau);
  }
  Pva_valide = true;
Bonjour,

J'ai appliqué cette modif sur les autres proposées sur ce fil (config monophasé avec la dernière version d'Envoy) et ca fonctionne très bien !
Bravo à vous !!!

N'hesitez pas à fournir les ino à tester ... (suivre le fil des modif à l'interieur des ino n'est pas facile à suivre ) ...

Bravo et merci

Tu peux partager ton code final qui fonctionne chez toi michy ?
Merci à toi ;-)

A+
Répondre

Franchement merci a tous pour cette mobilisation. Et bravo !
Répondre

Je suis prêt à proposer une nouvelle version officielle, mais il faudra qu'elle tourne en monophasé et triphasé.
Désolé, mais de mon côté, n'ayant pas d'Enphase, je ne peux pas participer aux essais.

Cordialement

André / F1ATB
Répondre

C'est vrai qu'il est difficile de s'y retrouver et plusieurs personnes proposent des solutions avec des traitements qui semblent différentes.

Pour ma part, j'ai en gros suivi la lignée michy, cmichel et Laurent(lbourdel je crois), qui marche pour moi en monophasé, basé sur la 17.21 et Envoy en dernière version.

Voici en pj les INO des 2 fichiers modifiés (ils sont dans le zip):
* le fichier Solar_Router_V17_21_ibourdelv2 a rajouté un ralentisseur (j'ai mis 1600 ms, il était proposé plus, mais ça passe) pour les accès consécutifs à envoy
Code :
if (Source == "Enphase") {
        LectureEnphase();
        LastRMS_Millis = millis();
        PeriodeProgMillis = 1600 + ralenti;  //On s'adapte à la vitesse réponse Envoy-S metered

* Source_EnphaseEnvoy.ino lui même avec le void de lecture modifié uniquement.

Il est clair qu'il faudrait un triphasé qui fonctionne pour valider, mais je n'ai pas cela chez moi


Pièces jointes
.zip   V17_21_biphase_michy.zip (Taille : 28.25 Ko / Téléchargements : 8)
--------------------------------------------------------------
ESP32 (v117,20 et IP fixe) + sonde température + SSR -- Cumulus/Chauffe-Eau
Source données serveur Enphase 7.

Répondre



Atteindre :


Utilisateur(s) parcourant ce sujet :
lahuchette, rdsoft30, 1 utilisateur(s) invisible(s), 7 visiteur(s)

Moteur MyBB, © 2002-2026 Melroy van den Berg.