Afficheur météo, couleur tempo, conso élec, production solaire, etc

:clap: :clap: :clap:

Coooool :+1: :grin: :clap: Bravo !

Bonjour,
Franchement top bravo !
J’aurais une question sur la récupération du jour du lendemain, en ce qui me concerne elle ne fonctionne pas, https ne vous pose pas de problème ? J’ai du coup repris une partie de votre code et impossible d’obtenir les info….

Bonsoir !

Vous avez bien installé la librairie "ArduinoJson" (auteur bblanchon) et fait un #include <ArduinoJson.h> au début du programme ?
Vous avez déclaré les variables JourJ et JourJ1 au début avant le setup avec
String JourJ, JourJ1; ?
Vous envoyez bien une chaîne sous la forme
https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=2023-11-19
avec à la fin l'année, le mois la date et le jour séparés par des tirets ?
Et si vous entrez directement la chaîne ci-dessus dans un navigateur ça vous renvoie des infos ?

Roland

Bonjour
Oui j’ai fait ainsi et le site web s’affiche bien mais le prog ne me renvoi rien malgré l’absence d’erreur…

Le mieux serait que vous nous montriez votre programme ! (où le mettiez en pièce jointe au format zip dans une réponse.

roland

Je bascule sur le pc et vous partage ça, merci :wink:

Voici le code modifié, remodifié...etc...je tourne un peu en rond...:slight_smile:

#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     = "TP-Link_4554";
const char* password = "78446908";

const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 0;
const int   daylightOffset_sec = 3600;

const char* requeteTempo;
const char* JourJ;
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(5000);
  printLocalTime();
  delay(5000);
  LectureWebTempoJ1();
}

void printLocalTime(){
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return;
  }

//  Serial.print("AAAA-MM-JJ : ");
//  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<200> doc1;   
      deserializeJson(doc1, recup1);  
      const char* JourJ = doc1["couleurJourJ"];
      const char* JourJ1 = doc1["couleurJourJ1"];

      JourJJ =  String(JourJ);  
      JourJJ1 = String(JourJ1);

  Serial.print(JourJ);    
  Serial.print(JourJ1);
  Serial.println(JourJ);    
  Serial.println(JourJ1);
  delay(5000);

/*    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");}
*/  }

Et la réponse du Moniteur Série

WiFi connected.
[HTTP] begin...
https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=2023-11-20
[HTTP] GET...
Guru Meditation Error: Core 1 panic'ed (LoadProhibited). Exception was unhandled.

Core 1 register dump:
PC : 0x400899d3 PS : 0x00060130 A0 : 0x800d8caf A1 : 0x3ffcb010
A2 : 0x3ffc3d20 A3 : 0x00000000 A4 : 0x00000001 A5 : 0x000000bf
A6 : 0x00ff0000 A7 : 0xff000000 A8 : 0x00000000 A9 : 0x00000000
A10 : 0x00000001 A11 : 0x00000000 A12 : 0x0000000f A13 : 0x00000000
A14 : 0x0000000e A15 : 0xff000000 SAR : 0x0000001a EXCCAUSE: 0x0000001c
EXCVADDR: 0x00000000 LBEG : 0x400898c8 LEND : 0x400898de LCOUNT : 0xffffffff

Backtrace: 0x400899d0:0x3ffcb010 0x400d8cac:0x3ffcb030 0x400d8dca:0x3ffcb050 0x400d35fe:0x3ffcb070 0x400d3737:0x3ffcb280 0x400da491:0x3ffcb2a0

ELF file SHA256: ce8e02be6a88f66d

Rebooting...
ets Jul 29 2019 12:21:46

