diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index c5c5108f0..8d0cf694b 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -1547,7 +1547,7 @@ void EMSdevice::get_value_json(JsonObject json, DeviceValue & dv) { json["circuit"] = tag_to_mqtt(dv.tag); } - char val[10]; + char val[20]; switch (dv.type) { case DeviceValueType::ENUM: { if (*(uint8_t *)(dv.value_p) < dv.options_size) { @@ -1785,7 +1785,7 @@ bool EMSdevice::generate_values(JsonObject output, const int8_t tag_filter, cons : (dv.uom == DeviceValueUOM::DEGREES) ? 2 : (dv.uom == DeviceValueUOM::DEGREES_R) ? 1 : 0; - char val[10] = {'\0'}; + char val[20] = {'\0'}; if (dv.type == DeviceValueType::INT8) { json[name] = serialized(Helpers::render_value(val, *(int8_t *)(dv.value_p), dv.numeric_operator, fahrenheit)); } else if (dv.type == DeviceValueType::UINT8) { diff --git a/src/helpers.cpp b/src/helpers.cpp index 5429dc5f1..d536b2678 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -254,13 +254,13 @@ char * Helpers::render_value(char * result, const double value, const int8_t for char * ret = result; double v = value < 0 ? value - 1.0 / (2 * p[format]) : value + 1.0 / (2 * p[format]); - auto whole = (int32_t)v; + auto whole = (long long)v; if (whole == 0 && v < 0) { result[0] = '-'; result++; } - itoa(whole, result, 10); + lltoa(whole, result, 10); while (*result != '\0') { result++; @@ -354,16 +354,16 @@ char * Helpers::render_value(char * result, const uint32_t value, const int8_t f #ifndef EMSESP_STANDALONE if (!format) { - strlcpy(result, ltoa(new_value, s, 10), sizeof(s)); // format is 0 + strlcpy(result, lltoa(new_value, s, 10), sizeof(s)); // format is 0 } else if (format > 0) { - strlcpy(result, ltoa(new_value / format, s, 10), sizeof(s)); + strlcpy(result, lltoa(new_value / format, s, 10), sizeof(s)); strlcat(result, ".", sizeof(s)); strlcat(result, itoa(((new_value % format) * 10) / format, s, 10), sizeof(s)); if (format == 100) { strlcat(result, itoa(new_value % 10, s, 10), sizeof(s)); } } else { - strlcpy(result, ltoa(new_value * format * -1, s, 10), sizeof(s)); + strlcpy(result, lltoa(new_value * format * -1, s, 10), sizeof(s)); } #else if (!format) { @@ -458,26 +458,22 @@ int Helpers::atoint(const char * value) { // fahrenheit=0 - off, no conversion // fahrenheit=1 - relative, 1.8t // fahrenheit=2 - absolute, 1.8t + 32(fahrenheit-1) -float Helpers::transformNumFloat(float value, const int8_t numeric_operator, const uint8_t fahrenheit) { - float val; +double Helpers::transformNumFloat(double value, const int8_t numeric_operator, const uint8_t fahrenheit) { + double val; if (numeric_operator == 0) { // DV_NUMOP_NONE - val = value * 100 + 0.5; + val = value * 100; } else if (numeric_operator > 0) { // DV_NUMOP_DIVxx - val = value * 100 / numeric_operator + 0.5; + val = value * 100 / numeric_operator; } else { // DV_NUMOP_MULxx val = value * -100 * numeric_operator; } - if (value < 0) { // negative rounding - val = val - 1; - } - if (fahrenheit) { val = val * 1.8 + 3200 * (fahrenheit - 1); } - return ((int32_t)val) / 100.0; + return (round(val)) / 100.0; } // abs of a signed 32-bit integer diff --git a/src/helpers.h b/src/helpers.h index bf2f84246..1758f2dee 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -51,7 +51,7 @@ class Helpers { static uint16_t string2minutes(const std::string & str); static float numericoperator2scalefactor(int8_t numeric_operator); - static float transformNumFloat(float value, const int8_t numeric_operator, const uint8_t fahrenheit = 0); + static double transformNumFloat(double value, const int8_t numeric_operator, const uint8_t fahrenheit = 0); static std::string toLower(std::string const & s); static std::string toUpper(std::string const & s); diff --git a/src/web/WebCustomEntityService.cpp b/src/web/WebCustomEntityService.cpp index cca572bf5..e76bb32af 100644 --- a/src/web/WebCustomEntityService.cpp +++ b/src/web/WebCustomEntityService.cpp @@ -214,7 +214,7 @@ bool WebCustomEntityService::command_setvalue(const char * value, const int8_t i // output of a single value // if add_uom is true it will add the UOM string to the value void WebCustomEntityService::render_value(JsonObject output, CustomEntityItem & entity, const bool useVal, const bool web, const bool add_uom) { - char payload[12]; + char payload[20]; std::string name = useVal ? "value" : entity.name; switch (entity.value_type) { case DeviceValueType::BOOL: @@ -496,7 +496,7 @@ void WebCustomEntityService::generate_value_web(JsonObject output, const bool is obj["c"] = entity.name; include = true; if (entity.value_type != DeviceValueType::BOOL && entity.value_type != DeviceValueType::STRING) { - char s[10]; + char s[20]; obj["s"] = Helpers::render_value(s, entity.factor, 1); } } diff --git a/src/web/WebDataService.cpp b/src/web/WebDataService.cpp index 4b97c9737..9ae7d3894 100644 --- a/src/web/WebDataService.cpp +++ b/src/web/WebDataService.cpp @@ -267,10 +267,10 @@ void WebDataService::write_device_value(AsyncWebServerRequest * request, JsonVar if (data.is()) { return_code = Command::call(device_type, cmd, data.as(), true, id, output); } else if (data.is()) { - char s[10]; + char s[20]; return_code = Command::call(device_type, cmd, Helpers::render_value(s, data.as(), 0), true, id, output); } else if (data.is()) { - char s[10]; + char s[20]; return_code = Command::call(device_type, cmd, Helpers::render_value(s, data.as(), 1), true, id, output); } else if (data.is()) { return_code = Command::call(device_type, cmd, data.as() ? "true" : "false", true, id, output);