#include <WiFi.h>
#include <NetworkClientSecure.h> // to work with WiFi or Ethernet
#include <HTTPClient.h>
#include "UrlEncode.h"
#include <ArduinoJson.h>
// info utilisateur
String EnphaseUser = "";
String EnphasePwd = "";
String EnphaseSerial = "";
int RMSextIP = 1; // pas zéro our tester
String Session_id = "";
String TokenEnphase = "";
uint32_t previousTimeRMSMin;
uint32_t previousTimeRMSMax;
uint32_t previousTimeRMSMoy;
uint32_t previousTimeRMS;
uint32_t LastRMS_Millis;
uint32_t PeriodeProgMillis;
void Setup_Enphase() {
Serial.println("Enter Setup_Enphase"); // temporaire
/* // hors test possible avec wokwi
// Résolution mDNS de http://envoy.local en adresse IP // SR19
// ***************************************************
const char* host = "envoy";
IPAddress envoyIP;
if (RMSextIPauto) {
if (!MDNS.begin(hostname)) { //Init mDNS
TelnetPrintln("Erreur : impossible d'initialiser mDNS");
return;
} else {
envoyIP = MDNS.queryHost(host, 2000); //avec timeout 2s
}
if (envoyIP != IPAddress(0,0,0,0)) {
StockMessage("IP Enphase : http://" + String(host) + ".local" + " -> " + envoyIP.toString());
RMSextIP = uint32_t(envoyIP[0] << 24) | uint32_t(envoyIP[1] << 16) | uint32_t(envoyIP[2] << 8) | uint32_t(envoyIP[3]);
EcritureEnROM();
} else {
StockMessage("Échec! passerelle Enphase envoy déconnectée");
return;
}
}
*/
//Obtention Session ID
//********************
HTTPClient http;
http.setFollowRedirects(HTTPC_STRICT_FOLLOW_REDIRECTS);
Serial.println(EnphaseUser); // temporaire
Serial.println(EnphasePwd.length()); // temporaire
Serial.println(RMSextIP); // temporaire
if (EnphaseUser != "" && EnphasePwd != "" && RMSextIP > 0) {
NetworkClientSecure client;
client.setInsecure();
Serial.println("Essai connexion Enlighten server 1...");
http.begin(client, "https://enlighten.enphaseenergy.com/login/login.json");
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
String requestBody = "user[email]=" + urlEncode(EnphaseUser) + "&user[password]=" + urlEncode(EnphasePwd);
Serial.print("Request entrez :"); // temporaire
Serial.println(requestBody); // temporaire
int httpCode = http.POST(requestBody);
if (httpCode == HTTP_CODE_OK) {
String payload = http.getString();
JsonDocument doc;
DeserializationError error = deserializeJson(doc, payload);
if (!error) {
Session_id = doc["session_id"].as<String>();
Serial.println("session_id : " + Session_id);
} else {
Serial.print("Erreur de parsing JSON : ");
Serial.println(error.c_str());
return;
}
} else {
Serial.println("Echec Obtention session_id : " + String(httpCode));
return;
}
http.end();
} else {
Serial.println("Pas d'élement pour obtenir Token, tentative Connexion vers Envoy-S en http non sécu, methode firmware version 5");
return;
}
Serial.println(Session_id); // temporaire
Serial.println(EnphaseSerial); // temporaire
// Obtention Token
// ********************
if (Session_id != "" && EnphaseSerial != "" && EnphaseUser != "") {
NetworkClientSecure client;
client.setInsecure();
Serial.println("\nEssai connexion Enlighten server 2...");
http.begin(client, "https://entrez.enphaseenergy.com/tokens");
http.addHeader("Content-Type", "application/json");
JsonDocument bodyDoc;
bodyDoc["session_id"] = Session_id;
bodyDoc["serial_num"] = EnphaseSerial;
bodyDoc["username"] = EnphaseUser;
String requestBody;
serializeJson(bodyDoc, requestBody);
Serial.println("Request entrez :"); // temporaire
Serial.println(requestBody); // temporaire
int httpCode = http.POST(requestBody);
if (httpCode == HTTP_CODE_OK) {
TokenEnphase = http.getString();
Serial.println("--- Corps de la réponse ---"); // temporaire
Serial.println(TokenEnphase); // temporaire
TokenEnphase.trim();
Serial.println("Token reçu (" + String(TokenEnphase.length()) + " octets)");
if (TokenEnphase.length() > 50) {
previousTimeRMSMin = 1000;
previousTimeRMSMax = 1;
previousTimeRMSMoy = 1;
previousTimeRMS = millis();
LastRMS_Millis = millis();
PeriodeProgMillis = 1000;
}
} else {
Serial.println("Echec Obtention TokenEnphase : " + String(httpCode));
return;
}
http.end();
}
Serial.println("Sortie Setup_Enphase"); // temporaire
}
void setup() {
setenv("TZ", "CET-1CEST,M3.5.0/2,M10.5.0/3", 1);
tzset();
Serial.begin(115200);
Serial.print("Connecting to WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
Serial.print(".");
}
Serial.println(" Connected!");
Serial.println("******************");
Setup_Enphase();
Serial.println("******************");
}
void loop() {
delay(100); // this speeds up the simulation
}