Aller au contenu

Quick App - Enphase Envoy


Lazer

Messages recommandés

Le 03/08/2023 à 08:51, stipower a dit :

Merci, c'est super.

Je vais regarder cela et poster mon code au cas ou ca intéresse quelqu'un sur HD2.

Même si ca sera beaucoup moins pro que toi ...

Bonjour,

Voici mon code pour une scène HD2 :

 

Citation

 

--[[
%% autostart
%% properties
%% events
%% globals
--]]

-- date du Token = aout 2023
local Token = 'eyJraWQiOiCXXXXX...'

local Bearer = 'Bearer ' .. Token
local URL = "https://192.168....."
local API = "/ivp/meters/readings"

local http = net.HTTPClient()

function RequestHTTP()

    http:request(URL .. API, {
        options = {
            checkCertificate = false,
            method = 'GET',
            headers = {
                ['Accept'] = 'application/json',
                ['Content-Type'] = 'application/json',
                ['Authorization'] = Bearer },
            timeout = 10000
            },
        success = function(response)
            local result = response.data;

            if response.status == 200 or response.status == 201 then
            -- réponse OK
                fibaro:setGlobal("TableEnvoy", response.data)
                --fibaro:debug(response.data) 
                TableEnvoy = json.decode(response.data)
                fibaro:debug("activePower =" .. TableEnvoy[2].activePower)
            else
            -- réponse Pas OK
                fibaro:debug('response code : ' .. response.status)
                fibaro:debug("TableEnvoy -> False")    
                fibaro:setGlobal("TableEnvoy", "False")
                --fibaro:debug(response.data)            
            end
        end,
        
        -- Erreur sur la fonction
        error = function(err)
            fibaro:debug('function(err) : ' .. err)
            fibaro:debug("TableEnvoy -> False")    
            fibaro:setGlobal("TableEnvoy", "False")
        end
    })
    
    setTimeout(RequestHTTP,1*1000) -- boucle toute les secondes
    
end

setTimeout(RequestHTTP,0) --lance la function

 

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Hello, je reviens sur mes erreurs liant une saturation de la passerelle.

Étant privé de connexion internet depuis 1 semaine, j'ai pu en profiter pour debugguer.

  • Première chose, je confirme que la vérification du token, se fait bien en local, d'ailleurs, on peut mettre un vieux Token, du moment que la date encodé en unixbase n'est pas dépassé, c'est fonctionnel.
  • La seconde, J'ai enfin trouvé le point bloquant qui "spammait" ma passerelle de requetes, j'ai rajouté un check dans le code qui permet de de vérifier qu'on est bien en présence d'un refresh, sinon on sort avec un callback. Ca semble fonctionner correctement :).
  • La dernière chose que j'ai pu noter, est dès qu'on essaie d'aller sur la passerelle via un navigateur en même temps que la QA tourne, on tombe face à une erreur d'accès côté QA. Ceci confirme qu'une limitation du nombre de "connexions" simultanées est présente. A ce sujet, je vois également passer quelques erreurs non liée à une double connexion coté user/qa, peut-être qu'elles sont liées à l'exportation des data via enlighten... et que durant ce même laps de temps, la QA n'a pas accès à l'api...? je ne sais pas. c'est peu fréquent et pas bloquant.

 

J'avance sur mon fork et je viens de voir aujourd'hui que plusieurs MO arrêtent de produire par moment, certes, c'était un journée très très nuageuse et la prod n'était que de quelques W par panneaux, mais je trouve ceci intriguant.

-> Ceci me conforte dans le choix d'aller vérifier qui produit toutes les 5 min du levé du soleil +1h au couché du soleil -1h.

 

En revanche, je bloque toujours pour aller chercher les infos de la page : https://<ip gateway>/api/v1/production/inverters

Impossible de récupérer les datas, je suis toujours bloqué avec une erreur de certificat...(Est-ce lié au fait que je n'ai pas internet, et que la vérification n'est pas possible..., je ne pense pas...)

Je m'y prends surement très mal, je suis une vrai quiche en requêtes HTTP et autres...

Voici mon code (pour le moment dans uns scène, je le transférerai en QA une fois fonctionnel)

 

 

  print("GET INVERTERS (MicroInverters details)")


