Merge pull request #447 from proddy/dev

changes per #444
This commit is contained in:
Proddy
2022-04-04 21:47:12 +02:00
committed by GitHub
8 changed files with 33 additions and 22 deletions

View File

@@ -19,7 +19,6 @@ const FirmwareFileUpload: FC<UploadFirmwareProps> = ({ uploadFirmware }) => {
my={2}
/>
<SingleUpload
// accept="application/octet-stream"
accept=".bin"
onDrop={uploadFile}
onCancel={cancelUpload}

View File

@@ -42,11 +42,6 @@ import { DeviceShort, Devices, DeviceEntity } from './types';
const StyledTableCell = styled(TableCell)(({ theme }) => ({
[`&.${tableCellClasses.head}`]: {
backgroundColor: '#607d8b'
// color: theme.palette.common.white,
// fontSize: 12
},
[`&.${tableCellClasses.body}`]: {
// fontSize: 12
}
}));
@@ -70,9 +65,14 @@ const SettingsCustomization: FC = () => {
}
}, []);
const setInitialMask = (data: DeviceEntity[]) => {
setDeviceEntities(data.map((de) => ({ ...de, om: de.m })));
};
const fetchDeviceEntities = async (unique_id: number) => {
try {
setDeviceEntities((await EMSESP.readDeviceEntities({ id: unique_id })).data);
const data = (await EMSESP.readDeviceEntities({ id: unique_id })).data;
setInitialMask(data);
} catch (error: any) {
setErrorMessage(extractErrorMessage(error, 'Problem fetching device entities'));
}
@@ -161,8 +161,17 @@ const SettingsCustomization: FC = () => {
const saveCustomization = async () => {
if (deviceEntities && selectedDevice) {
const masked_entities = deviceEntities
// .filter((de) => de.m)
.filter((de) => de.m !== de.om)
.map((new_de) => new_de.m.toString(16).padStart(2, '0') + new_de.s);
if (masked_entities.length > 50) {
enqueueSnackbar(
'Too many selected entities (' + masked_entities.length + '). Limit is 50. Please Save in batches',
{ variant: 'warning' }
);
return;
}
try {
const response = await EMSESP.writeMaskedEntities({
id: selectedDevice,
@@ -176,6 +185,7 @@ const SettingsCustomization: FC = () => {
} catch (error: any) {
enqueueSnackbar(extractErrorMessage(error, 'Problem sending entity list'), { variant: 'error' });
}
setInitialMask(deviceEntities);
}
};

View File

@@ -83,7 +83,6 @@ export function resetCustomizations(): AxiosPromise<void> {
return AXIOS.post('/resetCustomizations');
}
// EMS-ESP API calls
export function API(apiCall: APIcall): AxiosPromise<void> {
return AXIOS_API.post('/', apiCall);
}

View File

@@ -147,6 +147,7 @@ export interface DeviceEntity {
n: string; // name
s: string; // shortname
m: number; // mask
om?: number; // original mask before edits
w: boolean; // writeable
}

View File

@@ -948,6 +948,7 @@ function updateMask(entity, de, dd) {
rest_server.post(EMSESP_MASKED_ENTITIES_ENDPOINT, (req, res) => {
const id = req.body.id
console.log(req.body.entity_ids)
for (const entity of req.body.entity_ids) {
if (id === 1) {
updateMask(entity, emsesp_deviceentities_1, emsesp_devicedata_1)

View File

@@ -234,7 +234,6 @@ class Solar : public EMSdevice {
bool set_wwKeepWarm(const char * value, const int8_t id);
bool set_wwDisinfectionTemp(const char * value, const int8_t id);
bool set_wwDailyTemp(const char * value, const int8_t id);
};
} // namespace emsesp

View File

@@ -848,23 +848,26 @@ void EMSdevice::generate_values_web_all(JsonArray & output) {
}
// set mask per device entity based on the id which is prefixed with the 2 char hex mask value
// returns true if the entity has a mask set
// returns true if the entity has a mask set (not 0 the default)
bool EMSdevice::mask_entity(const std::string & entity_id) {
for (auto & dv : devicevalues_) {
std::string entity = dv.tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(dv.short_name) : tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name);
if (entity == entity_id.substr(2)) {
uint8_t mask = Helpers::hextoint(entity_id.substr(0, 2).c_str()); // first character contains mask flags
if (Mqtt::ha_enabled() && (((dv.state >> 4) ^ mask) & (DeviceValueState::DV_READONLY >> 4))) {
std::string entity_name =
dv.tag < DeviceValueTAG::TAG_HC1 ? read_flash_string(dv.short_name) : tag_to_string(dv.tag) + "/" + read_flash_string(dv.short_name);
uint8_t current_mask = dv.state >> 4;
if (entity_name == entity_id.substr(2)) {
// this entity has a new mask set
uint8_t new_mask = Helpers::hextoint(entity_id.substr(0, 2).c_str()); // first character contains mask flags
if (Mqtt::ha_enabled() && ((current_mask ^ new_mask) & (DeviceValueState::DV_READONLY >> 4))) {
// remove ha config on change of dv_readonly flag
dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED);
Mqtt::publish_ha_sensor_config(dv, "", "", true); // delete topic (remove = true)
}
dv.state = ((dv.state & 0x0F) | (mask << 4)); // set state high bits to flag
return mask; // true if entity mask is not the deafult 0
dv.state = ((dv.state & 0x0F) | (new_mask << 4)); // set state high bits to flag
return new_mask; // true if entity mask is not the deafult 0
}
}
return false;
return false; // we didn't find the entity
}
// builds json for a specific device value / entity

View File

@@ -215,7 +215,7 @@ void WebCustomizationService::device_entities(AsyncWebServerRequest * request, J
// and updates the entity list real-time
void WebCustomizationService::masked_entities(AsyncWebServerRequest * request, JsonVariant & json) {
if (json.is<JsonObject>()) {
EMSESP::logger().debug(F("Masked entities json size: %d"), measureJson(json));
// EMSESP::logger().debug(F("Masked entities json size: %d"), measureJson(json));
// find the device using the unique_id
for (const auto & emsdevice : EMSESP::emsdevices) {
if (emsdevice) {
@@ -226,17 +226,16 @@ void WebCustomizationService::masked_entities(AsyncWebServerRequest * request, J
std::vector<std::string> entity_ids;
for (const JsonVariant id : entity_ids_json) {
std::string entity_id = id.as<std::string>();
// handle the mask change and add to the list of customized entities
// if the value is different from the default (mask == 0)
// set the new mask and add to the list of customized entities if the value is different from the default (mask == 0)
if (emsdevice->mask_entity(entity_id)) {
entity_ids.push_back(entity_id);
}
}
// Save the list to the customization file
uint8_t product_id = emsdevice->product_id();
uint8_t device_id = emsdevice->device_id();
// Save the list to the customization file
EMSESP::webCustomizationService.update(
[&](WebCustomization & settings) {
// if it exists (productid and deviceid match) overwrite it