Community Forum
    • Blog
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    Ajout de l'export XML et brut

    Scheduled Pinned Locked Moved WifInfo
    3 Posts 2 Posters 2.1k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • M Offline
      mjeanne
      last edited by mjeanne

      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)

      1 Reply Last reply Reply Quote
      • CharlesC Offline
        Charles
        last edited by

        @mjeanne

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

        1 Reply Last reply Reply Quote
        • M Offline
          mjeanne
          last edited by mjeanne

          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.

          1 Reply Last reply Reply Quote
          • First post
            Last post

          0

          Online

          5.7k

          Users

          534

          Topics

          5.0k

          Posts

          Top Topics

          • Denky 4 - Domoticz - Triphasé -
            Nicolas BernaertsN
            Nicolas Bernaerts
            0
            7
            266

          • Denky D4 et Linky Standard TInfo Rx Non Configuré
            CharlesC
            Charles
            0
            5
            303

          Popular Tags

          teleinfo
          24 topics
          arduino
          19 topics
          remora
          16 topics
          esp8266
          10 topics
          arduipi
          10 topics
          wifinfo
          7 topics
          raspberry
          7 topics
          broadcast
          7 topics
          Copyright © 2022 Charles-Henri Hallard | Return to blog page | Powered by NodeBB