diff --git a/interface/src/project/DashboardDevices.tsx b/interface/src/project/DashboardDevices.tsx index c98ef559e..693ca740e 100644 --- a/interface/src/project/DashboardDevices.tsx +++ b/interface/src/project/DashboardDevices.tsx @@ -350,7 +350,7 @@ const DashboardDevices: FC = () => { const deviceValueDialogSave = async (devicevalue: DeviceValue) => { const id = Number(device_select.state.id); - await writeDeviceValue({ id, devicevalue }) + await writeDeviceValue({ id, c: devicevalue.c, v: devicevalue.v }) .then(() => { toast.success(LL.WRITE_CMD_SENT()); }) diff --git a/mock-api/server.js b/mock-api/server.js index b5e96205e..48fb34dfb 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -2404,42 +2404,45 @@ rest_server.post(EMSESP_WRITE_ENTITIES_ENDPOINT, (req, res) => { }); rest_server.post(EMSESP_WRITE_VALUE_ENDPOINT, async (req, res) => { - const devicevalue = req.body.devicevalue; + const command = req.body.c; + const value = req.body.v; const id = req.body.id; console.log('Write device value for id : ' + id); - console.log(' devicedata: ' + JSON.stringify(devicevalue)); + console.log(' data: ' + JSON.stringify(req.body)); if (id === 1) { - objIndex = emsesp_devicedata_1.data.findIndex((obj) => obj.c == devicevalue.c); - emsesp_devicedata_1.data[objIndex] = devicevalue; + objIndex = emsesp_devicedata_1.data.findIndex((obj) => obj.c == command); + emsesp_devicedata_1.data[objIndex].v = value; } if (id === 2) { - objIndex = emsesp_devicedata_2.data.findIndex((obj) => obj.c == devicevalue.c); - emsesp_devicedata_2.data[objIndex] = devicevalue; + objIndex = emsesp_devicedata_2.data.findIndex((obj) => obj.c == command); + emsesp_devicedata_2.data[objIndex].v = value; } if (id === 3) { - objIndex = emsesp_devicedata_3.data.findIndex((obj) => obj.c == devicevalue.c); - emsesp_devicedata_3.data[objIndex] = devicevalue; + objIndex = emsesp_devicedata_3.data.findIndex((obj) => obj.c == command); + emsesp_devicedata_3.data[objIndex].v = value; } if (id === 4) { - objIndex = emsesp_devicedata_4.data.findIndex((obj) => obj.c == devicevalue.c); - emsesp_devicedata_4.data[objIndex] = devicevalue; + objIndex = emsesp_devicedata_4.data.findIndex((obj) => obj.c == command); + emsesp_devicedata_4.data[objIndex].v = value; } if (id === 5) { - objIndex = emsesp_devicedata_5.data.findIndex((obj) => obj.c == devicevalue.c); - emsesp_devicedata_5.data[objIndex] = devicevalue; + objIndex = emsesp_devicedata_5.data.findIndex((obj) => obj.c == command); + emsesp_devicedata_5.data[objIndex].v = value; } if (id === 6) { - objIndex = emsesp_devicedata_6.data.findIndex((obj) => obj.c == devicevalue.c); - emsesp_devicedata_6.data[objIndex] = devicevalue; + objIndex = emsesp_devicedata_6.data.findIndex((obj) => obj.c == command); + emsesp_devicedata_6.data[objIndex].v = value; } if (id === 7) { - objIndex = emsesp_devicedata_7.data.findIndex((obj) => obj.c == devicevalue.c); - emsesp_devicedata_7.data[objIndex] = devicevalue; + objIndex = emsesp_devicedata_7.data.findIndex((obj) => obj.c == command); + emsesp_devicedata_7.data[objIndex].v = value; } + + // custom entities if (id === 99) { - objIndex = emsesp_devicedata_99.data.findIndex((obj) => obj.c == devicevalue.c); - emsesp_devicedata_99.data[objIndex] = devicevalue; + objIndex = emsesp_devicedata_99.data.findIndex((obj) => obj.c == command); + emsesp_devicedata_99.data[objIndex].v = value; } await delay(1000); // wait to show spinner diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index 77185d233..243087de3 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -228,17 +228,23 @@ void WebDataService::device_data(AsyncWebServerRequest * request) { // assumes the service has been checked for admin authentication void WebDataService::write_device_value(AsyncWebServerRequest * request, JsonVariant & json) { if (json.is()) { - JsonObject dv = json["devicevalue"]; - uint8_t unique_id = json["id"]; + uint8_t unique_id = json["id"]; // unique ID + const char * cmd = json["c"]; // the command + JsonVariant data = json["v"]; // the value in any format + + // quit on bad values + if (strlen(cmd) == 0 || data.isNull()) { + AsyncWebServerResponse * response = request->beginResponse(400); // bad request + request->send(response); + return; + } // using the unique ID from the web find the real device type - // id is the selected device for (const auto & emsdevice : EMSESP::emsdevices) { if (emsdevice->unique_id() == unique_id) { // parse the command as it could have a hc or wwc prefixed, e.g. hc2/seltemp - const char * cmd = dv["c"]; // the command - int8_t id = -1; // default - cmd = Command::parse_command_string(cmd, id); // extract hc or wwc + int8_t id = -1; // default + cmd = Command::parse_command_string(cmd, id); // extract hc or wwc // create JSON for output auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_SMALL); @@ -246,9 +252,8 @@ void WebDataService::write_device_value(AsyncWebServerRequest * request, JsonVar // the data could be in any format, but we need string // authenticated is always true - JsonVariant data = dv["v"]; // the value in any format - uint8_t return_code = CommandRet::NOT_FOUND; - uint8_t device_type = emsdevice->device_type(); + uint8_t return_code = CommandRet::NOT_FOUND; + uint8_t device_type = emsdevice->device_type(); if (data.is()) { return_code = Command::call(device_type, cmd, data.as(), true, id, output); } else if (data.is()) { @@ -276,16 +281,16 @@ void WebDataService::write_device_value(AsyncWebServerRequest * request, JsonVar return; } } + + // special check for custom entities (which have a unique id of 99) if (unique_id == 99) { // parse the command as it could have a hc or wwc prefixed, e.g. hc2/seltemp - const char * cmd = dv["c"]; - int8_t id = -1; - cmd = Command::parse_command_string(cmd, id); - auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_SMALL); - JsonObject output = response->getRoot(); - JsonVariant data = dv["v"]; // the value in any format - uint8_t return_code = CommandRet::NOT_FOUND; - uint8_t device_type = EMSdevice::DeviceType::CUSTOM; + int8_t id = -1; + cmd = Command::parse_command_string(cmd, id); + auto * response = new AsyncJsonResponse(false, EMSESP_JSON_SIZE_SMALL); + JsonObject output = response->getRoot(); + uint8_t return_code = CommandRet::NOT_FOUND; + uint8_t device_type = EMSdevice::DeviceType::CUSTOM; if (data.is()) { return_code = Command::call(device_type, cmd, data.as(), true, id, output); } else if (data.is()) { @@ -302,6 +307,7 @@ void WebDataService::write_device_value(AsyncWebServerRequest * request, JsonVar EMSESP::logger().debug("Write command successful"); #endif } + response->setCode((return_code == CommandRet::OK) ? 200 : 400); // bad request response->setLength(); request->send(response); @@ -309,6 +315,7 @@ void WebDataService::write_device_value(AsyncWebServerRequest * request, JsonVar } } + // if we reach here, fail AsyncWebServerResponse * response = request->beginResponse(400); // bad request request->send(response); }