From 1e082f941a44bfd10b9524d660e6ef1848f8611c Mon Sep 17 00:00:00 2001 From: Proddy Date: Fri, 27 May 2022 09:49:32 +0200 Subject: [PATCH] customizations, swap shortname and fullname, using id as unique shortname --- .../src/project/SettingsCustomization.tsx | 14 +- interface/src/project/types.ts | 6 +- mock-api/server.js | 196 +++++++++--------- src/emsdevice.cpp | 35 ++-- 4 files changed, 124 insertions(+), 127 deletions(-) diff --git a/interface/src/project/SettingsCustomization.tsx b/interface/src/project/SettingsCustomization.tsx index 3a06e5f0d..4115c1b3e 100644 --- a/interface/src/project/SettingsCustomization.tsx +++ b/interface/src/project/SettingsCustomization.tsx @@ -47,7 +47,7 @@ import { DeviceShort, Devices, DeviceEntity, DeviceEntityMask } from './types'; const SettingsCustomization: FC = () => { const { enqueueSnackbar } = useSnackbar(); - const [deviceEntities, setDeviceEntities] = useState([{ id: '', v: 0, s: '', m: 0, w: false }]); + const [deviceEntities, setDeviceEntities] = useState([{ id: '', v: 0, n: '', m: 0, w: false }]); const [devices, setDevices] = useState(); const [errorMessage, setErrorMessage] = useState(); const [selectedDevice, setSelectedDevice] = useState(0); @@ -200,10 +200,10 @@ const SettingsCustomization: FC = () => { } function formatName(de: DeviceEntity) { - if (de.id == de.s) { - return de.s; + if (de.n === undefined) { + return de.id; } - return de.id + ' (' + de.s + ')'; + return de.n + ' (' + de.id + ')'; } const getMaskNumber = (newMask: string[]) => { @@ -279,7 +279,7 @@ const SettingsCustomization: FC = () => { if (deviceEntities && selectedDevice) { const masked_entities = deviceEntities .filter((de) => de.m !== de.om) - .map((new_de) => new_de.m.toString(16).padStart(2, '0') + new_de.s); + .map((new_de) => new_de.m.toString(16).padStart(2, '0') + new_de.id); if (masked_entities.length > 60) { enqueueSnackbar('Selected entities exceeded limit of 60. Please Save in batches', { variant: 'warning' }); @@ -471,7 +471,7 @@ const SettingsCustomization: FC = () => { setMasks(['']); }} > - + @@ -480,7 +480,7 @@ const SettingsCustomization: FC = () => { - + diff --git a/interface/src/project/types.ts b/interface/src/project/types.ts index 9c1cfecef..c0f115a16 100644 --- a/interface/src/project/types.ts +++ b/interface/src/project/types.ts @@ -132,9 +132,9 @@ export interface DeviceData { } export interface DeviceEntity { - id: string; // name - v: any; // value, in any format - s: string; // shortname + id: string; // shortname + v?: any; // value, in any format, optional + n?: string; // fullname, optional m: number; // mask om?: number; // original mask before edits w: boolean; // writeable diff --git a/mock-api/server.js b/mock-api/server.js index 5be39abe3..bcecc0df7 100644 --- a/mock-api/server.js +++ b/mock-api/server.js @@ -337,6 +337,7 @@ settings = { pbutton_gpio: 0, board_profile: 'S32', bool_format: 1, + bool_dashboard: 1, enum_format: 1, } @@ -575,153 +576,154 @@ const emsesp_devicedata_4 = { ], } +// CUSTOMIZATION + const emsesp_deviceentities_1 = [ { v: '(0)', - id: 'error code', - s: 'errorcode', + n: 'error code', + id: 'errorcode', m: 0, w: false, }, { v: '14:54:39 06/06/2021', - id: 'date/time', - s: 'datetime', + n: 'date/time', + id: 'datetime', m: 0, w: false, }, { v: 'roomTemp', id: 'hc1/HA climate config creation', - s: 'hc1/HA climate config creation', m: 0, w: false, }, { v: 18.2, - id: 'hc1 selected room temperature', - s: 'hc1/seltemp', + n: 'hc1 selected room temperature', + id: 'hc1/seltemp', m: 0, w: true, }, { v: 22.6, - id: 'hc1 current room temperature', - s: 'hc1/curtemp', + n: 'hc1 current room temperature', + id: 'hc1/curtemp', m: 0, w: false, }, { v: 'auto', - id: 'hc1 mode', - s: 'hc1/mode', + n: 'hc1 mode', + id: 'hc1/mode', m: 0, w: true, }, ] const emsesp_deviceentities_2 = [ - { u: 0, id: 'reset', s: 'reset', m: 8, w: false }, - { v: false, id: 'heating active', s: 'heatingactive', m: 8, w: false }, - { v: false, id: 'tapwater active', s: 'tapwateractive', m: 4, w: false }, - { v: 5, id: 'selected flow temperature', s: 'selflowtemp', m: 4, w: true }, - { v: 0, id: 'burner selected max power', s: 'selburnpow', m: 14, w: true }, - { v: 0, id: 'heating pump modulation', s: 'heatingpumpmod', m: 0, w: false }, - { id: 'heating pump 2 modulation', s: 'heatingpump2mod', m: 0, w: false }, - { id: 'outside temperature', s: 'outdoortemp', m: 0, w: false }, - { v: 53, id: 'current flow temperature', s: 'curflowtemp', m: 0, w: false }, - { v: 51.8, id: 'return temperature', s: 'rettemp', m: 0, w: false }, - { id: 'mixing switch temperature', s: 'switchtemp', m: 0, w: false }, - { v: 1.3, id: 'system pressure', s: 'syspress', m: 0, w: false }, - { v: 54.6, id: 'actual boiler temperature', s: 'boiltemp', m: 0, w: false }, - { id: 'exhaust temperature', s: 'exhausttemp', m: 0, w: false }, - { v: false, id: 'gas', s: 'burngas', m: 0, w: false }, - { v: false, id: 'gas stage 2', s: 'burngas2', m: 0, w: false }, - { v: 0, id: 'flame current', s: 'flamecurr', m: 0, w: false }, - { v: false, id: 'heating pump', s: 'heatingpump', m: 0, w: false }, - { v: false, id: 'fan', s: 'fanwork', m: 0, w: false }, - { v: false, id: 'ignition', s: 'ignwork', m: 0, w: false }, - { v: false, id: 'oil preheating', s: 'oilpreheat', m: 0, w: false }, - { v: true, id: 'heating activated', s: 'heatingactivated', m: 0, w: false }, - { v: 80, id: 'heating temperature', s: 'heatingtemp', m: 0, w: false }, - { v: 70, id: 'burner pump max power', s: 'pumpmodmax', m: 0, w: false }, - { v: 30, id: 'burner pump min power', s: 'pumpmodmin', m: 0, w: false }, - { v: 1, id: 'pump delay', s: 'pumpdelay', m: 0, w: false }, - { v: 10, id: 'burner min period', s: 'burnminperiod', m: 0, w: false }, - { v: 0, id: 'burner min power', s: 'burnminpower', m: 0, w: false }, - { v: 50, id: 'burner max power', s: 'burnmaxpower', m: 0, w: false }, - { v: -6, id: 'hysteresis on temperature', s: 'boilhyston', m: 0, w: false }, - { v: 6, id: 'hysteresis off temperature', s: 'boilhystoff', m: 0, w: false }, - { v: 0, id: 'set flow temperature', s: 'setflowtemp', m: 0, w: true }, - { v: 0, id: 'burner set power', s: 'setburnpow', m: 0, w: false }, - { v: 0, id: 'burner current power', s: 'curburnpow', m: 0, w: false }, - { v: 326323, id: 'burner starts', s: 'burnstarts', m: 0, w: false }, - { v: 553437, id: 'total burner operating time', s: 'burnworkmin', m: 0, w: false }, - { v: 451286, id: 'total heat operating time', s: 'heatworkmin', m: 0, w: false }, - { v: 4672175, id: 'total UBA operating time', s: 'ubauptime', m: 0, w: false }, - { v: '1C(210) 06.06.2020 12:07 (0 min)', id: 'last error code', s: 'lastcode', m: 0, w: false }, - { v: '0H', id: 'service code', s: 'servicecode', m: 0, w: false }, - { v: 203, id: 'service code number', s: 'servicecodenumber', m: 0, w: false }, - { v: 'H00', id: 'maintenance message', s: 'maintenancemessage', m: 0, w: false }, - { v: 'manual', id: 'maintenance scheduled', s: 'maintenance', m: 0, w: false }, - { v: 6000, id: 'time to next maintenance', s: 'maintenancetime', m: 0, w: false }, - { v: '01.01.2012', id: 'next maintenance date', s: 'maintenancedate', m: 0, w: false }, - { v: true, id: 'dhw turn on/off', s: 'wwtapactivated', m: 0, w: false }, - { v: 62, id: 'dhw set temperature', s: 'wwsettemp', m: 0, w: false }, - { v: 60, id: 'dhw selected temperature', s: 'wwseltemp', m: 0, w: true }, - { id: 'dhw selected lower temperature', s: 'wwseltemplow', m: 2 }, - { id: 'dhw selected temperature for off', s: 'wwseltempoff', m: 2 }, - { id: 'dhw single charge temperature', s: 'wwseltempsingle', m: 2 }, - { v: 'flow', id: 'dhw type', s: 'wwtype', m: 0, w: false }, - { v: 'hot', id: 'dhw comfort', s: 'wwcomfort', m: 0, w: false }, - { v: 40, id: 'dhw flow temperature offset', s: 'wwflowtempoffset', m: 0, w: false }, - { v: 100, id: 'dhw max power', s: 'wwmaxpower', m: 0, w: false }, - { v: false, id: 'dhw circulation pump available', s: 'wwcircpump', m: 0, w: false }, - { v: '3-way valve', id: 'dhw charging type', s: 'wwchargetype', m: 0, w: false }, - { v: -5, id: 'dhw hysteresis on temperature', s: 'wwhyston', m: 0, w: false }, - { v: 0, id: 'dhw hysteresis off temperature', s: 'wwhystoff', m: 0, w: false }, - { v: 70, id: 'dhw disinfection temperature', s: 'wwdisinfectiontemp', m: 0, w: false }, - { v: 'off', id: 'dhw circulation pump mode', s: 'wwcircmode', m: 0, w: false }, - { v: false, id: 'dhw circulation active', s: 'wwcirc', m: 0, w: false }, - { v: 46.4, id: 'dhw current intern temperature', s: 'wwcurtemp', m: 0, w: false }, - { id: 'dhw current extern temperature', s: 'wwcurtemp2', m: 2 }, - { v: 0, id: 'dhw current tap water flow', s: 'wwcurflow', m: 0, w: false }, - { v: 46.3, id: 'dhw storage intern temperature', s: 'wwstoragetemp1', m: 0, w: false }, - { id: 'dhw storage extern temperature', s: 'wwstoragetemp2', m: 2 }, - { v: true, id: 'dhw activated', s: 'wwactivated', m: 0, w: false }, - { v: false, id: 'dhw one time charging', s: 'wwonetime', m: 0, w: false }, - { v: false, id: 'dhw disinfecting', s: 'wwdisinfecting', m: 0, w: false }, - { v: false, id: 'dhw charging', s: 'wwcharging', m: 0, w: false }, - { v: false, id: 'dhw recharging', s: 'wwrecharging', m: 0, w: false }, - { v: true, id: 'dhw temperature ok', s: 'wwtempok', m: 0, w: false }, - { v: false, id: 'dhw active', s: 'wwactive', m: 0, w: false }, - { v: true, id: 'dhw 3way valve active', s: 'ww3wayvalve', m: 0, w: false }, - { v: 0, id: 'dhw set pump power', s: 'wwsetpumppower', m: 0, w: true }, - { id: 'dhw mixer temperature', s: 'wwmixertemp', m: 2 }, - { id: 'dhw cylinder middle temperature (TS3)', s: 'wwcylmiddletemp', m: 2 }, - { v: 288768, id: 'dhw starts', s: 'wwstarts', m: 0, w: false }, - { v: 102151, id: 'dhw active time', s: 'wwworkm', m: 0, w: false }, + { u: 0, id: 'reset', m: 8, w: false }, + { v: false, n: 'heating active', id: 'heatingactive', m: 8, w: false }, + { v: false, n: 'tapwater active', id: 'tapwateractive', m: 4, w: false }, + { v: 5, n: 'selected flow temperature', id: 'selflowtemp', m: 4, w: true }, + { v: 0, n: 'burner selected max power', id: 'selburnpow', m: 14, w: true }, + { v: 0, n: 'heating pump modulation', id: 'heatingpumpmod', m: 0, w: false }, + { n: 'heating pump 2 modulation', id: 'heatingpump2mod', m: 0, w: false }, + { n: 'outside temperature', id: 'outdoortemp', m: 0, w: false }, + { v: 53, n: 'current flow temperature', id: 'curflowtemp', m: 0, w: false }, + { v: 51.8, n: 'return temperature', id: 'rettemp', m: 0, w: false }, + { n: 'mixing switch temperature', id: 'switchtemp', m: 0, w: false }, + { v: 1.3, n: 'system pressure', id: 'syspress', m: 0, w: false }, + { v: 54.6, n: 'actual boiler temperature', id: 'boiltemp', m: 0, w: false }, + { n: 'exhaust temperature', id: 'exhausttemp', m: 0, w: false }, + { v: false, n: 'gas', id: 'burngas', m: 0, w: false }, + { v: false, n: 'gas stage 2', id: 'burngas2', m: 0, w: false }, + { v: 0, n: 'flame current', id: 'flamecurr', m: 0, w: false }, + { v: false, n: 'heating pump', id: 'heatingpump', m: 0, w: false }, + { v: false, n: 'fan', id: 'fanwork', m: 0, w: false }, + { v: false, n: 'ignition', id: 'ignwork', m: 0, w: false }, + { v: false, n: 'oil preheating', id: 'oilpreheat', m: 0, w: false }, + { v: true, n: 'heating activated', id: 'heatingactivated', m: 0, w: false }, + { v: 80, n: 'heating temperature', id: 'heatingtemp', m: 0, w: false }, + { v: 70, n: 'burner pump max power', id: 'pumpmodmax', m: 0, w: false }, + { v: 30, n: 'burner pump min power', id: 'pumpmodmin', m: 0, w: false }, + { v: 1, n: 'pump delay', id: 'pumpdelay', m: 0, w: false }, + { v: 10, n: 'burner min period', id: 'burnminperiod', m: 0, w: false }, + { v: 0, n: 'burner min power', id: 'burnminpower', m: 0, w: false }, + { v: 50, n: 'burner max power', id: 'burnmaxpower', m: 0, w: false }, + { v: -6, n: 'hysteresis on temperature', id: 'boilhyston', m: 0, w: false }, + { v: 6, n: 'hysteresis off temperature', id: 'boilhystoff', m: 0, w: false }, + { v: 0, n: 'set flow temperature', id: 'setflowtemp', m: 0, w: true }, + { v: 0, n: 'burner set power', id: 'setburnpow', m: 0, w: false }, + { v: 0, n: 'burner current power', id: 'curburnpow', m: 0, w: false }, + { v: 326323, n: 'burner starts', id: 'burnstarts', m: 0, w: false }, + { v: 553437, n: 'total burner operating time', id: 'burnworkmin', m: 0, w: false }, + { v: 451286, n: 'total heat operating time', id: 'heatworkmin', m: 0, w: false }, + { v: 4672175, n: 'total UBA operating time', id: 'ubauptime', m: 0, w: false }, + { v: '1C(210) 06.06.2020 12:07 (0 min)', n: 'last error code', id: 'lastcode', m: 0, w: false }, + { v: '0H', n: 'service code', id: 'servicecode', m: 0, w: false }, + { v: 203, n: 'service code number', id: 'servicecodenumber', m: 0, w: false }, + { v: 'H00', n: 'maintenance message', id: 'maintenancemessage', m: 0, w: false }, + { v: 'manual', n: 'maintenance scheduled', id: 'maintenance', m: 0, w: false }, + { v: 6000, n: 'time to next maintenance', id: 'maintenancetime', m: 0, w: false }, + { v: '01.01.2012', n: 'next maintenance date', id: 'maintenancedate', m: 0, w: false }, + { v: true, n: 'dhw turn on/off', id: 'wwtapactivated', m: 0, w: false }, + { v: 62, n: 'dhw set temperature', id: 'wwsettemp', m: 0, w: false }, + { v: 60, n: 'dhw selected temperature', id: 'wwseltemp', m: 0, w: true }, + { n: 'dhw selected lower temperature', id: 'wwseltemplow', m: 2 }, + { n: 'dhw selected temperature for off', id: 'wwseltempoff', m: 2 }, + { n: 'dhw single charge temperature', id: 'wwseltempsingle', m: 2 }, + { v: 'flow', n: 'dhw type', id: 'wwtype', m: 0, w: false }, + { v: 'hot', n: 'dhw comfort', id: 'wwcomfort', m: 0, w: false }, + { v: 40, n: 'dhw flow temperature offset', id: 'wwflowtempoffset', m: 0, w: false }, + { v: 100, n: 'dhw max power', id: 'wwmaxpower', m: 0, w: false }, + { v: false, n: 'dhw circulation pump available', id: 'wwcircpump', m: 0, w: false }, + { v: '3-way valve', n: 'dhw charging type', id: 'wwchargetype', m: 0, w: false }, + { v: -5, n: 'dhw hysteresis on temperature', id: 'wwhyston', m: 0, w: false }, + { v: 0, n: 'dhw hysteresis off temperature', id: 'wwhystoff', m: 0, w: false }, + { v: 70, n: 'dhw disinfection temperature', id: 'wwdisinfectiontemp', m: 0, w: false }, + { v: 'off', n: 'dhw circulation pump mode', id: 'wwcircmode', m: 0, w: false }, + { v: false, n: 'dhw circulation active', id: 'wwcirc', m: 0, w: false }, + { v: 46.4, n: 'dhw current intern temperature', id: 'wwcurtemp', m: 0, w: false }, + { n: 'dhw current extern temperature', id: 'wwcurtemp2', m: 2 }, + { v: 0, n: 'dhw current tap water flow', id: 'wwcurflow', m: 0, w: false }, + { v: 46.3, n: 'dhw storage intern temperature', id: 'wwstoragetemp1', m: 0, w: false }, + { n: 'dhw storage extern temperature', id: 'wwstoragetemp2', m: 2 }, + { v: true, n: 'dhw activated', id: 'wwactivated', m: 0, w: false }, + { v: false, n: 'dhw one time charging', id: 'wwonetime', m: 0, w: false }, + { v: false, n: 'dhw disinfecting', id: 'wwdisinfecting', m: 0, w: false }, + { v: false, n: 'dhw charging', id: 'wwcharging', m: 0, w: false }, + { v: false, n: 'dhw recharging', id: 'wwrecharging', m: 0, w: false }, + { v: true, n: 'dhw temperature ok', id: 'wwtempok', m: 0, w: false }, + { v: false, n: 'dhw active', id: 'wwactive', m: 0, w: false }, + { v: true, n: 'dhw 3way valve active', id: 'ww3wayvalve', m: 0, w: false }, + { v: 0, n: 'dhw set pump power', id: 'wwsetpumppower', m: 0, w: true }, + { n: 'dhw mixer temperature', id: 'wwmixertemp', m: 2 }, + { n: 'dhw cylinder middle temperature (TS3)', id: 'wwcylmiddletemp', m: 2 }, + { v: 288768, n: 'dhw starts', id: 'wwstarts', m: 0, w: false }, + { v: 102151, n: 'dhw active time', id: 'wwworkm', m: 0, w: false }, ] const emsesp_deviceentities_4 = [ { v: 16, - id: 'hc2 selected room temperature', - s: 'hc2/seltemp', + n: 'hc2 selected room temperature', + id: 'hc2/seltemp', m: 8, w: true, }, { v: 18.5, - id: 'hc2 current room temperature', - s: 'hc2/curtemp', + n: 'hc2 current room temperature', + id: 'hc2/curtemp', m: 2, w: false, }, { v: 'off', - id: 'hc2 mode', - s: 'hc2/mode', + n: 'hc2 mode', + id: 'hc2/mode', m: 2, w: true, }, diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 429190e0e..a46ffe89f 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -716,11 +716,9 @@ void EMSdevice::generate_values_web(JsonObject & output) { auto mask = Helpers::hextoa((uint8_t)(dv.state >> 4), false); // create mask to a 2-char string - // add name, prefixing the tag if it exists. This is the id used for the table sorting + // add name, prefixing the tag if it exists. This is the id used in the WebUI table and must be unique if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { obj["id"] = mask + read_flash_string(dv.full_name); - } else if (dv.tag < DeviceValueTAG::TAG_HC1) { - obj["id"] = mask + tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); } else { obj["id"] = mask + tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name); } @@ -831,30 +829,27 @@ void EMSdevice::generate_values_web_customization(JsonArray & output) { obj["v"] = (divider > 0) ? time_value / divider : time_value * factor; // sometimes we need to divide by 60 } } - } else { - obj["v"] = ""; // must always have v for sorting to work in web } - // shortname - std::string shortname; + // id holds the shortname and must always have a value for the WebUI table to work if (dv.tag >= DeviceValueTAG::TAG_HC1) { - shortname = tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); + obj["id"] = tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name); } else { - shortname = read_flash_string(dv.short_name); + obj["id"] = read_flash_string(dv.short_name); } - obj["s"] = shortname; - // id is the fullname, or the shortname (it must exist for the web table to work) - if (dv.full_name) { - if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { - obj["id"] = dv.full_name; - } else { - char name[50]; - snprintf(name, sizeof(name), "%s %s", tag_to_string(dv.tag).c_str(), read_flash_string(dv.full_name).c_str()); - obj["id"] = name; + // n is the fullname, and can be optional + // don't add the fullname if its a command + if (dv.type != DeviceValueType::CMD) { + if (dv.full_name) { + if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) { + obj["n"] = dv.full_name; + } else { + char name[50]; + snprintf(name, sizeof(name), "%s %s", tag_to_string(dv.tag).c_str(), read_flash_string(dv.full_name).c_str()); + obj["n"] = name; + } } - } else { - obj["id"] = shortname; // fullname/id is same as shortname } obj["m"] = dv.state >> 4; // send back the mask state. We're only interested in the high nibble