Page 2 sur 2

Re: récupérer fichier Json sous esp8266 et l’exploiter

Publié : 19 mai 2020, 17:33
par totof60
Merci de ton retour et de ton aide.( je n'avais pas vu que tu avais répondu!)
marsflow a écrit : 15 mai 2020, 23:49 bonsoir alors déjà pour décrypter le json distant tu as besoin de coller ton json actuel que tu souhaites récupérer sur ce site https://arduinojson.org/v5/assistant/
Je suis parti sur la version 6 de arduinojson donc : https://arduinojson.org/v6/assistant/

J'ai adapté le sketch afin d'afficher le retour d'une sonde température sur un afficheur a base de Max7219.
Le sketch fonctionne, pendant une bonne heure il affiche bien la bonne température.
Mais au bout d'une heure le sketch plante avec le message dans le moniteur serie :

Code : Tout sélectionner

deserializeJson() failed: NoMemory
Seul un reset du wemos le fait redemarrer
Voici le sketch si ça peut aider quelqu’un et si on peut m'aider!

Code : Tout sélectionner

#include <ESP8266WebServer.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <Wire.h>
#include <SPI.h>
#include <ArduinoJson.h>

#include <MD_Parola.h>
#include <MD_MAX72xx.h>

// Parametrage matrice  ( Pin Arduino ou est branché la matrice )
#define MAX_DEVICES 4 // ( nombre de matrice )
#define CLK_PIN   D5
#define DATA_PIN  D7
#define CS_PIN    D6
#define  MAX_INTENSITY 0xf



// initialisation de la matrice
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
MD_Parola P = MD_Parola(HARDWARE_TYPE,CS_PIN, MAX_DEVICES);
//MD_Parola P = MD_Parola(DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);

unsigned long delayTime;


const char* ssid     = "xxxxxxx"; //Nom du reseau wifi
const char* password = "xxxxxxx"; //mot de passe

const char* host = "192.168.0.236"; //Domoticz
const char* url = "/json.htm?type=devices&rid=194"; //Url du device à analyser


const uint16_t port = 8080;
const int   watchdog = 30000; // Fréquence de reception des données  Domoticz 
unsigned long previousMillis = millis();

ESP8266WebServer server ( 80 );
HTTPClient http;

 

void setup() {


 //init affichage
  P.begin();
  
  Serial.setDebugOutput(true);
  Serial.begin(115200);
  
#ifdef  __AVR_ATmega32U4__  // If this is a 32U4 processor, then wait 3 seconds to initialize USB
    delay(3000);
  #endif
    

  
  Serial.setDebugOutput(true);
  Serial.println("Connecting Wifi...");

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }


  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

}

int value = 0;

void loop() {

unsigned long currentMillis = millis();



if ( currentMillis - previousMillis > watchdog ) {
    previousMillis = currentMillis;
  
  WiFiClient client;
  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    delay(500);
    return;
  }

   if(WiFi.status() != WL_CONNECTED) {
      Serial.println("WiFi not connected !");
    } else {  
      Serial.println("reception data de Domoticz");

  Serial.println("passage ok");


  // Check HTTP status


  http.begin(host, port, url);
  int httpCode = http.GET();
  if (httpCode) {
    if (httpCode == 200) {
      String client = http.getString();
     Serial.println("200 OK");
    }
  }

  // Send HTTP request
  client.println(F("GET /json.htm?type=devices&rid=194 HTTP/1.0"));
  client.println(F("Host: http://192.168.0.236:8080"));
  client.println(F("Connection: close"));
  if (client.println() == 0) {
    Serial.println(F("Failed to send request"));
    return;
  }

  Serial.println("passage 2 ok");
  // Skip HTTP headers
  char endOfHeaders[] = "\r\n\r\n";
  if (!client.find(endOfHeaders)) {
    Serial.println(F("Invalid response"));
    return;
  }

  Serial.println("passage 3 ok");

  // Allocate the JSON document
  // Use arduinojson.org/assistant to compute the capacity.
  const size_t capacity = 2*JSON_ARRAY_SIZE(1) + JSON_OBJECT_SIZE(16) + JSON_OBJECT_SIZE(34) + 1559;
  DynamicJsonDocument doc(capacity);

  Serial.println(capacity);

  // Parse JSON object
  DeserializationError error = deserializeJson(doc, client);
  if (error) {
    Serial.print(F("deserializeJson() failed: "));
    Serial.println(error.c_str());
    return;
  }

  // Extract values
  JsonObject root = doc.as<JsonObject>();
  Serial.println(F("Response:"));

  long ActTime = root["ActTime"];
  const char* ServerTime = doc["ServerTime"];
  JsonObject result_0 = root["result"][0];
  const char* result_0_Data = result_0["Data"];
  const char* result_0_Name = result_0["Name"];
  float result_0_Temp = result_0["Temp"];
  

  Serial.println(ServerTime);
  Serial.println(result_0_Temp);
  Serial.println(result_0_Name);
  Serial.println(result_0_Data);

  P.begin();
 
  P.print(result_0_Data);

  // Disconnect
  client.stop();

 
   }
 
 
    }


}
J'ai mis des print pour suivre le debug

