//************************************ Auteur 59Jag *******************************************************
//Ce programme Arduino pour ESP32 récupère les informations relatives aux jours EJP via une API d'EDF.
//Vérifie si la date est dans la période EJP (entre le 1er novembre et le 30 avril).
//Écarte automatiquement les week-ends (EJP ne s'applique pas les samedis et dimanches).
//Génère une URL pour interroger l'API EDF avec les dates d'aujourd'hui et de demain.
//Récupère et analyse les informations sur les statuts EJP (jourStatus et demainStatus) via une requête HTTP GET.
//ajout des en-têtes HTTP (HTTP headers) à la requête pour Définir l'origine de la requête,
//simulant qu'elle provient d'un navigateur accédant au site officiel d'EDF.
//cela donne l'impression que la requête est envoyée depuis la page web du portail EDF https://particulier.edf.fr
//*****************************************************************************************************************************
#include <WiFi.h>
#include <HTTPClient.h>
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
#define NTP_SERVER "pool.ntp.org"
#define UTC_OFFSET 0
#define UTC_OFFSET_DST 0
String dateJour;
int mois;
int jour;
int jourSemaine;
int endIndex;
String jourStatus;
String demainStatus;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
String getFormattedDate(int daysOffset = 0) {
struct tm timeinfo;
if (!getLocalTime(&timeinfo)) {
Serial.println("impossible de recup time");
return "";
}
// Ajouter un décalage en jours si nécessaire (pour "demain")
time_t rawTime = mktime(&timeinfo) + (daysOffset * 24 * 3600); // Ajout en secondes
localtime_r(&rawTime, &timeinfo); // Appliquer le décalage
jour = timeinfo.tm_mday; // Jour du mois (1-31)
mois = timeinfo.tm_mon + 1; // Mois (0-11, donc +1 pour avoir 1-12)
jourSemaine = timeinfo.tm_wday; // Jour de la semaine (0 = dimanche, ..., 6 = samedi)
char dateBuffer[11]; // AAAA-MM-JJ : 10 caractères + null terminator
strftime(dateBuffer, sizeof(dateBuffer), "%Y-%m-%d", &timeinfo);
return String(dateBuffer);
}
void setup() {////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Serial.begin(115200);
delay(1000);
Serial.println(WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connexion au Wi-Fi");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnecté au Wi-Fi !");
Serial.println(WiFi.localIP());
configTime(UTC_OFFSET, UTC_OFFSET_DST, NTP_SERVER);
dateJour = getFormattedDate(); // Date d'aujourd'hui au format AAAA-MM-JJ
Serial.print("jour de la semaine ");
Serial.println(jourSemaine);
if (mois > 10 || mois < 4){ //ejp seulement entre 1 novembre au 31 Avril
if (!(jourSemaine == 6)) { //samedi dimanche pas d ejp (0 = dimanche, ..., 6 = samedi)
Serial.println("Periode EJP ");
recupDataApi();
}else{
Serial.println("pas de ejp le WeeekEnd");
jourStatus="NON_EJP";
demainStatus ="NON_EJP";
}
}else{
Serial.println("hors Periode ejp du 1 novembre au 31 Avril");
jourStatus="NON_EJP";
demainStatus ="NON_EJP";
}
Serial.println("Resultat");
Serial.println("aujourd hui "+ jourStatus);
Serial.println("demain " + demainStatus);
}
////////////////////////////////////////////////////////////////////////////////////////
String extractValue(String source, String startDelimiter, String endDelimiter) {
int startIndex = source.indexOf(startDelimiter);
if (startIndex == -1) return ""; // Délimiteur de début introuvable
startIndex += startDelimiter.length(); // Avancer après le délimiteur de début
int endIndex = source.indexOf(endDelimiter, startIndex);
if (endIndex == -1) return ""; // Délimiteur de fin introuvable
return source.substring(startIndex, endIndex);
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
void recupDataApi() {
if (WiFi.status() == WL_CONNECTED) {
Serial.println("Date aujourd hui "+ dateJour);
String dateDemain = getFormattedDate(1); // Date de demain au format AAAA-MM-JJ
Serial.println("Date demain "+ dateDemain);
String apiURL = "https://api-commerce.edf.fr/commerce/activet/v1/calendrier-jours-effacement";
apiURL += "?option=EJP";
apiURL += "&dateApplicationBorneInf=" + dateJour;
apiURL += "&dateApplicationBorneSup=" + dateDemain;
apiURL += "&identifiantConsommateur=src";
Serial.println("URL générée : " + apiURL);
Serial.println(" ");
HTTPClient http;
http.begin(apiURL);
http.addHeader("Accept", "application/json");
http.addHeader("Content-Type", "application/json");
http.addHeader("Origin", "https://particulier.edf.fr");
http.addHeader("Referer", "https://particulier.edf.fr/");
http.addHeader("application-origine-controlee", "site_RC");
http.addHeader("situation-usage", "Jours Effacement");
int httpResponseCode = http.GET();
if (httpResponseCode > 0) {
String EJPdata = http.getString();
Serial.println("Reponse de l API ");
Serial.println(EJPdata);
jourStatus = extractValue(EJPdata, dateJour + "\",\"statut\":\"", "\"");
demainStatus = extractValue(EJPdata, dateDemain +"\",\"statut\":\"" , "\"}]");
} else {
Serial.print("Erreur dans la requête HTTP : ");
Serial.println(httpResponseCode);
}
http.end(); // Fin de la requête
} else {
Serial.println("Wi-Fi non connecté !");
}
}
///////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
//zzzzzzzzzzzzzz
}