rst:0xc (SW_CPU_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1344
load:0x40078000,len:13964
load:0x40080400,len:3600
entry 0x400805f0
Booting
Connecting to TP-Link_4554
..................
WiFi connected.

Après un rapide coup d'oeil :
Vous coupez le Wifi à la fin du setup, ça n'empêche pas l'horloge interne de l'ESP de tourner, mais la requête http ne risque pas de marcher sans Wifi !
Il faut enlever les 2 dernières lignes avant le loop.

Le plantage vient je pense de ces lignes :

  JourJJ =  String(JourJ);  
  JourJJ1 = String(JourJ1);

Je crois me rappeler que j'avais aussi procédé comme ça au début, et quand je voulais transformer les données après le deserializeJson(doc1, recup1); en string, c'est là que ça plantait.

Je vous mets le détail de comment je fais ma requête, c'est le ".as<String>()" qui transforme le résultat de la requête Json en string directement. (c'est dans l'un des exemples sur la page Github de ArduinoJson)
Et ça évite de passer par "const char* JourJ" et "const char* JourJ1"

Dans le même esprit il existe aussi .as<long>() ou .as<float>() etc...

void lect_Tempo()
{
  String requeteTempo;                            // pour l'appel au serveur Particulier EDF
  HTTPClient http;
  requeteTempo = ("https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=");
  requeteTempo += String(loc->tm_year+1900)+'-'+String(loc->tm_mon+1)+'-'+String(loc->tm_mday);
  http.begin(requeteTempo);
  http.setConnectTimeout(2000);
  httpCode = http.GET();
  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
      }
    }
  http.end();
}

Sinon une autre remarque : dans votre loop vous appelez la requête http toute les 10 secondes.
Je ne sais pas si c'est vrai, mais j'ai lu que le site edf blacklistait les adresses IP qui font trop de requêtes, et une toutes les 10 secondes ça fait beaucoup !
Perso j'en fait une toutes les demi-heures (à la minute 1 et la minute 31 de chaque heure), ça suffit amplement.
La plupart du temps c'est à 11h00 qu'apparaît la couleur du lendemain (mais pas toujours).
Et une fois que je connais la couleur du lendemain, j'arrête les requêtes (en vérifiant que la couleur du lendemain est différente de "NON_DEFINI")

Voili voilou, dites-moi ce que ça donne !

Roland

superbe realisation cela donne envie de ce lancer dans l'aventure !

merci !

1 Like

Exact, bien vue pour le wifi, j'avais zappé de l'enlever de mon caneva récupéré dans un autre prog . !
J'avais en effet mis une requête toute les 10 s pour les tests, je ne savais pas qu'on pouvait se faire bloquer, je vais rallonger, merci pour l'info.
Du coup j'ai copié vos lignes de prog. en laissant les JourJ et JourJ1 en String., je ne connaissait pas .as'String'()

Mais j'ai les erreurs suivantes :

D:\Documents\Arduino\RecuperationDateHeureTempoWeb_v2.1\RecuperationDateHeureTempoWeb_v2.1.ino: In function 'void LectureWebTempoJ1()':
D:\Documents\Arduino\RecuperationDateHeureTempoWeb_v2.1\RecuperationDateHeureTempoWeb_v2.1.ino:102:21: error: 'HTTP_CODE_Ok' was not declared in this scope
     if (httpCode == HTTP_CODE_Ok)
                     ^~~~~~~~~~~~
D:\Documents\Arduino\RecuperationDateHeureTempoWeb_v2.1\RecuperationDateHeureTempoWeb_v2.1.ino:102:21: note: suggested alternative: 'HTTP_CODE_OK'
     if (httpCode == HTTP_CODE_Ok)
                     ^~~~~~~~~~~~
                     HTTP_CODE_OK

exit status 1

Compilation error: 'HTTP_CODE_Ok' was not declared in this scope

Ah oui...

  1. Vous avez un k minuscule à la fin de HTTP_CODE_Ok, passez-le en majuscule !
  2. Et il faut déclarer la variable "httpCode" avant le setup avec int httpCode; si ce n'est déjà fait.
    Ou alors si la variable ne sert qu'ici la déclarer en local au début de la fonction qui fait le requête http comme ça, juste en ajoutant le "int":
    int httpCode = http.GET();

On va finir par y arriver !

Roland

Désolé, un vrai bourdas...j'ai pas brillé...

  1. avec le K majuscule ça fonctionne parfaitement ! :wink:
  2. elle était initialement en "const char*" et ça fonctionnait mais je l'ai passée en "int" ce matin du coup oui c'est bon, avant le setup.
    Oui, c'est bon, vous m'avez dépanné en quelques messages alors que j'ai galéré quelques heures avant...comme on dit vaut mieux un qui sait ! :slight_smile: parfait, je vais pouvoir finir mon indicateur local led avec relais pour couper ma PAC et étendre le programme pour affichage des jours restants sur un I2C !
    Merci encore en tout cas !!!! :wink: :wink: :wink: :wink: :wink:

