Enphase - Envoy - Script - Json Node-Red

Bonjour,

Je vais donner mon avis sur le matériel, à votre place j’aurais opté pour la Metered qui permet de connaitre la consommation et la production en temps réel, mais surtout elle va être compatible smart grid avec les IQ7 dans l’année si tout va bien.

Pour l’installation, il vous faudra créer un compte chez Enphase, attention la passerelle permet de configurer les micro-onduleurs avec le bon profil, je ne vais pas rentrer dans les détails mais je vous conseille vivement de contacter Enphase France avant la mise en service si vous n’êtes pas sur de ce que vous faites. Ils sont très réactifs et commerciaux, je les ai contactés à plusieurs reprises et ils m’ont toujours aidé et/ou dépanné sans problème.

Je vous conseille aussi de lire un peu la documentation très riche qu’ils mettent a disposition sur leur site web.

https://enphase.com/fr-fr/produits/envoy/gamme-de-produits

La passerelle de communication Envoy-S Standard permet :

  • De détecter et dépanner à distance les panneaux solaires
  • De mesurer la production électrique
  • Des communications bidirectionnelles permettant à l’Envoy de s’adapter aux futures exigences des réseaux
  • Une mise en réseau flexible grâce au Wi-Fi intégré
  • Une connexion cellulaire Plug-&-Play

La passerelle de communication Envoy-S Metered permet en plus de la Standard :

  • De surveiller la consommation électrique de votre logement
  • D’ajouter des batteries Enphase pour un stockage d’énergie

Bon dimanche

Merci pour ton retour.

J’ai déjà un système de mesure indépendant pour mesurer la consommation, la production, l’injection donc je ne voyais pas d’intérêt à prendre la version metered.

En revanche je voulais voir combien produits chaque micro onduleur car chez EDF ENR ils n’ont pas estimé que c’était sympathique pour le client d’avoir cette information. Il installe un boîtier Yuze qui permet d’envoyer des informations sur le site EDF client. Je pense qu’ils ont cette information mais ne nous la communique pas.

Un truc qui me fait peur c’est que tu parles de configurer un profil. J’espère que ce n’est pas à faire lors d’une simple détection car je ne veux pas risquer d’interférer avec ce que l’installateur a mis en place. Question de garantie aussi…

@Bison,
oui c’est bien pour ça qu’il faut faire attention, pour l’instant en France la norme réseau en vigueur est VFR2014.
Profils réseau france
N’hésite vraiment pas à contacter Enphase si tu as un doute car le paramétrage de la passerelle n’est pas si simple que ça, entre les différents profils avec ou sans injection, le plan de calepinage, etc.
Tu as aussi un forum très bien pour le photovoltaïque
Forum photovoltaïque
Ne prend pas peur non plus, rien d’insurmontable si tu as l’information.

1 « J'aime »

Petite précision sur le profil :
Le réglage des paramètres VFR2019 est en vigueur depuis la publication de l’arrêté du 9 juin 2020.

Pour rappel, les nouveaux réglages exigés pour le raccordement des onduleurs sur le réseau français nous ramène aux réglages de base de la norme VDE126-1-1.
La version utilisée depuis 2011 définissait une fréquence d’arrêt des onduleurs à 50,2Hz. Puis à 50,4Hz en 2013, puis 50,6Hz en 2014.
La VFR2019 définit cette fréquence à 51,5Hz.

Les paramètres de la VDE126-1-1 sont repris pour l’élaboration de la nouvelle norme RFG(Requirements for Generators) EN 50549-1/2 et les réglages VFR2019 sont inscrits dans le code [EU] EN50549 : 2018.

il y a une promo delais trés court …

Passerelle Envoy-S Metered™- Enphase 51%

https://allo.solar/passerelle-envoy-s-meteredtm-enphase.html?utm_source=google+shopping&utm_medium=shopping&utm_campaign=Other+products&utm_term=Other+products&utm_content=Other+products&gclid=Cj0KCQiA0-6ABhDMARIsAFVdQv_g67jp-zn236ajfjD4g7eHRbumAyUSYOGV2FMZ0Kr_QDEmbpEfuQEaAnEiEALw_wcB#

