diff --git a/interface/public/fonts/re.woff2 b/interface/public/fonts/re.woff2 index 020729ef8..716979a34 100644 Binary files a/interface/public/fonts/re.woff2 and b/interface/public/fonts/re.woff2 differ diff --git a/interface/src/framework/network/NetworkSettingsForm.tsx b/interface/src/framework/network/NetworkSettingsForm.tsx index ffd2fd81e..fe4c574a5 100644 --- a/interface/src/framework/network/NetworkSettingsForm.tsx +++ b/interface/src/framework/network/NetworkSettingsForm.tsx @@ -313,7 +313,7 @@ const WiFiSettingsForm: FC = () => { )} {restartNeeded && ( - + diff --git a/interface/src/project/DashboardDevices.tsx b/interface/src/project/DashboardDevices.tsx index 693ca740e..abbb07b18 100644 --- a/interface/src/project/DashboardDevices.tsx +++ b/interface/src/project/DashboardDevices.tsx @@ -420,33 +420,35 @@ const DashboardDevices: FC = () => { )} - - {(tableList: any) => ( - <> -
- - - {LL.DESCRIPTION()} - {LL.TYPE(0)} - -
- - {tableList.map((device: Device) => ( - - - - - - {device.n} -   ({device.e}) - - {device.tn} - - ))} - - - )} -
+ {coreData.connected && ( + + {(tableList: any) => ( + <> +
+ + + {LL.DESCRIPTION()} + {LL.TYPE(0)} + +
+ + {tableList.map((device: Device) => ( + + + + + + {device.n} +   ({device.e}) + + {device.tn} + + ))} + + + )} +
+ )} ); diff --git a/interface/src/project/Help.tsx b/interface/src/project/Help.tsx index 611695e74..810ce107c 100644 --- a/interface/src/project/Help.tsx +++ b/interface/src/project/Help.tsx @@ -111,7 +111,7 @@ const Help: FC = () => { {'github.com/emsesp/EMS-ESP32'} - + @proddy @MichaelDvP diff --git a/lib/framework/FSPersistence.h b/lib/framework/FSPersistence.h index cdbc7f1e3..434ab78ee 100644 --- a/lib/framework/FSPersistence.h +++ b/lib/framework/FSPersistence.h @@ -63,16 +63,15 @@ class FSPersistence { // serialize it to filesystem File settingsFile = _fs->open(_filePath, "w"); -#ifdef EMSESP_DEBUG - Serial.println("Writing settings to " + String(_filePath)); -#endif - // failed to open file, return false if (!settingsFile || !jsonObject.size()) { return false; } - // serialize the data to the file +// serialize the data to the file +#ifdef EMSESP_DEBUG + Serial.println("Writing settings to " + String(_filePath)); +#endif serializeJson(jsonDocument, settingsFile); settingsFile.close(); return true; diff --git a/platformio.ini b/platformio.ini index a41ae6381..a6fac42a1 100644 --- a/platformio.ini +++ b/platformio.ini @@ -184,7 +184,6 @@ build_flags = ; platform = https://github.com/platformio/platform-espressif32.git ; platform = https://github.com/Jason2866/platform-espressif32.git#Arduino/IDF5 ; platform_packages = https://github.com/espressif/arduino-esp32.git#3.0.0-alpha2 - platform = espressif32@6.4.0 framework = arduino board = esp32dev diff --git a/scripts/api_test.http b/scripts/api_test.http index 2d62cee7d..b79a172be 100755 --- a/scripts/api_test.http +++ b/scripts/api_test.http @@ -2,6 +2,12 @@ # to be used with "REST Client" extension in Visual Studio Code (https://marketplace.visualstudio.com/items?itemName=humao.rest-client) # Open this file in VSC, modify the token, go to the API call and click on 'Send Request' (or Ctrl+Alt+R) # The response will be shown in the right panel +# +# You can also test with the command line +# test using CLI with: +# curl -X POST http://10.10.10.135/rest/signIn \ +# -H 'Content-Type: application/json' \ +# -d '{ "value" : 22 }' @host = http://ems-esp.local @host_dev = http://10.10.10.135 @@ -9,13 +15,9 @@ @token = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiYWRtaW4iOnRydWV9.2bHpWya2C7Q12WjNUBD6_7N3RCD7CMl-EGhyQVzFdDg GET {{host}}/api/system/info - ### - GET {{host}}/api/thermostat/seltemp - ### - POST {{host}}/api/thermostat/seltemp Content-Type: application/json Authorization: Bearer {{token}} @@ -23,9 +25,7 @@ Authorization: Bearer {{token}} { "value" : 21.0 } - ### - POST {{host}}/api/thermostat Content-Type: application/json Authorization: Bearer {{token}} @@ -34,9 +34,7 @@ Authorization: Bearer {{token}} "entity" : "seltemp", "value" : 21.0 } - ### - POST {{host}}/api Content-Type: application/json Authorization: Bearer {{token}} @@ -46,95 +44,68 @@ Authorization: Bearer {{token}} "entity" : "wwtapactivated", "value" : "on" } - ### - GET {{host}}/api/system/restart Authorization: Bearer {{token}} - ### - GET {{host}}/api/boiler/coldshot Authorization: Bearer {{token}} - ### - GET {{host}}/api/temperaturesensor/info - ### # # Test on dev # -GET {{host_dev}}/rest/features - -### GET {{host_dev}}/api/system/info - -# Run a test. EMS-ESP must be compiled with -DEMSESP_TEST -# Use this to load up a dummy thermostat and boiler with data - ### - GET {{host_dev}}/api?device=system&cmd=test&data=general - ### - GET {{host_dev}}/api/boiler/info - ### GET {{host_dev}}/api/boiler/values - ### - GET {{host_dev}}/api/analogsensor/info - ### - GET {{host_dev}}/api/boiler/coldshot Authorization: Bearer {{token}} +### +GET {{host_dev}}/api/system/commands +### +POST {{host_dev}}/api +Content-Type: application/json +Authorization: Bearer {{token}} + +{ + "device" : "system", + "entity" : "info", + "id" : 0 +} ### - -GET {{host_dev}}/api/system/commands - +GET {{host_dev}}/rest/features ### GET {{host_dev}}/rest/getSettings Authorization: Bearer {{token}} - ### - POST {{host_dev}}/rest/signIn Content-Type: application/json - ### - GET {{host_dev}}/rest/coreData Authorization: Bearer {{token}} - ### - GET {{host_dev}}/rest/logSettings - ### - GET {{host_dev}}/rest/systemStatus Authorization: Bearer {{token}} - ### - GET {{host_dev}}/rest/deviceData?id=1 Authorization: Bearer {{token}} - ### - GET {{host_dev}}/rest/networkSettings Authorization: Bearer {{token}} -# test using CLI with: - curl -X POST http://10.10.10.135/rest/signIn \ - -H 'Content-Type: application/json' \ - -d '{ "value" : 22 }' + diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index b94cb2c6d..25b32b57f 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -1,7 +1,7 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP * Copyright 2020 Paul Derbyshire - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or @@ -116,7 +116,7 @@ void AnalogSensor::reload() { } if (!found) { sensors_.emplace_back(sensor.gpio, sensor.name, sensor.offset, sensor.factor, sensor.uom, sensor.type); - sensors_.back().ha_registered = false; // this will trigger recrate of the HA config + sensors_.back().ha_registered = false; // this will trigger recreate of the HA config if (sensor.type == AnalogType::COUNTER || sensor.type >= AnalogType::DIGITAL_OUT) { sensors_.back().set_value(sensor.offset); } else { @@ -616,9 +616,9 @@ void AnalogSensor::publish_values(const bool force) { } JsonObject dev = config.createNestedObject("dev"); - dev["name"] = name; + dev["name"] = Mqtt::basename() + " Analog"; JsonArray ids = dev.createNestedArray("ids"); - ids.add(Mqtt::basename()); + ids.add(Mqtt::basename() + "-analog"); // add "availability" section Mqtt::add_avty_to_doc(stat_t, config.as(), val_cond); diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 30602656a..d6ff921a6 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -4226,7 +4226,7 @@ void Thermostat::register_device_values() { #if defined(EMSESP_STANDALONE_DUMP) // if we're just dumping out values, create a single dummy hc - register_device_values_hc(std::make_shared(1, this->model())); // hc=1 + register_device_values_hc(std::make_shared(1, this->model())); // hc=1 #endif } diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index c9c6bc6a5..f62fa278b 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -1755,7 +1755,7 @@ void EMSdevice::mqtt_ha_entity_config_create() { } #ifndef EMSESP_STANDALONE // always create minimum one config - if (ESP.getMaxAllocHeap() < (6 * 1024) || (!emsesp::EMSESP::system_.PSram() && ESP.getFreeHeap() < (65 * 1024))) { + if (ESP.getMaxAllocHeap() < (6 * 1024) || (!EMSESP::system_.PSram() && ESP.getFreeHeap() < (65 * 1024))) { break; } #endif diff --git a/src/emsesp.cpp b/src/emsesp.cpp index ad67f7268..3608c190b 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -1159,7 +1159,7 @@ bool EMSESP::add_device(const uint8_t device_id, const uint8_t product_id, const emsdevices.back()->unique_id(++unique_id_count_); // sort devices based on type - std::sort(emsdevices.begin(), emsdevices.end(), [](const std::unique_ptr & a, const std::unique_ptr & b) { + std::sort(emsdevices.begin(), emsdevices.end(), [](const std::unique_ptr & a, const std::unique_ptr & b) { return a->device_type() < b->device_type(); }); @@ -1398,7 +1398,7 @@ void EMSESP::scheduled_fetch_values() { EMSESP::EMSESP() #ifndef EMSESP_STANDALONE : telnet_([this](Stream & stream, const IPAddress & addr, uint16_t port) -> std::shared_ptr { - return std::make_shared(*this, stream, addr, port); + return std::make_shared(*this, stream, addr, port); }) #endif { @@ -1488,7 +1488,7 @@ void EMSESP::start() { // start the file system #ifndef EMSESP_STANDALONE if (!LittleFS.begin(true)) { - Serial.println("LittleFS Mount Failed. EMS-ESP stopped."); + Serial.println("LittleFS Mount Failed. Using default settings."); return; } #endif diff --git a/src/emsesp.h b/src/emsesp.h index 755a34d86..ea02110b6 100644 --- a/src/emsesp.h +++ b/src/emsesp.h @@ -83,11 +83,11 @@ namespace emsesp { -using DeviceValueUOM = emsesp::DeviceValue::DeviceValueUOM; -using DeviceValueType = emsesp::DeviceValue::DeviceValueType; -using DeviceValueState = emsesp::DeviceValue::DeviceValueState; -using DeviceValueTAG = emsesp::DeviceValue::DeviceValueTAG; -using DeviceValueNumOp = emsesp::DeviceValue::DeviceValueNumOp; +using DeviceValueUOM = DeviceValue::DeviceValueUOM; +using DeviceValueType = DeviceValue::DeviceValueType; +using DeviceValueState = DeviceValue::DeviceValueState; +using DeviceValueTAG = DeviceValue::DeviceValueTAG; +using DeviceValueNumOp = DeviceValue::DeviceValueNumOp; // forward declarations for compiler class EMSESPShell; diff --git a/src/main.cpp b/src/main.cpp index 0906f965a..722f5fb39 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,7 +18,9 @@ #include "emsesp.h" -static emsesp::EMSESP application; +using namespace emsesp; + +static EMSESP application; // the main application void setup() { application.start(); diff --git a/src/mqtt.cpp b/src/mqtt.cpp index ff2f42351..3b0745405 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -1194,12 +1194,16 @@ bool Mqtt::publish_ha_climate_config(const uint8_t tag, const bool has_roomtemp, snprintf(mode_str_tpl, sizeof(mode_str_tpl), - "{%%if %s%%}off{%%elif %s=='manual'%%}heat{%%elif %s=='day'%%}heat{%%elif %s=='night'%%}off{%%elif %s=='off'%%}off{%%else%%}auto{%%endif%%}", + "{%%if %s%%}off{%%elif %s=='%s'%%}heat{%%elif %s=='%s'%%}heat{%%elif %s=='%s'%%}off{%%elif %s=='%s'%%}off{%%else%%}auto{%%endif%%}", hc_mode_cond, hc_mode_s, + Helpers::translated_word(FL_(manual)), hc_mode_s, + Helpers::translated_word(FL_(day)), hc_mode_s, - hc_mode_s); + Helpers::translated_word(FL_(night)), + hc_mode_s, + Helpers::translated_word(FL_(off))); snprintf(name_s, sizeof(name_s), "Hc%d", hc_num); diff --git a/src/shower.cpp b/src/shower.cpp index f83813cb1..8c59abbf6 100644 --- a/src/shower.cpp +++ b/src/shower.cpp @@ -211,9 +211,9 @@ void Shower::set_shower_state(bool state, bool force) { } JsonObject dev = doc.createNestedObject("dev"); - dev["name"] = "EMS-ESP"; + dev["name"] = "EMS-ESP Shower"; JsonArray ids = dev.createNestedArray("ids"); - ids.add(Mqtt::basename()); + ids.add(Mqtt::basename() + "-shower"); Mqtt::add_avty_to_doc(stat_t, doc.as()); // add "availability" section @@ -221,7 +221,7 @@ void Shower::set_shower_state(bool state, bool force) { ha_configdone_ = Mqtt::queue_ha(topic, doc.as()); // publish the config payload with retain flag // - // shower duaration + // shower duration // doc.clear(); @@ -241,9 +241,9 @@ void Shower::set_shower_state(bool state, bool force) { // doc["ent_cat"] = "diagnostic"; JsonObject dev2 = doc.createNestedObject("dev"); - dev2["name"] = "EMS-ESP"; + dev2["name"] = "EMS-ESP Shower"; JsonArray ids2 = dev2.createNestedArray("ids"); - ids2.add(Mqtt::basename()); + ids2.add(Mqtt::basename() + "-shower"); Mqtt::add_avty_to_doc(stat_t, doc.as(), "value_json.duration is defined"); // add "availability" section @@ -268,9 +268,9 @@ void Shower::set_shower_state(bool state, bool force) { // doc["ent_cat"] = "diagnostic"; JsonObject dev3 = doc.createNestedObject("dev"); - dev3["name"] = "EMS-ESP"; + dev3["name"] = "EMS-ESP Shower"; JsonArray ids3 = dev3.createNestedArray("ids"); - ids3.add(Mqtt::basename()); + ids3.add(Mqtt::basename() + "-shower"); Mqtt::add_avty_to_doc(stat_t, doc.as(), "value_json.timestamp is defined"); // add "availability" section diff --git a/src/system.cpp b/src/system.cpp index aa32ae67d..d327c0fa9 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -1112,7 +1112,7 @@ bool System::check_upgrade(bool factory_settings) { #if defined(EMSESP_DEBUG) if (!missing_version) { - LOG_INFO("Current version from settings is %d.%d.%d-%s", + LOG_INFO("Checking version (settings has %d.%d.%d-%s)...", settings_version.major(), settings_version.minor(), settings_version.patch(), @@ -1120,26 +1120,20 @@ bool System::check_upgrade(bool factory_settings) { } #endif - // always save the new version to the settings - EMSESP::webSettingsService.update( - [&](WebSettings & settings) { - settings.version = EMSESP_APP_VERSION; - return StateUpdateResult::CHANGED; - }, - "local"); - if (factory_settings) { return false; // fresh install, do nothing } version::Semver200_version this_version(EMSESP_APP_VERSION); + bool save_version = true; + // compare versions - bool reboot_required = false; if (this_version > settings_version) { + // need upgrade LOG_NOTICE("Upgrading to version %d.%d.%d-%s", this_version.major(), this_version.minor(), this_version.patch(), this_version.prerelease().c_str()); - // if we're coming from 3.4.4 or 3.5.0b14 then we need to apply new settings + // if we're coming from 3.4.4 or 3.5.0b14 which had no version stored then we need to apply new settings if (missing_version) { LOG_DEBUG("Setting MQTT Entity ID format to v3.4 format"); EMSESP::esp8266React.getMqttSettingsService()->update( @@ -1149,15 +1143,26 @@ bool System::check_upgrade(bool factory_settings) { }, "local"); } - } else if (this_version < settings_version) { + // need downgrade LOG_NOTICE("Downgrading to version %d.%d.%d-%s", this_version.major(), this_version.minor(), this_version.patch(), this_version.prerelease().c_str()); } else { // same version, do nothing - return false; + save_version = false; } - return reboot_required; + // if we did a change, set the new version and reboot + if (save_version) { + EMSESP::webSettingsService.update( + [&](WebSettings & settings) { + settings.version = EMSESP_APP_VERSION; + return StateUpdateResult::CHANGED; + }, + "local"); + return true; // need reboot + } + + return false; } // list commands @@ -1220,15 +1225,14 @@ bool System::command_info(const char * value, const int8_t id, JsonObject & outp node["free app"] = EMSESP::system_.appFree(); // kilobytes node["partition"] = esp_ota_get_running_partition()->label; - // TODO test if works - const esp_app_desc_t * desc = esp_ota_get_app_description(); + // hash: Helpers::data_to_hex(desc->app_elf_sha256, sizeof(desc->app_elf_sha256)); + const esp_app_desc_t * desc = + esp_ota_get_app_description(); // https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/system/misc_system_api.html#_CPPv414esp_app_desc_t if (desc != nullptr) { - node["app_build"] = std::string(desc->date) + " " + desc->time + " hash: " + Helpers::data_to_hex(desc->app_elf_sha256, sizeof(desc->app_elf_sha256)); + node["app_build"] = std::string(desc->date) + " " + desc->time; } -#endif - node["reset reason"] = EMSESP::system_.reset_reason(0) + " / " + EMSESP::system_.reset_reason(1); + node["build_date"] = std::string(__DATE__) + " " + __TIME__; -#ifndef EMSESP_STANDALONE // Network Status node = output.createNestedObject("Network Info"); if (EMSESP::system_.ethernet_connected()) { diff --git a/src/temperaturesensor.cpp b/src/temperaturesensor.cpp index 3f91c463c..31c50599b 100644 --- a/src/temperaturesensor.cpp +++ b/src/temperaturesensor.cpp @@ -544,9 +544,9 @@ void TemperatureSensor::publish_values(const bool force) { config["name"] = name; JsonObject dev = config.createNestedObject("dev"); - dev["name"] = Mqtt::basename(); + dev["name"] = Mqtt::basename() + " Temperature"; JsonArray ids = dev.createNestedArray("ids"); - ids.add(Mqtt::basename()); + ids.add(Mqtt::basename() + "-temperature"); // add "availability" section Mqtt::add_avty_to_doc(stat_t, config.as(), val_cond); diff --git a/src/test/test.cpp b/src/test/test.cpp index ac72bacfd..c5e3cf040 100644 --- a/src/test/test.cpp +++ b/src/test/test.cpp @@ -282,8 +282,8 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const run_test("general"); // add sensors - emsesp::EMSESP::analogsensor_.test(); - emsesp::EMSESP::temperaturesensor_.test(); + EMSESP::analogsensor_.test(); + EMSESP::temperaturesensor_.test(); // shell.invoke_command("show devices"); shell.invoke_command("show values"); @@ -704,7 +704,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const if (command == "temperature") { shell.printfln("Testing adding Temperature sensor"); - emsesp::EMSESP::temperaturesensor_.test(); + EMSESP::temperaturesensor_.test(); ok = true; } @@ -714,7 +714,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const Mqtt::nested_format(1); // Mqtt::nested_format(0); - emsesp::EMSESP::temperaturesensor_.test(); + EMSESP::temperaturesensor_.test(); shell.invoke_command("show values"); shell.invoke_command("call system publish"); @@ -732,7 +732,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const Mqtt::nested_format(1); // Mqtt::nested_format(0); - emsesp::EMSESP::analogsensor_.test(); + EMSESP::analogsensor_.test(); shell.invoke_command("show values"); // shell.invoke_command("call system publish"); // shell.invoke_command("show mqtt"); @@ -956,19 +956,19 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const /* requestX.url("/api/system"); // check if defaults to info EMSESP::webAPIService.webAPIService_get(&requestX); - emsesp::EMSESP::logger().notice("*"); + EMSESP::logger().notice("*"); requestX.url("/api/system/info"); EMSESP::webAPIService.webAPIService_get(&requestX); - emsesp::EMSESP::logger().notice("*"); + EMSESP::logger().notice("*"); requestX.url("/api/thermostat"); // check if defaults to values EMSESP::webAPIService.webAPIService_get(&requestX); - emsesp::EMSESP::logger().notice("*"); + EMSESP::logger().notice("*"); requestX.url("/api/thermostat/info"); EMSESP::webAPIService.webAPIService_get(&requestX); - emsesp::EMSESP::logger().notice("*"); + EMSESP::logger().notice("*"); requestX.url("/api/thermostat/seltemp"); EMSESP::webAPIService.webAPIService_get(&requestX); @@ -984,7 +984,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const /* requestX.url("/api/temperaturesensor/xxxx"); EMSESP::webAPIService.webAPIService_get(&requestX); - emsesp::EMSESP::logger().notice("****"); + EMSESP::logger().notice("****"); requestX.url("/api/temperaturesensor/info"); EMSESP::webAPIService.webAPIService_get(&requestX); return; @@ -1160,7 +1160,7 @@ void Test::run_test(uuid::console::Shell & shell, const std::string & cmd, const request.url("/api"); EMSESP::webAPIService.webAPIService_post(&request, json); - emsesp::EMSESP::logger().warning("* these next ones should fail *"); + EMSESP::logger().warning("* these next ones should fail *"); // write value from web - testing hc9/seltemp - should fail! char data8[] = "{\"id\":2,\"devicevalue\":{\"v\":\"55\",\"u\":1,\"n\":\"hc2 selected room temperature\",\"c\":\"hc9/seltemp\"}"; diff --git a/src/web/WebAPIService.cpp b/src/web/WebAPIService.cpp index 2ec12d390..2e6fcb3b2 100644 --- a/src/web/WebAPIService.cpp +++ b/src/web/WebAPIService.cpp @@ -31,10 +31,10 @@ WebAPIService::WebAPIService(PsychicHttpServer * server, SecurityManager * secur } void WebAPIService::registerURI() { - // POST /{device}[/{hc|id}][/{name}] + // POST /api/{device}[/{hc|wwc|id}][/{name}] // note: must explicity use 'Content-Type: application/json' in header _server->on(EMSESP_API_SERVICE_PATH, HTTP_POST, [this](PsychicRequest * request, JsonVariant & json) { - // if no body then treat it as a secure GET + // if no json body then treat it as a secure GET if (!json.is()) { StaticJsonDocument input_doc; JsonObject input = input_doc.to(); @@ -49,7 +49,15 @@ void WebAPIService::registerURI() { // GET /{device}/{entity} _server->on(EMSESP_API_SERVICE_PATH, HTTP_GET, [this](PsychicRequest * request) { StaticJsonDocument input_doc; - JsonObject input = input_doc.to(); + JsonObject input = input_doc.to(); // empty input json + return parse(request, input); + }); + + + // GET - for when using GET query parameters, the old style from v2 + _server->on("/api", HTTP_GET, [this](PsychicRequest * request) { + StaticJsonDocument input_doc; + JsonObject input = input_doc.to(); // empty input json return parse(request, input); }); @@ -75,33 +83,40 @@ esp_err_t WebAPIService::parse(PsychicRequest * request, JsonObject & input) { // check for query parameters first, the old style from v2 // api?device={device}&cmd={name}&data={value}&id={hc} // TODO check if this works, because we're using wildcard now for api/* - if (request->url() == "/api") { - // get the device - if (request->hasParam(F_(device))) { - input["device"] = request->getParam(F_(device))->value().c_str(); - } - if (request->hasParam(F_(cmd))) { - input["cmd"] = request->getParam(F_(cmd))->value().c_str(); - } - if (request->hasParam(F_(data))) { - input["data"] = request->getParam(F_(data))->value().c_str(); - } - if (request->hasParam(F_(value))) { - input["value"] = request->getParam(F_(value))->value().c_str(); - } - if (request->hasParam(F_(id))) { - input["id"] = Helpers::atoint(request->getParam(F_(id))->value().c_str()); - } - if (request->hasParam(F_(hc))) { - input["hc"] = Helpers::atoint(request->getParam(F_(hc))->value().c_str()); - } - if (request->hasParam(F_(wwc))) { - input["wwc"] = Helpers::atoint(request->getParam(F_(wwc))->value().c_str()); - } + EMSESP::logger().info("API URL: %s", request->url().c_str()); // TODO remove + if (request->hasParam(F_(device))) { + input["device"] = request->getParam(F_(device))->value().c_str(); + EMSESP::logger().info("API: have device"); // TODO remove } + // if (request->url() == "/api") { + // get the device + if (request->hasParam(F_(device))) { + input["device"] = request->getParam(F_(device))->value().c_str(); + } + if (request->hasParam(F_(cmd))) { + input["cmd"] = request->getParam(F_(cmd))->value().c_str(); + } + if (request->hasParam(F_(data))) { + input["data"] = request->getParam(F_(data))->value().c_str(); + } + if (request->hasParam(F_(value))) { + input["value"] = request->getParam(F_(value))->value().c_str(); + } + if (request->hasParam(F_(id))) { + input["id"] = Helpers::atoint(request->getParam(F_(id))->value().c_str()); + } + if (request->hasParam(F_(hc))) { + input["hc"] = Helpers::atoint(request->getParam(F_(hc))->value().c_str()); + } + if (request->hasParam(F_(wwc))) { + input["wwc"] = Helpers::atoint(request->getParam(F_(wwc))->value().c_str()); + } + serializeJson(input, Serial); // TODO remove + // } + // capture current heap memory before allocating the large return buffer - emsesp::EMSESP::system_.refreshHeapMem(); + EMSESP::system_.refreshHeapMem(); // output json buffer size_t buffer = EMSESP_JSON_SIZE_XXXLARGE; @@ -129,7 +144,7 @@ esp_err_t WebAPIService::parse(PsychicRequest * request, JsonObject & input) { } else { snprintf(error, sizeof(error), "API failed with error code (%s)", Command::return_code_string(return_code).c_str()); } - emsesp::EMSESP::logger().err(error); + EMSESP::logger().err(error); api_fails_++; // FAIL, OK, NOT_FOUND, ERROR, NOT_ALLOWED = 400 (bad request), 200 (OK), 400 (not found), 400 (bad request), 401 (unauthorized) diff --git a/src/web/WebAPIService.h b/src/web/WebAPIService.h index fb4f3e7ee..22fbb56b6 100644 --- a/src/web/WebAPIService.h +++ b/src/web/WebAPIService.h @@ -1,7 +1,7 @@ /* * EMS-ESP - https://github.com/emsesp/EMS-ESP * Copyright 2020-2023 Paul Derbyshire - * + * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or diff --git a/src/web/WebCustomEntityService.cpp b/src/web/WebCustomEntityService.cpp index d1a645174..68c6da4db 100644 --- a/src/web/WebCustomEntityService.cpp +++ b/src/web/WebCustomEntityService.cpp @@ -431,9 +431,9 @@ void WebCustomEntityService::publish(const bool force) { } } JsonObject dev = config.createNestedObject("dev"); - dev["name"] = Mqtt::basename(); + dev["name"] = Mqtt::basename() + " Custom"; JsonArray ids = dev.createNestedArray("ids"); - ids.add(Mqtt::basename()); + ids.add(Mqtt::basename() + "-custom"); // add "availability" section Mqtt::add_avty_to_doc(stat_t, config.as(), val_cond); diff --git a/src/web/WebCustomizationService.cpp b/src/web/WebCustomizationService.cpp index 2998e937c..7f21f5c40 100644 --- a/src/web/WebCustomizationService.cpp +++ b/src/web/WebCustomizationService.cpp @@ -256,7 +256,7 @@ esp_err_t WebCustomizationService::customization_entities(PsychicRequest * reque } else { emsdevice->setCustomizationEntity(id_s); } - // emsesp::EMSESP::logger().info(id.as()); + // EMSESP::logger().info(id.as()); } // add deleted entities from file read([&](WebCustomization & settings) { diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index e7393a0cb..e51cdf1db 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -189,7 +189,7 @@ esp_err_t WebDataService::device_data(PsychicRequest * request) { for (const auto & emsdevice : EMSESP::emsdevices) { if (emsdevice->unique_id() == id) { // wait max 2.5 sec for updated data (post_send_delay is 2 sec) - for (uint16_t i = 0; i < (emsesp::TxService::POST_SEND_DELAY + 500) && EMSESP::wait_validate(); i++) { + for (uint16_t i = 0; i < (TxService::POST_SEND_DELAY + 500) && EMSESP::wait_validate(); i++) { delay(1); } EMSESP::wait_validate(0); // reset in case of timeout diff --git a/src/web/WebSchedulerService.cpp b/src/web/WebSchedulerService.cpp index cf1f02cae..c6989396d 100644 --- a/src/web/WebSchedulerService.cpp +++ b/src/web/WebSchedulerService.cpp @@ -292,9 +292,9 @@ void WebSchedulerService::publish(const bool force) { } JsonObject dev = config.createNestedObject("dev"); - dev["name"] = Mqtt::basename(); + dev["name"] = Mqtt::basename() + " Scheduler"; JsonArray ids = dev.createNestedArray("ids"); - ids.add(Mqtt::basename()); + ids.add(Mqtt::basename() + "-scheduler"); // add "availability" section Mqtt::add_avty_to_doc(stat_t, config.as(), val_cond); @@ -356,7 +356,7 @@ bool WebSchedulerService::command(const char * cmd, const char * data) { } else { snprintf(error, sizeof(error), "Scheduled command %s failed with error code (%s)", cmd, Command::return_code_string(return_code).c_str()); } - emsesp::EMSESP::logger().err(error); + EMSESP::logger().err(error); return false; } diff --git a/src/web/WebSettingsService.cpp b/src/web/WebSettingsService.cpp index 65ceee4d7..cb68c66c8 100644 --- a/src/web/WebSettingsService.cpp +++ b/src/web/WebSettingsService.cpp @@ -350,7 +350,7 @@ void WebSettingsService::onUpdate() { } if (WebSettings::has_flags(WebSettings::ChangeFlags::MQTT)) { - emsesp::Mqtt::reset_mqtt(); // reload MQTT, init HA etc + Mqtt::reset_mqtt(); // reload MQTT, init HA etc } WebSettings::reset_flags();