Content que ça marche, et pour fêter ça demain c'est le premier jour blanc de la saison !

Des bourdes avec des erreurs de majuscules minuscules j'en ai déjà fait beaucoup aussi, et passé du temps dessus pour trouver l'erreur !
C'est comme ça qu'on apprend...

Bonne continuation !

Roland

1 Like

C'est clair, faut pas lâcher...mais là vous m'avez grandement aidé, je crois que j'y serait encore resté quelques heures sans vous !!!! :sweat_smile:
Merci et au plaisir de suivre vos futur projets qui sont d'un autre niveau y'a pas photo, ça fait rêver !

Bonjour,

Tout d'abord bravo pour cette incroyable réalisation.
Je l'ai suivie pas-à pas pour la partie qui m'interesse (lecture du serveur EDF) et tout fonctionne.

J'essaie maintenant de migrer l'appli pour lire le statut EJP plutôt que Tempo en utilisant la page "https://particulier.edf.fr/services/rest/referentiel/historicEJPStore?searchType=EJP".
Et là, plus rien ne fonctionne, le http.Get() se termine systématiquement par un 'read Timeout (erreur -11 sur mon ESP32)' et n'entre même pas dans la boucle de traitement.
En direct, depuis un navigateur, les données sont correctement recues.

Si quelqu'un a une idée, je suis preneur.

Bonnes fêtes à tous & merci de votre aide.

Ricquet

Bonjour !

Le mieux serait de nous partager la partie de code concernée par votre requête qu'on y voie plus clair !

Roland

Bonjour & merci pour votre réponse rapide.

Mon code est élémentaire car j'ai déshabillé au maximum pour comprendre.

// Plateforme ESP32-WROOM-32
#include <WiFi.h>
#include <HTTPClient.h>

const char WIFI_SSID[] = "SSID";         // CHANGE IT
const char WIFI_PASSWORD[] = "PWD"; // CHANGE IT

HTTPClient http;
//**********************************************************************************************
// requeteServeur à commenter/décommenter
// -la première interroge le serveur 'EDF' pour l'état Tempo....OK
// -la seconde interroge le serveur 'EDF' pour l'état EJP....MARCHE PAS!!!!
// -la troisième pour vérifier que le SSL est OK et qu'une réponse Json longue (>1500 caractères) est acceptée...OK
// Il semble que la fonction 'http.setConnectTimeout()' soit buggée le changement de valeur est sans effet
//-----------------------------------------------------------------------------------------------
//String requeteServeur = ("https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=2023-12-17");
String requeteServeur = (  "https://particulier.edf.fr/services/rest/referentiel/historicEJPStore?searchType=EJP");
//String requeteServeur = ("https://www.howsmyssl.com/a/check");
//**********************************************************************************************

void setup() {
  Serial.begin(9600);
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.println("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Addresse: ");
  Serial.println(WiFi.localIP());

  http.begin(requeteServeur);
  http.setConnectTimeout(2000);
  int httpCode = http.GET();
  if(httpCode > 0)
    {
      Serial.println(http.getString());
    }
  else 
    { 
    Serial.print("Erreur ");
    Serial.println(httpCode);
    }
  http.end();
}

void loop() {
}

Les réponses sont:

  • Tempo : {"couleurJourJ":"TEMPO_BLEU","couleurJourJ1":"TEMPO_ROUGE"}
  • EJP : Erreur -11

J'espère avoir répondu 'dans les règles du forum'

Bonnes fêtes

Ricquet

Rebonjour.

Oui oui la réponse est tout à fait claire et OK !

J'ai chargé votre code sur un ESP32, et j'ai effectivement le même souci que vous.
Par contre, avec mon niveau de connaissances, je ne vois pas du tout d'où vient le problème.

Peut-être qu'un @J-M-L en saurait plus...

Roland