Un petit bloc code pour scenario

prérequis

  • une passerelle envoy
  • paramétrer la 1ere ligne avec l’IP de la passerelle et son mot de passe
$login='envoy';$passwd='011770';$ip = '192.168.0.248';
  • faire un virtuel avec une commande info autre sans historique

bloc code du scenario :

$login='envoy';$passwd='011770';$ip = '192.168.0.248';
$tags = $scenario->getTags();
$request_http = new com_http('http://'.$ip.'/api/v1/production/inverters',"$login","$passwd");
$request_http->setCURLOPT_HTTPAUTH(CURLAUTH_DIGEST);
$json=json_decode(trim($request_http->exec()), true);

$tableau = "<table><tr><td>Paneau</td><td>N° de Série</td><td>Moment</td><td>Type</td><td>Puissance</td><td>Maxi</td></tr>";
$x=0;

foreach ($json as &$value) {
  $y = $x + 1;
  $tableau .= '<tr>';
  $tableau .= '<td>'.$y.'</td>';
  $tableau .= '<td>'.$json[$x]['serialNumber'].'</td>';
  $tableau .= '<td>'.date('H:i:s d-m-Y',$json[$x]['lastReportDate']).'</td>';
  $tableau .= '<td>'.$json[$x]['devType'].'</td>';  
  $tableau .= '<td>'.$json[$x]['lastReportWatts'].' W</td>';
  $tableau .= '<td>'.$json[$x]['maxReportWatts'].' W</td>';
  $tableau .= "</tr>";
  $x+=1;
}

$tableau .= "</table>";
$tableau = str_replace("<td>","<td style ='border: 1px solid red;height: 30px;padding-right: 2px;padding-left: 2px;'>",$tableau);
$scenario->setLog($tableau);

//unset($value);

$tags['#tableau#'] = $tableau;
$scenario->setTags($tags);

Aprés le bloc code ajoutez une action event sur votre commande virtuel

N’oubliez pas le déclancheur

Le résultat :

Capture d’écran du 2021-02-05 19-13-50

Bon de nuit ça donne rien de bien :rofl:

J’ai tester sur une passerelle standard à vous de me dire le résultat sur une passerelle Metered

Have a fun

salut @olive
j’ai mis en place ton petit code sur une envoy metered ca fonctionne , peut on ajouter d’autre info comme si c’est en production, provisione ,communication ?
merci a toi

Je sais pas (j’ai pas de metered) mais envoi moi les fichiers json dit moi les infos pertinente a récupérer correspondant et je regarde.

Merci pour le test en tout cas, c’est sympa d’avoir des retours.

ps dans /api/v1/production/inverters je n’ai que ces infos la …
faut tester les autre adresses pour voir

salut @olive
le rafraichissement se fait toutes les 15 minutes environ?
le code lui se fait toute les minutes
ca doit venir de l’envoye ca ?
cdt

Yes docteur en fait j’ai mis une minute arbitrairement pour voir …

1 « J'aime »

Désolé même la plus belle fille du monde ne peut avoir que ce que veut bien lui donner la passerelle …

Reste a savoir si sur ce 1/4 heure c’est une valeur moyenne ?
Il faudrait faire le calcul sur une journée et comparer la prod du jour …

Bonjour,
j’ai pu lire un sujet ce début de semaine,et très bien détaillé, sur comment interfacer les données (Prod actuelle, conso actuelle) de la passerelle envoy s sur notre jeedom en utilisant le fichier http://192.168.1.***/production.json présent sur cette passerelle, j’ai relus toute une semaine de titres sans le retouver, il y avais d’ailleur eu très peu de réponses du reste.
Si sont auteur est sur ce post, je le remercie d’avance pour faire remonter son tuto.
Je dénigre pas les explications présentes sur ce post mais elles me semblent moins limpides, moi, petit utilisateur du dimanche.
Merci à vous !

Salut,
En fait le sujet était sur le forum photovoltaïque, si ce intéresse, c’est par ici :

http://forum-photovoltaique.fr/viewtopic.php?f=110&t=47963&hilit=jeedom