-- date du Token = aout 2023
local Token = 'eyJraWQiOiI3ZDEwMDA1ZC03ODk5LTRkMGQtYmNiNC0yNDRmOThlZTE1NmIiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiIxMjIxMzEwMjE4MzMiLCJpc3MiOiJFbnRyZXoiLCJlbnBoYXNlVXNlciI6Im93bmVyIiwiZXhwIjoxNzI2NDIxMTA2LCJpYXQiOjE2OTQ4ODUxMDYsImp0aSI6Ijg4MDRlNWU0LWNjZTItNGFiZC04N2EwLTI2YmQ3NTQ5NGY4ZiIsInVzZXJuYW1lIjoicmVtaS5tYWdhbmRAZ21haWwuY29tIn0.jiaR5_XA0Hew7TkmBZ_Kc-22zW4hTeQj6hd6VPpXc0xZq0PIyoBVdXD_4SIKTzz-IU94916J-54sU3GWT7U09g'


    
local Bearer = 'Bearer ' .. Token
local URL = "https://192.168.1.89"
local API = "/api/v1/production/inverters"

local http = net.HTTPClient()


function RequestHTTP()

    print("START")

    http:request(URL .. API,
    {
      options = {        
        method = 'GET',
        checkCertificate = 'false' ,
            headers = {
                
                ['Accept'] = 'application/json',
                ['Content-Type'] = 'application/json',
                ['Authorization'] = Bearer },
            timeout = 10000
            },
        success = function(response)

            local result = response.data;

            if response.status == 200 or response.status == 201 then
            -- réponse OK
                print("OK")
                fibaro:setGlobal("TableEnvoy", response.data)
                hub.debug(response.data) 
                TableEnvoy = json.decode(response.data)
                hub.debug("activePower =" .. TableEnvoy[2].activePower)
            else
            -- réponse Pas OK
                print("KO : ".. response.status)
                hub.debug('response code : ' .. response.status)
                hub.debug("TableEnvoy -> False")    
                setGlobal("TableEnvoy", "False")
                hub.debug(response.data)         
                   
            end
        end,
        
        -- Erreur sur la fonction
        error = function(err)
            print("ER :".. err)
            hub.debug("TableEnvoy -> False")    
            --setGlobal("TableEnvoy", "False")
        end
    })
    
    --fibaro.setTimeout(1*1000,RequestHTTP) -- boucle toute les secondes
    
end

fibaro.setTimeout(0,RequestHTTP)


    print("END GET INVERTERS (MicroInverters details)")

 

 

 

et la sortie qui va bien jusqu'au bout, mais présente l'erreur de certificat:

image.png.ace429c6564b66247b4314112fc8b603.png

 

Merci pour votre aide. (Merci @stipower pour ton code HC2 ;))

Rémi

 

Modifié par TitiXsi
Lien vers le commentaire
Partager sur d’autres sites

Tu peux utiliser les balises de code, ce n'est pas très lisible sans cela :

image.png.23f5c35c98d6821c0f24d8e2faa0852d.png

Essaye sans les guillemets, ça ira mieux, il faut un booléen, pas une string :

checkCertificate = false

 

 

Il y a 2 heures, TitiXsi a dit :

on peut mettre un vieux Token, du moment que la date encodé en unixbase n'est pas dépassé, c'est fonctionnel

ça c'est très fort :lol:

 

Il y a 2 heures, TitiXsi a dit :

plusieurs MO arrêtent de produire par moment, certes, c'était un journée très très nuageuse et la prod n'était que de quelques W par panneaux, mais je trouve ceci intriguant

Tu as quels modèles de MO et quels panneaux ?

C'est peut être normal, tu sais qu'il y a une tension minimale pour que les MO fonctionnent.

C'est un des avantages des IQ7+ sur les IQ7A d'ailleurs, ils sont limités en puissance, mais produisent plus tôt/tard, donc c'est aussi valable en cas de temps très couvert quand la prod s'approche de 0W.

Lien vers le commentaire
Partager sur d’autres sites

Il y a 13 heures, Lazer a dit :

Tu peux utiliser les balises de code, ce n'est pas très lisible sans cela :

image.png.23f5c35c98d6821c0f24d8e2faa0852d.png

J'ai pas compris, dès que je sélectionne Code et désigne un langage, j'au un truc tout pourri ...

image.png.398f0f4a7f1dde18e24b3a5b8f262e46.png

 

 

Il y a 13 heures, Lazer a dit :

checkCertificate = false

 

 

Same issue

 

Il y a 13 heures, Lazer a dit :

Tu as quels modèles de MO et quels panneaux ?