Merci à tous

Re: récupérer fichier Json sous esp8266 et l’exploiter

Publié : 28 mai 2020, 18:34
par totof60
Retour expérience:

Je n'ai pas trouvé le pourquoi de cette erreur mémoire au bout d'un certain temps.

Pour remédier à cela j'ai rajouté deux lignes après la détection d'erreur

Code : Tout sélectionner

Serial.println("Reset..");
    ESP.restart();

Un peu barbare dirons certain ! mais cela a solutionné mon problème.
L'afficheur récupère régulièrement la valeur de la sonde du Jacuzzi.
Et il l'affiche correctement !
Si une erreur est détectée il y a un reboot du wemos.
Pour ceux que cela intéresse ; la différence entre reset et restart :https://www.pieterverhees.nl/sparklesag ... sp-restart

Re: récupérer fichier Json sous esp8266 et l’exploiter

Publié : 28 mai 2020, 22:38
par Antori91
Bonsoir,
Concernant la différence entre reset et restart, je suis persuadé que le site que vous mentionnez n'a fait que copier ce que d'autres sites disent...De mon expérience, j'ai pas mal joué avec les esp.reset() et esp.restart() et ai même tenté de décrypter le code (sans succès. Extrait ci-dessous d'un de mes posts sur le ESP8266 community forum ), un esp.reset est beaucoup plus sûr en terme de réinitialisation de l'ESP8266, par exemple en cas de perte de connexion WiFi sans reconnexion automatique.

2. I looked in the ESPclass code to find what ESP.restart() and ESP.reset() do. I found
extern "C" void __real_system_restart_local ();
void EspClass :: reset (void)
{
__real_system_restart_local ();
}
void EspClass :: restart (void)
{
system_restart ();
esp_yield ();
}

Re: récupérer fichier Json sous esp8266 et l’exploiter

Publié : 29 mai 2020, 09:23
par totof60
Antori91 a écrit : 28 mai 2020, 22:38 Bonsoir,
Concernant la différence entre reset et restart, je suis persuadé que le site que vous mentionnez n'a fait que copier ce que d'autres sites disent...
Effectivement, j'ai cité cette publication au hasard car il y en plusieurs avec le même texte ; du pur copié collé.!
Je crois que j'avais vu ton post sur le forum esp8266 lors de mes recherches, ma recherche était : comment rebooter le wemos via le sketch.
https://www.esp8266.com/viewtopic.php?p=76361

Merci de ton retour, lors de ma prochaine modif de mon afficheur j'essayerai avec ESP.reset

Re: récupérer fichier Json sous esp8266 et l’exploiter

Publié : 29 mai 2020, 11:22
par Antori91
Pour l'erreur à l’initiative de cette file "deserializeJson() failed: NoMemory", cela ressemble au cas classique de l'objet maintes fois instancié et jamais détruit . J'utilise la même librairie sans connaître ce problème (il y a de mémoire deux façons d'utiliser la librairie: "objet statique ou non"). Vous pouvez regarder mon code à https://github.com/Antori91/Home_Automa ... %20modules

Re: récupérer fichier Json sous esp8266 et l’exploiter

Publié : 29 mai 2020, 17:20
par totof60
Antori91 a écrit : 29 mai 2020, 11:22 Pour l'erreur à l’initiative de cette file "deserializeJson() failed: NoMemory", cela ressemble au cas classique de l'objet maintes fois instancié et jamais détruit...
Merci de ton retour
C'est ce que j'ai cru comprendre mais je sais pas comment " détruire " les données une fois lues

Re: récupérer fichier Json sous esp8266 et l’exploiter

Publié : 31 mai 2020, 18:41
par Flying Domotic
Essaie de déplacer le traitement dans une routine que tu appelles depuis loop(), ça peut changer le comportement, notamment en détruisant l’objet Json à la sortie de la routine.

Re: récupérer fichier Json sous esp8266 et l’exploiter

Publié : 01 juin 2020, 13:43
par totof60
Flying Domotic a écrit : 31 mai 2020, 18:41 Essaie de déplacer le traitement dans une routine que tu appelles depuis loop(), ça peut changer le comportement, notamment en détruisant l’objet Json à la sortie de la routine.
Merci pour l'aide.
Mais vu que le sketch est issu de différentes origines, j'en ai fais un mélange pas très rigoureux !!!
Tu as un exemple vers quoi me diriger svp ?

Re: récupérer fichier Json sous esp8266 et l’exploiter

Publié : 06 juin 2020, 19:05
par Flying Domotic
Ton code actuel :

Code : Tout sélectionner

loop() {
  # la partie du code à déplacer
}
... devient :

Code : Tout sélectionner

maRoutine(): {
   # la partie du code à déplacer
}

loop: {
    maRoutine();
}
Les objets qui auront été créés dans maRoutine seront automatiquement détruits à sa sortie de la routine.

Re: récupérer fichier Json sous esp8266 et l’exploiter

Publié : 07 juin 2020, 10:53
par totof60
Merci

A tester