Bon Week…

1 « J'aime »

c’est juste ce qui à été décrit en début de fil …

Bonjour à tous, je vous lit depuis un moment et c’est à mon tour de partager, d’abord le contexte : j’ai dix panneaux et une passerelle S-Metered, j’ai créé un scénario qui récupère tout ce qui est dispo (à ma connaissance et je n’ai pas de batteries) et le stocke dans des variables, ensuite j’utilise un virtuel pour transformer les variables utiles en commandes :

Les variables de chaque panneau sont identifiées par le numéro de série du MO.
Le cron du scénario est à 1m, la passerelle interroge les MO toutes les cinq minutes.

et dans Graphana :

voici le php du scénario j’ai créé un bloc code par fichier json de la passerelle
premier bloc code :

$jsonenph = file_get_contents("http://192.168.x.xx/production.json");
//$jsonenph = trim($jsonenph,"{}");
$jsonenph = str_replace('"', "", $jsonenph);
$jsonenph = str_replace('{', "", $jsonenph);
$jsonenph = str_replace('}', "", $jsonenph);
$jsonenph = str_replace('[', "", $jsonenph);
//$scenario->setLog($jsonenph);
//$scenario->setLog('resultat:');


$arr1 = explode( "]" , $jsonenph);
foreach ($arr1 as &$v1) {
  	$itt = 0;
  	$v1 = ltrim($v1,",");
  	$pos = strpos($v1, ":");
  	$typ = substr($v1, 0, $pos);
  	//$scenario->setLog($typ);
    $v1 = ltrim($v1,$typ);
  	$v1 = ltrim($v1,":");
    //$scenario->setLog($v1);
	$arr2 = explode( "," , $v1);
	foreach ($arr2 as &$v2) {
        //$scenario->setLog($v2);
        $arr3 = explode( ":" , $v2);
      	$typ = substr($typ , 0, 4);
      	if ($arr3[0] == "type")
          	$itt == $itt++;
      	if ($itt > 0) {
          	$type = $typ.$itt."-".$arr3[0];
        } else {
     		$type = $typ."-".$arr3[0];
        }
		//$scenario->setLog('type');
      	//$scenario->setLog($type);
  		//$scenario->setLog('arr3[1]');
  		//$scenario->setLog($arr3[1]);
      	$scenario->setData($type, $arr3[1]);
	}

$itt == $itt++;
}	
unset($v1);
unset($v2);

deuxième bloc code :

$jsonprod = file_get_contents("http://192.168.x.xx/api/v1/production/");
$jsonprod = str_replace('{', "", $jsonprod);
$jsonprod = str_replace('}', "", $jsonprod);
$jsonprod = str_replace('"', "", $jsonprod);
//$scenario->setLog($jsonprod);
$arr4 = explode( "," , $jsonprod);
	foreach ($arr4 as &$v4) {
        $v4 = ltrim($v4);
      	//$scenario->setLog($v4);
        $arr5 = explode( ":" , $v4);
     	$arr5[1] = ltrim($arr5[1]);
		//$scenario->setLog($arr5[0]);
  		//$scenario->setLog($arr5[1]);
      	$scenario->setData($arr5[0], $arr5[1]);
}
unset($v4);

troisième bloc code :

$login = 'envoy';
 $password = 'xxxxx';
 $url = 'http://192.168.x.xx/api/v1/production/inverters';
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL,$url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
 curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
 curl_setopt($ch, CURLOPT_USERPWD, "$login:$password");
 $jsoniq = curl_exec($ch);
 curl_close($ch);    