C'est peut être normal, tu sais qu'il y a une tension minimale pour que les MO fonctionnent.

C'est un des avantages des IQ7+ sur les IQ7A d'ailleurs, ils sont limités en puissance, mais produisent plus tôt/tard, donc c'est aussi valable en cas de temps très couvert quand la prod s'approche de 0W.

20 Sonnenstrom Fabrik M60 + 3 Bisol Bifacial, le tout en Iq7+

Je viens de remarqué que j'ai eu plusieurs micro coupures de courant (mes fils pilote Qubino on resetés...) c'est au même moment que j'ai perdu progressivement la prod pui qui est revenus. Je suspecte quelques baisses de tension ...

 

Sinon, cette nuit, erreur de getProduction de 23h à 9h15 et depuis tout va bien ... il se passe des choses étranges avec cette passerelle ...

Lien vers le commentaire
Partager sur d’autres sites

Je ne connais pas ces panneaux en particulier, mais si tu as des coupures de courant / chute de tension, alors c'est normal que les MO arrêtent de produire, c'est dans la norme pour des raisons de sécurité.

A noter que même sans coupure de courant secteur, tu peux aussi avoir une coupure des MO si la tension à leur borne dépasse 253V, ce qui peut arriver si le câble trop long / de trop faible section provoque une chute de tension importante.

 

23h c'est l'heure à laquelle mon Envoy est indisponible, mais ça ne dure que quelques minutes chez moi.

Lien vers le commentaire
Partager sur d’autres sites

il y a une heure, Lazer a dit :

Je ne connais pas ces panneaux en particulier, mais si tu as des coupures de courant / chute de tension, alors c'est normal que les MO arrêtent de produire, c'est dans la norme pour des raisons de sécurité.

A noter que même sans coupure de courant secteur, tu peux aussi avoir une coupure des MO si la tension à leur borne dépasse 253V, ce qui peut arriver si le câble trop long / de trop faible section provoque une chute de tension importante.

On est bien d'accord, que lorsqu'il produit moins que la tension de démarrage des mo, ca coupe, c'était juste une remarque qui montre que j'ai un réseau de montagne, c'est pas tout lisse ...

Sinon J'ai 3Qrelay et donc 3*30m de câble en 2.5

il y a une heure, Lazer a dit :

23h c'est l'heure à laquelle mon Envoy est indisponible, mais ça ne dure que quelques minutes chez moi.

Pour le coup, ca c'est peut-être du à ma non connexion à internet. La passerelle essaie de transmettre ses infos (peut-être plus que l'envoi toutes les 15min) et un timeout de plusieurs heures en présent. On verra quand internet reviendra ...

 

as tu pu essayer mon code ? :)

Merci

 

Lien vers le commentaire
Partager sur d’autres sites

30m en 2.5mm² derrière un disjoncteur de 20A, ça fait 11V de chute de tension, soit 4.80%, ça fait beaucoup je trouve.

https://schema-electrique.net/calcul-chute-de-tension-electrique-formule-calcul-section-cable-triphase-monophase.html

Après ça dépend aussi de la puissance sur chaque circuit (donc du nombre de MO), c'est peut être moins que ça, j'ai pris le pire cas de figure.

Bon c'est pas le sujet mais quand même un peu important.
 

Il est probable en effet que la passerelle Envoy essaye de se connecter au cloud Enphase. Non pas pour envoyer des infos (ce qu'elle fait tout au long de la journée tant que les MO produisent), mais peut être pour chercher ne dernière version de firmware ou autre truc dans le même genre... donc si elle n'arrive pas à se reconnecter au serveur, peut être qu'elle reste bloquée.
Si c'est ça c'est quand même bien merdique comme fonctionnement... m'enfin si elle produit dès le matin, à la limite c'est sans impact réel.

 

Non pas essayé ton code, mon QA me convient :)

 

Lien vers le commentaire
Partager sur d’autres sites

Il y a 1 heure, Lazer a dit :

Non pas essayé ton code, mon QA me convient :)

 

Ce n'était pas sans ce sens là. :2:Mais c'est pas un problème.

 

Je viens de découvrir qu'il y avait 3 codes dans ton QA. du coup, ça change la donne, j'ai les infos qu'il me faut... je pensai depuis le début que les fonctions enphase:... était liée un l'API directement et j'essayais de trouver en vain des infos dessus..  la buse... enfin..  j'apprends :yes:

