(19-06-2026, 04:08 PM)ROPA 59 a écrit : Pour aider ..
ne faudrait il pas limiter / ralentir les demandes de l'ESP32 sur l'Enphase ?
Comparativement au monitor de l'application d'Enphase qui doit être +- 3 minutes entre chaque information ( vraiment trop longue
a+
Bonsoir,
Pour info sur l'application Enphase le monitoring est par défaut à 15 min, je sais qu'il peuvent le baisser sur demande, il faudra que je leur demande lundi pour voir. Pour info toujours en 5167.
String statusLine = client.readStringUntil('\n');
statusLine.trim();
TelnetPrintln("HTTP: " + statusLine);
if (statusLine.indexOf("200") < 0)
{
TelnetPrintln("Envoy refused request");
client.stop();
return;
}
// On passe toutes les lignes de header restantes jusqu'à tomber sur la ligne vide (\r)
while (client.connected())
{
String line = client.readStringUntil('\n');
if (line == "\r" || line == "")
{
break; // Fin des headers atteinte, le JSON commence juste après
}
}
// On attend un poil que les paquets TLS arrivent
uint32_t startCheck = millis();
while (client.available() == 0 && (millis() - startCheck) < 2000)
{
delay(10);
}
String jsonPayload = "";
while (client.available() > 0 || client.connected())
{
if (client.available() > 0)
{
jsonPayload += (char)client.read();
}
else
{
delay(1); // Laisse respirer le stack TLS de l'ESP32
}
}
client.stop(); // Fermeture propre immédiate du socket
Le endpoint /ivp/meters/reports/consumption ne fonctionne plus suite à la dernière mise a jour, ce qui fait planter le routeur.
On peut utiliser à la place le endpoint/ivp/meters/reports qui fonctionne toujours
Petite optimisation à faire : un nouveau token est généré à chaque allumage de l'esp32 alors qu'il suffirait de le stocker et de vérifier sa validité avant de l'utiliser. Pour info un token est valable 1 an.
String statusLine = client.readStringUntil('\n');
statusLine.trim();
TelnetPrintln("HTTP: " + statusLine);
if (statusLine.indexOf("200") < 0)
{
TelnetPrintln("Envoy refused request");
client.stop();
return;
}
// On passe toutes les lignes de header restantes jusqu'à tomber sur la ligne vide (\r)
while (client.connected())
{
String line = client.readStringUntil('\n');
if (line == "\r" || line == "")
{
break; // Fin des headers atteinte, le JSON commence juste après
}
}
// On attend un poil que les paquets TLS arrivent
uint32_t startCheck = millis();
while (client.available() == 0 && (millis() - startCheck) < 2000)
{
delay(10);
}
String jsonPayload = "";
while (client.available() > 0 || client.connected())
{
if (client.available() > 0)
{
jsonPayload += (char)client.read();
}
else
{
delay(1); // Laisse respirer le stack TLS de l'ESP32
}
}
client.stop(); // Fermeture propre immédiate du socket
Je n'ai pas encore testé ton code, mais peux tu préciser de quel "script posté" tu parles ? Script d'origine, un autre...
De plus, pour la lisibilité ne pas hésiter à utiliser les balises "code" pour poster tes sources (comme je viens de le faire au dessus)
some time later
Je viens de tester ton code, et pour moi cela à l'air de fonctionner.
La puissance produite est ok (100 w à cette heure çi )
Je laisse un peu tourner, pour comparer les valeurs avec mes autres outils, mais cela semble cohérent.
Pour rappel, Je suis en v8.3.5528 sur la passerelle et je suis parti de la RMS v17.21
-------------------------------------------------------------- ESP32 (v117,20 et IP fixe) + sonde température + SSR -- Cumulus/Chauffe-Eau
Source données serveur Enphase 7.
Je suis parti du code de Michy en page 15 avec le fichier attaché
Comme constaté par Michy, le fait d'appeler l'ancien endpoint /ivp/meters/reports/consumption fait bien planter la passerelle, il faut attendre un certain temps pour qu'elle revienne fonctionnelle
Sans doute la derniere mise a jour qui est buggé
En attendant une correction d'enphase, on peut utiliser/ivp/meters/readings
Comme remonté dans le fil de discussion, le token est valable 1 an, donc il serait bon de sauver le token et le timestamp de peremption dans le file system afin de ne pas en demander de nouveaux (lors d'une perte de connection Wifi, reboot, ..).
Je regarderai comment mettre cette optim en place
J'attend vos retours suite à ma proposition de correction
La puissance réseau public (Pw) à l'air ok
Puissance produite : OK
Y'a que puissance consommée qui me parait étrange. Elle semble correspondre aux 2 précédentes sommées sans tenir compte du signe ?
-------------------------------------------------------------- ESP32 (v117,20 et IP fixe) + sonde température + SSR -- Cumulus/Chauffe-Eau
Source données serveur Enphase 7.
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)
20-06-2026, 10:14 AM (Modification du message : 20-06-2026, 10:16 AM par lbourdel@yahoo.fr.)
(20-06-2026, 07:52 AM)Alain_C38 a écrit : La puissance réseau public (Pw) à l'air ok
Puissance produite : OK
Y'a que puissance consommée qui me parait étrange. Elle semble correspondre aux 2 précédentes sommées sans tenir compte du signe ?
J'ai mis a jour ma fonction, effectivement la Pconsommé etait mal calcullé
J'ai modifier la facon de stocker le Json car il fait 18k, avant on arrivait pas a recuperer les index energie.
Peut etre quelque ajustement a apporter car l'energie calculé est a partir du boot, peut etre veut on garder depuis la mise en service de la passerelle?
20-06-2026, 10:44 AM (Modification du message : 20-06-2026, 11:07 AM par Alain_C38.)
(20-06-2026, 10:14 AM)lbourdel@yahoo.fr a écrit :
(20-06-2026, 07:52 AM)Alain_C38 a écrit : La puissance réseau public (Pw) à l'air ok
Puissance produite : OK
Y'a que puissance consommée qui me parait étrange. Elle semble correspondre aux 2 précédentes sommées sans tenir compte du signe ?
J'ai mis a jour ma fonction, effectivement la Pconsommé etait mal calcullé
J'ai modifier la facon de stocker le Json car il fait 18k, avant on arrivait pas a recuperer les index energie.
Peut etre quelque ajustement a apporter car l'energie calculé est a partir du boot, peut etre veut on garder depuis la mise en service de la passerelle?
Fichier updaté en attaché
PS: fonction pour firmware V7 en monophasé ONLY
Laurent
Bonjour Laurent,
Je ne comprends pas.
Le version que tu viens de proposer ressemble à ceci :
// ============================================================
// CORRECTION 1 : Initialisation explicite du filtre Envoy V7
// ============================================================
StaticJsonDocument<2048> filter;
// En configurant l'index [0], ArduinoJson v6 va appliquer
// ce masque à TOUS les objets du tableau principal.
filter[0]["activePower"] = true;
filter[0]["apparentPower"] = true;
filter[0]["voltage"] = true;
filter[0]["current"] = true;
filter[0]["freq"] = true;
filter[0]["actEnergyDlvd"] = true; // Sera extrait partout où il existe !
filter[0]["actEnergyRcvd"] = true; // Sera extrait partout où il existe !
DynamicJsonDocument doc(13000); // 13000 octets pour le JSON complet (V7) avec les index énergétiques
DeserializationError error = DeserializationError::EmptyInput;
// On passe toutes les lignes de header restantes jusqu'à tomber sur la ligne vide (\r)
while (client.connected())
{
String line = client.readStringUntil('\n');
if (line == "\r" || line == "")
{
break; // Fin des headers atteinte, le JSON commence juste après
}
}
// On attend un poil que les paquets TLS arrivent
uint32_t startCheck = millis();
while (client.available() == 0 && (millis() - startCheck) < 2000)
{
delay(10);
}
String jsonPayload = "";
while (client.available() > 0 || client.connected())
{
if (client.available() > 0)
{
jsonPayload += (char)client.read();
}
else
{
delay(1); // Laisse respirer le stack TLS de l'ESP32
}
}
client.stop(); // Fermeture propre immédiate du socket
if (error)
{
TelnetPrintln("JSON ERR: " + String(error.c_str()));
return;
}
TelnetPrintln("JSON OK");
}
// --- LOGIQUE DE TRAITEMENT ET DISPATCH DES DONNÉES ---
float PactReseau = 0.0f;
float PvaReseau = 0.0f;
long whDlvdCum = 0L;
long whRcvdCum = 0L; // <--- AJOUT CRITIQUE POUR LE FIRMWARE V7
// Calcul VA (Puissance apparente)
// TRÈS IMPORTANT : Sur l'Envoy V7, apparentPower est TOUJOURS positif dans le JSON !
PvaReseau = PfloatMax(PvaReseau);
if (PactReseau < 0.0f)
{ // On se base sur le signe de la puissance active
PVAS_M_inst = 0;
PVAI_M_inst = (int)(PvaReseau);
}
else
{
PVAI_M_inst = 0;
PVAS_M_inst = (int)(PvaReseau);
}
Pva_valide = true;
filtre_puissance();
String statusLine = client.readStringUntil('\n');
statusLine.trim();
TelnetPrintln("HTTP: " + statusLine);
if (statusLine.indexOf("200") < 0)
{
TelnetPrintln("Envoy refused request");
client.stop();
return;
}
// On passe toutes les lignes de header restantes jusqu'à tomber sur la ligne vide (\r)
while (client.connected())
{
String line = client.readStringUntil('\n');
if (line == "\r" || line == "")
{
break; // Fin des headers atteinte, le JSON commence juste après
}
}
// On attend un poil que les paquets TLS arrivent
uint32_t startCheck = millis();
while (client.available() == 0 && (millis() - startCheck) < 2000)
{
delay(10);
}
String jsonPayload = "";
while (client.available() > 0 || client.connected())
{
if (client.available() > 0)
{
jsonPayload += (char)client.read();
}
else
{
delay(1); // Laisse respirer le stack TLS de l'ESP32
}
}
client.stop(); // Fermeture propre immédiate du socket