Merci, c’est très clair et je m ´en doutais un peu. Je crois que je vais contourner le problème EJP en prévoyant migrer mon contrat en tempo car EJP n’a plus vraiment de sens sauf si on a une consommation en plein tarif marginal car le prix est juste exorbitant maintenant.
Bonjour vous tous,
J'essaye désespérément de trouver ou adapter un programme pour récupérer et exploiter les informations Tempo et EJP sur le site EDF https://particulier.edf.fr/services/rest/referentiel/historicEJPStore?searchType=EJP !
J'ai essayé vos programmes sans succès et aussi essayé le programme et le simulateur particulier.edf.fr - Wokwi ESP32, STM32, Arduino Simulator](particulier.edf.fr - Wokwi ESP32, STM32, Arduino Simulator) mais la connexion au site en se réalise pas [HTTPS] GET... failed, error: read Timeout .
Je ne trouve pas l'explication !
J'ai remarqué que le certificat est utilisé ! En visitant X sites et forums, j'ai remarqué que l'on peut contourner la certification pour site HTTPS.
Un grand bravo à Rollmops67 (Rollmopps Hummm.... pour ceux qui connaisse !) pour ces travaux et mises en boitiers.
Merci à ceux qui veuille bien me répondre et vous souhaite à tous de bien terminer l'année 2023.
L'Arsène.
j'ai eu accès rapidement à un terminal unix
tapez
curl -v -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" 'https://particulier.edf.fr/services/rest/referentiel/historicEJPStore?searchType=EJP'
et vous verrez que la requête nécessite HTTP/2 pour fonctionner
en effet un
curl --http1.0 -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3" 'https://particulier.edf.fr/services/rest/referentiel/historicEJPStore?searchType=EJP'
ou avec --http1.1 ne répond pas
➜ donc il faut fournir un code compatible avec HTTP/2 ... et donc pas un truc habituel
il y avait eu sh2lib qui permettait de gérer HTTP2 mais si j'en crois ce lien c'est " Removed or Deprecated Components"
j'ai jamais regardé ce qui pouvait le remplacer mais c'est de ce côté là qu'il faut creuser puisque le curl fonctionne avec ce user agent.
Ce n'est pas tout à fait exact, cela dépend déjà de la version de curl que tu utilise, ma version fait par exemple du http/2 par défaut.
l'option -v de curl, indique que EDF déclare supporteur http/1.1 et http2.
Personnellement un curl donc avec ou sans l'option http/2 génère une erreur.
Ce qui est surprenant c'est qu'en demandant le service tempo, que ce soit en http/2 ou 1.1, le serveur répond sans soucis au deux requêtes.
oui j'aurais dû dire pour ma version de curl sur mon Mac.
si on force http1.1 ou http1.0 cependant il n'y a pas de réponse, si on ne dit rien il voit du HTT/2 et ça fonctionne.
il faut passer un user agent aussi sinon ça ne fonctionne pas
Oui je n'ai pas ajouté d'user agent autre que celui de curl pour faire croire à un browser.
A moins qu'il n'y ait aucun user agent, mais je crois que curl en déclare un par défaut(quoi que pas du tout sûre)
Oui en http/1.1, il n'y a aucun réponse si on demande EJB à la différence de tempo.
j'ai essayé sans agent et ça ne répond pas
par exemple HTTP/2 utilise la compression d'en-tête pour réduire la surcharge due au protocole ou la multiplexation. Nos bibliothèques Arduino "de base" ne savent pas gérer cela.
Effectivement si on précise un autre user agent que celui de curl( curl/7.84.0) par ex "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" on a une réponse ![]()
Bonjour,
Merci pour les réponses.
Je vais faire des essais.
Bonne année à tous,
Pour les malheureux en recherche d'une solution EJP, il existe une possibilité (pas forcément pérenne mais au moins, ca semble fonctionner pour nos petits bricolages en attente de mieux) :
https://selectra.info/api/ejp/calendar qui fournit un JSon.
Il existe son petit frère pour tempo : https://selectra.info/api/tempo/calendar
Enfin dans un tout autre ordre il existe aussi (mais là, je n'en suis qu'au début):
https://api-commerce.edf.fr/commerce/activet/v1/calendrier-jours-effacement?option=EJP&dateApplicationBorneInf=2023-1-4&dateApplicationBorneSup=2024-1-4&identifiantConsommateur=src
mais là, il semble y avoir un mécanisme de token qui me dépasse un peu.
Pour y accèder, lancer la page http://particulier.edf.fr/fr/accueil/gestion-contrat/options/ejp.html#/ ....Ca négocie le protocole et l'on peut ensuite jouer avec le JSon.
Suivant la bonne habitude de EDF, il ne semble y avoir aucune doc sur cette API.
Ce JSon a la particularité de lister TOUS les jours de l'année et non pas seulement les jours EJP.
Il existe de nombreuses déclinaisons de cet appel y compris pour Tempo.
Ricquet
Bonjour vous tous,
Je vous souhaite une bonne et heureuse année 2024 et beaucoup de réussites dans vos efforts.
J'ai fait le tour des différents programmes évoqués, j'ai retenu celui à Ricquet et modifié selon les propositions des intervenants. Je souhaiterai par la suite comme Ricquet exploiter les infos EJP par 'https://particulier.edf.fr/services/rest/referentiel/historicEJPStore?searchType=EJP'
Concernant le programme évoqué, les connections pour la date et les infos du coté EDF se réalisent mais le résultat est :
14:19:28.001 -> [HTTP] begin...
14:19:28.001 -> https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=2024-01-05
14:19:28.001 -> [HTTP] GET...
14:19:34.902 -> nullnull
Le programme est le suivant:
#include <WiFi.h>
#include <ArduinoJson.h>
#include <time.h>
#include <HTTPClient.h>
#define LedBlueTempo 12 // Tempo EDF
#define LedWhiteTempo 14 // Tempo EDF
#define LedRedTempo 0 // Tempo EDF
const char* ssid = " ";
const char* password = " ";
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 0;
const int daylightOffset_sec = 3600;
const char* requeteTempo;
String JourJ;//const char* JourJ;
String JourJ1;//const char* JourJ1;
String JourJJ;
String JourJJ1;
String Jour;
String Mois;
String An;
void setup(){
pinMode(LedBlueTempo, OUTPUT); // Tempo EDF
pinMode(LedWhiteTempo, OUTPUT); // Tempo EDF
pinMode(LedRedTempo, OUTPUT); // Tempo EDF
digitalWrite(LedBlueTempo, LOW); // Tempo EDF
digitalWrite(LedWhiteTempo, LOW); // Tempo EDF
digitalWrite(LedRedTempo, LOW); // Tempo EDF
Serial.begin(115200);
Serial.println("Booting");
// Connect to Wi-Fi
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
// Init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
//disconnect WiFi as it's no longer needed
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
}
void loop(){
delay(500);
printLocalTime();
delay(500);
LectureWebTempoJ1();
}
void printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
Serial.print("Date optenue : ");
Serial.println(&timeinfo, "%F");
char timeDay[3];
strftime(timeDay, 3, "%d", &timeinfo);
Jour = String(timeDay);
char timeMonth[4];
strftime(timeMonth, 4, "%m", &timeinfo);
Mois = String(timeMonth);
char timeYear[6];
strftime(timeYear, 6, "%Y", &timeinfo);
An = String(timeYear);
}
void LectureWebTempoJ1() // Pour lecture couleur du lendemain sur serveur web EDF
{
HTTPClient http;
Serial.print("[HTTP] begin...\n");
String TempoJour = ("https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=");
TempoJour += (An) + '-' + (Mois) + '-' + (Jour);
Serial.println(TempoJour);
http.begin(TempoJour);
Serial.print("[HTTP] GET...\n");
int httpJour = http.GET();
String recup1 = http.getString();
StaticJsonDocument<100> doc2;
deserializeJson(doc2, (http.getString()));
JourJ = doc2["couleurJourJ"].as<String>(); // Peut être "TEMPO_BLEU", "TEMPO_BLANC", "TEMPO_ROUGE"
JourJ1 = doc2["couleurJourJ1"].as<String>(); // Peut être "TEMPO_BLEU", "TEMPO_BLANC", "TEMPO_ROUGE", "NON_DEFINI"
// le ".as<String>()" à la fin des requêtes Json transforme la chaîne de caractère du résultat en string
// bien plus facile à manipuler
//JourJJ = String(JourJ);
//JourJJ1 = String(JourJ1);
Serial.print(JourJ);
Serial.print(JourJ1);
// Serial.println(JourJ);
// Serial.println(JourJ1);
delay(50000);
/* if ((JourJJ1.equals("NON_DEFINI"))) {
Serial.println("En attente");}
if ((JourJJ1.equals("TEMPO_BLEU"))) {
Serial.println("Bleu");}
if ((JourJJ1.equals("TEMPO_BLANC"))) {
Serial.println("Blanc");}
if ((JourJJ1.equals("TEMPO_ROUGE"))) {
Serial.println("Rouge");}
*/ }
Les résultats de la désérialisation Json serait il mal interprétés ?
J'ai fait des essais avec des variables car et string sans résultats positifs !
Merci pour vos réponses.
L'Arsène.
vous en aurez sans doute plus si vous n'oubliez pas le balises de code...
Merci de nous aider à conserver le forum lisible
cf les recommandations listées dans "Les bonnes pratiques du Forum Francophone”
Pour cela, il te faudra trouver un moyen d'utiliser le HTTP/2, car EDF ne semble pas accepter le http/1.1 pour le service EJP.
Le peu que j'ai testé HTTPClient ne semble pas gérer le HTTP/2, je crois que @J-M-L l'a confirmer d'ailleurs.
il ne fallait pas reporter, juste utiliser le petit bouton en forme de crayon sous votre post pour l'éditer et rajouter les balises de code (faites le)
Bonjour !
Par rapport à votre post #71, lisez les remarques que j'ai fait au début (au sujet du WiFi) et la fin (au sujet du nombre de requêtes) du post #30 dont vous semblez reprendre le code...
Roland
Bonjour rollmops,
J'ai pris en compte tes écrits et le résultat est positif.
Merci beaucoup.
J'ai agrémenté le programme par quelques lignes d'informations par le moniteur série, arrêté le WiFi en fin de liaison et relancé lors de la prochaine interrogation et d'autres petits détails.
Pour ceux qui voudraient s'en inspirer comme moi chez tous ceux qui publient, voici le code.
#include <WiFi.h>
#include <ArduinoJson.h>
#include <time.h>
#include <HTTPClient.h>
const char* ssid = "";
const char* password = "";
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 0;
const int daylightOffset_sec = 3600;
String requeteTempo; // pour l'appel au serveur Particulier EDF
String JourJ;
String JourJ1;
String JourJJ;
String JourJJ1;
String Jour;
String Mois;
String An;
String Heure;
String Minute;
void setup(){
Serial.begin(115200);
// Connect to Wi-Fi
Serial.print("Connection à: ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("La liaison WiFi est établie");
// Init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
}
void loop(){
delay(500);
printLocalTime();
delay(500);
setup(); // pour redémarrer la liaison WiFi
LectureWebTempoJ1();
}
void printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Non obtension de la date/heure");
return;
}
Serial.println();
Serial.print("Date optenue : ");
Serial.print(&timeinfo, "%F");
char timeDay[3];
strftime(timeDay, 3, "%d", &timeinfo);
Jour = String(timeDay);
char timeMonth[4];
strftime(timeMonth, 4, "%m", &timeinfo);
Mois = String(timeMonth);
char timeYear[6];
strftime(timeYear, 6, "%Y", &timeinfo);
An = String(timeYear);
char timeHour[10];
strftime(timeHour, 10, "%H", &timeinfo);
Heure = String(timeHour);
char timeMinute[12];
strftime(timeMinute, 12, "%M", &timeinfo);
Minute = String(timeMinute);
Serial.print(" ");
Serial.print(timeHour);
Serial.print("h ");
Serial.print(timeMinute);
Serial.println("mn");
}
void LectureWebTempoJ1() // Pour lecture couleur du jour et du lendemain sur serveur web EDF
{
HTTPClient http;
requeteTempo = ("https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=");
requeteTempo += (An) + '-' + (Mois) + '-' + (Jour);
http.begin(requeteTempo);
http.setConnectTimeout(2000);
int httpCode = http.GET();
Serial.print("Le codes HTTP est: ");
Serial.println(httpCode);
if(httpCode == 200){
Serial.println("La liaison avec le site particulier.edf.fr est établie !");
}
if(httpCode > 0)
{
if (httpCode == HTTP_CODE_OK)
{
StaticJsonDocument<100> doc2;
deserializeJson(doc2, (http.getString()));
JourJ = doc2["couleurJourJ"].as<String>(); // Peut être "TEMPO_BLEU", "TEMPO_BLANC", "TEMPO_ROUGE"
JourJ1 = doc2["couleurJourJ1"].as<String>(); // Peut être "TEMPO_BLEU", "TEMPO_BLANC", "TEMPO_ROUGE", "NON_DEFINI"
// le ".as<String>()" à la fin des requêtes Json transforme la chaîne de caractère du résultat en string
// bien plus facile à manipuler
}
}
Serial.println("Aujourdhui: " + JourJ);
Serial.println("Demain: " + JourJ1);
http.end();
WiFi.disconnect(); // On peut arrêter la liaison WiFi
WiFi.mode(WIFI_OFF);
delay(50000);
}
Les prochains essais ce sera pour les informations EJP, pas évident selon vos écrits.
L'Arsène.
Heureux que ça marche !
Par contre je ne vois pas trop l'intérêt d'arrêter le WiFi pour le redémarrer et relancer la commande " configTime" 50 secondes après...
A part une petite économie de consommation !
Roland
Rollmops67,
Par la suite la tempo d’arrêt du WiFi et donc la demande d’infos sera rallongée par un autre moyen tel à des heures/ minutes de l’horloge qui sera un RTC.
L’Arsène.
Bonjour,
rollmops67, la fonte que tu as choisie est de mon gout, quelle est-elle ?
Aurais tu l'adresse du site pour télécharge les infos Json pour les HC et HP ?
Bon dimanche.
L'Arsène.
Bonjour !
Tout d'abord les choses simples :
Pour la (ou les) adresse(s) pour accéder aux infos HP et HC, voir ce sujet :
Il y a la méthode simple (au début) et la méthode un peu plus complexe ensuite.
Pour les fontes c'est un peu plus compliqué.
Il faut utiliser la (super) bibliothèque "TFT_eSPI" pour piloter l'écran que tu trouveras là :
Cette bibliothèque permet de créer des "smoothfonts" à partir de n'importe quelle police ttf de son ordinateur.
La procédure est assez complexe (mais pas compliquée), je me suis d'ailleurs fait un tuto que voilà :
Faire des Smooth fonts à partir de fichiers TTF.zip (125,9 Ko)
J'utilise plutôt la méthode 2.
La bibliothèque TFT-eSPI est assez complexe à aborder, mais d'une richesse assez étonnante.
Il faut se prendre le temps de tout appréhender !
J'y suis arrivé, donc c'est possible...
Roland