Ajout de l'export XML et brut



  • Grosse évolution, j'ai laissé l'ESP-01 et je suis passé au nodeMCU.
    Que du bonheur: l'alim est intégrée, j'ai plus d'entrées/sorties, et surtout, j'ai l'OTA qui fonctionne. Pur bonheur que de pouvoir faire des mises à jour sans démonter l'installation au sous-sol !
    Je ne constate plus de valeurs erronées, mais j'ignore si c'est lié au passage au nodeMCU ou à la nouvelle version de la librairie (ou au deux).

    Je suis donc passé à la nouvelle version du soft Wifinfo, et je vous fait profiter de deux modifs que j'y apporte.
    J'ai une ziBase, elle parle "XML", j'ai rajouté l'export XML et comme ça ne coute rien, l'export "brut".

    (Je n'utilise pas GIT, du coup, je mets ça un peu en vrac)

    Dans webserver.cpp:

    /* ======================================================================
    Function: sendXML
    Purpose : dump all values in XML
    Input   : linked list pointer on the concerned data
              true to dump all values, false for only modified ones
    Output  : - 
    Comments: -
    ====================================================================== */
    void sendXML(void)
    {
      ValueList * me = tinfo.getList();
      String response = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<data>\r\n";
      
      // Got at least one ?
      if (me) {
        // Json start
        response += F("<_UPTIME>");
        response += seconds;
        response += F("</_UPTIME>\r\n");    
    
        // Loop thru the node
        while (me->next) {
    
          // we're there
          ESP.wdtFeed();
    
          // go to next node
          me = me->next;
    
          response += F("<") ;
          response += me->name ;
          response += F(">") ;
          formatNumberJSON(response, me->value);
          response += F("</") ;
          response += me->name ;
          response += F(">\r\n") ;
        }
       // Json end
       response += F("</data>\r\n") ;
    
      } else {
        server.send ( 404, "text/plain", "No data" );
      }
      server.send ( 200, "text/xml", response );
    }
    
    /* ======================================================================
    Function: sendRAW
    Purpose : dump all values in JSON
    Input   : linked list pointer on the concerned data
              true to dump all values, false for only modified ones
    Output  : - 
    Comments: -
    ====================================================================== */
    void sendRAW(void)
    {
      ValueList * me = tinfo.getList();
      String response = "";
      
      // Got at least one ?
      if (me) {
        // Json start
        response += F("UPTIME ");
        response += seconds;
        response += F(" #\r\n");    
       
    
        // Loop thru the node
        while (me->next) {
    
          // we're there
          ESP.wdtFeed();
    
          // go to next node
          me = me->next;
    
          response += me->name ;
          response += F(" ") ;
          response += me->value ;
          response += F(" ") ;
          response += me->checksum ;
          response += F("\r\n") ;
        }
      } else {
        server.send ( 404, "text/plain", "No data" );
      }
      server.send ( 200, "text/plain", response );
    }
    

    rajout des définitions dans webserver.h

    void sendXML(void);
    void sendRAW(void);
    

    dans wifinfo.ino, fonction setup(), on ajoute les fonctions au serveur et j'en profite pour rajouter la prise en charge de "/restart" (car "/reset" me semble moins parlant, et j'ai déjà des scripts qui utilisent "/restart")

      server.on("/xml", sendXML);  
      server.on("/raw", sendRAW); 
      server.on("/restart", handleReset);
    

    Pour info, l'export "brut", je l'utilise via un ESP configuré en pont. Il lit en wifi les données brutes du vrai téléinfo, et me les redonne sur le port série. Cela simule la téléinfo d'un compteur EDF, et je vais pouvoir travailler "au chaud" sur d'autres modifs au lieu de me brancher dans le garage. En particulier, j'avais branché sur l'ESP01 un DHT11 pour lire la température, mais ça ne fonctionnais pas bien. Je vais pouvoir debugguer ça directement sur un second nodeMCU relié à mon PC.

    Autre modif, au niveau du "restart", je recharge la page d'accueil après reboot (délai de 30s en fait). Dans webserver.cpp, j'ai changé ça:

    const char FP_RESTART[] PROGMEM = "<html><head><META http-equiv=\"refresh\" content=\"30;URL=/\"></head><body>OK, Red&eacute;marrage en cours\r\n</body></html>";
    

    et 2 modifications identiques plus loin dans le code pour renvoyer du html au lieu de texte:

    server.send ( 200, "text/html", FPSTR(FP_RESTART) );
    

    Dernier point, une requète. Pour mettre à jour via web, il y a une vérification du nom de fichier. Serait-il possible de rajouter "Wifinfo.ino.bin", car c'est ainsi que l’éditeur nomme le fichier chez moi par défaut (ou m'indiquer le fichier à modifier)


  • Staff

    @mjeanne

    Excellent ça, je l'incorporerais dans la prochaine version, merci à toi.



  • ce n'était pas une grosse modif, j'ai copié la fonction d'export json.

    j'ajoute une autre modif, puisque j'ai résolu mon soucis avec mon capteur DHT11 (je déclarais une variable pour la broche utilisée, mais en fait, je ne m'étais pas rendu compte que j'appelais la fonction avec un numéro "en dur").

    Pour ajouter température et humidité, j'utilise les librairies d'Adafruit ("Adafruit DHT unified" et "DHT sensor library"):

    dans le fichier wifinfo.ino, du coté des déclarations de variables:

    #include <DHT.h>
    DHT dht(14, DHT11, 15);
    

    dans "UpdateSysinfo", la lecture de la sonde (avec 2 essais en cas de non réponse)

      int retry = 0;
      float h = dht.readHumidity();
      while (isnan(h) && (retry <2)) {
        delay(500);
        h = dht.readHumidity();
        retry++;    
      }
      sprintf( buff, "%f", h);
      sysinfo.humidity = h;
      float t = dht.readTemperature();
      retry = 0;
      while (isnan(t) && (retry <2)) {
        delay(500);
        t = dht.readTemperature();
        retry++;    
      }
      sprintf( buff, "%f C", t);
      sysinfo.temperature = t;
    

    Pour stocker les données, modif de la structure dans wifinfo.h:

    // sysinfo informations
    typedef struct 
    {
      String sys_uptime;
      String temperature;
      String humidity;    
    } _sysinfo;
    

    Dans webserver.cpp, modif de la sortie des infos "getSysJSONData"

      response += "{\"na\":\"Uptime\",\"va\":\"";
      response += sysinfo.sys_uptime;
      response += "\"},\r\n";
    
      response += "{\"na\":\"Temperature\",\"va\":\"";
      response += sysinfo.temperature ;
      response += " °C\"},\r\n";
    
      response += "{\"na\":\"Humidity\",\"va\":\"";
      response += sysinfo.humidity ;
      response += " %\"},\r\n";  
    

    j'exporte aussi ces données dans les exports json, xml et raw, dans leurs fonctions respective:

    void sendJSON(void)
    {
      ValueList * me = tinfo.getList();
      String response = "";
      
      // Got at least one ?
      if (me) {
        // Json start
        response += FPSTR(FP_JSON_START);
        response += F("\"_UPTIME\":");
        response += seconds;
        response += F(",\"_TEMPERATURE\":");
        response += sysinfo.temperature;
        response += F(",\"_HUMIDITY\":");
        response += sysinfo.humidity;  
    (...)
    }
    
    void sendXML(void)
    {
      ValueList * me = tinfo.getList();
      String response = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<data>\r\n";
      
      // Got at least one ?
      if (me) {
        // Json start
        response += F("<_UPTIME>");
        response += seconds;
        response += F("</_UPTIME>\r\n");    
        response += F("<T>");
        response += sysinfo.temperature;
        response += F("</T>\r\n");    
        response += F("<H>");
        response += sysinfo.humidity;
        response += F("</H>\r\n");   
    (...)
    }
    
    void sendRAW(void)
    {
      ValueList * me = tinfo.getList();
      String response = "";
      
      // Got at least one ?
      if (me) {
        // Json start
        response += F("UPTIME ");
        response += seconds;
        response += F(" #\r\n");    
        response += F("T ");
        response += sysinfo.temperature;
        response += F(" #\r\n");    
        response += F("H ");
        response += sysinfo.humidity;
        response += F(" #\r\n");   
    (...)
    }
    

    Selon la broche utilisée pour votre DHT11, changez la ligne
    DHT dht(14, DHT11, 15);
    J'utilise la GPIO14 (D5), car sur mon nodeMCU, on a cote à cote 3V-GND-D5, ce qui correspond à l'ordre des broches de mon capteur.
    alt text
    Attention si vous utilisez ce capteur:
    alt text
    L'ordre des broches est différent.
    Si vous utilisez un DHT22, ça marche aussi, il suffit de remplacer DHT11 par DHT22.
    Le 3ème paramètre (15) n'est normalement plus utilisé sur les versions récente de la librairie. Il permet d'ajuster la vitesse de lecture à la vitesse du CPU. C'est maintenant automatique.


Log in to reply
 

Looks like your connection to hallard.me's community was lost, please wait while we try to reconnect.