Lien vers le commentaire
Partager sur d’autres sites

Ah désolé j'avais pas compris ça comme ça :lol:

 

Oui effectivement mes QA sont découpés en plusieurs "fichiers", ce qui permet de structurer le code un peu plus proprement... enfin j'essaye :D

La finalité, c'est de faciliter la réutilisation de bouts de codes entiers, sous forme de fichier, et qui s'apparente à des librairies comme il est de coutume en programmation.

Les premiers développements sont plus long, mais le temps gagné par la suite est considérable : création des nouveaux QA, mise à jour d'une partie d'un QA, et ça m'a même aidé dans ma migration HC2=>HC3.

Lien vers le commentaire
Partager sur d’autres sites

Il y a 2 heures, Lazer a dit :

Tiens, comme tous les soirs à 23h, sauf que cette fois-ci j'étais devant le PC quand j'ai reçu la notification, donc j'ai fait une capture d'écran du log.

La passerelle est indisponible pendant moins de 2 minutes.

 

image.thumb.png.ab5ccf155bdd367d0822649aa27910f5.png

La bonne nouvelle est que les commandes garde le tempo de 10sd. Chez moi ça vrillait plusieurs fois par sd..

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Hello, quelques news avec 4 bonnes nouvelles de mon côté :

  1. Le passage à la fibre à permis de gagner un peu de latence sur le l'interrogation de la passerelle en Wifi
    --> problème de saturation de la passerelle au bout d'une journée, au lieu de quelques heures (avec un Timing refresh de 60sd)

     
  2. J'ai enfin compris l'origine du problème de saturation de ma passerelle.
    --> Je pensais à Tord que le Timeout était "intelligent" et qu'il n’enverrai la requête suivante que lorsque la précédente était terminée (asynchronisme et callback)... Erreur, si la requête précédente à pris du retard, les 2 requêtes s’emplafonnent et la passerelle perd les pédales...
    --> J'ai donc j'ajouté un simple compteur qui est incrémenté à l'exécution d'une requête et décrémenté quand celle-ci revient "SUCCESS" ou "ERROR". Ensuite un petit check qui permet vérifier qu'aucune requête n'est en cours, si tout est Ok, on peut soumettre la nouvelle requête. C'est simple et au moins si la passerelle a du retard, la requête suivante ne partira pas, tout fonctionne pour le moment avec toujours des retards... Fichu Wifi ... (avec un Timing refresh de 30sd)
     
  3. Je viens de câbler en RJ45 ma passerelle et clairement c'est plus rapide, le ping répond en 2ms contre un temps variable de 40ms à 1.7s en Wifi.
    --> Je pense que là je n'aurais plus ou encore mois d'erreur.
     
  4. J'ai normalement terminée ma QA, elle est en test pendant 1 semaine histoire de fixer les dernières broutilles non anticipées... et je ferai un fil dédié ;)
    image.thumb.png.764e17e0f7478c9fae77baf3e61f829b.png

Encore Merci pour votre indulgence sur mes nombreuses interrogations parfois bêtes...
6mois que j'ai une box domotique, on ne peut pas tout savoir dès la première semaine... Surtout si on mets les pattes dedans franchement avec des QA :)

 


 

Modifié par TitiXsi
  • Like 2
Lien vers le commentaire
Partager sur d’autres sites

Et voilà... je le voyais venir. Fin d'api au 30.09... @Lazer ça fonctionne toujours chez toi ? J'ai l'impression que le production.json n'est plus accessible depuis cette nuit...

Bon en fait, j'ai rien dit, c'est toujours accessible, mais il faut valider un certificat pour accéder à la passerelle... Enphase et ses entourloupes ...

Modifié par TitiXsi
Lien vers le commentaire
Partager sur d’autres sites

il y a 46 minutes, Lazer a dit :

Oui chez moi le QuickApp fonctionne toujours.
 

Peut-être que ma qa est trop gourmande et plante par moment... j'avais lu un truc (peut-être gea) et sa capacité à détecter une sa ou un scénario dans les choux pour le redémarrer... je vais regarder .. mais étrange d'avoir un certificat à valider désormais sur la passerelle...

Lien vers le commentaire
Partager sur d’autres sites

Salut @Lazer, j'ai une question pour toi J'ai vu dans le code qu'il était possible de mettre plusieurs seuils de déclenchement par Variable si on sépare les valeurs par une virgule :
ProdThresUp : 1800,2000

 

