From 805cef68a291129e5736a4133ef2604a067e32c1 Mon Sep 17 00:00:00 2001 From: proddy Date: Sat, 13 Nov 2021 15:59:04 +0100 Subject: [PATCH 1/2] fix handling on non json payloads - #173 --- src/command.cpp | 3 ++- src/mqtt.cpp | 19 +++++++++++-------- src/test/test.cpp | 3 +++ src/version.h | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/command.cpp b/src/command.cpp index 7a1a0b19f..5a3e13c0d 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -151,7 +151,7 @@ uint8_t Command::process(const char * path, const bool is_admin, const JsonObjec char data_str[10]; return_code = Command::call(device_type, command_p, Helpers::render_value(data_str, (float)data.as(), 2), is_admin, id_n, output); } else if (data.isNull()) { - return_code = Command::call(device_type, command_p, "", is_admin, id_n, output); // empty + return_code = Command::call(device_type, command_p, "", is_admin, id_n, output); // empty, will do a query instead } else { return message(CommandRet::ERROR, "cannot parse command", output); // can't process } @@ -246,6 +246,7 @@ uint8_t Command::call(const uint8_t device_type, const char * cmd, const char * // check if its a call to and end-point to a device, i.e. has no value // except for system commands as this is a special device without any queryable entities (device values) // exclude SYSTEM and DALLASSENSOR + if ((device_type >= EMSdevice::DeviceType::BOILER) && (!value || !strlen(value))) { if (!cf || !cf->cmdfunction_json_) { #if defined(EMSESP_DEBUG) diff --git a/src/mqtt.cpp b/src/mqtt.cpp index f31d23b1b..bdf461cf7 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -256,21 +256,24 @@ void Mqtt::on_message(const char * topic, const char * payload, size_t len) { } } + StaticJsonDocument input_doc; + StaticJsonDocument output_doc; + JsonObject input, output; + // convert payload into a json doc, if it's not empty // if the payload is a single parameter (not JSON) create a JSON with the key 'value' - StaticJsonDocument input; if (len != 0) { - DeserializationError error = deserializeJson(input, message); - if (error == DeserializationError::Code::InvalidInput) { - input.clear(); // this is important to clear first - input["value"] = (const char *)message; // always a string + DeserializationError error = deserializeJson(input_doc, message); + if (!input_doc.containsKey("value") || error) { + input_doc.clear(); + input_doc["value"] = (const char *)message; // always a string } } // parse and call the command - StaticJsonDocument output_doc; - JsonObject output = output_doc.to(); - uint8_t return_code = Command::process(topic, true, input.as(), output); // mqtt is always authenticated + input = input_doc.as(); + output = output_doc.to(); + uint8_t return_code = Command::process(topic, true, input, output); // mqtt is always authenticated if (return_code != CommandRet::OK) { char error[100]; diff --git a/src/test/test.cpp b/src/test/test.cpp index 3c3095847..fda1ada31 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -640,6 +640,9 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd) { EMSESP::mqtt_.incoming("ems-esp/system/publish"); EMSESP::mqtt_.incoming("ems-esp/thermostat/seltemp"); // empty payload, sends reponse + EMSESP::mqtt_.incoming("ems-esp/boiler/wwseltemp", "59"); + EMSESP::mqtt_.incoming("ems-esp/boiler/wwseltemp"); + // MQTT bad tests EMSESP::mqtt_.incoming("ems-esp/thermostate/mode", "auto"); // unknown device EMSESP::mqtt_.incoming("ems-esp/thermostat/modee", "auto"); // unknown command diff --git a/src/version.h b/src/version.h index c8c6979b1..ccdc47158 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.3.0b4" +#define EMSESP_APP_VERSION "3.3.0b5" From c229371c685b89441b317c2c57a1f1db2f5052f7 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 14 Nov 2021 10:26:13 +0100 Subject: [PATCH 2/2] fix typo --- pio_local.ini_example | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pio_local.ini_example b/pio_local.ini_example index 5aa434a55..8d01020e6 100644 --- a/pio_local.ini_example +++ b/pio_local.ini_example @@ -8,7 +8,7 @@ my_build_flags = ; 5=verbose, 4=debug, 3=info -debug_flags = DCORE_DEBUG_LEVEL=5 +debug_flags = -DCORE_DEBUG_LEVEL=5 [env:esp32] ; if using OTA enter your details below @@ -19,9 +19,7 @@ upload_flags = upload_port = ems-esp.local ; use this when you don't want to re-build the WebUI -extra_scripts = - scripts/rename_fw.py - scripts/upload_fw.py +extra_scripts = scripts/rename_fw.py ; pio run -e debug ; or from Visual Studio Code do PIO -> Project Tasks -> debug -> General -> Upload and Monitor