Note de ce sujet :
  • Moyenne : 4.67 (6 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Plus d'accès aux données de la passerelle Enphase Envoy
Bonsoir André, à tous,

J'ai porté les améliorations que j'ai décrite dans un post précédent dans le fichier Source_EnphaseEnvoy.ino.
Cette amélioration qui porte uniquement sur la récupération des données Enphase marche très bien et provique beaucoup moins de reconnexion ou perte de données.

Je partage donc les fichiers sources modifiés ainsi que le binaire (base de v17.26 André + mes modifications).
Je précise que j'ai laissé tout ce qu'il y a dans la version 17.26 sur le site d'André ( donc pas de suppression de la gestion du Linky, ni du Telnet).

En revanche j'ai des problèmes assez fréquents d'affichage de la page d'accueil, rien ne se bloque, mais il manque des informations de temps en temps, ..... je n'ai pas la preuve, mais cela fait plusieurs fois que je prends des bases de code différentes et j'obtient toujours les mêmes problèmes si trop de RAM est consommé. pour l'instant je n'ai pas trouvé d'autre solution que de libérer de l'emprunte mémoire pour résoudre le problème.

Si certain veulent d'aventurer dans la recherche du problème, je suis preneur de solutions ;-) pour tester.

Aussi si d'autres peuvent tester cette version pour faire un retour ici, de si ils ont un soucis d'affichage de la page d'accueil dans son intégralité (aucunes datas manquantes).

@André, si tu le souhaites comme tu me l'as demandé, tu peux en faire une version 17.27 telle que j'ai poussé l'ensemble des sources, car je n'ai modifié que:
- Source_EnphaseEnvoy.ino
- Solar_router.ino

https://drive.google.com/drive/folders/1...drive_link

Bonne soirée à tous,

David
Merci à tous.

(06-07-2026, 09:18 PM)michy a écrit : Bonjour, 

  avant de commencer à sacrifier des modules (peut être que certain n'apprécierons pas / je n'ai rien contre les belges, mais il y a certainement en service plus de Source Linky que Smartgateway et HomeWizard réunis, si vraiment, il fallait choisir ...)  :

  => pas la peine de supprimer le module linky pour gagner les 10k de ram utilisés par la variable DataRawLinky,

  il suffit de transformer DataRawLinky en pointeur (ça ne consomme que 4 octets quand ce n'est pas utilisé) 
Code :
//volatile char DataRawLinky[10000];  //Buffer entrée données Linky
#define SIZEBUFFCIRC  10000 // taille du buffer pour trame linky  (utiliser cette constante partout où le 10000 fait référence à la taille du buffer)
volatile char* DataRawLinky = NULL;  // Utilisation d'un pointeur, allocation de RAM uniquement si la source est Linky


  et allouer la mémoire uniquement si Source est "Linky", dans la fonction Setup_Linky() qui n'est appelé qu'une fois lors du boot
Code :
  if (DataRawLinky == NULL) {
    DataRawLinky = (volatile char*)malloc(SIZEBUFFCIRC);
    if (DataRawLinky != NULL) {
      memset((void*)DataRawLinky, 0, SIZEBUFFCIRC);
    } else {
      Serial.println("Erreur : Mémoire insuffisante pour Linky !");
      return;
    }
  }

+ une vérification avant usage dans server.ino
Code :
    //if (Source_data == "Linky") {
    if (Source_data == "Linky" && DataRawLinky != NULL ) {

Si on veut continuer dans cette voie : 
* quand il n'y a pas de sonde de température, c'est tabTemperature_5mn qui consomme 4800 octets
* quand on n'utilise pas le module UxI, il y a les tableaux volt[100], amp[100], voltM[100] et ampM[100]  qui consomme 1600 octets en permanence (usage ou pas de UxI)
* affecté la mémoire en fonction du nombre d'actions effectivement en place 
* pas de triac .... c'est encore quelques d'octets qu'on peut rendre disponible

* Une fusion des modules Shelly qui font sensiblement la même chose
* Pas mal de variable globale qui pourrait être déporté en static dans la fonction qui l'utilise (le RAM ne sera alloué que si on exécute la fonction au moins une fois)



  Dans toutes les variantes de version pour la source Enphase (depuis la mise à jour du firmware qui pose problème), vous avez tous continué dans la voie de la gestion du client réseau à la main, alors qu'il y a des fonctions éprouvées, optimisées, native dans l'environnement Espressif [=> httpClient, les timeouts sont parfaitement maitrisés en arrière plan, pas la peine se compliquer l'histoire soit même]

de même, vous gérez du json à la main alors qu'on embarque déjà le code de ArduinoJson, (on peut gagner sur plusieurs tableaux : on supprime le code qui gère des String à n'en plus finir, on enlève le code redéveloppé (qui prend de la place, alors que ArduinoJson est déjà dispo et beaucoup plus conforme aux spécifications 'json.org'), couplé avec httpClient et du filtrage direct sur le flux réseau, ça optimise l'usage de RAM et la vitesse d'exécution




un des plus gros gain possible c'est de supprimer les fonctions qui crée et traite moulte copies des chaines en RAM : 

un simple String avec un '+' c'est la taille de la chaine d'origine + la taille de la chaine a ajouter  qui se retrouve dupliqué en RAM et pour faire ça, il faut un bloc de ram continu suffisamment grand (et malheureusement les String, ça semble facile à utiliser mais, ça fragmente la mémoire en multiple bloc jusqu'à ce qu'il n'y ai plus de bloc d'un seul tenant assez grand)  ... entre temps, c'est des plantages ou choses pas attendu qui se produisent et difficile à comprendre (quand je vois 372 octets dispo, ça ne peut que mal finir à court terme)

ajoutons que le passage de String en paramètres de fonction (sans usage de const String &  ), ça duplique encore une fois

Salut michy,

Les améliorations que tu proposes pour la mémoire occupée par la gestion du Linky, j'y ai déjà pensé, penses tu ....,  c'est une bonne solution.

Pour l'histoire de l'API ArduinoJson, je ne partage pas ton point de vue ..... le travail fait par tsabran mixés au travail que j'avais déjà fait pour optimiser les temps de lecture des datas Enphase ainsi que leur décodage sont bien plus optimiser en utilisant le moins possible la classe String ainsi que les lib Json ..... J'avais fait les mesures de conso de temps, et la gestion des tableaux (qui sont en statique) ainsi que la loop de lecture des data Enphase fonctionne bien mieux sans les String et la librairie AduinoJson.

Ensuite, je pense que tu n'as pas toute la subtilité de ce qu'est une variable statique locale. Elle sera de toutes les façon déclarée et utilisera la mémoire dés le démarrage du programme, même si la fonction qui contient la variable statique locale n'est jamais appelée !! C'est équivalent à une variable globale, mais étant statique elle ne sera accessible que dans la fonction en local. C'est la pile mémoire qui s'en trouve soulagée, rien d'autre !!

Dernier point qui peut-être pourrait t'échapper, le fait que tsabran ait réecrit la fonction de lecture d'un clientWifi, avec une boucle de lecture octet par octet permet de soulager les autres threads de l'application pendant la boucle de lecture par l'appel à la fonction yield() dans la boucle. A moins que la fonction readStringUntil() rende correctement la main aux autres threads, j'ai constaté une nette amélioration de la réactivité de l'application dans les pages Web en ayant intégrer ces modifications de tsabran.

Bref, à suivre. Mais la consommation de RAM semble un point critique à l'heure actuelle dans le code avec toutes les fonctionnalités qu'il contient (Merci André ;-) pour tout ce travail produit qui est énorme !!).

A+

David
Répondre

Bonjour rdsoft30,
Version en test et pour le moment ça fonctionne pas mal, j'ai quelques messages:
07/07/2026 15:21:38 : Envoy error while reading HTTP response status, status= TIMEOUT, partialLen=0
07/07/2026 15:33:14 : Envoy error while reading HTTP response status, status= TIMEOUT, partialLen=0

Mais peu et les graphiques et les pages sont correctes, je laisse en // le fonctionnement pour comparer, à voir la suite
Routeur v12 / routage cumulus 1.9kW triphasé avec 2 x SSR40A H
Source : Envoy Metered en V8
PV : 3Kw triphasé, 8 panneaux LONGI 375w, 8 x IRQ7+, en autoconsommation avec CACSI
RMS Station de charge VE-RMS, version ESP32 ou ESP32 & Arduino Uno
Répondre

(07-07-2026, 03:58 PM)cmichel a écrit : Bonjour rdsoft30,
Version en test et pour le moment ça fonctionne pas mal, j'ai quelques messages:
07/07/2026 15:21:38 : Envoy error while reading HTTP response status, status= TIMEOUT, partialLen=0
07/07/2026 15:33:14 : Envoy error while reading HTTP response status, status= TIMEOUT, partialLen=0

Mais peu et les graphiques et les pages sont correctes, je laisse en // le fonctionnement pour comparer, à voir la suite

Merci pour le retour ;-)

A suivre.
Répondre

J’ai mis en ligne la version 17.27, qui intègre les développements de rdsoft30 pour la partie Enphase. J’ai également réduit la taille du buffer du Linky pour qu’il occupe moins de mémoire : je suis passé de 10 Ko à 4 Ko.
Pour rappel, une analyse de message Linky traite environ 1 Ko de données. Comme les messages sont espacés de 2 secondes (avec un débit de 9600 bauds), le Linky ne peut pas envoyer plus de 2 Ko par message. Avec un buffer de 4 Ko, il n’y a donc aucun risque de débordement.

J’espère que cette nouvelle version satisfera le plus grand nombre de possesseurs de systèmes Enphase.
Cordialement,
André
Répondre

  • En V17.27:
toujours baisse preoccupante Ram mini à 688 octets seulement après 42 minutes...
Nb erreurs non bloquantes du timeout 
  • En V ”tsabran”
Une observation pour sortir des absences/erreurs d’affichage de la page d'accueil, il me suffit de "basculer” entre l’adresse interne (192.168.1.xxx) et l’adresse externe par redirection de port (aaa.bbb.ccc.ddd:ppppp) pour retrouver instantanément un affichage correct !!!
Je ne suis pas assez compétent pour interpréter ce comportement entre les appels de mon navigateur en "bascule” entre l’Ip interne et externe de mon esp, qui permettent de réinitialiser l'affichage correct de la page par le serveur de l’esp ?


Pièces jointes Miniature(s)
   
Répondre

Bonjour,
Je suis en train de tester cette nouvelle version 17.27 et tout me semble bien fonctionner, j'ai quelques messages dans la partie données brutes:
08/07/2026 10:55:03 : JSON Loading failed
08/07/2026 10:55:17 : Envoy error while reading HTTP response status, status= TIMEOUT, partialLen=0
qui se répète à divers intervalles.

La taille mémoire minimum est à 6490, les pages s'affichent correctement.

       

Merci.
Routeur v12 / routage cumulus 1.9kW triphasé avec 2 x SSR40A H
Source : Envoy Metered en V8
PV : 3Kw triphasé, 8 panneaux LONGI 375w, 8 x IRQ7+, en autoconsommation avec CACSI
RMS Station de charge VE-RMS, version ESP32 ou ESP32 & Arduino Uno
Répondre

Bonjour à tous,
Je teste aussi la version 17.27
Aucun problème constaté, pas de messages d'erreur.
C'est tout bon !
Merci à tous les contributeurs pour cette version.
3,4 kWc - Enphase iq8hc
Enphase envoy metered
RMS triac - 2,2kW appoint ECS
RMS Station de charge VE-RMS
Merci André !
Répondre

Je suis passé depuis ce matin à la version 17.27 en exploitation (branché sur le CE).

Tout fonctionne, par contre, autant, au début, la réactivité de passage entre les différentes pages était parfaites+, au bout de 5h30 de fonctionnement, c'est un peu plus saccadé, mais parfaitement utilisable.

Je suis par contre à 240 octets pour la "Mémoire RAM libre minimum". Les premières heures, on était autour de 2000 octets il me semble.

Quelques messages divers apparaissent toujours, mais nettement moins me semble-t-il.

Great job !
--------------------------------------------------------------
ESP32 (v17.27 et IP fixe) + sonde température + SSR -- Cumulus/Chauffe-Eau
Source données serveur Enphase.

Répondre

Bonjour a tous,

Je suis passé en 17.27 hier en fin d'après midi.

Tout a l'air de fonctionner après quasiment 1 jour de fonctionnement.
J'ai encore en Ram libre minimum 3700 octets

Mais j'ai pas mal d'erreur de type :
08/07/2026 16:35:26 : JSON Loading failed
08/07/2026 16:37:00 : Envoy JSON Reading 3 failed, status= TIMEOUT, partialLen=430
08/07/2026 16:37:00 : JSON Loading failed
08/07/2026 16:38:04 : Envoy JSON Reading 3 failed, status= TIMEOUT, partialLen=432
08/07/2026 16:38:04 : JSON Loading failed
08/07/2026 16:38:54 : Envoy error while reading HTTP response status, status= TIMEOUT, partialLen=0
08/07/2026 16:39:56 : Envoy JSON Reading 3 failed, status= TIMEOUT, partialLen=434
08/07/2026 16:39:56 : JSON Loading failed
08/07/2026 16:41:02 : Envoy JSON Reading 3 failed, status= TIMEOUT, partialLen=424
08/07/2026 16:41:02 : JSON Loading failed

Je précise également que j'ai l'appli sur mon téléphone (pas ouverte de la journée) et que j'ai également le plugin enphase dans mon HA (qui lui doit communiquer toutes les 15 ou 20 secondes de mémoire)

Un grand merci a tous pour vos recherches/développements de ce magnifique projet.
Aéro

V17.27 avec SSR sur CE 200L/3Kw - Mesure passerelle Emphase + 15x 400W sur IQ7A
Répondre

(08-07-2026, 04:45 PM)aero a écrit : Bonjour a tous,

Je suis passé en 17.27 hier en fin d'après midi.

Tout a l'air de fonctionner après quasiment 1 jour de fonctionnement.
J'ai encore en Ram libre minimum 3700 octets

Mais j'ai pas mal d'erreur de type :
08/07/2026 16:35:26 : JSON Loading failed
08/07/2026 16:37:00 : Envoy JSON Reading 3 failed, status= TIMEOUT, partialLen=430
08/07/2026 16:37:00 : JSON Loading failed
08/07/2026 16:38:04 : Envoy JSON Reading 3 failed, status= TIMEOUT, partialLen=432
08/07/2026 16:38:04 : JSON Loading failed
08/07/2026 16:38:54 : Envoy error while reading HTTP response status, status= TIMEOUT, partialLen=0
08/07/2026 16:39:56 : Envoy JSON Reading 3 failed, status= TIMEOUT, partialLen=434
08/07/2026 16:39:56 : JSON Loading failed
08/07/2026 16:41:02 : Envoy JSON Reading 3 failed, status= TIMEOUT, partialLen=424
08/07/2026 16:41:02 : JSON Loading failed

Je précise également que j'ai l'appli sur mon téléphone (pas ouverte de la journée) et que j'ai également le plugin enphase dans mon HA (qui lui doit communiquer toutes les 15 ou 20 secondes de mémoire)

Un grand merci a tous pour vos recherches/développements de ce magnifique projet.
Salut,

Merci pour le retour.

De mon côté j'utilise HA mais j'ai fait en sorte que HA récupère les infos de consommation directement sur le Routeur solaire. Pourquoi ? Ca evite d'avoir 2 applications qui interrogent la passerelle Enphase pour au final avoir les même infos. Si 2 appareils intérrogent en même temps je pense que cela ralenti et perturbe la lecture du routeur solaire qui n'arrive pas tout le temps à ouvrir une connexion avec l'Enphase.
Je serais toi, je récupèrerais tout sur le routeur solaire et je désactiverais la lecture de l'Enphase directement depuis HA.

Tout dépends de ce que tu veux faire .....

Avec le dernier source "Source_EnphaseEnvoy.ino" j'ai nettement moins de non connexion voire aucunes. Le seul message que j'ai de temps en temps mais plus rare qu'avant c'est que pendant une lecture des données JSON, la connexion est perdue car la passerelle coupe la connexion, je ne sais pourquoi .....

Je pense aussi que le temps de lecture des données Enphase, dépend beaucoup de la qualité de la connexion entre le routeur et la passerelle Enphase. Moi je suis en Wifi avec -57Dbm à -60Dbm de signal Wifi sur l'ESP32.
Ensuite je suis certain que le problème d'affichage des pages Web dépend de la quantité de mémoire restante disponible ..... mais je ne sais encore pourquoi.
Une autre solution consiste à optimiser fortement le code pour qu'il consomme moins de mémoire RAM en fonction des fonctions activées et non pas même si non utilisées ou activées.
Je vais travailler sur cet aspect un peu pour voir ce qu'il est facile de gagner et si je trouve des choses à mettre en place je partagerai à André pour qu'il voit ce que ça donne et pour que des personnes puissent aussi tester. Quand j'aurais quelque chose je partagerai ;-).

A+

David
Répondre



Atteindre :


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

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