Confirmes tu que c'est supporté et que la syntaxe est correcte ?
Je rencontre un plantage lors que l'accès à getEvents si mon seuil dispose de plus d'une valeur.

 

Merci ;)

 

 

Ps : J'apprends à utiliser les Events et c'est carrément Top ! Merci :)

Lien vers le commentaire
Partager sur d’autres sites

Effectivement, on peut mettre plusieurs valeurs numériques pour la variable ProdThresUp, séparées par des virgules.

Et normalement ça fonctionne, et ta syntaxe est correcte... en tout cas la dernière fois que j'ai essayé, car actuellement en production, je n'exploite plus cette possibilité (j'ai une seule valeur)

Lien vers le commentaire
Partager sur d’autres sites

il y a 5 minutes, Lazer a dit :

Effectivement, on peut mettre plusieurs valeurs numériques pour la variable ProdThresUp, séparées par des virgules.

Et normalement ça fonctionne, et ta syntaxe est correcte... en tout cas la dernière fois que j'ai essayé, car actuellement en production, je n'exploite plus cette possibilité (j'ai une seule valeur)

Merci, je vais me pencher sur le sujet ;)

 

Lien vers le commentaire
Partager sur d’autres sites

Hello, quelques news sur ce sujet ...
Problème isolé, compris, fixé, c'est vraiment un cas tordu... si la valeur renvoyé est Pile poil un entier (sans virgule). Bon ok, ca doit arriver 1 fois sur 1 000 000 000 ... le %d n'est pas content seulement si il y a plus d'un seuil de définit...
Surement que le split transforme la variable de float à integer dans ce cas là ...
C'est étrange, je pensait que le %d transformait un integer en Float dans le pire des cas...

 

C'est fixé dans le getEvents ;-)

Lien vers le commentaire
Partager sur d’autres sites

Je viens seulement de remarquer que le 16 septembre, j'ai encore eu le compteur d'énergie cumulée des IQ7+ qui s'est réinitialisé à 0.
C'est la seconde fois que ça le fait, la dernière fois je crois que c'était au moment de la mise à jour du firmware D7 en juillet 2023.

 

Je n'ai pas noté le firmware que j'avais eu à cette époque.... mais là je suis en D7.6.175, du coup je ne sais pas dire si Enphase a forcé une nouvelle mise à jour ou non...

 

Bref, plus que jamais il ne fait pas fair trop confiance aux infos remontées par les IQ7.
Restons sur les mesures de l'Envoy (via les pinces)

Lien vers le commentaire
Partager sur d’autres sites

  • 4 mois après...

Bonjour,

 

Je cherche à automatiser la génération de token Envoy pour ma HC2 .

 

Je bloque sur la 1ère étape qui consiste à s'authentifier sur https://enlighten.enphaseenergy.com/login/login.json? et récupérer le session_id.

 

Je récupère un string de 50017 caractères alors que je devait récupérer un json du type : 

 

Citation

{"message":"success","session_id":"3aab3ebdff231af701f32a3ebdfd1f75","manager_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQeyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQeyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQeyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQeyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c","is_consumer":false,"system_id":1234567}%

 

On dirait que je reçois tout le site en html avec la page d'auth et tout.

 

Merci pour votre aide.

 

doc : https://mesgeekeries.ch/2023/11/04/decouvrir-les-api-enphase-iq-gateway-envoy-s/

 

 

Mon code dans une scène HC2 :

 

erreurs corrigés : voir post plus loin


Le résultat : 

 

 

[DEBUG] 19:15:11: {"user[password]":"YYYYY","user":"XXXXXX"}
[DEBUG] 19:15:11: Get session_id
[DEBUG] 19:15:13: response.status :
[DEBUG] 19:15:13: 200
[DEBUG] 19:15:13: response.data : type = string
[DEBUG] 19:15:13: response.data : string.len = 50017
[DEBUG] 19:15:13: response.data (caract 1110 à 1249):
[DEBUG] 19:15:13: Energy - Enlighten | Sign in to Enlighten
[DEBUG] 19:15:13:
[DEBUG] 19:15:13:

 

 

Modifié par stipower
Lien vers le commentaire
Partager sur d’autres sites

J'ai pas trop le temps de relire ton code en ce moment, si tu es pressé, regarde ce que fait le code source de mon QuickApp, dans le fichier Library - Enphase v2.00.lua dans la function Enphase:getToken()

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...