From 551def947256745da0494e47f000012335bc09c1 Mon Sep 17 00:00:00 2001 From: Doume Date: Fri, 30 Jun 2017 19:47:15 +0100 Subject: [PATCH 1/9] If list of Teleinfo values contains a corrupted variable name, force a reinit of LibTeleInfo List --- examples/Wifinfo/Wifinfo.h | 2 +- examples/Wifinfo/Wifinfo.ino | 28 +++-- examples/Wifinfo/data/index.htm.gz | Bin 8241 -> 8447 bytes examples/Wifinfo/webclient.cpp | 183 +++++++++++++++++------------ examples/Wifinfo/webclient.h | 8 +- examples/Wifinfo/webserver.cpp | 170 ++++++++++++++++++--------- examples/Wifinfo/webserver.h | 17 ++- 7 files changed, 264 insertions(+), 144 deletions(-) diff --git a/examples/Wifinfo/Wifinfo.h b/examples/Wifinfo/Wifinfo.h index e6eab12..0b2d037 100644 --- a/examples/Wifinfo/Wifinfo.h +++ b/examples/Wifinfo/Wifinfo.h @@ -50,7 +50,7 @@ extern "C" { #define DEBUG_SERIAL Serial1 #define DEBUG_SERIAL1 -#define WIFINFO_VERSION "1.0.2" +#define WIFINFO_VERSION "1.0.4" // I prefix debug macro to be sure to use specific for THIS library // debugging, this should not interfere with main sketch or other diff --git a/examples/Wifinfo/Wifinfo.ino b/examples/Wifinfo/Wifinfo.ino index 58065e1..6c37bdc 100644 --- a/examples/Wifinfo/Wifinfo.ino +++ b/examples/Wifinfo/Wifinfo.ino @@ -76,7 +76,10 @@ unsigned long seconds = 0; _sysinfo sysinfo; // count Wifi connect attempts, to check stability -int nb_reconnect = 0; +int nb_reconnect = 0; +bool need_reinit = false; +unsigned int nb_reinit = 0; +bool first_info_call=true; /* ====================================================================== Function: UpdateSysinfo @@ -681,6 +684,7 @@ void setup() server.on("/config_form.json", handleFormConfig); server.on("/json", sendJSON); server.on("/tinfo.json", tinfoJSONTable); + server.on("/emoncms.json", emoncmsJSONTable); server.on("/system.json", sysJSONTable); server.on("/config.json", confJSONTable); server.on("/spiffs.json", spiffsJSONTable); @@ -774,6 +778,8 @@ void setup() #endif // Init teleinfo + need_reinit=false; + nb_reinit++; tinfo.init(); // Attach the callback we need @@ -822,7 +828,7 @@ void loop() //webSocket.loop(); - // Only once task per loop, let system do it own task + // Only once task per loop, let system do its own task if (task_1_sec) { UpdateSysinfo(false, false); task_1_sec = false; @@ -837,14 +843,20 @@ void loop() task_httpRequest=false; } - // Handle teleinfo serial - if ( Serial.available() ) { - // Read Serial and process to tinfo - c = Serial.read(); - //Serial1.print(c); - tinfo.process(c); + if (need_reinit) { + //Some polluted entries have been detected in Teleinfo ListValues + need_reinit=false; + nb_reinit++; //account of reinit operations, for system infos + tinfo.init(); //Clear ListValues, buffer, and wait for next STX + } else { + // Handle teleinfo serial + if ( Serial.available() ) { + // Read Serial and process to tinfo + c = Serial.read(); + tinfo.process(c); } //delay(10); } +} diff --git a/examples/Wifinfo/data/index.htm.gz b/examples/Wifinfo/data/index.htm.gz index ff527289485265f25c55ca994fb91d721bf42054..12c4fabb32ca1b2181c312c1e597f52df04da6ca 100644 GIT binary patch literal 8447 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 literal 8241 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 diff --git a/examples/Wifinfo/webclient.cpp b/examples/Wifinfo/webclient.cpp index 184548d..466700b 100644 --- a/examples/Wifinfo/webclient.cpp +++ b/examples/Wifinfo/webclient.cpp @@ -63,9 +63,108 @@ boolean httpPost(char * host, uint16_t port, char * url) Debugf(" in %d ms\r\n",millis()-start); return ret; } +/* ====================================================================== +Function: build_emoncms_json string (usable by webserver.cpp) +Purpose : construct the json part of emoncms url +Input : - +Output : String if some Teleinfo data available +Comments: - +====================================================================== */ +String build_emoncms_json(void) +{ + boolean first_item = true; + + String url = "{" ; + + ValueList * me = tinfo.getList(); + + if (me && me->next) { + // Loop thru the node + while (me->next) { + + // go to next node + me = me->next; + + // First item do not add , separator + if (first_item) + first_item = false; + else + url += ","; + + if(validate_value_name(me->name)) { + url += me->name ; + url += ":" ; + + // EMONCMS ne sait traiter que des valeurs numériques, donc ici il faut faire une + // table de mappage, tout à fait arbitraire, mais c"est celle-ci dont je me sers + // depuis mes débuts avec la téléinfo + if (!strcmp(me->name, "OPTARIF")) { + // L'option tarifaire choisie (Groupe "OPTARIF") est codée sur 4 caractères alphanumériques + /* J'ai pris un nombre arbitraire codé dans l'ordre ci-dessous + je mets le 4eme char à 0, trop de possibilités + BASE => Option Base. + HC.. => Option Heures Creuses. + EJP. => Option EJP. + BBRx => Option Tempo + */ + char * p = me->value; + + if (*p=='B'&&*(p+1)=='A'&&*(p+2)=='S') url += "1"; + else if (*p=='H'&&*(p+1)=='C'&&*(p+2)=='.') url += "2"; + else if (*p=='E'&&*(p+1)=='J'&&*(p+2)=='P') url += "3"; + else if (*p=='B'&&*(p+1)=='B'&&*(p+2)=='R') url += "4"; + else url +="0"; + } else if (!strcmp(me->name, "HHPHC")) { + // L'horaire heures pleines/heures creuses (Groupe "HHPHC") est codé par un caractère A à Y + // J'ai choisi de prendre son code ASCII + int code = *me->value; + url += String(code); + } else if (!strcmp(me->name, "PTEC")) { + // La période tarifaire en cours (Groupe "PTEC"), est codée sur 4 caractères + /* J'ai pris un nombre arbitraire codé dans l'ordre ci-dessous + TH.. => Toutes les Heures. + HC.. => Heures Creuses. + HP.. => Heures Pleines. + HN.. => Heures Normales. + PM.. => Heures de Pointe Mobile. + HCJB => Heures Creuses Jours Bleus. + HCJW => Heures Creuses Jours Blancs (White). + HCJR => Heures Creuses Jours Rouges. + HPJB => Heures Pleines Jours Bleus. + HPJW => Heures Pleines Jours Blancs (White). + HPJR => Heures Pleines Jours Rouges. + */ + if (!strcmp(me->value, "TH..")) url += "1"; + else if (!strcmp(me->value, "HC..")) url += "2"; + else if (!strcmp(me->value, "HP..")) url += "3"; + else if (!strcmp(me->value, "HN..")) url += "4"; + else if (!strcmp(me->value, "PM..")) url += "5"; + else if (!strcmp(me->value, "HCJB")) url += "6"; + else if (!strcmp(me->value, "HCJW")) url += "7"; + else if (!strcmp(me->value, "HCJR")) url += "8"; + else if (!strcmp(me->value, "HPJB")) url += "9"; + else if (!strcmp(me->value, "HPJW")) url += "10"; + else if (!strcmp(me->value, "HPJR")) url += "11"; + else url +="0"; + } else { + url += me->value; + } + } else { + //Value name not valid : ignore this value, and + // force Teleinfo to reinit on next loop ! + need_reinit=true; + } + } // While me + + } //if me + // Json end + url += "}"; + + return url; +} /* ====================================================================== -Function: emoncmsPost +Function: emoncmsPost (called by main sketch on timer, if activated) Purpose : Do a http post to emoncms Input : Output : true if post returned 200 OK @@ -81,7 +180,7 @@ boolean emoncmsPost(void) // Got at least one ? if (me && me->next) { String url ; - boolean first_item; + url = *config.emoncms.url ? config.emoncms.url : "/"; url += "?"; @@ -93,83 +192,15 @@ boolean emoncmsPost(void) url += F("apikey=") ; url += config.emoncms.apikey; - url += F("&json={") ; - first_item = true; - - // Loop thru the node - while (me->next) { - // go to next node - me = me->next; - // First item do not add , separator - if (first_item) - first_item = false; - else - url += ","; - - url += me->name ; - url += ":" ; - - // EMONCMS ne sais traiter que des valeurs numériques, donc ici il faut faire une - // table de mappage, tout à fait arbitraire, mais c"est celle-ci dont je me sers - // depuis mes débuts avec la téléinfo - if (!strcmp(me->name, "OPTARIF")) { - // L'option tarifaire choisie (Groupe "OPTARIF") est codée sur 4 caractères alphanumériques - /* J'ai pris un nombre arbitraire codé dans l'ordre ci-dessous - je mets le 4eme char à 0, trop de possibilités - BASE => Option Base. - HC.. => Option Heures Creuses. - EJP. => Option EJP. - BBRx => Option Tempo - */ - char * p = me->value; - - if (*p=='B'&&*(p+1)=='A'&&*(p+2)=='S') url += "1"; - else if (*p=='H'&&*(p+1)=='C'&&*(p+2)=='.') url += "2"; - else if (*p=='E'&&*(p+1)=='J'&&*(p+2)=='P') url += "3"; - else if (*p=='B'&&*(p+1)=='B'&&*(p+2)=='R') url += "4"; - else url +="0"; - } else if (!strcmp(me->name, "HHPHC")) { - // L'horaire heures pleines/heures creuses (Groupe "HHPHC") est codé par un caractère A à Y - // J'ai choisi de prendre son code ASCII - int code = *me->value; - url += String(code); - } else if (!strcmp(me->name, "PTEC")) { - // La période tarifaire en cours (Groupe "PTEC"), est codée sur 4 caractères - /* J'ai pris un nombre arbitraire codé dans l'ordre ci-dessous - TH.. => Toutes les Heures. - HC.. => Heures Creuses. - HP.. => Heures Pleines. - HN.. => Heures Normales. - PM.. => Heures de Pointe Mobile. - HCJB => Heures Creuses Jours Bleus. - HCJW => Heures Creuses Jours Blancs (White). - HCJR => Heures Creuses Jours Rouges. - HPJB => Heures Pleines Jours Bleus. - HPJW => Heures Pleines Jours Blancs (White). - HPJR => Heures Pleines Jours Rouges. - */ - if (!strcmp(me->value, "TH..")) url += "1"; - else if (!strcmp(me->value, "HC..")) url += "2"; - else if (!strcmp(me->value, "HP..")) url += "3"; - else if (!strcmp(me->value, "HN..")) url += "4"; - else if (!strcmp(me->value, "PM..")) url += "5"; - else if (!strcmp(me->value, "HCJB")) url += "6"; - else if (!strcmp(me->value, "HCJW")) url += "7"; - else if (!strcmp(me->value, "HCJR")) url += "8"; - else if (!strcmp(me->value, "HPJB")) url += "9"; - else if (!strcmp(me->value, "HPJW")) url += "10"; - else if (!strcmp(me->value, "HPJR")) url += "11"; - else url +="0"; - } else { - url += me->value; - } - } // While me - - // Json end - url += "}"; + //append json list of values + url += F("&json=") ; + + url += build_emoncms_json(); //Get Teleinfo list of values + // And submit all to emoncms ret = httpPost( config.emoncms.host, config.emoncms.port, (char *) url.c_str()) ; + } // if me } // if host return ret; diff --git a/examples/Wifinfo/webclient.h b/examples/Wifinfo/webclient.h index a7f6acc..0642e7a 100644 --- a/examples/Wifinfo/webclient.h +++ b/examples/Wifinfo/webclient.h @@ -28,12 +28,18 @@ // Exported variables/object instancied in main sketch // =================================================== +extern bool need_reinit; -// declared exported function from route.cpp +// Exported function instancied in webserver.cpp +// ============================================= +extern bool validate_value_name(String name); + +// declared exported function from webclient.cpp // =================================================== boolean httpPost(char * host, uint16_t port, char * url); boolean emoncmsPost(void); boolean jeedomPost(void); boolean httpRequest(void); +String build_emoncms_json(void); #endif diff --git a/examples/Wifinfo/webserver.cpp b/examples/Wifinfo/webserver.cpp index 2c283f3..ba2f5ba 100644 --- a/examples/Wifinfo/webserver.cpp +++ b/examples/Wifinfo/webserver.cpp @@ -16,6 +16,8 @@ // // History : V1.00 2015-06-14 - First release // +// Modified by Doume 2017-06-29 : Try to avoid polluted ListedValues with Triphase counter +// // All text above must be included in any redistribution. // // ********************************************************************************** @@ -31,6 +33,16 @@ const char FP_QCNL[] PROGMEM = "\",\r\n\""; const char FP_RESTART[] PROGMEM = "OK, Redémarrage en cours\r\n"; const char FP_NL[] PROGMEM = "\r\n"; +//List of authorized value names in Teleinfo, to detect polluted entries +const String tabnames[35] = { + "ADCO" , "OPTARIF" , "ISOUSC" , "BASE", "HCHC" , "HCHP", + "IMAX" , "IINST" , "PTEC", "PMAX", "PAPP", "HHPHC" , "MOTDETAT" , "PPOT", + "IINST1" , "IINST2" , "IINST3", "IMAX1" , "IMAX2" , "IMAX3" , + "EJPHN" , "EJPHPM" , "BBRHCJB" , "BBRHPJB", "BBRHCJW" , "BBRHPJW" , "BBRHCJR" , + "BBRHPJR" , "PEJP" , "DEMAIN" , "ADPS" , "ADIR1", "ADIR2" , "ADIR3" + }; + + /* ====================================================================== Function: formatSize Purpose : format a asize to human readable format @@ -292,26 +304,48 @@ Comments: - ====================================================================== */ void tinfoJSONTable(void) { + // we're there + ESP.wdtFeed(); //Force software wadchog to restart from 0 + ValueList * me = tinfo.getList(); String response = ""; // Just to debug where we are Debug(F("Serving /tinfo page...\r\n")); + if (! me ) //&& first_info_call) + { + //Let tinfo such time to build a list.... + first_info_call=false; + unsigned long topdebut = millis(); + bool expired = false; + while (! expired ) { + if( (millis() - topdebut ) >= 3000 ) { + expired = true; // 3 seconds delay expired + } else { + yield(); //Let CPU to other threads + } + } + // continue, hoping list values is now ready + me = tinfo.getList(); + } + // Got at least one ? if (me) { uint8_t index=0; - + + first_info_call=false; boolean first_item = true; // Json start response += F("[\r\n"); // Loop thru the node while (me->next) { + index++; + //if(index > 17) //Max number of lines, for a triphase counter + // break; - // we're there - ESP.wdtFeed(); - + // go to next node me = me->next; @@ -321,49 +355,24 @@ void tinfoJSONTable(void) else response += F(",\r\n"); -/* - Debug(F("(")) ; - Debug(++index) ; - Debug(F(") ")) ; - - if (me->name) Debug(me->name) ; - else Debug(F("NULL")) ; - - Debug(F("=")) ; - - if (me->value) Debug(me->value) ; - else Debug(F("NULL")) ; - - Debug(F(" '")) ; - Debug(me->checksum) ; - Debug(F("' ")); - - // Flags management - if ( me->flags) { - Debug(F("Flags:0x")); - Debugf("%02X => ", me->flags); - if ( me->flags & TINFO_FLAGS_EXIST) - Debug(F("Exist ")) ; - if ( me->flags & TINFO_FLAGS_UPDATED) - Debug(F("Updated ")) ; - if ( me->flags & TINFO_FLAGS_ADDED) - Debug(F("New ")) ; + if(validate_value_name(me->name)) { + //It's a known name : process the entry + response += F("{\"na\":\""); + response += me->name ; + response += F("\", \"va\":\"") ; + response += me->value; + response += F("\", \"ck\":\"") ; + if (me->checksum == '"' || me->checksum == '\\' || me->checksum == '/') + response += '\\'; + response += (char) me->checksum; + response += F("\", \"fl\":"); + response += me->flags ; + response += '}' ; + } else { + //Don't put this line in table : name is corrupted ! + need_reinit=true; } - Debugln() ; -*/ - response += F("{\"na\":\""); - response += me->name ; - response += F("\", \"va\":\"") ; - response += me->value; - response += F("\", \"ck\":\"") ; - if (me->checksum == '"' || me->checksum == '\\' || me->checksum == '/') - response += '\\'; - response += (char) me->checksum; - response += F("\", \"fl\":"); - response += me->flags ; - response += '}' ; - } // Json end response += F("\r\n]"); @@ -375,12 +384,9 @@ void tinfoJSONTable(void) Debug(F("sending...")); server.send ( 200, "text/json", response ); Debugln(F("OK!")); + yield(); //Let a chance to other threads to work } - - - - /* ====================================================================== Function: getSysJSONData Purpose : Return JSON string containing system data @@ -421,6 +427,10 @@ void getSysJSONData(String & response) response += nb_reconnect; response += "\"},\r\n"; + response += "{\"na\":\"Nb initialisations Teleinformation\",\"va\":\""; + response += nb_reinit; + response += "\"},\r\n"; + response += "{\"na\":\"WifInfo Version\",\"va\":\"" WIFINFO_VERSION "\"},\r\n"; response += "{\"na\":\"Compile le\",\"va\":\"" __DATE__ " " __TIME__ "\"},\r\n"; @@ -492,13 +502,34 @@ Comments: - void sysJSONTable() { String response = ""; - + + ESP.wdtFeed(); //Force software watchdog to restart from 0 getSysJSONData(response); // Just to debug where we are Debug(F("Serving /system page...")); server.send ( 200, "text/json", response ); Debugln(F("Ok!")); + yield(); //Let a chance to other threads to work +} + +/* ====================================================================== +Function: emoncmsJSONTable (added by Doume) +Purpose : prepare the JSON table needed to fill emoncms server with values + some values have been translated, because emoncms only + accept numeric values +Input : - +Output : Teleinfo values translated and filtered +Comments: - +====================================================================== */ +void emoncmsJSONTable() +{ + + String response = build_emoncms_json(); + + server.send ( 200, "text/json", response ); + + yield(); //Let a chance to other threads to work } @@ -558,11 +589,13 @@ Comments: - void confJSONTable() { String response = ""; + //ESP.wdtFeed(); //Force software watchdog to restart from 0 getConfJSONData(response); // Just to debug where we are Debug(F("Serving /config page...")); server.send ( 200, "text/json", response ); Debugln(F("Ok!")); + yield(); //Let a chance to other threads to work } /* ====================================================================== @@ -630,8 +663,10 @@ Comments: - void spiffsJSONTable() { String response = ""; + //ESP.wdtFeed(); //Force software watchdog to restart from 0 getSpiffsJSONData(response); server.send ( 200, "text/json", response ); + yield(); //Let a chance to other threads to work } /* ====================================================================== @@ -647,6 +682,8 @@ void sendJSON(void) ValueList * me = tinfo.getList(); String response = ""; + ESP.wdtFeed(); //Force software watchdog to restart from 0 + // Got at least one ? if (me) { // Json start @@ -658,10 +695,15 @@ void sendJSON(void) while (me->next) { // go to next node me = me->next; - response += F(",\"") ; - response += me->name ; - response += F("\":") ; - formatNumberJSON(response, me->value); + if(validate_value_name(me->name)) { + //It's a known name : process the entry + response += F(",\"") ; + response += me->name ; + response += F("\":") ; + formatNumberJSON(response, me->value); + } else { + need_reinit=true; + } } // Json end response += FPSTR(FP_JSON_END) ; @@ -670,6 +712,7 @@ void sendJSON(void) server.send ( 404, "text/plain", "No data" ); } server.send ( 200, "text/json", response ); + yield(); //Let a chance to other threads to work } @@ -722,6 +765,7 @@ void wifiScanJSON(void) Debug(F("sending...")); server.send ( 200, "text/json", response ); Debugln(F("Ok!")); + yield(); //Let a chance to other threads to work } @@ -850,4 +894,22 @@ void handleNotFound(void) // Led off LedBluOFF(); } +/* ====================================================================== +Function: validate_value_name +Purpose : check if value name is in known range of values.... +Input : name to check +Output : true if OK, false otherwise +Comments: - +====================================================================== */ +bool validate_value_name(String name) +{ + + for (int i=0 ; i < 35; i++ ) { + if( (tabnames[i].length() == name.length()) && (tabnames[i] == name) ) { + return true; + } + } + return false; //Not an existing name ! + //return true; +} diff --git a/examples/Wifinfo/webserver.h b/examples/Wifinfo/webserver.h index 3a33f90..657d419 100644 --- a/examples/Wifinfo/webserver.h +++ b/examples/Wifinfo/webserver.h @@ -31,11 +31,18 @@ // Exported variables/object instancied in main sketch // =================================================== -extern char response[]; -extern uint16_t response_idx; -extern int nb_reconnect; +extern char response[]; +extern uint16_t response_idx; +extern int nb_reconnect; +extern unsigned int nb_reinit; +extern bool need_reinit; +extern bool first_info_call; -// declared exported function from route.cpp +// Exported function instancied in webclient.cpp +// ============================================= +extern String build_emoncms_json(void); + +// declared exported function from webserver.cpp // =================================================== void handleTest(void); void handleRoot(void); @@ -44,6 +51,7 @@ void handleNotFound(void); void tinfoJSONTable(void); void getSysJSONData(String & r); void sysJSONTable(void); +void emoncmsJSONTable(void); //Added by Doume void getConfJSONData(String & r); void confJSONTable(void); void getSpiffsJSONData(String & r); @@ -52,5 +60,6 @@ void sendJSON(void); void wifiScanJSON(void); void handleFactoryReset(void); void handleReset(void); +bool validate_value_name(String name); #endif From 4873cc96c9f8a3c852ba5b3787561cc77746b887 Mon Sep 17 00:00:00 2001 From: Doume Date: Sun, 23 Jul 2017 14:22:40 +0100 Subject: [PATCH 2/9] V 1.0.5 : Don't use anymore malloc / free : Use static data table in LibTeleinfo --- README.md | 21 +- examples/Wifinfo/Wifinfo.h | 4 +- examples/Wifinfo/Wifinfo.ino | 58 +++- examples/Wifinfo/webclient.cpp | 152 ++++++----- examples/Wifinfo/webserver.cpp | 103 ++++---- library.json | 6 +- library.properties | 4 +- src/LibTeleinfo.cpp | 469 ++++++++++++++------------------- src/LibTeleinfo.h | 25 +- 9 files changed, 440 insertions(+), 402 deletions(-) diff --git a/README.md b/README.md index fcba5a5..951e0ea 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,26 @@ # Teleinfo Universal Library This is a fork of Teleinfo Universal Library for the ESP8266 MCU This is a generic Teleinfo French Meter Measure Library -- Github source : +- Initial Github source : +- Modified Github source : + +# Modifications par Doume (version 1.0.5) : +- Add support for request /emoncms.json + return a json list formated to interface emoncms server from a 3rd party + That allow to don't activate emoncms http client inside Wifinfo module +- Add possibility to compile a version of sketch for module not connected to EDF counter + Activate #define SIMU into Wifinfo.h, to obtain a version which will create + 2 variables and update one of them each second, to verify package +- Add a check on variable names, and force a reinit of LibTeleinfo interface if an + alteration is detected (each restart is counted, and displayed in 'system' page ) +- Change library LibTeleinfo.cpp, to don't use anymore malloc/free system APIs + Variables are now stored in static table, allocated on start + 50 entries max, name length 16 bytes max, value length 16 bytes max + To use this library version : + First, backup your old version of LibTeleinfo.... + copy files src/LibTeleinfo.cpp and src/LibTeleinfo.h into your Arduino + environment (generally ~/Arduino/libraries/LibTeleinfo-master/src ) + before to compile sketch # Added features : - Add possibility to configure HttpRequest to send parameters/values to Domoticz diff --git a/examples/Wifinfo/Wifinfo.h b/examples/Wifinfo/Wifinfo.h index 0b2d037..f02c506 100644 --- a/examples/Wifinfo/Wifinfo.h +++ b/examples/Wifinfo/Wifinfo.h @@ -45,12 +45,14 @@ extern "C" { #include "webclient.h" #include "config.h" +// Declare SIMU to work and test a non connected module +//#define SIMU #define DEBUG #define DEBUG_SERIAL Serial1 #define DEBUG_SERIAL1 -#define WIFINFO_VERSION "1.0.4" +#define WIFINFO_VERSION "1.0.5" // I prefix debug macro to be sure to use specific for THIS library // debugging, this should not interfere with main sketch or other diff --git a/examples/Wifinfo/Wifinfo.ino b/examples/Wifinfo/Wifinfo.ino index 6c37bdc..9470630 100644 --- a/examples/Wifinfo/Wifinfo.ino +++ b/examples/Wifinfo/Wifinfo.ino @@ -18,6 +18,15 @@ // // All text above must be included in any redistribution. // +// Modifié par Dominique DAMBRAIN 2017-07-10 (http://www.dambrain.fr) +// Version 1.0.5 +// Librairie LibTeleInfo : Allocation statique d'un tableau de stockage +// des variables (50 entrées) afin de proscrire les malloc/free +// pour éviter les altérations des noms & valeurs +// Modification en conséquence des séquences de scanning du tableau +// ATTENTION : Nécessite probablement un ESP-8266 type Wemos D1, +// car les variables globales occupent 42.284 octets +// // ********************************************************************************** // Include Arduino header #include @@ -81,6 +90,16 @@ bool need_reinit = false; unsigned int nb_reinit = 0; bool first_info_call=true; +#ifdef SIMU +//for tests +uint8_t flags = 8; +int loop_cpt = 60000; +String name2 = "HCHC"; +char * s2 = (char *)name2.c_str(); +String value2 = "000060000"; +char * v2 = (char *) value2.c_str(); +#endif + /* ====================================================================== Function: UpdateSysinfo Purpose : update sysinfo variables @@ -301,8 +320,8 @@ void NewFrame(ValueList * me) rgb_ticker.once_ms( (uint32_t) BLINK_LED_MS, LedOff, (int) RGB_LED_PIN); } - sprintf_P( buff, PSTR("New Frame (%ld Bytes free)"), ESP.getFreeHeap() ); - Debugln(buff); + //sprintf_P( buff, PSTR("New Frame (%ld Bytes free)"), ESP.getFreeHeap() ); + //Debugln(buff); } /* ====================================================================== @@ -325,8 +344,8 @@ void UpdatedFrame(ValueList * me) rgb_ticker.once_ms(BLINK_LED_MS, LedOff, RGB_LED_PIN); } - sprintf_P( buff, PSTR("Updated Frame (%ld Bytes free)"), ESP.getFreeHeap() ); - Debugln(buff); + //sprintf_P( buff, PSTR("Updated Frame (%ld Bytes free)"), ESP.getFreeHeap() ); + //Debugln(buff); /* // Got at least one ? @@ -779,7 +798,6 @@ void setup() // Init teleinfo need_reinit=false; - nb_reinit++; tinfo.init(); // Attach the callback we need @@ -809,6 +827,21 @@ void setup() // HTTP Request Update if needed if (config.httpReq.freq) Tick_httpRequest.attach(config.httpReq.freq, Task_httpRequest); + +//To simulate Teleinfo on not connected module +#ifdef SIMU + String name1 = "ADCO"; + String value1 = "01234546789012"; + + char * s1 = (char *)name1.c_str(); + char * v1 = (char *)value1.c_str(); + flags = TINFO_FLAGS_ADDED; + tinfo.addCustomValue(s1, v1, &flags); //ADCO arbitrary value + tinfo.addCustomValue(s2, v2, &flags); //counter value + flags = TINFO_FLAGS_NONE; + tinfo.valuesDump(); +#endif + } /* ====================================================================== @@ -832,6 +865,21 @@ void loop() if (task_1_sec) { UpdateSysinfo(false, false); task_1_sec = false; + +//To simulate Teleinfo on not connected module +#ifdef SIMU + loop_cpt++; + if(loop_cpt % 10) + { + // each 10 second, try to change HCHC value + //Increase v2 value + sprintf(v2, "%09d", (loop_cpt) ); + // and update ListValues + flags = TINFO_FLAGS_UPDATED; + tinfo.addCustomValue(s2, v2, &flags); + } +#endif + } else if (task_emoncms) { emoncmsPost(); task_emoncms=false; diff --git a/examples/Wifinfo/webclient.cpp b/examples/Wifinfo/webclient.cpp index 466700b..56ced86 100644 --- a/examples/Wifinfo/webclient.cpp +++ b/examples/Wifinfo/webclient.cpp @@ -78,83 +78,89 @@ String build_emoncms_json(void) ValueList * me = tinfo.getList(); - if (me && me->next) { + if (me) { // Loop thru the node while (me->next) { - - // go to next node - me = me->next; - - // First item do not add , separator - if (first_item) - first_item = false; - else - url += ","; - if(validate_value_name(me->name)) { - url += me->name ; - url += ":" ; - - // EMONCMS ne sait traiter que des valeurs numériques, donc ici il faut faire une - // table de mappage, tout à fait arbitraire, mais c"est celle-ci dont je me sers - // depuis mes débuts avec la téléinfo - if (!strcmp(me->name, "OPTARIF")) { - // L'option tarifaire choisie (Groupe "OPTARIF") est codée sur 4 caractères alphanumériques - /* J'ai pris un nombre arbitraire codé dans l'ordre ci-dessous - je mets le 4eme char à 0, trop de possibilités - BASE => Option Base. - HC.. => Option Heures Creuses. - EJP. => Option EJP. - BBRx => Option Tempo - */ - char * p = me->value; + if(! first_item) + // go to next node + me = me->next; + + if( ! me->free ) { + + + // On first item, do not add , separator + if (first_item) + first_item = false; + else + url += ","; - if (*p=='B'&&*(p+1)=='A'&&*(p+2)=='S') url += "1"; - else if (*p=='H'&&*(p+1)=='C'&&*(p+2)=='.') url += "2"; - else if (*p=='E'&&*(p+1)=='J'&&*(p+2)=='P') url += "3"; - else if (*p=='B'&&*(p+1)=='B'&&*(p+2)=='R') url += "4"; - else url +="0"; - } else if (!strcmp(me->name, "HHPHC")) { - // L'horaire heures pleines/heures creuses (Groupe "HHPHC") est codé par un caractère A à Y - // J'ai choisi de prendre son code ASCII - int code = *me->value; - url += String(code); - } else if (!strcmp(me->name, "PTEC")) { - // La période tarifaire en cours (Groupe "PTEC"), est codée sur 4 caractères - /* J'ai pris un nombre arbitraire codé dans l'ordre ci-dessous - TH.. => Toutes les Heures. - HC.. => Heures Creuses. - HP.. => Heures Pleines. - HN.. => Heures Normales. - PM.. => Heures de Pointe Mobile. - HCJB => Heures Creuses Jours Bleus. - HCJW => Heures Creuses Jours Blancs (White). - HCJR => Heures Creuses Jours Rouges. - HPJB => Heures Pleines Jours Bleus. - HPJW => Heures Pleines Jours Blancs (White). - HPJR => Heures Pleines Jours Rouges. - */ - if (!strcmp(me->value, "TH..")) url += "1"; - else if (!strcmp(me->value, "HC..")) url += "2"; - else if (!strcmp(me->value, "HP..")) url += "3"; - else if (!strcmp(me->value, "HN..")) url += "4"; - else if (!strcmp(me->value, "PM..")) url += "5"; - else if (!strcmp(me->value, "HCJB")) url += "6"; - else if (!strcmp(me->value, "HCJW")) url += "7"; - else if (!strcmp(me->value, "HCJR")) url += "8"; - else if (!strcmp(me->value, "HPJB")) url += "9"; - else if (!strcmp(me->value, "HPJW")) url += "10"; - else if (!strcmp(me->value, "HPJR")) url += "11"; - else url +="0"; - } else { - url += me->value; - } - } else { - //Value name not valid : ignore this value, and - // force Teleinfo to reinit on next loop ! - need_reinit=true; - } - } // While me + + if(validate_value_name(me->name)) { + url += me->name ; + url += ":" ; + + // EMONCMS ne sait traiter que des valeurs numériques, donc ici il faut faire une + // table de mappage, tout à fait arbitraire, mais c"est celle-ci dont je me sers + // depuis mes débuts avec la téléinfo + if (!strcmp(me->name, "OPTARIF")) { + // L'option tarifaire choisie (Groupe "OPTARIF") est codée sur 4 caractères alphanumériques + /* J'ai pris un nombre arbitraire codé dans l'ordre ci-dessous + je mets le 4eme char à 0, trop de possibilités + BASE => Option Base. + HC.. => Option Heures Creuses. + EJP. => Option EJP. + BBRx => Option Tempo + */ + char * p = me->value; + + if (*p=='B'&&*(p+1)=='A'&&*(p+2)=='S') url += "1"; + else if (*p=='H'&&*(p+1)=='C'&&*(p+2)=='.') url += "2"; + else if (*p=='E'&&*(p+1)=='J'&&*(p+2)=='P') url += "3"; + else if (*p=='B'&&*(p+1)=='B'&&*(p+2)=='R') url += "4"; + else url +="0"; + } else if (!strcmp(me->name, "HHPHC")) { + // L'horaire heures pleines/heures creuses (Groupe "HHPHC") est codé par un caractère A à Y + // J'ai choisi de prendre son code ASCII + int code = *me->value; + url += String(code); + } else if (!strcmp(me->name, "PTEC")) { + // La période tarifaire en cours (Groupe "PTEC"), est codée sur 4 caractères + /* J'ai pris un nombre arbitraire codé dans l'ordre ci-dessous + TH.. => Toutes les Heures. + HC.. => Heures Creuses. + HP.. => Heures Pleines. + HN.. => Heures Normales. + PM.. => Heures de Pointe Mobile. + HCJB => Heures Creuses Jours Bleus. + HCJW => Heures Creuses Jours Blancs (White). + HCJR => Heures Creuses Jours Rouges. + HPJB => Heures Pleines Jours Bleus. + HPJW => Heures Pleines Jours Blancs (White). + HPJR => Heures Pleines Jours Rouges. + */ + if (!strcmp(me->value, "TH..")) url += "1"; + else if (!strcmp(me->value, "HC..")) url += "2"; + else if (!strcmp(me->value, "HP..")) url += "3"; + else if (!strcmp(me->value, "HN..")) url += "4"; + else if (!strcmp(me->value, "PM..")) url += "5"; + else if (!strcmp(me->value, "HCJB")) url += "6"; + else if (!strcmp(me->value, "HCJW")) url += "7"; + else if (!strcmp(me->value, "HCJR")) url += "8"; + else if (!strcmp(me->value, "HPJB")) url += "9"; + else if (!strcmp(me->value, "HPJW")) url += "10"; + else if (!strcmp(me->value, "HPJR")) url += "11"; + else url +="0"; + } else { + url += me->value; + } + } else { + //Value name not valid : ignore this value, and + // force Teleinfo to reinit on next loop ! + need_reinit=true; + } + } //not free entry + } // While next } //if me // Json end diff --git a/examples/Wifinfo/webserver.cpp b/examples/Wifinfo/webserver.cpp index ba2f5ba..478739c 100644 --- a/examples/Wifinfo/webserver.cpp +++ b/examples/Wifinfo/webserver.cpp @@ -329,7 +329,7 @@ void tinfoJSONTable(void) // continue, hoping list values is now ready me = tinfo.getList(); } - + //tinfo.valuesDump(); // Got at least one ? if (me) { uint8_t index=0; @@ -342,35 +342,37 @@ void tinfoJSONTable(void) // Loop thru the node while (me->next) { index++; - //if(index > 17) //Max number of lines, for a triphase counter - // break; + + if(! first_item) + // go to next node + me = me->next; - // go to next node - me = me->next; - - // First item do not add , separator - if (first_item) - first_item = false; - else - response += F(",\r\n"); - - if(validate_value_name(me->name)) { - //It's a known name : process the entry - response += F("{\"na\":\""); - response += me->name ; - response += F("\", \"va\":\"") ; - response += me->value; - response += F("\", \"ck\":\"") ; - if (me->checksum == '"' || me->checksum == '\\' || me->checksum == '/') - response += '\\'; - response += (char) me->checksum; - response += F("\", \"fl\":"); - response += me->flags ; - response += '}' ; - } else { - //Don't put this line in table : name is corrupted ! - need_reinit=true; + + if( ! me->free ) { + // First item do not add , separator + if (first_item) + first_item = false; + else + response += F(",\r\n"); + + if(validate_value_name(me->name)) { + //It's a known name : process the entry + response += F("{\"na\":\""); + response += me->name ; + response += F("\", \"va\":\"") ; + response += me->value; + response += F("\", \"ck\":\"") ; + if (me->checksum == '"' || me->checksum == '\\' || me->checksum == '/') + response += '\\'; + response += (char) me->checksum; + response += F("\", \"fl\":"); + response += me->flags ; + response += '}' ; + } else { + //Don't put this line in table : name is corrupted ! + need_reinit=true; + } } } @@ -383,6 +385,7 @@ void tinfoJSONTable(void) } Debug(F("sending...")); server.send ( 200, "text/json", response ); + //Debugln(response); Debugln(F("OK!")); yield(); //Let a chance to other threads to work } @@ -427,7 +430,7 @@ void getSysJSONData(String & response) response += nb_reconnect; response += "\"},\r\n"; - response += "{\"na\":\"Nb initialisations Teleinformation\",\"va\":\""; + response += "{\"na\":\"Altérations Data détectées\",\"va\":\""; response += nb_reinit; response += "\"},\r\n"; @@ -524,11 +527,12 @@ Comments: - ====================================================================== */ void emoncmsJSONTable() { - + Debug(F("Serving /emoncms.json page...")); String response = build_emoncms_json(); server.send ( 200, "text/json", response ); - + //Debugln(response); + Debugln(F("Ok!")); yield(); //Let a chance to other threads to work } @@ -679,11 +683,13 @@ Comments: - ====================================================================== */ void sendJSON(void) { + boolean first_item = true; ValueList * me = tinfo.getList(); String response = ""; ESP.wdtFeed(); //Force software watchdog to restart from 0 - + + Debug(F("Serving /json page...")); // Got at least one ? if (me) { // Json start @@ -693,18 +699,25 @@ void sendJSON(void) // Loop thru the node while (me->next) { - // go to next node - me = me->next; - if(validate_value_name(me->name)) { - //It's a known name : process the entry - response += F(",\"") ; - response += me->name ; - response += F("\":") ; - formatNumberJSON(response, me->value); - } else { - need_reinit=true; - } - } + if(! first_item) + // go to next node + me = me->next; + + if( ! me->free ) { + if (first_item) + first_item = false; + + if(validate_value_name(me->name)) { + //It's a known name : process the entry + response += F(",\"") ; + response += me->name ; + response += F("\":") ; + formatNumberJSON(response, me->value); + } else { + need_reinit=true; + } // name validity + } //free entry + } //while // Json end response += FPSTR(FP_JSON_END) ; @@ -712,6 +725,8 @@ void sendJSON(void) server.send ( 404, "text/plain", "No data" ); } server.send ( 200, "text/json", response ); + //Debugln(response); + Debugln(F("Ok!")); yield(); //Let a chance to other threads to work } diff --git a/library.json b/library.json index e6d3bdb..bbfb054 100644 --- a/library.json +++ b/library.json @@ -5,13 +5,15 @@ "repository": { "type": "git", - "url": "https://github.com/hallard/LibTeleinfo.git" + "url": "https://github.com/Doume/LibTeleinfo.git" }, - "version": "1.0.2", + "version": "1.0.5", "authors": { "name": "Charles-Henri Hallard", "url": "http://hallard.me" + "name": "Dominique DAMBRAIN", + "url": "http://www.dambrain.fr" }, "frameworks": "arduino", "platforms": "*" diff --git a/library.properties b/library.properties index 8278793..fc06ebe 100644 --- a/library.properties +++ b/library.properties @@ -1,7 +1,7 @@ name=LibTeleinfo -version=1.0.2 +version=1.0.5 author=Charles-Henri Hallard -maintainer=Charles-Henri Hallard +maintainer=Charles-Henri Hallard , Dominique DAMBRAIN sentence=Teleinfo French power meter reader and decoding paragraph=This is a generic Teleinfo French Meter Measure Library, it can be used on Arduino, Particle, ESP8266, Raspberry PI or anywhere you can do Cpp coding. category=Communication diff --git a/src/LibTeleinfo.cpp b/src/LibTeleinfo.cpp index 0ec99fa..b98bcf9 100644 --- a/src/LibTeleinfo.cpp +++ b/src/LibTeleinfo.cpp @@ -19,9 +19,22 @@ // // Edit : Tab size set to 2 but I converted tab to sapces // +// Modifié par Dominique DAMBRAIN 2017-07-10 (http://www.dambrain.fr) +// Version 1.0.5 +// Librairie LibTeleInfo : Allocation statique d'un tableau de stockage +// des variables (50 entrées) afin de proscrire les malloc/free +// pour éviter les altérations des noms & valeurs +// Modification en conséquence des séquences de scanning du tableau +// ATTENTION : Nécessite probablement un ESP-8266 type Wemos D1, +// car les variables globales occupent 42.284 octets +// // ********************************************************************************** #include "LibTeleinfo.h" +int ValueItem = 0; //Index of next position to use +struct _ValueList ValuesTab[50]; //Allocate static table of 50 items + // to don't use anymore malloc & free + /* ====================================================================== Class : TInfo @@ -32,11 +45,25 @@ Comments: - ====================================================================== */ TInfo::TInfo() { + ValueList * me; // Init of our linked list +/* _valueslist.name = NULL; _valueslist.value = NULL; +*/ +/* _valueslist.checksum = '\0'; _valueslist.flags = TINFO_FLAGS_NONE; +*/ + for(int i = 0; i < 50; i++) { + me = &ValuesTab[i]; + memset(&ValuesTab[i], 0, sizeof(_ValueList) ); //Also reset the 'free' marker + me->free=1; //Init each entry as free + me->flags = TINFO_FLAGS_NONE; + if(i < 49) + me->next = &ValuesTab[i+1]; + } + // callback _fn_ADPS = NULL; @@ -177,12 +204,12 @@ Comments: - state of the label changed by the function ====================================================================== */ ValueList * TInfo::valueAdd(char * name, char * value, uint8_t checksum, uint8_t * flags) { - // Get our linked list - ValueList * me = &_valueslist; - + uint8_t lgname = strlen(name); uint8_t lgvalue = strlen(value); uint8_t thischeck = calcChecksum(name,value); + int firstfree = -1; + ValueList * me; // just some paranoia if (thischeck != checksum ) { @@ -190,121 +217,76 @@ ValueList * TInfo::valueAdd(char * name, char * value, uint8_t checksum, uint8_t TI_Debug('='); TI_Debug(value); TI_Debug(F(" '")); - TI_Debug((char) cheksum); + TI_Debug((char) checksum); TI_Debug(F("' Not added bad checksum calculated '")); TI_Debug((char) thischeck); TI_Debugln(F("'")); } else { // Got one and all seems good ? - if (me && lgname && lgvalue && checksum) { - // Create pointer on the new node - ValueList *newNode = NULL; - ValueList *parNode = NULL ; - - // Loop thru the node - while (me->next) { - // save parent node - parNode = me ; - - // go to next node - me = me->next; - - // Check if we already have this LABEL - if (strncmp(me->name, name, lgname) == 0) { - // Already got also this value, return US - if (strncmp(me->value, value, lgvalue) == 0) { - *flags |= TINFO_FLAGS_EXIST; - me->flags = *flags; - return ( me ); - } else { - // We changed the value - *flags |= TINFO_FLAGS_UPDATED; - me->flags = *flags ; - // Do we have enought space to hold new value ? - if (strlen(me->value) >= lgvalue ) { - // Copy it - strncpy(me->value, value , lgvalue ); - me->checksum = checksum ; - - // That's all - return (me); - } else { - // indicate our parent node that the next node - // is not us anymore but the next we have - parNode->next = me->next; - - // free up this node - free (me); - - // Return to parent (that will now point on next node and not us) - // and continue loop just in case we have sevral with same name - me = parNode; - } - } - } - } - - // Our linked list structure sizeof(ValueList) - // + Name + '\0' - // + Value + '\0' - size_t size ; - #ifdef ESP8266 - lgname = ESP8266_allocAlign(lgname+1); // Align name buffer - lgvalue = ESP8266_allocAlign(lgvalue+1); // Align value buffer - // Align the whole structure - size = ESP8266_allocAlign( sizeof(ValueList) + lgname + lgvalue ) ; - #else - size = sizeof(ValueList) + lgname + 1 + lgvalue + 1 ; - #endif - - // Create new node with size to store strings - if ((newNode = (ValueList *) malloc(size) ) == NULL) - return ( (ValueList *) NULL ); - - // get our buffer Safe - memset(newNode, 0, size); - - // Put the new node on the list - me->next = newNode; - - // First String located after last struct element - // Second String located after the First + \0 - newNode->checksum = checksum; - newNode->name = (char *) newNode + sizeof(ValueList); - newNode->value = (char *) newNode->name + lgname + 1; - - // Copy the string data - memcpy(newNode->name , name , lgname ); - memcpy(newNode->value, value , lgvalue ); - - // So we just created this node but was it new - // or was matter of text size ? - if ( (*flags & TINFO_FLAGS_UPDATED) == 0) { + if (lgname && lgvalue && checksum) { + // Parameters seems to be coherent + // Scan the existing table + int i; + for(i=0; i < ValueItem, i < 50 ; i++) { + me = &ValuesTab[i]; + if( ! me->free) { + if (strncmp(me->name, name, lgname) == 0) { + //entry found for the same value name : reuse it ! + if (strncmp(me->value, value, lgvalue) == 0) { + *flags |= TINFO_FLAGS_EXIST; + me->flags = *flags; + return ( me ); + } else { + //Exist, but value changed + *flags |= TINFO_FLAGS_UPDATED; + me->flags = *flags ; + // Copy new value + memset(me->value, 0, 16); + memcpy(me->value, value , lgvalue ); + me->checksum = checksum ; + + // That's all + return (me); + } + } //name comparison + } else { + //This entry is free + if(firstfree < 0) + firstfree=i; //It's the 1st one detected + } + } //for + + //No existing entry for this name : Create a new one + if(firstfree >= 0) { + //Use the 1st free entry found + i=firstfree; + } else { + if(i < 50) + ValueItem=i; //Note new entry as last one + else + return ( (ValueList *) NULL ); //Table saturated ! + } + + // i points the entry to use : get our buffer Safe + me = &ValuesTab[i]; + memset(me, 0, sizeof(_ValueList) ); //Also reset the 'free' marker + me->checksum = checksum; + if(i < 49) + me->next = &ValuesTab[i+1]; + + // Copy the string data (name & value) + memcpy(me->name, name , lgname ); + memcpy(me->value, value , lgvalue ); + if ( (*flags & TINFO_FLAGS_UPDATED) == 0) { // so we added this node ! *flags |= TINFO_FLAGS_ADDED ; - newNode->flags = *flags; + me->flags = *flags; } - - TI_Debug(F("Added '")); - TI_Debug(name); - TI_Debug('='); - TI_Debug(value); - TI_Debug(F("' '")); - TI_Debug((char) cheksum); - TI_Debugln(F("'")); - - // return pointer on the new node - return (newNode); - } - - } // Checksum OK - - - // Error or Already Exists - return ( (ValueList *) NULL); -} - - + // That's all + return (me); + } + } //Checksum check +} /* ====================================================================== Function: valueRemoveFlagged @@ -315,40 +297,21 @@ Comments: - ====================================================================== */ boolean TInfo::valueRemoveFlagged(uint8_t flags) { - boolean deleted = false; - - // Get our linked list - ValueList * me = &_valueslist; - ValueList *parNode = NULL ; - - // Got one and all seems good ? - if (me) { - // Loop thru the node - while (me->next) { - // save parent node - parNode = me ; - - // go to next node - me = me->next; - - // found the flags? - if (me->flags & flags ) { - // indicate our parent node that the next node - // is not us anymore but the next we have - parNode->next = me->next; - - // free up this node - free (me); - - // Return to parent (that will now point on next node and not us) - // and continue loop just in case we have sevral with same name - me = parNode; - deleted = true; - } - } - } - - return (deleted); + boolean deleted = false; + int i; + ValueList * me; + + for(i=0; i < ValueItem, i < 50; i++) { + me = &ValuesTab[i]; + if(! me->free ) { + if (me->flags & flags ) { + //memset(me, 0, sizeof(_ValueList) ); + me->free=1; + deleted=true; + } + } + } + return deleted; } /* ====================================================================== @@ -361,41 +324,26 @@ Comments: - boolean TInfo::valueRemove(char * name) { boolean deleted = false; - - // Get our linked list - ValueList * me = &_valueslist; - ValueList *parNode = NULL ; - uint8_t lgname = strlen(name); - - // Got one and all seems good ? - if (me && lgname) { - // Loop thru the node - while (me->next) { - // save parent node - parNode = me ; - - // go to next node - me = me->next; - - // found ? - if (strncmp(me->name, name, lgname) == 0) { - // indicate our parent node that the next node - // is not us anymore but the next we have - parNode->next = me->next; - - // free up this node - free (me); - - // Return to parent (that will now point on next node and not us) - // and continue loop just in case we have sevral with same name - me = parNode; - deleted = true; - } - } - } - - return (deleted); + int i; + ValueList * me; + + for(i=0 ; i < ValueItem, i < 50; i++) { + me = &ValuesTab[i]; + if( ! me->free ) { + //This entry is busy + // found ? + if (strncmp(me->name, name, lgname) == 0) { + memset(me->name, 0, 16 ); + // free up this entry + me->free=1; + + // and continue loop just in case we have several with same name + deleted = true; + } + } + } + return (deleted); } /* ====================================================================== @@ -408,30 +356,28 @@ Output : pointer to the value where we filled data NULL is not found char * TInfo::valueGet(char * name, char * value) { // Get our linked list - ValueList * me = &_valueslist; uint8_t lgname = strlen(name); + int i; + ValueList * me; // Got one and all seems good ? - if (me && lgname) { - - // Loop thru the node - while (me->next) { - - // go to next node - me = me->next; - - // Check if we match this LABEL - if (strncmp(me->name, name, lgname) == 0) { - // this one has a value ? - if (me->value) { - // copy to dest buffer - uint8_t lgvalue = strlen(me->value); - strncpy(value, me->value , lgvalue ); - return ( value ); + if (lgname) { + // Loop thru the table + for(i = 0; i < ValueItem, i < 50; i++) { + me = &ValuesTab[i]; + if( ! me->free) { + // Check if we match this LABEL + if (strncmp(me->name, name, lgname) == 0) { + // copy to dest buffer + uint8_t lgvalue = strlen(me->value); + strncpy(value, me->value , lgvalue ); + return ( value ); + } } - } - } - } + } //for + + } //lgname + // not found return ( NULL); } @@ -444,8 +390,9 @@ Output : Pointer ====================================================================== */ ValueList * TInfo::getList(void) { + ValueList * me = &ValuesTab[0]; // Get our linked list - return &_valueslist; + return me; } /* ====================================================================== @@ -457,51 +404,50 @@ Output : total number of values uint8_t TInfo::valuesDump(void) { // Get our linked list - ValueList * me = &_valueslist; + ValueList * me = &ValuesTab[0]; uint8_t index = 0; // Got one ? if (me) { // Loop thru the node - while (me->next) { - // go to next node - me = me->next; - - index++; - TI_Debug(index) ; - TI_Debug(F(") ")) ; - - if (me->name) - TI_Debug(me->name) ; - else - TI_Debug(F("NULL")) ; - - TI_Debug(F("=")) ; - - if (me->value) - TI_Debug(me->value) ; - else - TI_Debug(F("NULL")) ; - - TI_Debug(F(" '")) ; - TI_Debug(me->checksum) ; - TI_Debug(F("' ")); - - // Flags management - if ( me->flags) { - TI_Debug(F("Flags:0x")); - TI_Debugf("%02X =>", me->flags); - if ( me->flags & TINFO_FLAGS_EXIST) - TI_Debug(F("Exist ")) ; - if ( me->flags & TINFO_FLAGS_UPDATED) - TI_Debug(F("Updated ")) ; - if ( me->flags & TINFO_FLAGS_ADDED) - TI_Debug(F("New ")) ; - } - - TI_Debugln() ; - } - } + for(int i=0; i<50; i++) { + me = &ValuesTab[i]; + if( ! me->free ) { + index++; + TI_Debug(i) ; + TI_Debug(F(") ")) ; + + if (me->name) + TI_Debug(me->name) ; + else + TI_Debug(F("NULL")) ; + + TI_Debug(F("=")) ; + + if (me->value) + TI_Debug(me->value) ; + else + TI_Debug(F("NULL")) ; + + TI_Debug(F(" '")) ; + TI_Debug(me->checksum) ; + TI_Debug(F("' ")); + + // Flags management + if ( me->flags) { + TI_Debug(F("Flags:0x")); + TI_Debugf("%02X =>", me->flags); + if ( me->flags & TINFO_FLAGS_EXIST) + TI_Debug(F("Exist ")) ; + if ( me->flags & TINFO_FLAGS_UPDATED) + TI_Debug(F("Updated ")) ; + if ( me->flags & TINFO_FLAGS_ADDED) + TI_Debug(F("New ")) ; + } + TI_Debugln() ; + } //test if free + } //for + } //me exists return index; } @@ -515,14 +461,12 @@ Output : element numbers int TInfo::labelCount() { int count = 0; - - // Get our linked list - ValueList * me = &_valueslist; - - if (me) - while ((me = me->next)) - count++; - + ValueList * me; + for(int i=0 ; i < 50 ; i++) { + me = &ValuesTab[i]; + if( ! me->free) + count++; + } return (count); } @@ -534,30 +478,19 @@ Output : True if Ok False Otherwise ====================================================================== */ boolean TInfo::listDelete() { - // Get our linked list - ValueList * me = &_valueslist; - - // Got a pointer - if (me) { - ValueList *current; - // For each linked list - while ((current = me->next)) { - // Get the next - me->next = current->next; + ValueList * me; - // Free the current - free(current); - } - - // Free the top element - me->next = NULL ; - - // Ok - return (true); - } + for(int i = 0; i < 50; i++) { + me = &ValuesTab[i]; + memset(&ValuesTab[i], 0, sizeof(_ValueList) ); //Also reset the 'free' marker + me->free=1; //Init each entry as free + me->flags = TINFO_FLAGS_NONE; + if(i < 49) + me->next = &ValuesTab[i+1]; + } - return (false); + return(true); } /* ====================================================================== diff --git a/src/LibTeleinfo.h b/src/LibTeleinfo.h index e88758a..2f38b20 100644 --- a/src/LibTeleinfo.h +++ b/src/LibTeleinfo.h @@ -19,6 +19,15 @@ // // Edit : Tab size set to 2 but I converted tab to sapces // +// Modifié par Dominique DAMBRAIN 2017-07-10 (http://www.dambrain.fr) +// Version 1.0.5 +// Librairie LibTeleInfo : Allocation statique d'un tableau de stockage +// des variables (50 entrées) afin de proscrire les malloc/free +// pour éviter les altérations des noms & valeurs +// Modification en conséquence des séquences de scanning du tableau +// ATTENTION : Nécessite probablement un ESP-8266 type Wemos D1, +// car les variables globales occupent 42.284 octets +// // ********************************************************************************** #ifndef LibTeleinfo_h @@ -76,18 +85,22 @@ #pragma pack(push) // push current alignment to stack #pragma pack(1) // set alignment to 1 byte boundary + + // Linked list structure containing all values received +// Will be allocated statically typedef struct _ValueList ValueList; struct _ValueList { - ValueList *next; // next element - uint8_t checksum;// checksum - uint8_t flags; // specific flags - char * name; // LABEL of value name - char * value; // value + ValueList *next; // next element (for compatibility) + char name[16]; // LABEL of value name + char value[16]; // value + uint8_t checksum; // checksum + uint8_t flags; // specific flags + uint8_t free; // checksum + uint8_t filler; // unused, for boundary }; -#pragma pack(pop) // Library state machine enum _State_e { From 64650ed34ea38d61f9375ec26df984472b2d4b9b Mon Sep 17 00:00:00 2001 From: Dominique DAMBRAIN Date: Sun, 23 Jul 2017 15:28:18 +0200 Subject: [PATCH 3/9] cosmetic modification --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 951e0ea..2bbf13d 100644 --- a/README.md +++ b/README.md @@ -5,19 +5,30 @@ This is a generic Teleinfo French Meter Measure Library - Modified Github source : # Modifications par Doume (version 1.0.5) : + - Add support for request /emoncms.json + return a json list formated to interface emoncms server from a 3rd party That allow to don't activate emoncms http client inside Wifinfo module + - Add possibility to compile a version of sketch for module not connected to EDF counter + Activate #define SIMU into Wifinfo.h, to obtain a version which will create 2 variables and update one of them each second, to verify package + - Add a check on variable names, and force a reinit of LibTeleinfo interface if an alteration is detected (each restart is counted, and displayed in 'system' page ) + - Change library LibTeleinfo.cpp, to don't use anymore malloc/free system APIs + Variables are now stored in static table, allocated on start + 50 entries max, name length 16 bytes max, value length 16 bytes max + To use this library version : + First, backup your old version of LibTeleinfo.... + copy files src/LibTeleinfo.cpp and src/LibTeleinfo.h into your Arduino environment (generally ~/Arduino/libraries/LibTeleinfo-master/src ) before to compile sketch From 792a67afba4d5d289b98f11e69dea070fee3e2df Mon Sep 17 00:00:00 2001 From: Doume Date: Mon, 8 Jan 2018 11:30:06 +0100 Subject: [PATCH 4/9] Allow upload of wifinfo.ino.bin for OTA update --- examples/Wifinfo/Wifinfo.h | 4 ++-- examples/Wifinfo/data/index.htm.gz | Bin 8447 -> 8468 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Wifinfo/Wifinfo.h b/examples/Wifinfo/Wifinfo.h index f02c506..b594002 100644 --- a/examples/Wifinfo/Wifinfo.h +++ b/examples/Wifinfo/Wifinfo.h @@ -46,13 +46,13 @@ extern "C" { #include "config.h" // Declare SIMU to work and test a non connected module -//#define SIMU +#define SIMU #define DEBUG #define DEBUG_SERIAL Serial1 #define DEBUG_SERIAL1 -#define WIFINFO_VERSION "1.0.5" +#define WIFINFO_VERSION "1.0.5a" // I prefix debug macro to be sure to use specific for THIS library // debugging, this should not interfere with main sketch or other diff --git a/examples/Wifinfo/data/index.htm.gz b/examples/Wifinfo/data/index.htm.gz index 12c4fabb32ca1b2181c312c1e597f52df04da6ca..82bfcf44d02d602adb04aedcdcfcba36548da051 100644 GIT binary patch delta 8411 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 K7U#Y!oB#k_0qxKL From 467b418ba330133fc29deb31c9e787ef18231ca6 Mon Sep 17 00:00:00 2001 From: Doume Date: Thu, 11 Jan 2018 19:42:52 +0100 Subject: [PATCH 5/9] Switch configurable et fonctionnel --- examples/Wifinfo/Wifinfo.h | 12 +++++- examples/Wifinfo/Wifinfo.ino | 64 ++++++++++++++++++++++++++++- examples/Wifinfo/config.cpp | 1 + examples/Wifinfo/config.h | 5 ++- examples/Wifinfo/data/index.htm.gz | Bin 8468 -> 8506 bytes examples/Wifinfo/webclient.cpp | 36 +++++++++++++++- examples/Wifinfo/webclient.h | 1 + examples/Wifinfo/webserver.cpp | 28 ++++++++++--- examples/Wifinfo/webserver.h | 1 + 9 files changed, 136 insertions(+), 12 deletions(-) diff --git a/examples/Wifinfo/Wifinfo.h b/examples/Wifinfo/Wifinfo.h index b594002..9e2cb11 100644 --- a/examples/Wifinfo/Wifinfo.h +++ b/examples/Wifinfo/Wifinfo.h @@ -49,8 +49,18 @@ extern "C" { #define SIMU #define DEBUG + +#define SENSOR + +// En mode SIMU, cela signifie que rien n'est connecté au port Serial +// On peut donc laisser le debug sur ce port, pour beneficier de +// l'affichage via Arduino IDE +#ifdef SIMU +#define DEBUG_SERIAL Serial +#else #define DEBUG_SERIAL Serial1 -#define DEBUG_SERIAL1 +#define DEBUG_SERIAL1 +#endif #define WIFINFO_VERSION "1.0.5a" diff --git a/examples/Wifinfo/Wifinfo.ino b/examples/Wifinfo/Wifinfo.ino index 9470630..695000e 100644 --- a/examples/Wifinfo/Wifinfo.ino +++ b/examples/Wifinfo/Wifinfo.ino @@ -27,6 +27,15 @@ // ATTENTION : Nécessite probablement un ESP-8266 type Wemos D1, // car les variables globales occupent 42.284 octets // +// Version 1.0.5a (11/01/2018) +// Permettre la mise à jour OTA à partir de fichiers .ino.bin (Auduino IDE 1.8.3) +// Ajout de la gestion d'un switch (Contact sec) relié à GND et D5 (GPIO-14) +// Décommenter le #define SENSOR dans Winfo.h +// Pour être utilisable avec Domoticz, au moins l'URL du serveur et le port +// doivent être renseignés dans la configuration HTTP Request, ainsi que +// l'index du switch (dans Domoticz) +//  Note : Nécessité de flasher le SPIFFS pour pouvoir configurer l'IDX du switch +// // ********************************************************************************** // Include Arduino header #include @@ -79,6 +88,7 @@ volatile boolean task_1_sec = false; volatile boolean task_emoncms = false; volatile boolean task_jeedom = false; volatile boolean task_httpRequest = false; +volatile boolean task_updsw = false; unsigned long seconds = 0; // sysinfo data @@ -100,6 +110,16 @@ String value2 = "000060000"; char * v2 = (char *) value2.c_str(); #endif +#ifdef SENSOR +// Le contact sec devra etre connecte entre GND et D5 (GPIO-14) +const int SensorPin = 14; +int reading ; +int SwitchState; // the current reading from the input pin +int lastSwitchState = LOW; // the previous reading from the input pin +unsigned long lastChangeTime = 0; // the last time the input pin was toggled +unsigned long tempo = 200; // temps necessaire a la stabilisation du switch (0,2 seconde) +#endif + /* ====================================================================== Function: UpdateSysinfo Purpose : update sysinfo variables @@ -672,7 +692,7 @@ void setup() ArduinoOTA.onEnd([]() { LedRGBOFF(); - DebuglnF("Update finished restarting"); + DebuglnF("Update finished : restarting"); }); ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) { @@ -789,7 +809,7 @@ void setup() // Teleinfo is connected to RXD2 (GPIO13) to // avoid conflict when flashing, this is why - // we swap RXD1/RXD1 to RXD2/TXD2 + // we swap RXD1/TXD1 to RXD2/TXD2 // Note that TXD2 is not used teleinfo is receive only #ifdef DEBUG_SERIAL1 Serial.begin(1200, SERIAL_7E1); @@ -842,6 +862,13 @@ void setup() tinfo.valuesDump(); #endif +#ifdef SENSOR + pinMode(SensorPin, INPUT_PULLUP); + DebuglnF("Switch sensor initialized"); + reading = digitalRead(SensorPin); + Debugf("Initial State: %d\n", reading); +#endif + } /* ====================================================================== @@ -889,7 +916,40 @@ void loop() } else if (task_httpRequest) { httpRequest(); task_httpRequest=false; + } else if (task_updsw) { + UPD_switch(); + task_updsw=false; } + + +#ifdef SENSOR + // read the state of the switch into a local variable: + reading = digitalRead(SensorPin); + + // check to see if you just pressed the button + // (i.e. the input went from LOW to HIGH), and you've waited long enough + // since the last press to ignore any noise: + + // If the switch changed, due to noise or pressing: + if (reading != lastSwitchState) { + // reset the debouncing timer + lastChangeTime = millis(); + lastSwitchState = reading; + } + + if ((millis() - lastChangeTime) > tempo) { + // whatever the reading is at, it's been there for longer than the tempo + // delay, so take it as the actual current state: + + // if the switch state has changed: + if (reading != SwitchState) { + Debugf("Switch changed from %d to %d\n", SwitchState, reading); + SwitchState = reading; + //Notify HTTP server that switch has changed, on next loop + task_updsw=true; + } + } +#endif if (need_reinit) { //Some polluted entries have been detected in Teleinfo ListValues diff --git a/examples/Wifinfo/config.cpp b/examples/Wifinfo/config.cpp index d2b9caf..3457810 100644 --- a/examples/Wifinfo/config.cpp +++ b/examples/Wifinfo/config.cpp @@ -207,5 +207,6 @@ void showConfig() DebugF("port :"); Debugln(config.httpReq.port); DebugF("path :"); Debugln(config.httpReq.path); DebugF("freq :"); Debugln(config.httpReq.freq); + DebugF("sw idx :"); Debugln(config.httpReq.swidx); } diff --git a/examples/Wifinfo/config.h b/examples/Wifinfo/config.h index 7c105a1..c5689cd 100644 --- a/examples/Wifinfo/config.h +++ b/examples/Wifinfo/config.h @@ -128,9 +128,10 @@ typedef struct { char host[CFG_HTTPREQ_HOST_SIZE+1]; // FQDN char path[CFG_HTTPREQ_PATH_SIZE+1]; // Path - uint16_t port; // Protocol port (HTTP/HTTPS) + uint16_t port; // Protocol port (HTTP/HTTPS) uint32_t freq; // refresh rate - uint8_t filler[24]; // in case adding data in config avoiding loosing current conf by bad crc*/ + uint16_t swidx; // Switch index (into Domoticz) + uint8_t filler[22]; // in case adding data in config avoiding loosing current conf by bad crc*/ } _httpRequest; // Config saved into eeprom diff --git a/examples/Wifinfo/data/index.htm.gz b/examples/Wifinfo/data/index.htm.gz index 82bfcf44d02d602adb04aedcdcfcba36548da051..d4ccb7cb418b3c99d9cf16072cbc274164000c74 100644 GIT binary patch delta 8499 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 literal 8468 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 CC|UCW diff --git a/examples/Wifinfo/webclient.cpp b/examples/Wifinfo/webclient.cpp index 56ced86..944dc9d 100644 --- a/examples/Wifinfo/webclient.cpp +++ b/examples/Wifinfo/webclient.cpp @@ -1,5 +1,5 @@ // ********************************************************************************** -// ESP8266 Teleinfo WEB Client, web server function +// ESP8266 Teleinfo WEB Client, web client functions // ********************************************************************************** // Creative Commons Attrib Share-Alike License // You are free to use/extend this library but please abide with the CC-BY-SA license: @@ -371,3 +371,37 @@ boolean httpRequest(void) return ret; } +/* ====================================================================== +Function: UPD_switch +Purpose : Do a http request to update Switch state into Domoticz +Input : +Output : true if post returned 200 OK +Comments: - +====================================================================== */ +boolean UPD_switch(void) +{ + boolean ret = false; + + // Some basic checking + if (*config.httpReq.host && (config.httpReq.swidx != 0) ) + { + char url[128]; + char State[5]; + uint16_t port = config.httpReq.port; + + if(port == 0) + port = 80; + + if(SwitchState) + sprintf(State,"Off"); //switch ouvert + else + sprintf(State,"On"); //switch fermé : portail fermé + + sprintf(url,"/json.htm?type=command¶m=switchlight&idx=%d&switchcmd=%s",(int)config.httpReq.swidx, State); + //Debugf("Updating switch: <%s>\n", url ); + ret = httpPost( config.httpReq.host, port, url) ; + + } // if host & idx + return ret; +} + diff --git a/examples/Wifinfo/webclient.h b/examples/Wifinfo/webclient.h index 0642e7a..41d03eb 100644 --- a/examples/Wifinfo/webclient.h +++ b/examples/Wifinfo/webclient.h @@ -40,6 +40,7 @@ boolean httpPost(char * host, uint16_t port, char * url); boolean emoncmsPost(void); boolean jeedomPost(void); boolean httpRequest(void); +boolean UPD_switch(void); String build_emoncms_json(void); #endif diff --git a/examples/Wifinfo/webserver.cpp b/examples/Wifinfo/webserver.cpp index 478739c..38ee502 100644 --- a/examples/Wifinfo/webserver.cpp +++ b/examples/Wifinfo/webserver.cpp @@ -209,6 +209,12 @@ void handleFormConfig(void) } config.httpReq.freq = itemp; + itemp = server.arg("httpreq_swidx").toInt(); + if (itemp > 0 && itemp <= 65535) + config.httpReq.swidx = itemp; + else + config.httpReq.swidx = 0; + if ( saveConfig() ) { ret = 200; response = "OK"; @@ -311,7 +317,7 @@ void tinfoJSONTable(void) String response = ""; // Just to debug where we are - Debug(F("Serving /tinfo page...\r\n")); + //Debug(F("Serving /tinfo page...\r\n")); if (! me ) //&& first_info_call) { @@ -383,10 +389,10 @@ void tinfoJSONTable(void) Debugln(F("sending 404...")); server.send ( 404, "text/plain", "No data" ); } - Debug(F("sending...")); + //Debug(F("sending...")); server.send ( 200, "text/json", response ); //Debugln(response); - Debugln(F("OK!")); + //Debugln(F("OK!")); yield(); //Let a chance to other threads to work } @@ -409,7 +415,17 @@ void getSysJSONData(String & response) response += "{\"na\":\"Uptime\",\"va\":\""; response += sysinfo.sys_uptime; response += "\"},\r\n"; - + +#ifdef SENSOR + response += "{\"na\":\"Switch\",\"va\":\""; + if (SwitchState) + response += F("Open"); //switch ouvert + else + response += F("Closed"); //switch fermé + + response += "\"},\r\n"; +#endif + if (WiFi.status() == WL_CONNECTED) { response += "{\"na\":\"Wifi RSSI\",\"va\":\""; @@ -510,9 +526,9 @@ void sysJSONTable() getSysJSONData(response); // Just to debug where we are - Debug(F("Serving /system page...")); + //Debug(F("Serving /system page...")); server.send ( 200, "text/json", response ); - Debugln(F("Ok!")); + //Debugln(F("Ok!")); yield(); //Let a chance to other threads to work } diff --git a/examples/Wifinfo/webserver.h b/examples/Wifinfo/webserver.h index 657d419..3008078 100644 --- a/examples/Wifinfo/webserver.h +++ b/examples/Wifinfo/webserver.h @@ -37,6 +37,7 @@ extern int nb_reconnect; extern unsigned int nb_reinit; extern bool need_reinit; extern bool first_info_call; +extern int SwitchState; // Exported function instancied in webclient.cpp // ============================================= From 92436032fdb5cbde845c719c56c84bbcb0441c98 Mon Sep 17 00:00:00 2001 From: Doume Date: Fri, 12 Jan 2018 21:29:25 +0100 Subject: [PATCH 6/9] Start debug to file development.. --- examples/Wifinfo/Wifinfo.h | 3 ++ examples/Wifinfo/Wifinfo.ino | 54 +++++++++++++++++++++++++++-- examples/Wifinfo/config.cpp | 2 ++ examples/Wifinfo/config.h | 5 ++- examples/Wifinfo/data/index.htm.gz | Bin 8506 -> 8317 bytes examples/Wifinfo/webserver.cpp | 10 ++++-- 6 files changed, 69 insertions(+), 5 deletions(-) diff --git a/examples/Wifinfo/Wifinfo.h b/examples/Wifinfo/Wifinfo.h index 9e2cb11..f8932b5 100644 --- a/examples/Wifinfo/Wifinfo.h +++ b/examples/Wifinfo/Wifinfo.h @@ -64,6 +64,9 @@ extern "C" { #define WIFINFO_VERSION "1.0.5a" +// voir : https://github.com/arduino/Arduino/tree/master/hardware/arduino/avr/cores/arduino +// le Serial.print sous toutes ses formes.... + // I prefix debug macro to be sure to use specific for THIS library // debugging, this should not interfere with main sketch or other // libraries diff --git a/examples/Wifinfo/Wifinfo.ino b/examples/Wifinfo/Wifinfo.ino index 695000e..3f8adf0 100644 --- a/examples/Wifinfo/Wifinfo.ino +++ b/examples/Wifinfo/Wifinfo.ino @@ -34,6 +34,8 @@ // Pour être utilisable avec Domoticz, au moins l'URL du serveur et le port // doivent être renseignés dans la configuration HTTP Request, ainsi que // l'index du switch (dans Domoticz) +// L'état du switch (On/Off) est envoyé à Domoticz au boot, et à chaque +// changement d'état //  Note : Nécessité de flasher le SPIFFS pour pouvoir configurer l'IDX du switch // // ********************************************************************************** @@ -56,6 +58,10 @@ // Global project file #include "Wifinfo.h" +/* +#include "StringStream.h" +#include "PString.h" +*/ //WiFiManager wifi(0); ESP8266WebServer server(80); @@ -114,12 +120,56 @@ char * v2 = (char *) value2.c_str(); // Le contact sec devra etre connecte entre GND et D5 (GPIO-14) const int SensorPin = 14; int reading ; -int SwitchState; // the current reading from the input pin -int lastSwitchState = LOW; // the previous reading from the input pin +int SwitchState = -1; // the current reading from the input pin +int lastSwitchState = -1; // the previous reading from the input pin unsigned long lastChangeTime = 0; // the last time the input pin was toggled unsigned long tempo = 200; // temps necessaire a la stabilisation du switch (0,2 seconde) #endif +/* +char logbuffer[255]; +PString flogger(logbuffer, sizeof(logbuffer)); +*/ + +/* ====================================================================== +Function: write_log +Purpose : Ecrire buffer de log sur filesystem SPIFFS, par paquets +Input : - +Output : - +Comments: - +====================================================================== +void write_log() +{ + if(SPIFFS.begin()) + { + //Changer de fichier si > MAX_SIZE + File log = SPIFFS.open("/log.txt", "r"); + if(log) + { + if (log.size() >= 50000) + { + log.close(); + if (SPIFFS.exists("/log.1")) + { + SPIFFS.remove("/log.1"); + } + SPIFFS.rename("/log.txt","/log.1"); + } else { + log.close(); + } + } + + // Ouvre fichier + File out = SPIFFS.open("/log.txt", "a+"); + if (out) { + out.print(logbuffer); + flogger.begin(); + } + out.close(); + } +} +*/ + /* ====================================================================== Function: UpdateSysinfo Purpose : update sysinfo variables diff --git a/examples/Wifinfo/config.cpp b/examples/Wifinfo/config.cpp index 3457810..90294b3 100644 --- a/examples/Wifinfo/config.cpp +++ b/examples/Wifinfo/config.cpp @@ -181,10 +181,12 @@ void showConfig() DebugF("ap_psk :"); Debugln(config.ap_psk); DebugF("OTA auth :"); Debugln(config.ota_auth); DebugF("OTA port :"); Debugln(config.ota_port); + DebugF("Dbg/file :"); Debugln(config.dbgfile); DebugF("Config :"); if (config.config & CFG_RGB_LED) DebugF(" RGB"); if (config.config & CFG_DEBUG) DebugF(" DEBUG"); if (config.config & CFG_LCD) DebugF(" LCD"); + DebuglnF("\r\n===== Emoncms"); DebugF("host :"); Debugln(config.emoncms.host); diff --git a/examples/Wifinfo/config.h b/examples/Wifinfo/config.h index c5689cd..e796c85 100644 --- a/examples/Wifinfo/config.h +++ b/examples/Wifinfo/config.h @@ -69,6 +69,7 @@ #define CFG_FORM_AP_PSK FPSTR("ap_psk") #define CFG_FORM_OTA_AUTH FPSTR("ota_auth") #define CFG_FORM_OTA_PORT FPSTR("ota_port") +#define CFG_FORM_DBGFILE FPSTR("dbg_file") #define CFG_FORM_EMON_HOST FPSTR("emon_host") #define CFG_FORM_EMON_PORT FPSTR("emon_port") @@ -88,6 +89,7 @@ #define CFG_FORM_HTTPREQ_PORT FPSTR("httpreq_port") #define CFG_FORM_HTTPREQ_PATH FPSTR("httpreq_path") #define CFG_FORM_HTTPREQ_FREQ FPSTR("httpreq_freq") +#define CFG_FORM_HTTPREQ_SWIDX FPSTR("httpreq_swidx") #define CFG_FORM_IP FPSTR("wifi_ip"); #define CFG_FORM_GW FPSTR("wifi_gw"); @@ -145,7 +147,8 @@ typedef struct char ota_auth[CFG_PSK_SIZE+1]; // OTA Authentication password uint32_t config; // Bit field register uint16_t ota_port; // OTA port - uint8_t filler[131]; // in case adding data in config avoiding loosing current conf by bad crc + boolean dbgfile; // true if debug on SPIFFS required + uint8_t filler[130]; // in case adding data in config avoiding loosing current conf by bad crc _emoncms emoncms; // Emoncms configuration _jeedom jeedom; // jeedom configuration _httpRequest httpReq; // HTTP request diff --git a/examples/Wifinfo/data/index.htm.gz b/examples/Wifinfo/data/index.htm.gz index d4ccb7cb418b3c99d9cf16072cbc274164000c74..223d08f891bb8e63de3227890933d294359f65db 100644 GIT binary patch literal 8317 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

FgvxN@*S%4cbqP z6)7*@rL1M&?1mVmvxzysI4x#>^5`LX{{8)rGI1Qzz?@m07gHZhQFgo;C6D|R1oJ82 z(!!?e#J!(O0#FV4Wk_4RD4Eg;pyG_5Q&78wm!h%xg*}#4Wmk>2v^>&$fm*1%WRDvvuM3sdJu6RM)~HxF`3B*!DypUfyrY8%%XsTTj_1-8eswR!WfGMq|B367W8>? zfmMmcY)^#Ym6zqa`npz-Txf0bo`P5qqSnEzC)?5mvp~BZge64!{bX&z!njEG0+vAx zmlY!4fcUqZEoe5Zi`4#n$3{aI08&Mo4RVYX3+QVSdgM9PQR6?s-p6LShbszS$Qi1o zf0FUvaeK-GF1#jmI;B3(<(=NNnB_IjV!e1eJ&fWFRoyH}W5_%Mbm^GsGq6G6>P6j5 zLb<$?EWz^>6BHlP6Rcn@ZZ#(~4bt+qaTL*WjF)wt+)cY4N-{o%OcJZBWle?1PCat@ zzX%B8a?I?k$pd;CvlLb(E8M1}*p@5CM-ZHV9q?ERtzJ$hfXOtDL{*C#CO|d-+Y>XK zrXCZ^K}ll~5b$r6?wSe0ZTIkzu*M1_?R={jEV)WRwUyJa#x{!T_#ld44GpGlCD@kT zuWCW*pE3%H_cUinZ;ld%mHcW`wpQLUj!l!*V3?{_3*R#*N4^)WWVeb+0?Uoo7i*P- zwZ*scv7fnrCL;Q)3|F=K^`krHd%3gPNcDH>@^@rKVUkvn5Z`WR(hlc80R+ScUau z?U2SAeMd+5j!Z*gJ{#ap1t6P6UUMDfTBX6~FojWR@PBgX&#|W6(n+`NNhKrNi$$9Z z@sJ-)RhkhS(h2S_x>W>jR8R1O8FiYbaf{t;HR<*PB3ArqpP5E>(PT%fX7;(rKvuG` ziy%BX^O&wE^@?6hVlNGf>e>puCAPG>3w#4>+G4eeWD2uN5$sH3qZIE=qOGRRcDO<7pfv9*e;CnK!0t8l&O=fsqCjL;rK4yDLw-! z!%h)df}cZKnX*Xk_RfkrXZx8LM6%Q$IWNnv!n~9p(GVB)y40Ea`o*c2l4EeiDHbLl z)*8h(0nBC)RAfOmdh>QzG_njrReysp7G=C_R@@;YG8iiDp5`*3f@>MjH0pabijcQe8tJb!bl?EL90ZXgkV${Gq~90(Kw+fW=vP1>Eqqd4s%kk4|ZywQvTS2#$Aq|KXwAVv) zhqtQE>swM~vi&iOj@W$MK-L?qUX4p7lEPrc(?VH)6;OX4jYe(`QUtbv25wi!g4JGI z1w;YMAnQHSHfVjl7^Idg+Q~X`iRnmwli&II%^ADvRS>T71TKJ5u-=jyz3eY>G}8<5 zMgm3NXyhCoJ$-TX!0GCXYtmYkq!b`ZGSU$11X>Ude?B^P4ETZ}$z+2hFtr~JOVDTl zTOqH37b&iZu3%sWeTk3J4JT*W&)(0Sgmw#x;{d3=2l!%wW-7t01cjjJD_?p$tmozv;MtRv+AQ!2*IahYsuRU);*N zmE=mA{K=MA3s_vA-lnb5@`Ko&-T=%gK2NF*3VtIjNlW!OB(&$5my zD$Tmcc!_%av)Sr}$a6ri9;mrlbZ}M@lW1ud$e7UrMb;et%2t%zg3| z0msBu{h2jX9LZj=lz^Riil04mb>O5W3jhq;#L3Ea+r*l#gaMvvWAYh`rWZZ}xV z?UmFc$4Ih@?q%U=J_+5iWAU+ZgfJrxn2~khuGr%%E}0NT^EdUg8MS@kpDZwl?CeOn6v3cXK@igD1Wg* z78j@z_=}n-eo@KrV3ExXG5cmSl0%gleY1uG_uM80bJrDEZQTXTJy(}qb1y_}%#?)a97g&+EN@?ReZ=s6M0dl#D#J{61=+c=$WVc>Bke9ki57*9tT<%cM0pz|F~f=oYzEYzwLhP1f(@{)APR8~WcY3{Fx!fDHWR6RcX3VTeY<@8rTbXYn+wG zZ?y#IVUR5u@ujhmWr)-w$q2+PagI-tqQBC+DVS1aW#}n?&T(o)7<|NyMR?zH1)jHI$<${>UQX)FVR#A6&#dWc3WCs-TNe!U#Hyyeu zPgET4U?fzgXQqhAJq=+@kpc=vxA5&q+aL}^i6aP~{VxVVF}tx?0SOlg$N|D3EbXeal8wsf2k|@j zW9i2{dS-Y1px_W4YVQxry81WZ&?Kl^5FQKSs;uO0I_>7bmnF1|@$UzWqB|4rv!T?m`$x-397`&6B_^y@}&XU zM4-m>!kHTH_=y5D<_&hIDmEKG1C>5WC9Jp^!j zSr~6CD;+T^gWc8TBWrE3`x^BCs%+fa_Ee$K-19ut-Cbqb+oV#XZWV)bx8N1;6Bs`$ zh8K^Za-}j3EvT1j=+-VOZJpNin1x6J2OyNS@W8*RtMAivipA8f`!v8ic5yW5uOG)W z+v$&C87tn1Ves${`CGvgBA)U$Y5#Tyd$ui+J4*~9GWtpuRC*;ODgtH=fSfKJ#V7#3pG zO`5gR46Om2EB2D%-@Zos8d+B7&}>|uZ7M@g*sq`=w4XwnO>LVn2UQPJn|Si1x93ix zvPl+prO0IaRY+7bC)_6W>CrL38|If`vav+>#;_{^;M+FdcfOd`%np3op%(*$WbszAD`UAoj!!1Y?h+qh-}>0|3|WsrfZ32zSPJb2vP09Bnwf_E0`F!2i@DKIXrmn zfWp8-=35{baN@iy&nq=4%h5e=!{5uZS@oK4dA!3T>7Z3cN$PQMo-O&YsgyY5O=_?X z#%k0dUm_7O-iZq);3Mh^BPLZ1C|CJv2IPUsk$O}-DvLbv8-GzvLLc4d>59>}@n-EA zNB>h;A>}!)6L*G0X@7Ht&Y_!w{NKK6>L+6*4Hl5z#~6UKQe%+rrvt6R>5%q5nt~=R zjAu8P)o(BfUNSfxWBuX8RxA9Ewe-)&N4c7x=scKeeS&fzn5Y?MXMM?gp;K*_1}ln_ z@uH|FVO#ggvSwd@UR%X3Q|f9NBYS``ORf}TdJQU-=jcHK^(UT<@e%Aqmb%A}Peqvt z5|1;&3+wWryv$dxhE<-(Uhxzj)xt00Ir@m{IerO4%w$@d6y1Has%?N$CY~oBGdbz7 zqqvY#aZ@pkk1ouT(sJttU`Gd^^*;WxGY`tK3%!p&8;dzd^gjObn~I>(gkE1DeNZ(7 z(#D`60mOV7;ESM^yzQ+<<;g>hB_@D|wDXbHdzf06PZF9; z&K>pep^A!3R_CT7pX9kyBl}qk*(QIao%F0YD`BIP!oMZSMY&jf`>LLA<}aVmXD>g5 zB&ZMJyjAj7kOw_gCFbm#1#LyP>g2HDf>6pWdNAa5?Dfl~JQr>g5CY+{3|1i@!=hc$ z@IJnLiHq#}@B=s`ri1+NO!tAI+a6Ka+p%-|hQ@rI+BcH4Ak?E)js%jRoB$bi6AG0? zyU;FdDIS9kJ(#ED@yCj3xHcWrK)f2m+U5<{4m!FDIFtBUy^;IwDr+(OX5(Xd(LO!kEp|1Dc;uu)bN_SjY~lp_XBH$jXM89RxGyvPFJWK ziNeEty#^RoWzd$?n5;eY}+E9U}g!Q`WZWvuNJd{AfDf)`w~ovZOX9EIcEc#)(Qtp2m!GEU7(=gS)FA~N#O%+ z9#k+Y#zRzrFAbA!12ZFDjW$jtF=pxBf@Kj9^%9irnOLHj@FIvPSf8j?MGQ1R2^!f48V*K#p3p}6pUQ2@}yNbM6ZqGNRrRmi2a8ebWejCiK1jlUbRGW zLcY4SZMU_SJUub(2?Yog$+B@Z4jp#*U*>VVzo8%7%sPN793p95cB~z?2^8wc$~zN4 zqCd?7fB2vOvDBYZ$HRlAen2yagib&Q)+wWBag<~haicJ!VK%VNn3qil9zA6)?eddV z!a|lY$M2@DOlhM{95_M`SGX>F_tv-tUQ11iPo;?vEnx0uKo3d+e0BzLTaf9l-6dkS1cHrT(9~ zT|!=l6Q5=&A>FQQ&V4l^bWUOSr`^mMr50h{zzQyoosk?*5PH?saWi&GtzqAhz<&pW zPBMhiBA$~u-7K2GN&_py3HoX5glg=>zlf&{z$3*`cMO-N*6@dLl*W7g9(ErdUw-m0 zKjD-~;AAWcgFMfHg&gPY@1P4!Mw1GtM;B>!`R{d=iD>%ul@vS$q+b1nw017w9JvP&e|ig~py#7Q(ssL~a!m%Ae;A^J%- z&0QDADfk3X>jDcg^w4Hp(g~YRqchP-iQ9gLB%qvLp2SoIWFWGE8U4&WLEt$dqR7{w zFna-+d`fD(>;n}`sF&nrJ`qZQoKoviG6GD;|L>+*!eZ*xC&G<)L6!i8Qy7xu4U6$U z1widx+{n*^Fm3Haoy2WjB!LMe)!^_5kBm+RAD`fmrWJhZW?h!ipeyX1#Lh-Z_kLCw zMtPp-JdsTW{>O~^9@-A6TR1xpEM#@rl7bmU+^P+UVO)NI<)N!HqW&{=ZVjJi?2nwn zF<86l6-%Ce{*tGTpHpqgzk&76lNsx|@67dt$jY`;mNLHJ*zr?}Vocq4X&%g&bL=>^9u3pm6xTLU)V98;j6Jwf8B@sq9ARnU`|B}U zDp;vtGtD9&9UeS;b~Fc*m8>;3IZJsQt(e3o+KelON{oX%r^$LUGV6^-M& z;KI|8y9}Rid67nvK2qQWx0cl6eX52Uz%Xnz5q}IspyKVa5Mm!7Y!Y#5Kobri#-G}t zNfPC8y&v@CyF7#)6X$J|1K~)NLtquezT?749+I(O6~kezEofk;4s@};xL$?POCs=< zQt*A?V9X$%3mo4UWc1#vaS|g-0uu4RcljxfQUDYX?KxpeTr_y(eH2o?TRB0MlG(AA*881^Z5Z zd-{mb0J!0g{PNSa#82x0!H2#db2`n@IvHHE94O( zMy3oMNU`Nno@G%eEHZS_aT0~D&)jzd>xhOP5~E`SpDyoNghz)1%jykFqp2hKTFaJ` z8{4iRqR(Za&5eW8xFVD&YViaGO+aTOIJy`KhQ@9w_FC90t})yUPxyv>;j;?y)h?_! z#cOpjsAIClZE85HslRa)WxCQ{>c>Kq&rU>^P$xu#O;9PxrZ`DBLn=%nMmTOHb{EWF zVuo1{nasK7ikrA9*R{hmO4xh6pWqWrKaHZqLqjdKy#=mpR!J=bn=@#L5&;-m0ha?} zDNA7KXvK{ma%(BTC6mif5Y;9SpAuaN>m(A2Ua*7{8oO`mFRgK$u)s+!Onw#8EhHGk z2mC&zpHm0Z9a3~R+PQp|9balQ<%H`Z;l~JRI-k6HTX6Rl; zK_NAB++C33B!Z8h3KAIO3B`MeEyOqzv!F6q>e3P@qX6f)oc# zD%hqyH_cG-Wvaw$3ixC%o}tvOQW|tOi8PsAe$^Vjy8Hw_d`|FIUBAa0tMgQB8_e=! zb*)*h4AFY({3>jFqeU0@V3=1hGd~WTbDxHjY$|*KWtL3)|7#Rr0CyT?2_=cP!5Y|Y za5wo@*jrf0nkf|_D37PT=q!|C&}LRs*9j}~5=5TkSEYg{>ag#y;Z9W(6Tgol%vfl* zti;mQjnoZym8q|4YihbdhJ5T_e!4a{>O2-h-!oACSMXV!zEf<*4>c}(xYfpG9MF=@ zXe*c15Y~{xsoTlx;t_>F^8QU>a)z`{xjhwV6vuN*s}fSM^B@X2SeD<|fqp}CK~(Cl zi!h+5Myr1DY{#kEjk}oYZbv&hQ7JT%uFxO?p=mw}Sc%fAKEdO{BBEu=mkd|vX#g=wkS^u`Q5ZCj2c-P&FT|JOU^h53)$J_J;mrW7 zW5V4Ok@GRU8i~};acR&Z-L_K`?=Wf5GY*HL{UJIS|&TRIUBRtf#4 zH8ki$A}4*&;BZ7Sk7%SW+*!AV(=3ZgXJ>u6-xC*S4cgk;6r)nof#cS3Ky$u@d$;M_ zAuAGlcVvz@iFBK!HB=0fVULaklrv4wtz+%=tLJx#syy)xO!4!p5cL{5+&hxE7q)+R zaF>{JV)l++7|2phSK$kwB)`zA+Pey8w}v%61AnV3a-7gVuBjqHLwevI@~1cW69e-p z$&GDmnBhIvl=$#(V;j^Dzb%%|JHzI>F~jEi!ZSQHX9!q`$Mdgm4&PpMf*<7s5(B+0 z;#pHrZS&)Brvk!8?*Un8hRuhS8TjbAckp1NI{x8;Gi*JmqH*KFf>Z1~+%gdPRy?ur z#oJtnO%I;jlwJ(;V1&ujt2JX7dDM`9(I9W$SjfOA(5NPXxZ7K`P>{pipl39t-eNu&pfTEn*>v5qP&NG#7Q>GJ>gK_bVD86+A_8osu6 zt{o)a63*@-MC4fc79xHN5x<3q_aWj39(bl~%$zWTOF^97U2<0FL(h#&1<4yU^|(>X zp*?y0l025M&L1bf4)Nuz0JaOUC^+zQO+(ps1!D;37l17%o8C3HV96S`c$;p|x7Vxq!Y=oYuUiOq6b?jq zW8&po$n!1a`4;lrOOo-7W$u(5Jo)<_tH<<=dFNF@4lfI0#vbJh>GKB_3&s>}uU?w3)%?cB z_>?WahOgcOP!Ly~@EU? z4;!nSAK$FC9ti2i!e=KeR&uRQ=VP{8!PTLI`hxn+ceU;vSCcaXSCi_Ca(9ZW7f#AK z{l@WBY&XES39gT|pnN}}IB(a_W#Wr~wVQTnl0*qFWTxG$SLGe9NSZ0z&IXkD*z_%*-||pJy{b@9SpcDzji3 zkbUpe30>+fmbG%^sCm*>)mQr)=dYK}Sh~@CRRM5A!m4RAReo(PbZDfi_HiPNlI|!? zwRDXvRr9Xru(vn;0ujGy3Zfn0<5c^NruP>7WhXw--o{dAbG?vd_{uTXmdHc+Wno4< z+i~5?f2V-zQ#wb2Mt`m7_L2@!hIbY4{WMBm9`D}~hNH|maq==*Q=S{xtU@>c&6YYH zicAHT4zh4Dafihf<^nVVaGACoA0%=EWnO0C`z^OdIKT$E$$aF@XDg9JdN#5=7f)7h z%O@*0)*o!ihbtd$Z*Nwg#Xy*wNO>+{oM_2*BYkXJuFx|M|^pL+Vr;=EXT ze~cAWoCzgQ-2^24CBV``rbS}zFD3a<^#g@BRJ^2}&=G)Q4PQ}EUV)Qq9|faQ4giD16CR?b42{g3nZhc8lo+xlYtXjE0Utq7$;_-M?uebH&k&# zk2!vXg-R0U2rUcpJi5Sg=zO*3T=9y_qE3h^QYJQ9Tf8f0ED%xapck@k>4E`-S&PPC zB2^nfsW3k(;slSSVE)sB%12hhke;Kfr3!SfnYEbW z;V}duSk^IZs(^UvV5E=JF%N?RV{wn3Ml69{iPG8$DQ*cATo{{VGj+eZmzivyp0Q5N z1k8l8*cRpKV{c|X$2knX&TQC)mn&VwSy6sT2Ck|##QzIX5gcq5WqPbW^F+$fNfdK; z6BcLq9`7kWe=Xcj?pcDJLtYuPP$UW`#qE=R$_J4&aR=7h@^e&g#n*fIMYS(^CO^A# z>LlbCOmTu=MA)k}@{f_|&A_Ngf^_iV<6hCoQgBt>Rl-=9W@WRa4jGX3Jt^JeT==|1 zsOTf$iO%Q(khM%cND*XXBAQ5_U^;J^fM=cM31AyrS8VbKf9<`7{v90f7d~oPjS?4o zym2jyp0RW4b=H?*o?jl#n52ECrs-ak)3pp}8ugPLMaai0j?`yjI&grWECbIG(4@YX z)a!A2AT!c*@VhPYi1w;2a}IEX#DgFC@CY0UUbX+JD9Xt+#&4DkV*KjaL73rUYh!

