From d86153a08e0dbb1ce14a11e42c3a92748312763c Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Fri, 14 Apr 2023 14:59:57 +0200 Subject: [PATCH 1/2] add custom entity with empty strings --- interface/src/project/SettingsEntities.tsx | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/interface/src/project/SettingsEntities.tsx b/interface/src/project/SettingsEntities.tsx index 588888119..0ba4003dc 100644 --- a/interface/src/project/SettingsEntities.tsx +++ b/interface/src/project/SettingsEntities.tsx @@ -47,13 +47,13 @@ const SettingsEntities: FC = () => { const blocker = useBlocker(numChanges !== 0); const emptyEntity = { - device_id: 8, - type_id: 2, + device_id: '', + type_id: '', offset: 0, factor: 1, uom: 0, val_type: 2, - name: 'name', + name: '', deleted: false }; const [entity, setEntity] = useState([emptyEntity]); @@ -204,16 +204,7 @@ const SettingsEntities: FC = () => { const addEntityItem = () => { setCreating(true); - setEntityItem({ - device_id: 8, - type_id: 2, - offset: 0, - factor: 1, - val_type: 2, - uom: 0, - name: 'name', - deleted: false - }); + setEntityItem(emptyEntity); }; const updateEntityItem = () => { From a54f3f7085a206293777853569a6789cc4476035 Mon Sep 17 00:00:00 2001 From: MichaelDvP Date: Sat, 15 Apr 2023 10:45:41 +0200 Subject: [PATCH 2/2] add writeable checkbox to custom entities --- interface/src/i18n/de/index.ts | 3 ++- interface/src/i18n/en/index.ts | 3 ++- interface/src/i18n/fr/index.ts | 5 ++-- interface/src/i18n/nl/index.ts | 3 ++- interface/src/i18n/no/index.ts | 3 ++- interface/src/i18n/pl/index.ts | 3 ++- interface/src/i18n/sv/index.ts | 3 ++- interface/src/i18n/tr/index.ts | 3 ++- interface/src/project/SettingsEntities.tsx | 27 +++++++++++++++++---- interface/src/project/types.ts | 2 ++ src/web/WebEntityService.cpp | 28 ++++++++++++++-------- src/web/WebEntityService.h | 1 + 12 files changed, 61 insertions(+), 23 deletions(-) diff --git a/interface/src/i18n/de/index.ts b/interface/src/i18n/de/index.ts index db5fbcbc4..0471f8b40 100644 --- a/interface/src/i18n/de/index.ts +++ b/interface/src/i18n/de/index.ts @@ -320,7 +320,8 @@ const de: Translation = { SCHEDULE_TIMER_2: 'jede Minute', SCHEDULE_TIMER_3: 'jede Stunde', CUSTOM_ENTITIES: 'Individuelle Entitäten', - ENTITIES_HELP_1: 'Abfrage von Werten auf dem EMS-Bus' + ENTITIES_HELP_1: 'Abfrage von Werten auf dem EMS-Bus', + WRITEABLE: 'Schreibbar' }; export default de; diff --git a/interface/src/i18n/en/index.ts b/interface/src/i18n/en/index.ts index 3f0b829f9..d7d348213 100644 --- a/interface/src/i18n/en/index.ts +++ b/interface/src/i18n/en/index.ts @@ -320,7 +320,8 @@ const en: Translation = { SCHEDULE_TIMER_2: 'every minute', SCHEDULE_TIMER_3: 'every hour', CUSTOM_ENTITIES: 'Custom entities', - ENTITIES_HELP_1: 'Fetch custom entities from the EMS-bus' + ENTITIES_HELP_1: 'Fetch custom entities from the EMS-bus', + WRITEABLE: 'Writeable' }; export default en; diff --git a/interface/src/i18n/fr/index.ts b/interface/src/i18n/fr/index.ts index aa91b2ca3..4931886eb 100644 --- a/interface/src/i18n/fr/index.ts +++ b/interface/src/i18n/fr/index.ts @@ -319,8 +319,9 @@ const fr: Translation = { SCHEDULE_TIMER_1: 'on startup', // TODO translate SCHEDULE_TIMER_2: 'every minute', // TODO translate SCHEDULE_TIMER_3: 'every hour', // TODO translate - CUSTOM_ENTITIES: 'Custom entities', - ENTITIES_HELP_1: 'Fetch custom entities from the EMS-bus' + CUSTOM_ENTITIES: 'Custom entities', // TODO translate + ENTITIES_HELP_1: 'Fetch custom entities from the EMS-bus', // TODO translate + WRITEABLE: 'Writeable' // TODO translate }; export default fr; diff --git a/interface/src/i18n/nl/index.ts b/interface/src/i18n/nl/index.ts index ff0257861..42e063261 100644 --- a/interface/src/i18n/nl/index.ts +++ b/interface/src/i18n/nl/index.ts @@ -320,7 +320,8 @@ const nl: Translation = { SCHEDULE_TIMER_2: 'every minute', // TODO translate SCHEDULE_TIMER_3: 'every hour', // TODO translate CUSTOM_ENTITIES: 'Custom entities', - ENTITIES_HELP_1: 'Fetch custom entities from the EMS-bus' + ENTITIES_HELP_1: 'Fetch custom entities from the EMS-bus', + WRITEABLE: 'Writeable' // TODO translate }; export default nl; diff --git a/interface/src/i18n/no/index.ts b/interface/src/i18n/no/index.ts index ac7dfe79b..cb540a082 100644 --- a/interface/src/i18n/no/index.ts +++ b/interface/src/i18n/no/index.ts @@ -320,7 +320,8 @@ const no: Translation = { SCHEDULE_TIMER_2: 'hvert minutt', SCHEDULE_TIMER_3: 'hver time', CUSTOM_ENTITIES: 'Custom entities', - ENTITIES_HELP_1: 'Fetch custom entities from the EMS-bus' + ENTITIES_HELP_1: 'Fetch custom entities from the EMS-bus', + WRITEABLE: 'Writeable' // TODO translate }; export default no; diff --git a/interface/src/i18n/pl/index.ts b/interface/src/i18n/pl/index.ts index 5f1fff143..0cde3ab06 100644 --- a/interface/src/i18n/pl/index.ts +++ b/interface/src/i18n/pl/index.ts @@ -320,7 +320,8 @@ const pl: BaseTranslation = { SCHEDULE_TIMER_2: 'co minutę', SCHEDULE_TIMER_3: 'co godzinę', CUSTOM_ENTITIES: 'Custom entities', - ENTITIES_HELP_1: 'Fetch custom entities from the EMS-bus' + ENTITIES_HELP_1: 'Fetch custom entities from the EMS-bus', + WRITEABLE: 'Writeable' // TODO translate }; export default pl; diff --git a/interface/src/i18n/sv/index.ts b/interface/src/i18n/sv/index.ts index e2f21039b..ff8231513 100644 --- a/interface/src/i18n/sv/index.ts +++ b/interface/src/i18n/sv/index.ts @@ -320,7 +320,8 @@ const sv: Translation = { SCHEDULE_TIMER_2: 'every minute', // TODO translate SCHEDULE_TIMER_3: 'every hour', // TODO translate CUSTOM_ENTITIES: 'Custom entities', - ENTITIES_HELP_1: 'Fetch custom entities from the EMS-bus' + ENTITIES_HELP_1: 'Fetch custom entities from the EMS-bus', + WRITEABLE: 'Writeable' // TODO translate }; export default sv; diff --git a/interface/src/i18n/tr/index.ts b/interface/src/i18n/tr/index.ts index ddbb41cb6..21cbdaa7d 100644 --- a/interface/src/i18n/tr/index.ts +++ b/interface/src/i18n/tr/index.ts @@ -320,7 +320,8 @@ const tr: Translation = { SCHEDULE_TIMER_2: 'every minute', // TODO translate SCHEDULE_TIMER_3: 'every hour', // TODO translate CUSTOM_ENTITIES: 'Custom entities', - ENTITIES_HELP_1: 'Fetch custom entities from the EMS-bus' + ENTITIES_HELP_1: 'Fetch custom entities from the EMS-bus', + WRITEABLE: 'Writeable' // TODO translate }; export default tr; diff --git a/interface/src/project/SettingsEntities.tsx b/interface/src/project/SettingsEntities.tsx index 0ba4003dc..4dcdead7b 100644 --- a/interface/src/project/SettingsEntities.tsx +++ b/interface/src/project/SettingsEntities.tsx @@ -10,8 +10,8 @@ import { DialogActions, DialogContent, DialogTitle, - TextField, MenuItem, + Checkbox, InputAdornment } from '@mui/material'; @@ -26,7 +26,14 @@ import CancelIcon from '@mui/icons-material/Cancel'; import DoneIcon from '@mui/icons-material/Done'; import AddIcon from '@mui/icons-material/Add'; -import { ValidatedTextField, ButtonRow, FormLoader, SectionContent, BlockNavigation } from 'components'; +import { + ValidatedTextField, + ButtonRow, + FormLoader, + SectionContent, + BlockNavigation, + BlockFormControlLabel +} from 'components'; import { DeviceValueUOM_s, EntityItem } from './types'; import { extractErrorMessage, updateValue } from 'utils'; @@ -54,6 +61,7 @@ const SettingsEntities: FC = () => { uom: 0, val_type: 2, name: '', + write: false, deleted: false }; const [entity, setEntity] = useState([emptyEntity]); @@ -142,6 +150,7 @@ const SettingsEntities: FC = () => { o_uom: ei.uom, o_val_type: ei.val_type, o_name: ei.name, + o_write: ei.write, o_deleted: ei.deleted })) ); @@ -156,6 +165,7 @@ const SettingsEntities: FC = () => { ei.uom !== ei.o_uom || ei.factor !== ei.o_factor || ei.val_type !== ei.o_val_type || + ei.write !== ei.o_write || ei.deleted !== ei.o_deleted ); } @@ -181,7 +191,8 @@ const SettingsEntities: FC = () => { factor: condensed_ei.factor, val_type: condensed_ei.val_type, uom: condensed_ei.uom, - name: condensed_ei.name + name: condensed_ei.name, + write: condensed_ei.write }; }) }); @@ -306,7 +317,7 @@ const SettingsEntities: FC = () => { - + { onChange={updateValue(setEntityItem)} /> + + + } + label={LL.WRITEABLE()} + /> + (); entityItem.uom = ei["uom"]; entityItem.valuetype = ei["val_type"]; + entityItem.writeable = ei["write"]; if (entityItem.valuetype == DeviceValueType::BOOL) { entityItem.val = EMS_VALUE_DEFAULT_BOOL; @@ -84,12 +86,16 @@ StateUpdateResult WebEntity::update(JsonObject & root, WebEntity & webEntity) { } webEntity.entityItems.push_back(entityItem); // add to list - Command::add( - EMSdevice::DeviceType::CUSTOM, - webEntity.entityItems.back().name.c_str(), - [webEntity](const char * value, const int8_t id) { return EMSESP::webEntityService.command_setvalue(value, webEntity.entityItems.back().name); }, - FL_(entity_cmd), - CommandFlag::ADMIN_ONLY); + if (entityItem.writeable) { + Command::add( + EMSdevice::DeviceType::CUSTOM, + webEntity.entityItems.back().name.c_str(), + [webEntity](const char * value, const int8_t id) { + return EMSESP::webEntityService.command_setvalue(value, webEntity.entityItems.back().name); + }, + FL_(entity_cmd), + CommandFlag::ADMIN_ONLY); + } } } return StateUpdateResult::CHANGED; @@ -215,7 +221,7 @@ bool WebEntityService::get_value_info(JsonObject & output, const char * cmd) { output["name"] = entity.name; output["uom"] = EMSdevice::uom_to_string(entity.uom); output["readable"] = true; - output["writeable"] = true; + output["writeable"] = entity.writeable; output["visible"] = true; render_value(output, entity, true); if (attribute_s) { @@ -250,8 +256,8 @@ void WebEntityService::publish_single(const EntityItem & entity) { } else { snprintf(topic, sizeof(topic), "%s/%s", "custom_data", entity.name.c_str()); } - StaticJsonDocument<256> doc; - JsonObject output = doc.to(); + StaticJsonDocument doc; + JsonObject output = doc.to(); render_value(output, entity, true); Mqtt::queue_publish(topic, output["value"].as()); } @@ -343,7 +349,9 @@ void WebEntityService::generate_value_web(JsonObject & output) { JsonObject obj = data.createNestedObject(); // create the object, we know there is a value obj["id"] = "00" + entity.name; obj["u"] = entity.uom; - obj["c"] = entity.name; + if (entity.writeable) { + obj["c"] = entity.name; + } switch (entity.valuetype) { case DeviceValueType::BOOL: { char s[12]; diff --git a/src/web/WebEntityService.h b/src/web/WebEntityService.h index fc58370cb..172d484fa 100644 --- a/src/web/WebEntityService.h +++ b/src/web/WebEntityService.h @@ -34,6 +34,7 @@ class EntityItem { uint8_t uom; std::string name; double factor; + bool writeable; uint32_t val; };