$jsoniq = str_replace(array('"','[',']','}',' '), "", $jsoniq);
$jsoniq = substr($jsoniq, 3);
//$scenario->setLog($jsoniq);
$arr6 = explode( "{" , $jsoniq);
foreach ($arr6 as &$v6) {
  	$v6 = ltrim($v6);
  	$v6 = substr($v6 , 0, -2);
  	//$scenario->setLog('resultat v6:');
	//$scenario->setLog($v6);
  	$arr7 = explode( "," , $v6);
  
  	$arr7[0] = ltrim($arr7[0]);
   	//$scenario->setLog($arr7[0]);
   	$arr8 = explode( ":" , $arr7[0]);
 	//$scenario->setLog($arr8[0]);
   	//$scenario->setLog($arr8[1]);
  	$num = $arr8[1];
  	//$scenario->setLog($num."-".$arr8[0]);
   	//$scenario->setLog($num."-".$arr8[1]);
  
  	$arr7[1] = ltrim($arr7[1]);
   	//$scenario->setLog($arr7[1]);
   	$arr8 = explode( ":" , $arr7[1]);
  	$typ = $num."-".$arr8[0];
 	//$scenario->setLog($typ);
   	//$scenario->setLog($arr8[1]);
  	$scenario->setData($typ, $arr8[1]);
  
  	$arr7[2] = ltrim($arr7[2]);
   	//$scenario->setLog($arr7[2]);
   	$arr8 = explode( ":" , $arr7[2]);
  	$typ = $num."-".$arr8[0];
 	//$scenario->setLog($typ);
   	//$scenario->setLog($arr8[1]);
  	$scenario->setData($typ, $arr8[1]);
  
  	$arr7[3] = ltrim($arr7[3]);
   	//$scenario->setLog($arr7[3]);
   	$arr8 = explode( ":" , $arr7[3]);
  	$typ = $num."-".$arr8[0];
 	//$scenario->setLog($typ);
   	//$scenario->setLog($arr8[1]);
  	$scenario->setData($typ, $arr8[1]);
  
  	$arr7[4] = ltrim($arr7[4]);
   	//$scenario->setLog($arr7[4]);
   	$arr8 = explode( ":" , $arr7[4]);
  	$typ = $num."-".$arr8[0];
 	//$scenario->setLog($typ);
   	//$scenario->setLog($arr8[1]);
  	$scenario->setData($typ, $arr8[1]);
  
//    }
}

voici quelles variables créées :


Voila amusez vous bien pensez à mettre l’ip de la passerelle à la place des x.xx et les cinq derniers chiffres du n°de serie à la place des xxxxx (dans $password)

Prochaine fois je fait un message plus court… :kissing_smiling_eyes:

1 « J'aime »

C’est une façon de voir les choses mais tu t’embête beaucoup a nettoyer les json

le json_decode() est fait pour ça …

Regarde bien le bloc code ici :

Oui je sais… mais il faut comprendre deux choses :
1 je connait pas php, donc j’improvise, je lit les forums et j’improvise.
2 j’ai commencé par mon écocompteur Legrand qui publie un json non standard et même deux formatages différents selon le fichier lu…
en réalisant le parse moi même j’ai le contrôle sur les valeurs récupérées et je peux agir sur les noms.
mon code n’est pas optimisé (on pourrait faire une boucle pour les micro onduleurs avec autant d’itération que la variable activeCount du production 0 (variable prod1-activeCount dans mon code) par exemple) et puis j’ai écrit mon code bien avant que tu publie ce message, j’en était resté au fait que tu utilisait un script pour passer l’authentification « digest » de la passerelle. J’ai juste été long à le partager…

Mais aucun code n’est LA solution chacun fait au mieux avec ses systèmes et ses compétences, en tout cas merci, tes posts sont source d’inspirations et ressources (sur ce topic et sur d’autres, je travaille sur le design en ce moment)

C’était jus pour t’ orienté vers cette solution …

Bonsoir.

Merci à vous pour tous vos travaux. J’arrive avec plus d’un an de retard et vous avez une sérieuse avance. Après une soirée de lecture, pas mal de découverte. Il me reste pas mal de boulot.

A mon niveau je suis un newbe sur Jeedom et ne suis pas encore a l’aise avec toutes les notions.

@olive j’ai une question sur ta dernière proposition de script
https://community.jeedom.com/t/enphase-envoy-script-json-node-red/7730/369

Peux tu préciser comment tu configures le Virtuel ? Je pense passer à coté de quelque chose car côté scénario cela semble OK mais je n’arrive pas à sortir le tableau.

Merci à toi

Bonsoir,

Une commande info type autre complètement vide

C’est le scenario qui va remplir le champ.