diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 7009ad97a..40b0bd627 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -651,7 +651,12 @@ bool EMSdevice::get_value_info(JsonObject & root, const char * cmd, const int8_t // search device value with this tag for (auto & dv : devicevalues_) { if (strcmp(cmd, Helpers::toLower(uuid::read_flash_string(dv.short_name)).c_str()) == 0 && (tag <= 0 || tag == dv.tag)) { - uint8_t divider = (dv.options_size == 1) ? Helpers::atoint(uuid::read_flash_string(dv.options[0]).c_str()) : 0; + uint8_t divider = (dv.options_size == 1) ? Helpers::atoint(uuid::read_flash_string(dv.options[0]).c_str()) : 0; + const char * type = "type"; + const char * min = "min"; + const char * max = "max"; + const char * value = "value"; + json["name"] = dv.short_name; if (!tag_to_mqtt(dv.tag).empty()) { json["circuit"] = tag_to_mqtt(dv.tag); @@ -659,116 +664,133 @@ bool EMSdevice::get_value_info(JsonObject & root, const char * cmd, const int8_t switch (dv.type) { case DeviceValueType::ENUM: { if (Helpers::hasValue((uint8_t)(*(uint8_t *)(dv.value_p)))) { - json["value"] = dv.options[*(uint8_t *)(dv.value_p)]; // text - // json["value"] = (uint8_t)(*(uint8_t *)(dv.value_p)); + if (Mqtt::bool_format() == BOOL_FORMAT_10) { + json[value] = (uint8_t)(*(uint8_t *)(dv.value_p)); + } else { + json[value] = dv.options[*(uint8_t *)(dv.value_p)]; // text + } } - json["type"] = F_(enum); - uint8_t min = (uuid::read_flash_string(dv.options[*(uint8_t *)(dv.value_p)]) == "") ? 1 : 0; - json["min"] = min; - json["max"] = dv.options_size - 1; + json[type] = F_(enum); + uint8_t min_ = (uuid::read_flash_string(dv.options[0]) == "") ? 1 : 0; + json[min] = min_; + json[max] = dv.options_size - 1; JsonArray enum_ = json.createNestedArray(F_(enum)); - for (uint8_t i = min; i < dv.options_size; i++) { + for (uint8_t i = min_; i < dv.options_size; i++) { enum_.add(dv.options[i]); } break; } case DeviceValueType::USHORT: if (Helpers::hasValue(*(uint16_t *)(dv.value_p))) { - json["value"] = Helpers::round2(*(uint16_t *)(dv.value_p), divider); + json[value] = Helpers::round2(*(uint16_t *)(dv.value_p), divider); } - json["type"] = F_(number); - json["min"] = 0; - json["max"] = divider ? EMS_VALUE_USHORT_NOTSET / divider : EMS_VALUE_USHORT_NOTSET; + json[type] = F_(number); + json[min] = 0; + json[max] = divider ? EMS_VALUE_USHORT_NOTSET / divider : EMS_VALUE_USHORT_NOTSET; break; case DeviceValueType::UINT: if (Helpers::hasValue(*(uint8_t *)(dv.value_p))) { - json["value"] = Helpers::round2(*(uint8_t *)(dv.value_p), divider); + json[value] = Helpers::round2(*(uint8_t *)(dv.value_p), divider); } - json["type"] = F_(number); - json["min"] = 0; + json[type] = F_(number); + json[min] = 0; if (dv.uom == DeviceValueUOM::PERCENT) { - json["max"] = 100; + json[max] = 100; } else { - json["max"] = divider ? EMS_VALUE_UINT_NOTSET / divider : EMS_VALUE_UINT_NOTSET; + json[max] = divider ? EMS_VALUE_UINT_NOTSET / divider : EMS_VALUE_UINT_NOTSET; } break; case DeviceValueType::SHORT: if (Helpers::hasValue(*(int16_t *)(dv.value_p))) { - json["value"] = Helpers::round2(*(int16_t *)(dv.value_p), divider); + json[value] = Helpers::round2(*(int16_t *)(dv.value_p), divider); } - json["type"] = F_(number); - json["min"] = divider ? -EMS_VALUE_SHORT_NOTSET / divider : -EMS_VALUE_SHORT_NOTSET; - json["max"] = divider ? EMS_VALUE_SHORT_NOTSET / divider : EMS_VALUE_SHORT_NOTSET; + json[type] = F_(number); + json[min] = divider ? -EMS_VALUE_SHORT_NOTSET / divider : -EMS_VALUE_SHORT_NOTSET; + json[max] = divider ? EMS_VALUE_SHORT_NOTSET / divider : EMS_VALUE_SHORT_NOTSET; break; case DeviceValueType::INT: if (Helpers::hasValue(*(int8_t *)(dv.value_p))) { - json["value"] = Helpers::round2(*(int8_t *)(dv.value_p), divider); + json[value] = Helpers::round2(*(int8_t *)(dv.value_p), divider); } - json["type"] = F_(number); + json[type] = F_(number); if (dv.uom == DeviceValueUOM::PERCENT) { - json["min"] = -100; - json["max"] = 100; + json[min] = -100; + json[max] = 100; } else { - json["min"] = divider ? -EMS_VALUE_INT_NOTSET / divider : -EMS_VALUE_INT_NOTSET; - json["max"] = divider ? EMS_VALUE_INT_NOTSET / divider : EMS_VALUE_INT_NOTSET; + json[min] = divider ? -EMS_VALUE_INT_NOTSET / divider : -EMS_VALUE_INT_NOTSET; + json[max] = divider ? EMS_VALUE_INT_NOTSET / divider : EMS_VALUE_INT_NOTSET; } break; case DeviceValueType::ULONG: if (Helpers::hasValue(*(uint32_t *)(dv.value_p))) { - json["value"] = Helpers::round2(*(uint32_t *)(dv.value_p), divider); + json[value] = Helpers::round2(*(uint32_t *)(dv.value_p), divider); } - json["type"] = F_(number); - json["min"] = 0; - json["max"] = divider ? EMS_VALUE_ULONG_NOTSET / divider : EMS_VALUE_ULONG_NOTSET; + json[type] = F_(number); + json[min] = 0; + json[max] = divider ? EMS_VALUE_ULONG_NOTSET / divider : EMS_VALUE_ULONG_NOTSET; break; case DeviceValueType::BOOL: { if (Helpers::hasValue(*(uint8_t *)(dv.value_p), EMS_VALUE_BOOL)) { - json["value"] = (bool)(*(uint8_t *)(dv.value_p)) ? true : false; + if (dv.options_size == 2) { + json[value] = (bool)(*(uint8_t *)(dv.value_p)) ? dv.options[0] : dv.options[1]; + } else if (Mqtt::bool_format() == BOOL_FORMAT_ONOFF) { + json[value] = (bool)(*(uint8_t *)(dv.value_p)) ? F_(on) : F_(off); + } else if (Mqtt::bool_format() == BOOL_FORMAT_ONOFF_CAP) { + json[value] = (bool)(*(uint8_t *)(dv.value_p)) ? F_(ON) : F_(OFF); + } else if (Mqtt::bool_format() == BOOL_FORMAT_TRUEFALSE) { + json[value] = (bool)(*(uint8_t *)(dv.value_p)) ? true : false; + } else { + json[value] = (bool)(*(uint8_t *)(dv.value_p)) ? 1 : 0; + } } - json["type"] = F("boolean"); - json["min"] = 0; - json["max"] = 1; - JsonArray enum_ = json.createNestedArray(F("enum")); + json[type] = F("boolean"); + json[min] = 0; + json[max] = 1; + JsonArray enum_ = json.createNestedArray(F_(enum)); if (dv.options_size == 2) { enum_.add(dv.options[1]); enum_.add(dv.options[0]); } else if (Mqtt::bool_format() == BOOL_FORMAT_ONOFF) { - enum_.add("off"); - enum_.add("on"); + enum_.add(F_(off)); + enum_.add(F_(on)); } else if (Mqtt::bool_format() == BOOL_FORMAT_ONOFF_CAP) { - enum_.add("OFF"); - enum_.add("ON"); - } else { + enum_.add(F_(OFF)); + enum_.add(F_(ON)); + } else if (Mqtt::bool_format() == BOOL_FORMAT_TRUEFALSE) { enum_.add(false); enum_.add(true); + } else { + enum_.add(0); + enum_.add(1); } break; } case DeviceValueType::TIME: if (Helpers::hasValue(*(uint32_t *)(dv.value_p))) { - json["value"] = (divider) ? *(uint32_t *)(dv.value_p) / divider : *(uint32_t *)(dv.value_p); + json[value] = (divider) ? *(uint32_t *)(dv.value_p) / divider : *(uint32_t *)(dv.value_p); } - json["type"] = F_(number); - json["min"] = 0; - json["max"] = divider ? EMS_VALUE_ULONG_NOTSET / divider : EMS_VALUE_ULONG_NOTSET; + json[type] = F_(number); + json[min] = 0; + json[max] = divider ? EMS_VALUE_ULONG_NOTSET / divider : EMS_VALUE_ULONG_NOTSET; break; case DeviceValueType::TEXT: if (Helpers::hasValue((char *)(dv.value_p))) { - json["value"] = (char *)(dv.value_p); + json[value] = (char *)(dv.value_p); } - json["type"] = F_(text); + json[type] = F_(text); break; default: - json["type"] = F_(unknown); + json[type] = F_(unknown); break; } if (dv.uom != DeviceValueUOM::NONE) { json["unit"] = EMSdevice::uom_to_string(dv.uom); } json["writeable"] = dv.has_cmd; + // if we have individual limits, overwrite the common limits if (dv.min != 0 || dv.max != 0) { - json["min"] = dv.min; - json["max"] = dv.max; + json[min] = dv.min; + json[max] = dv.max; } return true; } @@ -788,8 +810,8 @@ bool EMSdevice::generate_values_json(JsonObject & root, const uint8_t tag_filter bool has_value = false; // only show if tag is either empty (TAG_NONE) or matches a value // and don't show if full_name is empty unless we're outputing for mqtt payloads - // for nested we use all values - if (((nested) || tag_filter == DeviceValueTAG::TAG_NONE || (tag_filter == dv.tag)) && (dv.full_name != nullptr || !console)) { + // for nested we use all values, dont show command only (have_cmd and no fulname) + if (((nested) || tag_filter == DeviceValueTAG::TAG_NONE || (tag_filter == dv.tag)) && (dv.full_name != nullptr || !console) && !(dv.full_name == nullptr && dv.has_cmd)) { // we have a tag if it matches the filter given, and that the tag name is not empty/"" bool have_tag = ((dv.tag != tag_filter) && !tag_to_string(dv.tag).empty());