mirror of
https://github.com/emsesp/EMS-ESP32.git
synced 2025-12-07 16:29:51 +03:00
fix devicevalue sorting the Michael way (thanks)
This commit is contained in:
@@ -637,17 +637,11 @@ void EMSdevice::generate_values_web(JsonObject & output) {
|
|||||||
output["label"] = to_string_short();
|
output["label"] = to_string_short();
|
||||||
JsonArray data = output.createNestedArray("data");
|
JsonArray data = output.createNestedArray("data");
|
||||||
|
|
||||||
// sort the device values
|
// do two passes. First for all entities marked as favourites, then for all others. This sorts the list.
|
||||||
std::sort(devicevalues_.begin(), devicevalues_.end(), [](const emsesp::DeviceValue & a, const emsesp::DeviceValue & b __attribute__((unused))) {
|
for (uint8_t i = 0; i < 2; i++) {
|
||||||
return a.has_state(DeviceValueState::DV_FAVORITE);
|
|
||||||
});
|
|
||||||
|
|
||||||
for (auto & dv : devicevalues_) {
|
for (auto & dv : devicevalues_) {
|
||||||
// check conditions:
|
bool state = (!i && dv.has_state(DeviceValueState::DV_FAVORITE)) || (i && !dv.has_state(DeviceValueState::DV_FAVORITE));
|
||||||
// 1. full_name cannot be empty
|
if (state && (!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.full_name && (dv.hasValue() || (dv.type == DeviceValueType::CMD)))) {
|
||||||
// 2. it must have a valid value, if it is not a command like 'reset'
|
|
||||||
|
|
||||||
if (!dv.has_state(DeviceValueState::DV_WEB_EXCLUDE) && dv.full_name && (dv.hasValue() || (dv.type == DeviceValueType::CMD))) {
|
|
||||||
JsonObject obj = data.createNestedObject(); // create the object, we know there is a value
|
JsonObject obj = data.createNestedObject(); // create the object, we know there is a value
|
||||||
uint8_t fahrenheit = 0;
|
uint8_t fahrenheit = 0;
|
||||||
|
|
||||||
@@ -701,13 +695,15 @@ void EMSdevice::generate_values_web(JsonObject & output) {
|
|||||||
// add the unit of measure (uom)
|
// add the unit of measure (uom)
|
||||||
obj["u"] = fahrenheit ? (uint8_t)DeviceValueUOM::FAHRENHEIT : dv.uom;
|
obj["u"] = fahrenheit ? (uint8_t)DeviceValueUOM::FAHRENHEIT : dv.uom;
|
||||||
|
|
||||||
|
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
|
// add name, prefixing the tag if it exists
|
||||||
if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) {
|
if ((dv.tag == DeviceValueTAG::TAG_NONE) || tag_to_string(dv.tag).empty()) {
|
||||||
obj["n"] = dv.full_name;
|
obj["n"] = mask + read_flash_string(dv.full_name);
|
||||||
} else if (dv.tag < DeviceValueTAG::TAG_HC1) {
|
} else if (dv.tag < DeviceValueTAG::TAG_HC1) {
|
||||||
obj["n"] = tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name);
|
obj["n"] = mask + tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name);
|
||||||
} else {
|
} else {
|
||||||
obj["n"] = tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name);
|
obj["n"] = mask + tag_to_string(dv.tag) + " " + read_flash_string(dv.full_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// add commands and options
|
// add commands and options
|
||||||
@@ -756,6 +752,7 @@ void EMSdevice::generate_values_web(JsonObject & output) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// as generate_values_web() but stripped down to only show all entities and their state
|
// as generate_values_web() but stripped down to only show all entities and their state
|
||||||
// this is used only for WebCustomizationService::device_entities()
|
// this is used only for WebCustomizationService::device_entities()
|
||||||
@@ -853,7 +850,7 @@ void EMSdevice::generate_values_web_all(JsonArray & output) {
|
|||||||
// this is called before loading in the exclude entities list from the customization service
|
// this is called before loading in the exclude entities list from the customization service
|
||||||
void EMSdevice::reset_entity_masks() {
|
void EMSdevice::reset_entity_masks() {
|
||||||
for (auto & dv : devicevalues_) {
|
for (auto & dv : devicevalues_) {
|
||||||
dv.state &= 0x0F;
|
dv.state &= 0x0F; // clear high nibble
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user