From a19f2f19c55b8ea908b311e7e5a0cd095a69fe7c Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 14 Nov 2021 16:10:10 +0100 Subject: [PATCH 1/5] update test data --- mock-api/server.js | 417 ++++++++++----------------------------------- 1 file changed, 91 insertions(+), 326 deletions(-) diff --git a/mock-api/server.js b/mock-api/server.js index 23fae6aa7..27d3eef4d 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -379,19 +379,19 @@ const emsesp_devicedata_1 = { { v: 18, u: 1, - n: '(hc1) selected room temperature', + n: 'hc1 selected room temperature', c: 'hc1/seltemp', }, { v: 22.6, u: 1, - n: '(hc1) current room temperature', + n: 'hc1 current room temperature', c: '', }, { v: 'auto', u: 0, - n: '(hc1) mode', + n: 'hc1 mode', c: 'hc1/mode', }, ], @@ -400,360 +400,125 @@ const emsesp_devicedata_1 = { const emsesp_devicedata_2 = { name: 'Boiler: Nefit GBx72/Trendline/Cerapur/Greenstar Si/27i', data: [ + { v: 'off', u: 0, n: 'heating active' }, + { v: 'off', u: 0, n: 'warm water active' }, + { v: 5, u: 1, n: 'selected flow temperature', c: 'selflowtemp' }, + { v: 0, u: 2, n: 'burner selected max power', c: 'selburnpow' }, + { v: 0, u: 2, n: 'heating pump modulation' }, + { v: 42.9, u: 1, n: 'current flow temperature' }, + { v: 41.8, u: 1, n: 'return temperature' }, + { v: 1.6, u: 9, n: 'system pressure' }, + { v: 45, u: 1, n: 'actual boiler temperature' }, + { v: 'off', u: 0, n: 'gas' }, + { v: 0, u: 8, n: 'flame current' }, + { v: 'off', u: 0, n: 'heating pump' }, + { v: 'off', u: 0, n: 'fan' }, + { v: 'off', u: 0, n: 'ignition' }, { - v: false, - u: 16, - n: 'heating active', - c: '', - }, - { - v: false, - u: 16, - n: 'warm water active', - c: '', - }, - { - v: 5, - u: 1, - n: 'selected flow temperature', - c: 'selflowtemp', - }, - { - v: 0, - u: 2, - n: 'burner selected max power', - c: 'selburnpow', - }, - { - v: 0, - u: 2, - n: 'heating pump modulation', - c: '', - }, - { - v: 51, - u: 1, - n: 'current flow temperature', - c: '', - }, - { - v: 49.8, - u: 1, - n: 'return temperature', - c: '', - }, - { - v: 1.1, - u: 9, - n: 'system pressure', - c: '', - }, - { - v: 52.7, - u: 1, - n: 'boiler temperature', - c: '', - }, - { - v: false, - u: 16, - n: 'gas', - c: '', - }, - { - v: 0, - u: 8, - n: 'flame current', - c: '', - }, - { - v: false, - u: 16, - n: 'heating pump', - c: '', - }, - { - v: false, - u: 16, - n: 'fan', - c: '', - }, - { - v: false, - u: 16, - n: 'ignition', - c: '', - }, - { - v: true, - u: 16, + v: 'on', + u: 0, n: 'heating activated', c: 'heatingactivated', + l: ['off', 'on'], }, - { - v: 75, - u: 1, - n: 'heating temperature', - c: 'heatingtemp', - }, - { - v: 90, - u: 2, - n: 'burner pump max power', - c: 'pumpmodmax', - }, - { - v: 55, - u: 2, - n: 'burner pump min power', - c: 'pumpmodmin', - }, - { - v: 1, - u: 7, - n: 'pump delay', - c: 'pumpdelay', - }, - { - v: 10, - u: 7, - n: 'burner min period', - c: 'burnminperiod', - }, - { - v: 0, - u: 2, - n: 'burner min power', - c: 'burnminpower', - }, - { - v: 75, - u: 2, - n: 'burner max power', - c: 'burnmaxpower', - }, - { - v: -6, - u: 1, - n: 'hysteresis on temperature', - c: 'boilhyston', - }, - { - v: 6, - u: 1, - n: 'hysteresis off temperature', - c: 'boilhystoff', - }, - { - v: 0, - u: 2, - n: 'burner current power', - c: '', - }, - { - v: 303226, - u: 15, - n: '# burner starts', - c: '', - }, - { - v: 510634, - u: 7, - n: 'total burner operating time', - c: '', - }, - { - v: 415235, - u: 7, - n: 'total heat operating time', - c: '', - }, - { - v: 4338730, - u: 7, - n: 'total UBA operating time', - c: '', - }, - { - v: '1C(210) 06.06.2020 12:07', - u: 0, - n: 'last error code', - c: '', - }, - { - v: '0H', - u: 0, - n: 'service code', - c: '', - }, - { - v: 203, - u: 0, - n: 'service code number', - c: '', - }, - { - v: '01.01.2012', - u: 0, - n: 'maintenance set date', - c: '', - }, + { v: 75, u: 1, n: 'heating temperature', c: 'heatingtemp' }, + { v: 90, u: 2, n: 'burner pump max power', c: 'pumpmodmax' }, + { v: 55, u: 2, n: 'burner pump min power', c: 'pumpmodmin' }, + { v: 1, u: 7, n: 'pump delay', c: 'pumpdelay' }, + { v: 10, u: 7, n: 'burner min period', c: 'burnminperiod' }, + { v: 0, u: 2, n: 'burner min power', c: 'burnminpower' }, + { v: 77, u: 2, n: 'burner max power', c: 'burnmaxpower' }, + { v: -6, u: 1, n: 'hysteresis on temperature', c: 'boilhyston' }, + { v: 6, u: 1, n: 'hysteresis off temperature', c: 'boilhystoff' }, + { v: 0, u: 2, n: 'burner current power' }, + { v: 317694, u: 16, n: 'burner starts' }, + { v: 524115, u: 7, n: 'total burner operating time' }, + { v: 424286, u: 7, n: 'total heat operating time' }, + { v: 4571225, u: 7, n: 'total UBA operating time' }, + { v: '1C(210) 06.06.2020 12:07', u: 0, n: 'last error code' }, + { v: '0H', u: 0, n: 'service code' }, + { v: 203, u: 0, n: 'service code number' }, + { v: ' ', u: 0, n: 'maintenance message' }, { v: 'off', u: 0, n: 'maintenance scheduled', c: 'maintenance', + l: ['off', 'time', 'date'], }, + { v: 6000, u: 6, n: 'maintenance set time', c: 'maintenancetime' }, + { v: '01.01.2012', u: 0, n: 'maintenance set date', c: 'maintenancedate' }, + { v: 60, u: 1, n: 'ww selected temperature', c: 'wwseltemp' }, + { v: 62, u: 1, n: 'ww set temperature' }, + { v: 'flow', u: 0, n: 'ww type' }, { - v: 6000, - u: 6, - n: 'maintenance set time', - c: '', - }, - { - v: 60, - u: 1, - n: '(ww) selected temperature', - c: '', - }, - { - v: 62, - u: 1, - n: '(ww) set temperature', - c: 'wwsettemp', - }, - { - v: 'flow', + v: 'eco', u: 0, - n: '(ww) type', - c: '', - }, - { - v: 'hot', - u: 0, - n: '(ww) comfort', + n: 'ww comfort', c: 'wwcomfort', + l: ['hot', 'eco', 'intelligent'], }, + { v: 40, u: 0, n: 'ww flow temperature offset', c: 'wwflowtempoffset' }, + { v: 100, u: 2, n: 'ww max power', c: 'wwmaxpower' }, { - v: 40, + v: 'off', u: 0, - n: '(ww) flow temperature offset', - c: 'wwflowtempoffset', - }, - { - v: 100, - u: 2, - n: '(ww) max power', - c: 'wwmaxpower', - }, - { - v: false, - u: 16, - n: '(ww) circulation pump available', + n: 'ww circulation pump available', c: 'wwcircpump', + l: ['off', 'on'], }, + { v: '3-way valve', u: 0, n: 'ww charging type' }, + { v: -5, u: 1, n: 'ww hysteresis on temperature', c: 'wwhyston' }, + { v: 0, u: 1, n: 'ww hysteresis off temperature', c: 'wwhystoff' }, + { v: 70, u: 1, n: 'ww disinfection temperature', c: 'wwdisinfectiontemp' }, { - v: 'charge pump', + v: 'off', u: 0, - n: '(ww) charging type', - c: '', - }, - { - v: 70, - u: 1, - n: '(ww) disinfection temperature', - c: 'wwdisinfectiontemp', + n: 'ww circulation pump frequency', + c: 'wwcircmode', + l: [ + 'off', + '1x3min', + '2x3min', + '3x3min', + '4x3min', + '5x3min', + '6x3min', + 'continuous', + ], }, { v: 'off', u: 0, - n: '(ww) circulation pump frequency', - c: 'wwcircmode', - }, - { - v: false, - u: 16, - n: '(ww) circulation active', + n: 'ww circulation active', c: 'wwcirc', + l: ['off', 'on'], }, + { v: 37.1, u: 1, n: 'ww current intern temperature' }, + { v: 0, u: 3, n: 'ww current tap water flow' }, + { v: 37.2, u: 1, n: 'ww storage intern temperature' }, + { v: 'on', u: 0, n: 'ww activated', c: 'wwactivated', l: ['off', 'on'] }, { - v: 44.4, - u: 1, - n: '(ww) current intern temperature', - c: '', - }, - { - v: 0, - u: 3, - n: '(ww) current tap water flow', - c: '', - }, - { - v: 44.4, - u: 1, - n: '(ww) storage intern temperature', - c: '', - }, - { - v: true, - u: 16, - n: '(ww) activated', - c: 'wwactivated', - }, - { - v: false, - u: 16, - n: '(ww) one time charging', + v: 'off', + u: 0, + n: 'ww one time charging', c: 'wwonetime', + l: ['off', 'on'], }, { - v: false, - u: 16, - n: '(ww) disinfecting', - c: '', - }, - { - v: false, - u: 16, - n: '(ww) charging', - c: '', - }, - { - v: false, - u: 16, - n: '(ww) recharging', - c: '', - }, - { - v: true, - u: 16, - n: '(ww) temperature ok', - c: '', - }, - { - v: false, - u: 16, - n: '(ww) active', - c: '', - }, - { - v: true, - u: 16, - n: '(ww) heating', - c: '', - }, - { - v: 268671, - u: 15, - n: '(ww) # starts', - c: '', - }, - { - v: 95399, - u: 7, - n: '(ww) active time', - c: '', + v: 'off', + u: 0, + n: 'ww disinfection', + c: 'wwdisinfect', + l: ['off', 'on'], }, + { v: 'off', u: 0, n: 'ww charging' }, + { v: 'off', u: 0, n: 'ww recharging' }, + { v: 'on', u: 0, n: 'ww temperature ok' }, + { v: 'off', u: 0, n: 'ww active' }, + { v: 'on', u: 0, n: 'ww heating' }, + { v: 282323, u: 16, n: 'ww starts' }, + { v: 99829, u: 7, n: 'ww active time' }, ], } From 999a05f7ff017b44b42d773027559053acce8538 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 14 Nov 2021 16:10:20 +0100 Subject: [PATCH 2/5] bump to b6 --- src/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/version.h b/src/version.h index ccdc47158..05670ef95 100644 --- a/src/version.h +++ b/src/version.h @@ -1 +1 @@ -#define EMSESP_APP_VERSION "3.3.0b5" +#define EMSESP_APP_VERSION "3.3.0b6" From fd810ff01c3cf8554e52410df2fe436960d33d7a Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 14 Nov 2021 16:10:32 +0100 Subject: [PATCH 3/5] add comments on format param --- src/helpers.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/helpers.cpp b/src/helpers.cpp index 4089501c0..55a209810 100644 --- a/src/helpers.cpp +++ b/src/helpers.cpp @@ -139,6 +139,7 @@ char * Helpers::render_boolean(char * result, bool value) { } // render for native char strings +// format is not used char * Helpers::render_value(char * result, const char * value, uint8_t format __attribute__((unused))) { strcpy(result, value); return result; @@ -251,6 +252,7 @@ char * Helpers::render_value(char * result, const int16_t value, const uint8_t f } // uint16: convert unsigned short (two bytes) to text string and prints it +// format: 0=no division, other divide by the value given and render with a decimal point char * Helpers::render_value(char * result, const uint16_t value, const uint8_t format) { if (!hasValue(value)) { return nullptr; @@ -260,6 +262,7 @@ char * Helpers::render_value(char * result, const uint16_t value, const uint8_t } // int8: convert signed byte to text string and prints it +// format: 0=no division, other divide by the value given and render with a decimal point char * Helpers::render_value(char * result, const int8_t value, const uint8_t format) { if (!hasValue(value)) { return nullptr; @@ -269,6 +272,7 @@ char * Helpers::render_value(char * result, const int8_t value, const uint8_t fo } // uint32: render long (4 byte) unsigned values +// format: 0=no division, other divide by the value given and render with a decimal point char * Helpers::render_value(char * result, const uint32_t value, const uint8_t format) { if (!hasValue(value)) { return nullptr; From d7576ebda162a820faba01204cd8a9e5cb07822b Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 14 Nov 2021 16:14:04 +0100 Subject: [PATCH 4/5] fix bug showing UOM in Console --- src/emsdevice.cpp | 42 ++++++++++++++++++++++++++++-------------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 9d4799c0c..7255d422c 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -572,22 +572,29 @@ void EMSdevice::register_device_value(uint8_t tag, register_device_value(tag, value_p, type, options, name, uom, nullptr, 0, 0); } -// looks up the uom (suffix) for a given key from the device value table +// looks up the UOM for a given key from the device value table const std::string EMSdevice::get_value_uom(const char * key) { - // the key may have a suffix at the start which is between brackets. remove it. + // the key may have a TAG string prefixed at the beginning. If so, remove it char new_key[80]; strlcpy(new_key, key, sizeof(new_key)); - char * p = new_key; - if (key[0] == '(') { - while ((*p++ != ')') && (*p != '\0')) - ; - p++; + char * key_p = new_key; + + size_t sz = sizeof(DeviceValueTAG_s) / sizeof(__FlashStringHelper *); + for (uint8_t i = 0; i < sz; i++) { + auto tag = uuid::read_flash_string(DeviceValueTAG_s[i]); + if (!tag.empty()) { + std::string key2 = key; // copy char to a std::string + if ((key2.find(tag) != std::string::npos) && (key[tag.length()] == ' ')) { + key_p += tag.length() + 1; // remove the tag + break; + } + } } - // find the key (p) in the name + // look up key in our device value list for (const auto & dv : devicevalues_) { if (dv_is_visible(dv)) { - if (uuid::read_flash_string(dv.full_name) == p) { + if (uuid::read_flash_string(dv.full_name) == key_p) { // ignore TIME since "minutes" is already added to the string value if ((dv.uom == DeviceValueUOM::NONE) || (dv.uom == DeviceValueUOM::MINUTES)) { break; @@ -715,6 +722,10 @@ void EMSdevice::generate_values_json_web(JsonObject & output) { } } } + +#if defined(EMSESP_DEBUG) + // serializeJson(data, Serial); // debug only +#endif } // builds json with specific single device value information @@ -1006,37 +1017,40 @@ bool EMSdevice::generate_values_json(JsonObject & output, const uint8_t tag_filt } } + // always convert temperatures to floats + bool make_float = (divider || (dv.uom == DeviceValueUOM::DEGREES)); + // INT if ((dv.type == DeviceValueType::INT) && Helpers::hasValue(*(int8_t *)(dv.value_p))) { - if (divider) { + if (make_float) { json[name] = Helpers::round2(*(int8_t *)(dv.value_p), divider); } else { json[name] = *(int8_t *)(dv.value_p) * factor; } has_value = true; } else if ((dv.type == DeviceValueType::UINT) && Helpers::hasValue(*(uint8_t *)(dv.value_p))) { - if (divider) { + if (make_float) { json[name] = Helpers::round2(*(uint8_t *)(dv.value_p), divider); } else { json[name] = *(uint8_t *)(dv.value_p) * factor; } has_value = true; } else if ((dv.type == DeviceValueType::SHORT) && Helpers::hasValue(*(int16_t *)(dv.value_p))) { - if (divider) { + if (make_float) { json[name] = Helpers::round2(*(int16_t *)(dv.value_p), divider); } else { json[name] = *(int16_t *)(dv.value_p) * factor; } has_value = true; } else if ((dv.type == DeviceValueType::USHORT) && Helpers::hasValue(*(uint16_t *)(dv.value_p))) { - if (divider) { + if (make_float) { json[name] = Helpers::round2(*(uint16_t *)(dv.value_p), divider); } else { json[name] = *(uint16_t *)(dv.value_p) * factor; } has_value = true; } else if ((dv.type == DeviceValueType::ULONG) && Helpers::hasValue(*(uint32_t *)(dv.value_p))) { - if (divider) { + if (make_float) { json[name] = Helpers::round2(*(uint32_t *)(dv.value_p), divider); } else { json[name] = *(uint32_t *)(dv.value_p) * factor; From 9d9ac4ed9e12ecede13417929f317cc83f83beb7 Mon Sep 17 00:00:00 2001 From: proddy Date: Sun, 14 Nov 2021 16:14:29 +0100 Subject: [PATCH 5/5] force temperatures in degrees to always show 1 decimal place --- interface/src/project/EMSESPDataForm.tsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/interface/src/project/EMSESPDataForm.tsx b/interface/src/project/EMSESPDataForm.tsx index d96052c87..9c3b40d25 100644 --- a/interface/src/project/EMSESPDataForm.tsx +++ b/interface/src/project/EMSESPDataForm.tsx @@ -122,7 +122,7 @@ export const formatDuration = (duration_min: number) => { return formatted; }; -function formatValue(value: any, uom: number, digit: number) { +function formatValue(value: any, uom: number) { switch (uom) { case DeviceValueUOM.HOURS: return value ? formatDuration(value * 60) : '0 hours'; @@ -134,9 +134,10 @@ function formatValue(value: any, uom: number, digit: number) { } return value; case DeviceValueUOM.DEGREES: + // always show with one decimal place return ( new Intl.NumberFormat(undefined, { - minimumFractionDigits: digit + minimumFractionDigits: 1 }).format(value) + ' ' + DeviceValueUOM_s[uom] @@ -410,7 +411,7 @@ class EMSESPDataForm extends Component< {sensorData.i} - {formatValue(sensorData.t, DeviceValueUOM.DEGREES, 1)} + {formatValue(sensorData.t, DeviceValueUOM.DEGREES)} ))} @@ -446,7 +447,7 @@ class EMSESPDataForm extends Component< Analog Input - {formatValue(data.analog, DeviceValueUOM.MV, 0)} + {formatValue(data.analog, DeviceValueUOM.MV)} @@ -601,7 +602,7 @@ class EMSESPDataForm extends Component< {item.n} - {formatValue(item.v, item.u, 0)} + {formatValue(item.v, item.u)} ))}