Bonjour,
Ok le résultat est fonctionnel (encore quelques ratées chez certain), bravo à ceux qui ont bossé de près (ou de loin) sur le sujet
**********
dans la nouvelle version Enphase 17.22 :
Une première passe pour le bonne cohérence et améliorer la fluidité lors de future révision de code :
Il n'y a plus de traitement pour Firmware V5 => si quelqu'un tourne encore en V5 qu'il se manifeste !
Code :
//***********************************
//* Source EnPhase Envoy V5 ou V7 *
//***********************************
-----------------
Les commentaires qui viennent du code que j'avais publier mais qui n'ont pas été considérer sont a supprimer :
Code :
// exploite la puissance de ArduinoJson :
et
// ============================================================
// CORRECTION 1 : Initialisation explicite du filtre Envoy V7
// ============================================================
n'ont
pas de sens puisque qu'il n'y a pas une seule ligne qui utilise ArduinoJSON et ses filtres associés
----------------
Code :
// établi ou rétabli la connexion qu'on garde ouverte entre les appels
n'a
pas de sens puisque "client" est détruit et recréer a chaque appel avec la ligne "NetworkClientSecure client;"
----------------------------
Code :
TelnetPrintln("Envoy refused request");
StockMessage("Envoy refused request");
La ligne
TelnetPrintln est inutile ici, l'appel de StockMessage fait déja le job (suite a l'appel de PrintScrool)
-----------------------------
Sans utilisation de ArduinoJson (mais usage des les fonctions de parsing inclus à la fin du module), pas d'intérêt de lire les 8 sections
(nGlobalIndex < 8),
(nGlobalIndex < 2) suffit
pour ne traiter que la [0] et la [1] avec
if (nGlobalIndex == 0) {
et
} else if (nGlobalIndex == 1) {
Ok le bouclage s'arrête avec la variable bJsonLoadingFinished
--------------
Code :
// Saute L'entete d'ouverture de la trame JSON.
jsonPayload = client.readStringUntil('[');
Le commentaire n'est pas bon, c'est "saute du retour code http (attendu 200) au premier crochet ouvrant" ...
c'est un piège, si l'entête contient un crochet ouvrant (un cookie ou autre info retournés dans la section header), ça décale toute la logique, il faudrait finir de lire l'entête et seulement après, chercher le crochet ouvrant dans le corps du message (qui devrait être le 1er octet...)
il faut passer la séquence \r\n\r\n pour arriver au début du body [a traiter]
---------------
=> Reste a confirmer que la situation monophasé et
toujours sur la phase L1 sinon c'est échec d'obtention des données correct
-----------------
dans le passage
Code :
if (!bMonoPhase) {
PactProd = ValJson("activePower", jsonPayload);
Tension_M = ValJson("voltage", jsonPayload);
Intensite_M = ValJson("current", jsonPayload);
}
c'est quasiment sur qu'on va lire le tension cumulé des 3 phases (soit ~700V) et pareil c'est le cumul des intensité par phase, pas grave ces infos ne sont pas utile (mais elles s'affiche sur le page données brutes)
la fonction ValJson utilisée et telle que définit mérite quelques corrections (ne semble pas impacté le fonctionnement sur les trames obtenu par passerelle) :
Le nom rechercher pourrait être la fin d'une autre variable car on ne cherche pas nom encadré entre guillemet
elle impose une virgule dans la suite du Json
Ouf : Avec la trame de la passerelle, on n'a jamais de nom qui se termine pareil (exemple de bug on demande la valeur de "toto" et il y a une variable "xyztoto" placé avant, c'est planté) et on ne va jamais récupérer la dernière variable avant l'accolade final
-----------------------
une version plus sécure (
conforme composition d'une trame JSON base json.org) pour extraire les infos incluant le dernier item d'une chaine JSON
Code :
// recherche nom encadré par double quote, avance jusqu'au double dot, puis optionnellement une double quote qui encadrerai la data
// retourne le float dispo a cet endroit (ou 0.0f si la chaine ne représente pas un début de nombre)
float ValJson(const String &nom,, String Json) { // évite une duplication de chaine
int p = Json.indexOf("\"" + nom + "\""); // le nom encadré avant et après évite d'extraire une correspondance en fin de nom
if (p == -1) return 0.0f; // pas trouvé le nom recherché, retourne 0.0f
Json = Json.substring(p); // commence la chaine juste après le guillemet fermant
p = Json.indexOf(":"); // avance au :
if (p == -1) return 0.0f; // si pas de ":" on retourne 0.0f
Json = Json.substring(p + 1); avance après le ":"
Json.trim(); // supprime l'éventuel espace qui suivrait le ":"
if (Json.charAt(0) == '\"') Json = Json.substring(1); // supprime l'éventuel 1er double quote qui encadre la donnée
return Json.toFloat(); // lit et retourne le float (ou 0.0f si les premiers caracteres ne représente pas un numérique), la lecture du float s'arrêtera sur tout caractères autre qui +-[0..9]E
}