From b449851510acd25500549f35cc181278bddded24 Mon Sep 17 00:00:00 2001 From: universam1 Date: Wed, 22 May 2019 23:16:51 +0200 Subject: [PATCH] migrating to ArduinoJSON v6 --- .travis.yml | 2 +- pio/lib/Globals/Globals.h | 2 +- pio/lib/Sender/Sender.cpp | 143 +++++++++++++++---------------- pio/lib/Sender/Sender.h | 11 +-- pio/src/iSpindel.cpp | 171 +++++++++++++++++++------------------- platformio.ini | 4 +- 6 files changed, 167 insertions(+), 166 deletions(-) diff --git a/.travis.yml b/.travis.yml index fbe33a74..0bb3b2fd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,7 +13,7 @@ script: - platformio run -e d1_mini deploy: provider: releases - # prerelease: true + prerelease: true api_key: secure: bU4iotLTrslYAlXQmSoMaGfCsjpM96TrKKne/2gFTlg++EQwjD/Z/i6T59lO7YVwp1GTD3qp/E4vSXfgkEm559mFIKZkd1IT8Vx/hpjX5CU6/OinGNmj1hYJw5M9DI1kQtc0wFDpbyNDnjPpKqBpFmIpqFyJUC7b3vctk/BMPkiiI5ncuBGp2f35M4qN2FedpTWoZdSAVZms7hsKFP4qZcih6stSlncUNf/niLwf78B31r5Td3G1aYQtHkB0BzyGQSgCvVuZ+PBm6zD/EWqRUGo6OWBCgwykbIZlgu45J4q46yQ2uS1CvRf4DFzIWU79bPg26MmxpjFe3oZucITTUtvOSzHFn8b1nuJE8IajYdM1KHSREl8Piej3A446P+JDQPk6ki3jCRyQentaZofI2ePUuqrvsV3iL4qKXMWpX1cOGU2c6nx0vvl/oft4rEcccibGpGZr0RIL7Ebpp7D4DSQ+bM+2XkuFab3W3QdrqrB6A0DOJuJfu/MvxEgkLtlpypZ2Z3g/F/TDgJkLSNEvX9e6kGAAIiIgkKz/zuuy04eNX+jox22TldovjbNSMCDfeeD6ghfKm0Q1+mdZax2dhvldgKOiwcZFL+TozN3AdPkr5GG/9m+dVaUGdrMK/n6uEJ++FZeUmdT8Pa2u/m3w2A4zeqMUWLM4WZMaUDW4cnA= file: ".pioenvs/d1_mini/firmware.bin" diff --git a/pio/lib/Globals/Globals.h b/pio/lib/Globals/Globals.h index a93c968c..6778d30c 100644 --- a/pio/lib/Globals/Globals.h +++ b/pio/lib/Globals/Globals.h @@ -20,7 +20,7 @@ extern Ticker flasher; // defines go here -#define FIRMWAREVERSION "6.0.6" +#define FIRMWAREVERSION "6.1.0" #define API_FHEM true #define API_UBIDOTS true diff --git a/pio/lib/Sender/Sender.cpp b/pio/lib/Sender/Sender.cpp index 86a896d4..7c4f816d 100644 --- a/pio/lib/Sender/Sender.cpp +++ b/pio/lib/Sender/Sender.cpp @@ -12,25 +12,28 @@ #define UBISERVER "things.ubidots.com" #define CONNTIMEOUT 2000 -SenderClass::SenderClass() -{ - _jsonVariant = _jsonBuffer.createObject(); -} +SenderClass::SenderClass() {} + void SenderClass::add(String id, float value) { - _jsonVariant[id] = value; + _doc[id] = value; } void SenderClass::add(String id, String value) { - _jsonVariant[id] = value; + _doc[id] = value; } void SenderClass::add(String id, uint32_t value) { - _jsonVariant[id] = value; + _doc[id] = value; } void SenderClass::add(String id, int32_t value) { - _jsonVariant[id] = value; + _doc[id] = value; +} +void SenderClass::stopclient() +{ + _client.stop(); + delay(100); // allow gracefull session close } bool SenderClass::sendMQTT(String server, uint16_t port, String username, String password, String name) @@ -58,40 +61,40 @@ bool SenderClass::sendMQTT(String server, uint16_t port, String username, String switch (Status) { case -4: - CONSOLELN(F("Connection timeout")); - break; + CONSOLELN(F("Connection timeout")); + break; case -3: - CONSOLELN(F("Connection lost")); - break; + CONSOLELN(F("Connection lost")); + break; case -2: - CONSOLELN(F("Connect failed")); - break; + CONSOLELN(F("Connect failed")); + break; case -1: - CONSOLELN(F("Disconnected")); - break; + CONSOLELN(F("Disconnected")); + break; case 1: - CONSOLELN(F("Bad protocol")); - break; + CONSOLELN(F("Bad protocol")); + break; case 2: - CONSOLELN(F("Bad client ID")); - break; + CONSOLELN(F("Bad client ID")); + break; case 3: - CONSOLELN(F("Unavailable")); - break; + CONSOLELN(F("Unavailable")); + break; case 4: - CONSOLELN(F("Bad credentials")); - break; + CONSOLELN(F("Bad credentials")); + break; case 5: - CONSOLELN(F("Unauthorized")); - break; + CONSOLELN(F("Unauthorized")); + break; } CONSOLELN(F("Retrying MQTT connection in 5 seconds")); // Wait 5 seconds before retrying @@ -99,17 +102,18 @@ bool SenderClass::sendMQTT(String server, uint16_t port, String username, String delay(5000); } } + //MQTT publish values - for (const auto &kv : _jsonVariant.as()) + for (const auto &kv : _doc.as()) { - CONSOLELN("MQTT publish: ispindel/" + name + "/" + kv.key + "/" + kv.value.as()); - _mqttClient.publish(("ispindel/" + name + "/" + kv.key).c_str(), kv.value.as().c_str()); + CONSOLELN("MQTT publish: ispindel/" + name + "/" + kv.key().c_str() + "/" + kv.value().as()); + _mqttClient.publish(("ispindel/" + name + "/" + kv.key().c_str()).c_str(), kv.value().as().c_str()); _mqttClient.loop(); //This should be called regularly to allow the client to process incoming messages and maintain its connection to the server. } CONSOLELN(F("Closing MQTT connection")); _mqttClient.disconnect(); - delay(100); // allow gracefull session close + stopclient(); return true; } void SenderClass::mqttCallback(char *topic, byte *payload, unsigned int length) @@ -127,12 +131,12 @@ String SenderClass::sendTCP(String server, uint16_t port) { int timeout = 0; String response; - _jsonVariant.printTo(Serial); + serializeJson(_doc, Serial); if (_client.connect(server.c_str(), port)) { CONSOLELN(F("\nSender: TCP stream")); - _jsonVariant.printTo(_client); + serializeJson(_doc, _client); _client.println(); } else @@ -150,26 +154,24 @@ String SenderClass::sendTCP(String server, uint16_t port) response += _client.read(); } CONSOLELN(response); - _client.stop(); - delay(50); // allow gracefull session close + stopclient(); return response; } bool SenderClass::sendGenericPost(String server, String url, uint16_t port) { - _jsonVariant.printTo(Serial); - + serializeJson(_doc, Serial); HTTPClient http; CONSOLELN(F("HTTPAPI: posting")); // configure traged server and url - http.begin(server, port, url); + http.begin(_client, server, port, url); http.addHeader("User-Agent", "iSpindel"); http.addHeader("Connection", "close"); http.addHeader("Content-Type", "application/json"); String json; - _jsonVariant.printTo(json); + serializeJson(_doc, json); auto httpCode = http.POST(json); CONSOLELN(String(F("code: ")) + httpCode); @@ -188,7 +190,7 @@ bool SenderClass::sendGenericPost(String server, String url, uint16_t port) } http.end(); - delay(100); // allow gracefull session close + stopclient(); return true; } @@ -201,7 +203,7 @@ bool SenderClass::sendInfluxDB(String server, uint16_t port, String db, String n CONSOLELN(String(F("INFLUXDB: posting to db: ")) + uri); // configure traged server and url - http.begin(server + ':' + port + uri); + http.begin(_client, server, port, uri); if (username.length() > 0) { @@ -217,15 +219,18 @@ bool SenderClass::sendInfluxDB(String server, uint16_t port, String db, String n msg += name; msg += " "; - for (const auto &kv : _jsonVariant.as()) + for (const auto &kv : _doc.to()) { - msg += kv.key; + msg += kv.key().c_str(); msg += "="; // check if value is of type char, if so set value in double quotes - if ( kv.value.is() ) { - msg += '"' + kv.value.as() + '"'; - }else{ - msg += kv.value.as(); + if (kv.value().is()) + { + msg += '"' + kv.value().as() + '"'; + } + else + { + msg += kv.value().as(); } msg += ","; } @@ -251,7 +256,7 @@ bool SenderClass::sendInfluxDB(String server, uint16_t port, String db, String n } http.end(); - delay(100); // allow gracefull session close + stopclient(); return true; } @@ -267,7 +272,7 @@ bool SenderClass::sendPrometheus(String server, uint16_t port, String job, Strin CONSOLELN(String("PROMETHEUS: posting to Prometheus Pushgateway: ") + uri); // configure traged server and url - http.begin(server, port, uri); + http.begin(_client, server, port, uri); http.addHeader("User-Agent", "iSpindel"); http.addHeader("Connection", "close"); http.addHeader("Content-Type", "text/plain"); @@ -276,19 +281,19 @@ bool SenderClass::sendPrometheus(String server, uint16_t port, String job, Strin //Build up the data for the Prometheus Pushgateway //A gauge is a metric that represents a single numerical value that can arbitrarily go up and down. - for (const auto &kv : _jsonVariant.as()) + for (const auto &kv : _doc.to()) { msg += "# TYPE "; - msg += kv.key; + msg += kv.key().c_str(); msg += " gauge\n"; msg += "# HELP "; - msg += kv.key; + msg += kv.key().c_str(); msg += " The approximate value of "; - msg += kv.key; + msg += kv.key().c_str(); msg += ".\n"; - msg += kv.key; + msg += kv.key().c_str(); msg += " "; - msg += kv.value.as(); + msg += kv.value().as(); msg += "\n"; } @@ -309,13 +314,13 @@ bool SenderClass::sendPrometheus(String server, uint16_t port, String job, Strin } http.end(); - delay(100); // allow gracefull session close + stopclient(); return true; } bool SenderClass::sendUbidots(String token, String name) { - _jsonVariant.printTo(Serial); + serializeJson(_doc, Serial); if (_client.connect(UBISERVER, 80)) { @@ -326,11 +331,11 @@ bool SenderClass::sendUbidots(String token, String name) msg += "?token="; msg += token; msg += F(" HTTP/1.1\r\nHost: things.ubidots.com\r\nUser-Agent: ESP8266\r\nConnection: close\r\nContent-Type: application/json\r\nContent-Length: "); - msg += _jsonVariant.measureLength(); + msg += measureJson(_doc); msg += "\r\n"; _client.println(msg); - _jsonVariant.printTo(_client); + serializeJson(_doc, _client); _client.println(); CONSOLELN(msg); } @@ -352,13 +357,13 @@ bool SenderClass::sendUbidots(String token, String name) } // currentValue = 0; _client.stop(); - delay(100); // allow gracefull session close + stopclient(); return true; } bool SenderClass::sendFHEM(String server, uint16_t port, String name) { - _jsonVariant.printTo(Serial); + serializeJson(_doc, Serial); if (_client.connect(server.c_str(), port)) { @@ -367,10 +372,10 @@ bool SenderClass::sendFHEM(String server, uint16_t port, String name) String msg = String("GET /fhem?cmd.Test=set%20"); msg += name; - for (const auto &kv : _jsonVariant.as()) + for (const auto &kv : _doc.to()) { msg += "%20"; - msg += kv.value.as(); + msg += kv.value().as(); } msg += F("&XHR=1 HTTP/1.1\r\nHost: "); @@ -402,13 +407,13 @@ bool SenderClass::sendFHEM(String server, uint16_t port, String name) } // currentValue = 0; _client.stop(); - delay(100); // allow gracefull session close + stopclient(); return true; } bool SenderClass::sendTCONTROL(String server, uint16_t port) { - _jsonVariant.printTo(Serial); + serializeJson(_doc, Serial); if (_client.connect(server.c_str(), port)) { @@ -416,11 +421,11 @@ bool SenderClass::sendTCONTROL(String server, uint16_t port) CONSOLELN(F("\nSender: TCONTROL")); String msg; - for (const auto &kv : _jsonVariant.as()) + for (const auto &kv : _doc.to()) { - msg += kv.key; + msg += kv.key().c_str(); msg += ": "; - msg += kv.value.as(); + msg += kv.value().as(); msg += " "; } msg.remove(msg.length() - 1); @@ -444,8 +449,6 @@ bool SenderClass::sendTCONTROL(String server, uint16_t port) char c = _client.read(); Serial.write(c); } - // currentValue = 0; - _client.stop(); - delay(100); // allow gracefull session close + stopclient(); return true; } diff --git a/pio/lib/Sender/Sender.h b/pio/lib/Sender/Sender.h index 5bd8ba4e..14b6fa2d 100644 --- a/pio/lib/Sender/Sender.h +++ b/pio/lib/Sender/Sender.h @@ -10,7 +10,7 @@ #include #include -#include //https://github.com/bblanchon/ArduinoJson +#include #include class SenderClass @@ -29,17 +29,14 @@ class SenderClass void add(String id, String value); void add(String id, int32_t value); void add(String id, uint32_t value); - void mqttCallback(char* topic, byte* payload, unsigned int length); + void stopclient(); + void mqttCallback(char *topic, byte *payload, unsigned int length); // ~SenderClass(); private: WiFiClient _client; PubSubClient _mqttClient; - - // StaticJsonBuffer<200> _jsonBuffer; - DynamicJsonBuffer _jsonBuffer; - // JsonObject data; - JsonVariant _jsonVariant; + StaticJsonDocument<1024> _doc; }; #endif diff --git a/pio/src/iSpindel.cpp b/pio/src/iSpindel.cpp index 25e19059..78ba7852 100644 --- a/pio/src/iSpindel.cpp +++ b/pio/src/iSpindel.cpp @@ -155,63 +155,63 @@ bool readConfig() std::unique_ptr buf(new char[size]); configFile.readBytes(buf.get(), size); - DynamicJsonBuffer jsonBuffer; - JsonObject &json = jsonBuffer.parseObject(buf.get()); + DynamicJsonDocument doc(1024); + DeserializationError error = deserializeJson(doc, buf.get()); - if (json.success()) + if (!error) { - if (json.containsKey("Name")) - strcpy(my_name, json["Name"]); - if (json.containsKey("Token")) - strcpy(my_token, json["Token"]); - if (json.containsKey("Server")) - strcpy(my_server, json["Server"]); - if (json.containsKey("Sleep")) - my_sleeptime = json["Sleep"]; - if (json.containsKey("API")) - my_api = json["API"]; - if (json.containsKey("Port")) - my_port = json["Port"]; - if (json.containsKey("URL")) - strcpy(my_url, json["URL"]); - if (json.containsKey("DB")) - strcpy(my_db, json["DB"]); - if (json.containsKey("Username")) - strcpy(my_username, json["Username"]); - if (json.containsKey("Password")) - strcpy(my_password, json["Password"]); - if (json.containsKey("Job")) - strcpy(my_job, json["Job"]); - if (json.containsKey("Instance")) - strcpy(my_instance, json["Instance"]); - if (json.containsKey("Vfact")) - my_vfact = json["Vfact"]; - if (json.containsKey("TS")) - my_tempscale = json["TS"]; - if (json.containsKey("OWpin")) - my_OWpin = json["OWpin"]; - if (json.containsKey("SSID")) - my_ssid = (const char *)json["SSID"]; - if (json.containsKey("PSK")) - my_psk = (const char *)json["PSK"]; - if (json.containsKey("POLY")) - strcpy(my_polynominal, json["POLY"]); + if (doc.containsKey("Name")) + strcpy(my_name, doc["Name"]); + if (doc.containsKey("Token")) + strcpy(my_token, doc["Token"]); + if (doc.containsKey("Server")) + strcpy(my_server, doc["Server"]); + if (doc.containsKey("Sleep")) + my_sleeptime = doc["Sleep"]; + if (doc.containsKey("API")) + my_api = doc["API"]; + if (doc.containsKey("Port")) + my_port = doc["Port"]; + if (doc.containsKey("URL")) + strcpy(my_url, doc["URL"]); + if (doc.containsKey("DB")) + strcpy(my_db, doc["DB"]); + if (doc.containsKey("Username")) + strcpy(my_username, doc["Username"]); + if (doc.containsKey("Password")) + strcpy(my_password, doc["Password"]); + if (doc.containsKey("Job")) + strcpy(my_job, doc["Job"]); + if (doc.containsKey("Instance")) + strcpy(my_instance, doc["Instance"]); + if (doc.containsKey("Vfact")) + my_vfact = doc["Vfact"]; + if (doc.containsKey("TS")) + my_tempscale = doc["TS"]; + if (doc.containsKey("OWpin")) + my_OWpin = doc["OWpin"]; + if (doc.containsKey("SSID")) + my_ssid = (const char *)doc["SSID"]; + if (doc.containsKey("PSK")) + my_psk = (const char *)doc["PSK"]; + if (doc.containsKey("POLY")) + strcpy(my_polynominal, doc["POLY"]); my_aX = UNINIT; my_aY = UNINIT; my_aZ = UNINIT; - if (json.containsKey("aX")) - my_aX = json["aX"]; - if (json.containsKey("aY")) - my_aY = json["aY"]; - if (json.containsKey("aZ")) - my_aZ = json["aZ"]; + if (doc.containsKey("aX")) + my_aX = doc["aX"]; + if (doc.containsKey("aY")) + my_aY = doc["aY"]; + if (doc.containsKey("aZ")) + my_aZ = doc["aZ"]; applyOffset(); CONSOLELN(F("parsed config:")); #ifdef DEBUG - json.printTo(Serial); + serializeJson(doc, Serial); CONSOLELN(); #endif return true; @@ -440,35 +440,34 @@ bool saveConfig() !SPIFFS.open(CFGFILE, "w")) formatSpiffs(); - DynamicJsonBuffer jsonBuffer; - JsonObject &json = jsonBuffer.createObject(); + DynamicJsonDocument doc(1024); - json["Name"] = my_name; - json["Token"] = my_token; - json["Sleep"] = my_sleeptime; + doc["Name"] = my_name; + doc["Token"] = my_token; + doc["Sleep"] = my_sleeptime; // first reboot is for test my_sleeptime = 1; - json["Server"] = my_server; - json["API"] = my_api; - json["Port"] = my_port; - json["URL"] = my_url; - json["DB"] = my_db; - json["Username"] = my_username; - json["Password"] = my_password; - json["Job"] = my_job; - json["Instance"] = my_instance; - json["Vfact"] = my_vfact; - json["TS"] = my_tempscale; - json["OWpin"] = my_OWpin; + doc["Server"] = my_server; + doc["API"] = my_api; + doc["Port"] = my_port; + doc["URL"] = my_url; + doc["DB"] = my_db; + doc["Username"] = my_username; + doc["Password"] = my_password; + doc["Job"] = my_job; + doc["Instance"] = my_instance; + doc["Vfact"] = my_vfact; + doc["TS"] = my_tempscale; + doc["OWpin"] = my_OWpin; // Store current Wifi credentials - json["SSID"] = WiFi.SSID(); - json["PSK"] = WiFi.psk(); + doc["SSID"] = WiFi.SSID(); + doc["PSK"] = WiFi.psk(); - json["POLY"] = my_polynominal; - json["aX"] = my_aX; - json["aY"] = my_aY; - json["aZ"] = my_aZ; + doc["POLY"] = my_polynominal; + doc["aX"] = my_aX; + doc["aY"] = my_aY; + doc["aZ"] = my_aZ; File configFile = SPIFFS.open(CFGFILE, "w+"); if (!configFile) @@ -480,9 +479,9 @@ bool saveConfig() else { #ifdef DEBUG - json.printTo(Serial); + serializeJson(doc, Serial); #endif - json.printTo(configFile); + serializeJson(doc, configFile); configFile.close(); SPIFFS.end(); CONSOLELN(F("saved successfully")); @@ -492,22 +491,24 @@ bool saveConfig() bool processResponse(String response) { - DynamicJsonBuffer jsonBuffer; - JsonObject &json = jsonBuffer.parseObject(response); + DynamicJsonDocument doc(1024); - if (json.success() && json.containsKey("interval")) - { - uint32_t interval = json["interval"]; - if (interval != my_sleeptime && - interval < 24 * 60 * 60 && - interval > 10) + DeserializationError error = deserializeJson(doc, response); + if (error) + + if (!error && doc.containsKey("interval")) { - my_sleeptime = interval; - CONSOLE(F("Received new Interval config: ")); - CONSOLELN(interval); - return saveConfig(); + uint32_t interval = doc["interval"]; + if (interval != my_sleeptime && + interval < 24 * 60 * 60 && + interval > 10) + { + my_sleeptime = interval; + CONSOLE(F("Received new Interval config: ")); + CONSOLELN(interval); + return saveConfig(); + } } - } return false; } @@ -635,7 +636,7 @@ bool uploadData(uint8_t service) sender.add("U", Volt); sender.add("G", Gravity); CONSOLELN(F("\ncalling TCONTROL")); - return sender.sendTCONTROL(my_server, my_port); + return sender.sendTCONTROL(my_server, 4968); } #endif // DATABASESYSTEM == return false; diff --git a/platformio.ini b/platformio.ini index a44d5e32..56296644 100644 --- a/platformio.ini +++ b/platformio.ini @@ -20,7 +20,7 @@ framework = arduino monitor_speed = 115200 upload_speed = 921600 lib_deps = - ArduinoJson@<6 + ArduinoJson@>5 ESP Async WebServer OneWire DallasTemperature @@ -34,7 +34,7 @@ framework = arduino monitor_speed = 115200 upload_speed = 921600 lib_deps = - ArduinoJson@<6 + ArduinoJson@>5 ESP Async WebServer OneWire DallasTemperature