hMt(nEptrL^i*o)8Wa-RV2Me>iMWt0?8FtG%keocRuSs2ZMo~ z0~djApq{;~e8Fn3jbcVVmxk6I(l%&ir5Gf)%-hKdv59U--iQy3y|IS&N_7fbS^^uU zl5>3|HGG+$0BXh;!i@+Dox#95IC}Z|=&`k|E-ndeRictlQKFIhSfkXK;o#S!V@sQ# z6C@t3k{FhD{k?K(RDi8BFM$;)uJNv*VAgvA9<3WL&eC6KPb4( z92(Q%e}MqFJ{brNP`kXNE-MbN_4rZskW#Z(5CT^Qjcyyoplu+ufd?_mdI|jZ9s4`^ zr9T@qAQ*G#uwwt&uIyWKuE5EkOnx;ci_OV6I#=v{(j)eY7!7Co?0gUa3nPGal8((e z5|pA*;~Ln~Zyw~PX~*VOu5Bc|fW2VT2Ik)@Zh=eDuko_+{e>$;A45UFxnRh>^1?I= zkQ6#~dcA430&R1-F6XJ?!EhgSU>)T#CU?*qwD&5r&hiPf1iuH_6!065Bh=I%@ z1vXRUrQ~kJhyP?|?%sC<6ysOb_Z?Ai1bIPI0(AN*es9rMj+5dnm|(Asos3wwot-d} zH4O>2EE_(72(f{=UO3rwEns0s960Bl2Y=~c{}oVO%d7Age>I+T{Z$U6nypb!p`?o? z`YozT>#^Oct+Y;??FwtQz7ld|X+c)ey)1g4jeL7(8FXwM!PSTbYGehd%X56iB~&DW zlQ?nkjR#Q)ab z+zj<=l(F$eC%EvymA_ae!3By0{-PxEUlcMt2-1nhX5X)cVyIN3AC_?7uH7VH_KKWV zX?H&7uB}QwXGs)JhS-Z=;BJC!D~1G^Tc5z7e$0CUG}tdLyL?>zP|Odo@5(Kxwq6g@ zV2350b_oi3aa~5VyB~M}x@*gGkEb9G!Y9#LXs^<9mQ^mj%(K_Ay~^>oEAfa%fBmC^ zOZ+ak(m?UfYyK&U4yHHsScx~RiARI*t>B!eiOL?rRYB_^d%`5t>+$0(${Zh|(L)lV zVi;lj@Y5Pq(?>MhM^wj@_vE%%i|w>EG1x)lT)oPnST58LkAnnaOhjOMM+E5|zCH2u zByKNHP{RF4JWR6|%c?djcCTlz6wOolCf`b@?1_(q{FT_dS~qOl1)I8zD!8YDREr*S&Vg@VVOWK))6Vmuk7G&?|6 z1DWqA6m&|m67v0;^A@ym*+2+SEAJAX@>DoZ-VC5YYi~MQ107&oK@g%G z(D38>y527JI4q$cLJF=DM8grFAWv7x-(NicS-fV7ZwBZP1HAw_DQHCCh>76jJ?*N9 z!m*h^q(bbMzt|cdw;@n`FlBjfN$bd82q@53AhlQx``g9T*7kp?4@aBB5OJ zmSvdE#a5;^2J7YqK5A#>@khl0Y8XUInt!P!vNV>$M~%U6iE?}h5$%=AreH{wmaeDx zK`UH_f=YH^cIS8fmc$#pC-KJmzv`~7w}~7IKlfjlP%$&xbW+&mB?0yUsI;r@f=E}a z)K(}YlVsFnCdy0-QOOVDcksvdTzom6OD_l>whwJ;du*RG=klFnJHCK%;N=Bq^RoD3 z5ko0xwpFz-5w@I|dCC$I+Eh_AxS^i1Mn0h6of^R9{V<97AC1F1h=g2tCPjpE8e~k7 z1Gj#KC-|J+qC=j(h4PAMtJvBL={1o?U!uQtUTWi^SEeL-3l zYE8myvj8~5zxAXCB1)`w;A{G z>J)8z80a)>(7i4ofXK=|xhm48(hPD0-(6&Xj;mz%+_Z^(?5WV~8 zQ*ZDXYW^I)`8!mdp1zt2d+IpJ47vD&_JTGbti|JQGda1J=Sn=Nue~}ux`F z;cR7d+kc?aH3cRl>(R2c^}Eq>;6i4=7lyUdHqQF|MAbauML8;QHe~PCo&vO2pwDt< zbjxK|-8zVf^SyKhvWBu1?5WbkWB^D=wA4W*n1@){O4M75C%&|`a?V&r9Ny>(yXcut@Ei*a}Wk| zh7TIfw8SW0^9G-4dTdqT@pRUv!Mrc5roqUhn*Q#GormJ8DPYj1%t2%qqPf#OOXv3! z>Yvu}=&hPUvkBntwy>&J#yaAv40czykL=y1+>6Bb-Cbqa+vHL! z-6{s>R^S!u35*|SqpL$`T&S3r7Sszhva*X#JBVt2%s?c80}#p@c;MdD_4j!?#b#>P zed6IABODF>>&G$8boygh#*VkbFeto*UH9?KmRUYHj67CNe*&kb&5SZbyOBseTgNFV zq-Y!I^%c?B)Q_;A01ubj(;Gsn>*e+xGcE*9J*|pWRUuJ-HLvKj*CFQ5+6cgKv#Y>h z7L^p-KJBnYFf7cdoiux;6r%y0EA|rO|E@*5jI4@Fcx;-FH-)Ch?^n>^$4@@Zy0y8i z3tbOV8#?l2w&z}^vdI>9rOD*@RajI#CsdRA^k^I4E%S@zYX#izsW};nQMZK^= zab%)H8|I>pn&XDVC;up-r@5L@Ca5QcrDX!kteB5*0vO|dP~{*5grVTy*qy74ZJIMM z=>z_u{($ghewDmL7#If42QSfkOeU>OHY?F_g=|#p|0CH*(~U$kUut9zgsFC5l8q?e zX&UOZ2c6rfB|KPmz+vDf^DPhzIB}8ZmxY?;`Q(9%;U6S%TD;;@9&d3=I(U^y7&#oA z#49e=jY1o|Ne|Y+wHh_#LnH#mTXVq#d_Z5J&7`UUA+L|bjW+3&cTyrINl7KiwsUjM}Ii6^%}n|n=U?>Bx-RUB;Hi(6O;qNMD;K` zlS|(7lWM!jlPJCg98EnL+j>@(J$w1NG>%=~Yg24h&sJUJdFu2l=(^iDOtZ96-g+2#a(#R3O|T)%n?&Le(;x=DYQQ3lMH=~ zs?7o=uh8&s$}v-t4m+w=f&eVIn#RWzWv5N1Nl_pdGTeTtlPhfq|O^S4ZZIiQv&t_oVogTiW(r)KA%xCj1Yn&ANyOWq!d zm;f3w&PQ4w@V9MXLQ!8K-%*bqsY;c;QNF3lT`=FNk^QuVY<+jFnRJ?sb5L}0_;(~Z z%a_YEK?`r^G$f_m@ITZMn6<8^)r!jq2EWD%(x?+Z=6XB{Cb95x&fiuj2h z40#iKow($eB5eXjz!ytT3V9nAX+^{P`0}M%W!{Gyz#_3ge$Ag^x=%FSW{bk!j+5KB zJj~aiyN4t#2=(YGO9EL?zI+|D35`k^*ri=iDISA1J?K)(_+!J!mrctwFt0kW2E780 zx7Y?2I@$&}lWJN0A^X`iL^4{ef+kht^!(C-bm1*3X1x*~NT@|-9aQ=it$V2~`J|5Z zzo9`g*aaAS2YJNepMh3-HE**5q=OozM4es$eEVj|D}bgPW3|2=UDi~W5^Xu}g+HYZ zYqfY@4^YD^?zUPB&baSIBOKJZA7sUH`|o^>zL6*#CS?gQtcc-Ra$~Z2It{6H%#4ow zTBT$qzDr6N(6ONmLkW|04Z8jkdzWWU0h#Phzi;YwAjsND8b2n$&19HllfI9vm4zE^ zuE@!l*E9aq*Iip6on7@1fNr|TSF7z|F}g}79<&2wca_uEdM`%4EiIGvGR+9$IW0Yq zU`nVd!#u+~EYRdUa!OT>=OXrtXj^d|U70kEv3N6sE! zpu@qnaA;|upjflS4;BaBvq!tSE)y_vRlU0Zz$_V?#c}%IO@>85RepZ_YBBz>@Oha} obFQVqlU-M`SXOGqxf49rnNPOx=~)k5Ivqv%4@$dvn8}?00RJmQTmS$7 diff --git a/examples/Wifinfo/webserver.cpp b/examples/Wifinfo/webserver.cpp index 38ee502..c3f8f8c 100644 --- a/examples/Wifinfo/webserver.cpp +++ b/examples/Wifinfo/webserver.cpp @@ -158,7 +158,11 @@ void handleFormConfig(void) strncpy(config.ota_auth,server.arg("ota_auth").c_str(), CFG_PSK_SIZE ); itemp = server.arg("ota_port").toInt(); config.ota_port = (itemp>=0 && itemp<=65535) ? itemp : DEFAULT_OTA_PORT ; - + if(server.arg("dbg_file").toInt() == 1) + config.dbgfile=true; + else + config.dbgfile=false; + // Emoncms strncpy(config.emoncms.host, server.arg("emon_host").c_str(), CFG_EMON_HOST_SIZE ); strncpy(config.emoncms.url, server.arg("emon_url").c_str(), CFG_EMON_URL_SIZE ); @@ -579,6 +583,7 @@ void getConfJSONData(String & r) r+=CFG_FORM_EMON_FREQ; r+=FPSTR(FP_QCQ); r+=config.emoncms.freq; r+= FPSTR(FP_QCNL); r+=CFG_FORM_OTA_AUTH; r+=FPSTR(FP_QCQ); r+=config.ota_auth; r+= FPSTR(FP_QCNL); r+=CFG_FORM_OTA_PORT; r+=FPSTR(FP_QCQ); r+=config.ota_port; r+= FPSTR(FP_QCNL); + r+=CFG_FORM_DBGFILE; r+=FPSTR(FP_QCQ); r+=config.dbgfile; r+= FPSTR(FP_QCNL); r+=CFG_FORM_JDOM_HOST; r+=FPSTR(FP_QCQ); r+=config.jeedom.host; r+= FPSTR(FP_QCNL); r+=CFG_FORM_JDOM_PORT; r+=FPSTR(FP_QCQ); r+=config.jeedom.port; r+= FPSTR(FP_QCNL); @@ -590,7 +595,8 @@ void getConfJSONData(String & r) r+=CFG_FORM_HTTPREQ_HOST; r+=FPSTR(FP_QCQ); r+=config.httpReq.host; r+= FPSTR(FP_QCNL); r+=CFG_FORM_HTTPREQ_PORT; r+=FPSTR(FP_QCQ); r+=config.httpReq.port; r+= FPSTR(FP_QCNL); r+=CFG_FORM_HTTPREQ_PATH; r+=FPSTR(FP_QCQ); r+=config.httpReq.path; r+= FPSTR(FP_QCNL); - r+=CFG_FORM_HTTPREQ_FREQ; r+=FPSTR(FP_QCQ); r+=config.httpReq.freq; + r+=CFG_FORM_HTTPREQ_FREQ; r+=FPSTR(FP_QCQ); r+=config.httpReq.freq; r+= FPSTR(FP_QCNL); + r+=CFG_FORM_HTTPREQ_SWIDX; r+=FPSTR(FP_QCQ); r+=config.httpReq.swidx; r+= F("\""); From da574496d27dc4e08d36b8ade1c3e8fb9f773e41 Mon Sep 17 00:00:00 2001 From: Doume Date: Fri, 26 Jan 2018 17:01:06 +0100 Subject: [PATCH 7/9] Remove SPIFFS handling code not working (Debug to SPIFFS, by example) Fix compilation problems when SENSOR & DEBUG not set --- examples/Wifinfo/Wifinfo.h | 19 +++- examples/Wifinfo/Wifinfo.ino | 170 ++++++++++++----------------- examples/Wifinfo/config.cpp | 13 ++- examples/Wifinfo/config.h | 6 +- examples/Wifinfo/data/index.htm.gz | Bin 8317 -> 8766 bytes examples/Wifinfo/webclient.cpp | 28 +++-- examples/Wifinfo/webclient.h | 1 + examples/Wifinfo/webserver.cpp | 12 +- examples/Wifinfo/webserver.h | 1 + 9 files changed, 114 insertions(+), 136 deletions(-) diff --git a/examples/Wifinfo/Wifinfo.h b/examples/Wifinfo/Wifinfo.h index f8932b5..528d8a4 100644 --- a/examples/Wifinfo/Wifinfo.h +++ b/examples/Wifinfo/Wifinfo.h @@ -45,22 +45,29 @@ extern "C" { #include "webclient.h" #include "config.h" -// Declare SIMU to work and test a non connected module -#define SIMU +// Décommenter SIMU pour compiler une version de test +// pour un module non connecté au compteur EDF (simule un ADCO et une valeur HCHC) +//#define SIMU -#define DEBUG +// Décommenter DEBUG pour une version capable d'afficher du Debug +// soit sur Serial, soit sur Serial1 si compteur EDF raccordé sur Serial +//#define DEBUG -#define SENSOR +//Décommenter SENSOR pour compiler une version capable de gérer +// un contcat sec connecté entre Ground et D4 +//#define SENSOR // En mode SIMU, cela signifie que rien n'est connecté au port Serial // On peut donc laisser le debug sur ce port, pour beneficier de // l'affichage via Arduino IDE +#ifdef DEBUG #ifdef SIMU #define DEBUG_SERIAL Serial #else #define DEBUG_SERIAL Serial1 #define DEBUG_SERIAL1 -#endif +#endif //SIMU +#endif //DEBUG #define WIFINFO_VERSION "1.0.5a" @@ -83,7 +90,7 @@ extern "C" { #define DebugF(x) {} #define DebuglnF(x) {} #define Debugf(...) {} -#define Debugflush {} +#define Debugflush() {} #endif #define BLINK_LED_MS 50 // 50 ms blink diff --git a/examples/Wifinfo/Wifinfo.ino b/examples/Wifinfo/Wifinfo.ino index 3f8adf0..fba1de3 100644 --- a/examples/Wifinfo/Wifinfo.ino +++ b/examples/Wifinfo/Wifinfo.ino @@ -30,14 +30,16 @@ // Version 1.0.5a (11/01/2018) // Permettre la mise à jour OTA à partir de fichiers .ino.bin (Auduino IDE 1.8.3) // Ajout de la gestion d'un switch (Contact sec) relié à GND et D5 (GPIO-14) -// Décommenter le #define SENSOR dans Winfo.h +// Décommenter le #define SENSOR dans Wifinfo.h // Pour être utilisable avec Domoticz, au moins l'URL du serveur et le port // doivent être renseignés dans la configuration HTTP Request, ainsi que -// l'index du switch (dans Domoticz) +// l'index du switch (déclaré dans Domoticz) // L'état du switch (On/Off) est envoyé à Domoticz au boot, et à chaque // changement d'état //  Note : Nécessité de flasher le SPIFFS pour pouvoir configurer l'IDX du switch -// +// et flasher le sketch winfinfo.ino.bin via interface Web +// Rendre possible la compilation si define SENSOR en commentaire +// et DEFINE_DEBUG en commentaire (aucun debug, version Production...) // ********************************************************************************** // Include Arduino header #include @@ -58,14 +60,9 @@ // Global project file #include "Wifinfo.h" -/* -#include "StringStream.h" -#include "PString.h" -*/ //WiFiManager wifi(0); ESP8266WebServer server(80); - bool ota_blink; // Teleinfo @@ -96,7 +93,7 @@ volatile boolean task_jeedom = false; volatile boolean task_httpRequest = false; volatile boolean task_updsw = false; unsigned long seconds = 0; - +char buff[132]; //To format debug strings // sysinfo data _sysinfo sysinfo; @@ -126,50 +123,6 @@ unsigned long lastChangeTime = 0; // the last time the input pin was toggled unsigned long tempo = 200; // temps necessaire a la stabilisation du switch (0,2 seconde) #endif -/* -char logbuffer[255]; -PString flogger(logbuffer, sizeof(logbuffer)); -*/ - -/* ====================================================================== -Function: write_log -Purpose : Ecrire buffer de log sur filesystem SPIFFS, par paquets -Input : - -Output : - -Comments: - -====================================================================== -void write_log() -{ - if(SPIFFS.begin()) - { - //Changer de fichier si > MAX_SIZE - File log = SPIFFS.open("/log.txt", "r"); - if(log) - { - if (log.size() >= 50000) - { - log.close(); - if (SPIFFS.exists("/log.1")) - { - SPIFFS.remove("/log.1"); - } - SPIFFS.rename("/log.txt","/log.1"); - } else { - log.close(); - } - } - - // Ouvre fichier - File out = SPIFFS.open("/log.txt", "a+"); - if (out) { - out.print(logbuffer); - flogger.begin(); - } - out.close(); - } -} -*/ - /* ====================================================================== Function: UpdateSysinfo Purpose : update sysinfo variables @@ -203,7 +156,6 @@ void Task_1_Sec() task_1_sec = true; seconds++; } - /* ====================================================================== Function: Task_emoncms Purpose : callback of emoncms ticker @@ -502,13 +454,16 @@ Comments: - int WifiHandleConn(boolean setup = false) { int ret = WiFi.status(); - + char toprint[20]; + IPAddress ad; + if (setup) { - +#ifdef DEBUG DebuglnF("========== SDK Saved parameters Start"); WiFi.printDiag(DEBUG_SERIAL); DebuglnF("========== SDK Saved parameters End"); Debugflush(); +#endif // no correct SSID if (!*config.ssid) { @@ -577,8 +532,9 @@ int WifiHandleConn(boolean setup = false) nb_reconnect++; // increase reconnections count DebuglnF("connected!"); WiFi.mode(WIFI_STA); - - DebugF("IP address : "); Debugln(WiFi.localIP()); + ad = WiFi.localIP(); + sprintf(toprint,"%d.%d.%d.%d", ad[0],ad[1],ad[2],ad[3]); + DebugF("IP address : "); Debugln(toprint); DebugF("MAC address : "); Debugln(WiFi.macAddress()); // not connected ? start AP @@ -648,14 +604,36 @@ Input : - Output : - Comments: - ====================================================================== */ -void setup() -{ - char buff[32]; +void setup() { + boolean reset_config = true; // Set CPU speed to 160MHz system_update_cpu_freq(160); + // Check File system init +#ifdef DEBUG + DEBUG_SERIAL.begin(115200); +#endif + + if (! SPIFFS.begin() ) + { + // Serious problem + DebuglnF("SPIFFS Mount failed !"); + } else { + DebuglnF(""); + DebuglnF("SPIFFS Mount succesfull"); + + Dir dir = SPIFFS.openDir("/"); + while (dir.next()) { + String fileName = dir.fileName(); + size_t fileSize = dir.fileSize(); + sprintf(buff,"FS File: %s, size: %d\n", fileName.c_str(), fileSize); + Debug(buff); + } + DebuglnF(""); + } + //WiFi.disconnect(false); // Set WiFi to station mode and disconnect from an AP if it was previously connected @@ -670,12 +648,11 @@ void setup() // Init the serial 1, Our Debug Serial TXD0 // note this serial can only transmit, just // enough for debugging purpose - DEBUG_SERIAL.begin(115200); Debugln(F("\r\n\r\n==============")); Debug(F("WifInfo V")); Debugln(F(WIFINFO_VERSION)); Debugln(); - Debugflush(); +// Debugflush(); // Clear our global flags config.config = 0; @@ -688,30 +665,14 @@ void setup() DebugF(" (emoncms="); Debug(sizeof(_emoncms)); DebugF(" jeedom="); Debug(sizeof(_jeedom)); DebugF(" http request="); Debug(sizeof(_httpRequest)); - Debugln(')'); - Debugflush(); - - // Check File system init - if (!SPIFFS.begin()) - { - // Serious problem - DebuglnF("SPIFFS Mount failed"); - } else { - - DebuglnF("SPIFFS Mount succesfull"); + Debugln(" )"); +// Debugflush(); - Dir dir = SPIFFS.openDir("/"); - while (dir.next()) { - String fileName = dir.fileName(); - size_t fileSize = dir.fileSize(); - Debugf("FS File: %s, size: %d\n", fileName.c_str(), fileSize); - } - DebuglnF(""); - } + // Read Configuration from EEP if (readConfig()) { - DebuglnF("Good CRC, not set!"); + DebuglnF("Good CRC, not set! From now, we can use EEPROM config !"); } else { // Reset Configuration ResetConfig(); @@ -757,12 +718,15 @@ void setup() ArduinoOTA.onError([](ota_error_t error) { LedRGBON(COLOR_RED); - Debugf("Update Error[%u]: ", error); +#ifdef DEBUG + sprintf(buff,"Update Error[%u]: ", error); + Debug(buff); if (error == OTA_AUTH_ERROR) DebuglnF("Auth Failed"); else if (error == OTA_BEGIN_ERROR) DebuglnF("Begin Failed"); else if (error == OTA_CONNECT_ERROR) DebuglnF("Connect Failed"); else if (error == OTA_RECEIVE_ERROR) DebuglnF("Receive Failed"); else if (error == OTA_END_ERROR) DebuglnF("End Failed"); +#endif ESP.restart(); }); @@ -805,7 +769,8 @@ void setup() if(upload.status == UPLOAD_FILE_START) { uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000; WiFiUDP::stopAll(); - Debugf("Update: %s\n", upload.filename.c_str()); + sprintf(buff,"Update: %s\n", upload.filename.c_str()); + Debug(buff); LedRGBON(COLOR_MAGENTA); ota_blink = true; @@ -826,9 +791,10 @@ void setup() } else if(upload.status == UPLOAD_FILE_END) { //true to set the size to the current progress - if(Update.end(true)) - Debugf("Update Success: %u\nRebooting...\n", upload.totalSize); - else + if(Update.end(true)) { + sprintf(buff,"Update Success: %u\nRebooting...\n", upload.totalSize); + Debug(buff); + } else Update.printError(Serial1); LedRGBOFF(); @@ -840,9 +806,10 @@ void setup() } delay(0); } - ); - - // All other not known + ); + + /////////////////////////////////////////////////////// + // All other not known server.onNotFound(handleNotFound); // serves all SPIFFS Web file with 24hr max-age control @@ -916,7 +883,8 @@ void setup() pinMode(SensorPin, INPUT_PULLUP); DebuglnF("Switch sensor initialized"); reading = digitalRead(SensorPin); - Debugf("Initial State: %d\n", reading); + sprintf(buff,"Initial State: %d\n", reading); + Debug(buff); #endif } @@ -956,7 +924,6 @@ void loop() tinfo.addCustomValue(s2, v2, &flags); } #endif - } else if (task_emoncms) { emoncmsPost(); task_emoncms=false; @@ -966,13 +933,13 @@ void loop() } else if (task_httpRequest) { httpRequest(); task_httpRequest=false; - } else if (task_updsw) { + } +#ifdef SENSOR + else if (task_updsw) { UPD_switch(); task_updsw=false; } - - -#ifdef SENSOR + // read the state of the switch into a local variable: reading = digitalRead(SensorPin); @@ -993,7 +960,8 @@ void loop() // if the switch state has changed: if (reading != SwitchState) { - Debugf("Switch changed from %d to %d\n", SwitchState, reading); + sprintf(buff,"Switch changed from %d to %d\n", SwitchState, reading); + Debug(buff); SwitchState = reading; //Notify HTTP server that switch has changed, on next loop task_updsw=true; @@ -1012,9 +980,9 @@ void loop() // Read Serial and process to tinfo c = Serial.read(); tinfo.process(c); - } + } - //delay(10); -} + //delay(10); + } } diff --git a/examples/Wifinfo/config.cpp b/examples/Wifinfo/config.cpp index 90294b3..06d3341 100644 --- a/examples/Wifinfo/config.cpp +++ b/examples/Wifinfo/config.cpp @@ -62,11 +62,13 @@ void eepromDump(uint8_t bytesPerRow) // First byte of the row ? if (j==0) { // Display Address - Debugf("%04X : ", i); + sprintf(buff,"%04X : ", i); + Debug(buff); } // write byte in hex form - Debugf("%02X ", EEPROM.read(i)); + sprintf(buff,"%02X ", EEPROM.read(i)); + Debug(buff); // Last byte of the row ? // start a new line @@ -153,11 +155,13 @@ bool saveConfig (void) ret_code = readConfig(false); Debug(F("Write config ")); - + +#ifdef DEBUG if (ret_code) Debugln(F("OK!")); else Debugln(F("Error!")); +#endif //eepromDump(32); @@ -181,7 +185,6 @@ void showConfig() DebugF("ap_psk :"); Debugln(config.ap_psk); DebugF("OTA auth :"); Debugln(config.ota_auth); DebugF("OTA port :"); Debugln(config.ota_port); - DebugF("Dbg/file :"); Debugln(config.dbgfile); DebugF("Config :"); if (config.config & CFG_RGB_LED) DebugF(" RGB"); if (config.config & CFG_DEBUG) DebugF(" DEBUG"); @@ -190,7 +193,7 @@ void showConfig() DebuglnF("\r\n===== Emoncms"); DebugF("host :"); Debugln(config.emoncms.host); - DebugF("port :"); Debugln(config.emoncms.port); + DebugF("port :"); Debugln((int)config.emoncms.port); DebugF("url :"); Debugln(config.emoncms.url); DebugF("key :"); Debugln(config.emoncms.apikey); DebugF("node :"); Debugln(config.emoncms.node); diff --git a/examples/Wifinfo/config.h b/examples/Wifinfo/config.h index e796c85..71dae4c 100644 --- a/examples/Wifinfo/config.h +++ b/examples/Wifinfo/config.h @@ -147,8 +147,7 @@ typedef struct char ota_auth[CFG_PSK_SIZE+1]; // OTA Authentication password uint32_t config; // Bit field register uint16_t ota_port; // OTA port - boolean dbgfile; // true if debug on SPIFFS required - uint8_t filler[130]; // in case adding data in config avoiding loosing current conf by bad crc + uint8_t filler[131]; // in case adding data in config avoiding loosing current conf by bad crc _emoncms emoncms; // Emoncms configuration _jeedom jeedom; // jeedom configuration _httpRequest httpReq; // HTTP request @@ -158,7 +157,8 @@ typedef struct // Exported variables/object instancied in main sketch // =================================================== -extern _Config config; +extern _Config config; +extern char buff[]; #pragma pack(pop) diff --git a/examples/Wifinfo/data/index.htm.gz b/examples/Wifinfo/data/index.htm.gz index 223d08f891bb8e63de3227890933d294359f65db..d0b281949790f53a62ba812caa96c368cccde7a5 100644 GIT binary patch literal 8766 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 literal 8317 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

FgvxN@*S%4cbqP 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 ", port==443?"s":"", host, port, url); + sprintf(buff,"http%s://%s:%d%s => ", port==443?"s":"", host, port, url); + Debug(buff); // start connection and send HTTP header int httpCode = http.GET(); @@ -60,7 +61,8 @@ boolean httpPost(char * host, uint16_t port, char * url) } else { DebugF("failed!"); } - Debugf(" in %d ms\r\n",millis()-start); + sprintf(buff," in %d ms\r\n",millis()-start); + Debug(buff); return ret; } /* ====================================================================== @@ -326,43 +328,43 @@ boolean httpRequest(void) { url.replace("%PAPP%", me->value); } - if (valName == "ADCO") + if (valName == "ADCO") { url.replace("%ADCO%", me->value); } - if (valName == "OPTARIF") + if (valName == "OPTARIF") { url.replace("%OPTARIF%", me->value); } - if (valName == "ISOUC") + if (valName == "ISOUC") { url.replace("%ISOUC%", me->value); } - if (valName == "PTEC") + if (valName == "PTEC") { url.replace("%PTEC%", me->value); } - if (valName == "IINST") + if (valName == "IINST") { url.replace("%IINST%", me->value); } - if (valName == "IMAX") + if (valName == "IMAX") { url.replace("%IMAX%", me->value); } - if (valName == "HHPHC") + if (valName == "HHPHC") { url.replace("%HHPHC%", me->value); } - if (valName == "MOTDETAT") + if (valName == "MOTDETAT") { url.replace("%MOTDETAT%", me->value); } - if (valName == "BASE") + if (valName == "BASE") { url.replace("%BASE%", me->value); } - } + } } // While me ret = httpPost( config.httpReq.host, config.httpReq.port, (char *) url.c_str()) ; @@ -371,6 +373,7 @@ boolean httpRequest(void) return ret; } +#ifdef SENSOR /* ====================================================================== Function: UPD_switch Purpose : Do a http request to update Switch state into Domoticz @@ -404,4 +407,5 @@ boolean UPD_switch(void) } // if host & idx return ret; } +#endif diff --git a/examples/Wifinfo/webclient.h b/examples/Wifinfo/webclient.h index 41d03eb..b41171f 100644 --- a/examples/Wifinfo/webclient.h +++ b/examples/Wifinfo/webclient.h @@ -29,6 +29,7 @@ // Exported variables/object instancied in main sketch // =================================================== extern bool need_reinit; +extern char buff[]; // Exported function instancied in webserver.cpp // ============================================= diff --git a/examples/Wifinfo/webserver.cpp b/examples/Wifinfo/webserver.cpp index c3f8f8c..eb8f74c 100644 --- a/examples/Wifinfo/webserver.cpp +++ b/examples/Wifinfo/webserver.cpp @@ -158,11 +158,7 @@ void handleFormConfig(void) strncpy(config.ota_auth,server.arg("ota_auth").c_str(), CFG_PSK_SIZE ); itemp = server.arg("ota_port").toInt(); config.ota_port = (itemp>=0 && itemp<=65535) ? itemp : DEFAULT_OTA_PORT ; - if(server.arg("dbg_file").toInt() == 1) - config.dbgfile=true; - else - config.dbgfile=false; - + // Emoncms strncpy(config.emoncms.host, server.arg("emon_host").c_str(), CFG_EMON_HOST_SIZE ); strncpy(config.emoncms.url, server.arg("emon_url").c_str(), CFG_EMON_URL_SIZE ); @@ -583,15 +579,12 @@ void getConfJSONData(String & r) r+=CFG_FORM_EMON_FREQ; r+=FPSTR(FP_QCQ); r+=config.emoncms.freq; r+= FPSTR(FP_QCNL); r+=CFG_FORM_OTA_AUTH; r+=FPSTR(FP_QCQ); r+=config.ota_auth; r+= FPSTR(FP_QCNL); r+=CFG_FORM_OTA_PORT; r+=FPSTR(FP_QCQ); r+=config.ota_port; r+= FPSTR(FP_QCNL); - r+=CFG_FORM_DBGFILE; r+=FPSTR(FP_QCQ); r+=config.dbgfile; r+= FPSTR(FP_QCNL); - r+=CFG_FORM_JDOM_HOST; r+=FPSTR(FP_QCQ); r+=config.jeedom.host; r+= FPSTR(FP_QCNL); r+=CFG_FORM_JDOM_PORT; r+=FPSTR(FP_QCQ); r+=config.jeedom.port; r+= FPSTR(FP_QCNL); r+=CFG_FORM_JDOM_URL; r+=FPSTR(FP_QCQ); r+=config.jeedom.url; r+= FPSTR(FP_QCNL); r+=CFG_FORM_JDOM_KEY; r+=FPSTR(FP_QCQ); r+=config.jeedom.apikey; r+= FPSTR(FP_QCNL); r+=CFG_FORM_JDOM_ADCO; r+=FPSTR(FP_QCQ); r+=config.jeedom.adco; r+= FPSTR(FP_QCNL); r+=CFG_FORM_JDOM_FREQ; r+=FPSTR(FP_QCQ); r+=config.jeedom.freq; r+= FPSTR(FP_QCNL); - r+=CFG_FORM_HTTPREQ_HOST; r+=FPSTR(FP_QCQ); r+=config.httpReq.host; r+= FPSTR(FP_QCNL); r+=CFG_FORM_HTTPREQ_PORT; r+=FPSTR(FP_QCQ); r+=config.httpReq.port; r+= FPSTR(FP_QCNL); r+=CFG_FORM_HTTPREQ_PATH; r+=FPSTR(FP_QCQ); r+=config.httpReq.path; r+= FPSTR(FP_QCNL); @@ -876,7 +869,8 @@ void handleNotFound(void) // convert uri to char * for compare uri = server.uri().c_str(); - Debugf("handleNotFound(%s)\r\n", uri); + sprintf(buff,"handleNotFound(%s)\r\n", uri); + Debug(buff); // Got at least one and consistent URI ? if (me && uri && *uri=='/' && *++uri ) { diff --git a/examples/Wifinfo/webserver.h b/examples/Wifinfo/webserver.h index 3008078..c3e6066 100644 --- a/examples/Wifinfo/webserver.h +++ b/examples/Wifinfo/webserver.h @@ -38,6 +38,7 @@ extern unsigned int nb_reinit; extern bool need_reinit; extern bool first_info_call; extern int SwitchState; +extern char buff[]; // Exported function instancied in webclient.cpp // ============================================= From b20b2d91f646c27696d1d0c6d4d89896e3a58c3a Mon Sep 17 00:00:00 2001 From: Doume Date: Fri, 26 Jan 2018 17:38:43 +0100 Subject: [PATCH 8/9] =?UTF-8?q?Ajout=20de=20binaires=20pr=C3=A9-compil?= =?UTF-8?q?=C3=A9s=20pour=20Wemos=20D1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/Wifinfo/Binaires/SPIFFS/README | 6 ++++++ examples/Wifinfo/Binaires/Switch+Debug/README | 8 ++++++++ examples/Wifinfo/Binaires/no-Switch_no-Debug/README | 9 +++++++++ examples/Wifinfo/Wifinfo.h | 2 +- 4 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 examples/Wifinfo/Binaires/SPIFFS/README create mode 100644 examples/Wifinfo/Binaires/Switch+Debug/README create mode 100644 examples/Wifinfo/Binaires/no-Switch_no-Debug/README diff --git a/examples/Wifinfo/Binaires/SPIFFS/README b/examples/Wifinfo/Binaires/SPIFFS/README new file mode 100644 index 0000000..af49111 --- /dev/null +++ b/examples/Wifinfo/Binaires/SPIFFS/README @@ -0,0 +1,6 @@ +Attention : Le fichier wifinfo.spiffs.bin disponible dans ce dossier +ne peut être utilisé que sur une Wemos D1 mini configurée pour 1M de sketch et 3M de SPIFFS + +Si vous utilisez un module différent, vous devrez compiler vous-même le fichier SPIFFS +avec Arduino IDE configuré pour votre module.... + diff --git a/examples/Wifinfo/Binaires/Switch+Debug/README b/examples/Wifinfo/Binaires/Switch+Debug/README new file mode 100644 index 0000000..3258259 --- /dev/null +++ b/examples/Wifinfo/Binaires/Switch+Debug/README @@ -0,0 +1,8 @@ +Le fichier Wifinfo.ino.bin disponible dans ce dossier a été compilé +avec l'option DEBUG activée (sur Serial1) et la gestion d'un contact sec +entre Ground et D5 (option SENSOR activée) + +Il peut être flashé via port série (outil ESPTOOL), +ou via l'interface Web de Wifinfo, à condition que vous ayez au préalable +flashé le SPIFFS permettant la prise en compte des fichiers .ino.bin + diff --git a/examples/Wifinfo/Binaires/no-Switch_no-Debug/README b/examples/Wifinfo/Binaires/no-Switch_no-Debug/README new file mode 100644 index 0000000..1afa234 --- /dev/null +++ b/examples/Wifinfo/Binaires/no-Switch_no-Debug/README @@ -0,0 +1,9 @@ +Le fichier Wifinfo.ino.bin disponible dans ce dossier a été compilé +sans l'option DEBUG et sans la gestion d'un contact sec + (option SENSOR désactivée) + Il s'agit donc d'une version 'standard' production + +Il peut être flashé via port série (outil ESPTOOL), +ou via l'interface Web de Wifinfo, à condition que vous ayez au préalable +flashé le SPIFFS permettant la prise en compte des fichiers .ino.bin + diff --git a/examples/Wifinfo/Wifinfo.h b/examples/Wifinfo/Wifinfo.h index 528d8a4..b708d5f 100644 --- a/examples/Wifinfo/Wifinfo.h +++ b/examples/Wifinfo/Wifinfo.h @@ -54,7 +54,7 @@ extern "C" { //#define DEBUG //Décommenter SENSOR pour compiler une version capable de gérer -// un contcat sec connecté entre Ground et D4 +// un contact sec connecté entre Ground et D4 //#define SENSOR // En mode SIMU, cela signifie que rien n'est connecté au port Serial From 35c78894f52668f1bed9cacd19c8a71baefc6b4a Mon Sep 17 00:00:00 2001 From: Doume Date: Fri, 26 Jan 2018 17:46:58 +0100 Subject: [PATCH 9/9] Typo error --- examples/Wifinfo/Wifinfo.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Wifinfo/Wifinfo.h b/examples/Wifinfo/Wifinfo.h index b708d5f..133a4b0 100644 --- a/examples/Wifinfo/Wifinfo.h +++ b/examples/Wifinfo/Wifinfo.h @@ -54,7 +54,7 @@ extern "C" { //#define DEBUG //Décommenter SENSOR pour compiler une version capable de gérer -// un contact sec connecté entre Ground et D4 +// un contact sec connecté entre Ground et D5 (GPIO-14) //#define SENSOR // En mode SIMU, cela signifie que rien n'est connecté au port Serial