diff --git a/src/devices/boiler.cpp b/src/devices/boiler.cpp index b842925e9..1ba1ff2bc 100644 --- a/src/devices/boiler.cpp +++ b/src/devices/boiler.cpp @@ -402,6 +402,7 @@ Boiler::Boiler(uint8_t device_type, int8_t device_id, uint8_t product_id, const 99); } */ + // heatpump info if (model() == EMS_DEVICE_FLAG_HEATPUMP) { register_device_value(DeviceValueTAG::TAG_DEVICE_DATA, diff --git a/src/devices/thermostat.cpp b/src/devices/thermostat.cpp index 20d49d7b4..984285b8f 100644 --- a/src/devices/thermostat.cpp +++ b/src/devices/thermostat.cpp @@ -197,7 +197,7 @@ Thermostat::Thermostat(uint8_t device_type, uint8_t device_id, uint8_t product_i #if defined(EMSESP_STANDALONE_DUMP) // if we're just dumping out values, create a single dummy hc - register_device_values_hc(std::make_shared(1, 0)); // hc=1, no flags + register_device_values_hc(std::make_shared(1, model)); // hc=1 #endif } diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index f89dcd66f..4f7062e87 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -1064,7 +1064,9 @@ void EMSdevice::getCustomEntities(std::vector & entity_ids) { #if defined(EMSESP_STANDALONE_DUMP) // dumps all entity values in native English -// device name,device type,product_id,shortname,fullname,type [(enum values) | (min/max)],uom,writeable,discovery_entityid +// the code is intended to run only once standalone, outside the ESP32 so not optimized for memory efficiency +// pipe symbols (|) are escaped so they can be converted to Markdown in the Wiki +// format is: device name,device type,product id,shortname,fullname,type [options...] \\| (min/max),uom,writeable,discovery entityid v3.4, discovery entityid void EMSdevice::dump_value_info() { for (auto & dv : devicevalues_) { if (dv.fullname == nullptr) { @@ -1085,33 +1087,25 @@ void EMSdevice::dump_value_info() { Serial.print(dv.fullname[0]); Serial.print(','); - // type and optional enum values and min/max + // per type switch (dv.type) { - case DeviceValueType::ENUM: { - Serial.print("enum"); - Serial.print(" ("); - for (uint8_t i = 0; i < dv.options_size; i++) { - Serial.print(Helpers::translated_word(dv.options[i])); - if (i < dv.options_size - 1) { - Serial.print('|'); - } + case DeviceValueType::ENUM: + case DeviceValueType::CMD: + if (dv.type == DeviceValueType::ENUM) { + Serial.print("enum"); + } else { + Serial.print("cmd"); } - Serial.print(')'); - break; - } - case DeviceValueType::CMD: { - Serial.print("cmd"); - Serial.print(" ("); + Serial.print(" ["); for (uint8_t i = 0; i < dv.options_size; i++) { - Serial.print(Helpers::translated_word(dv.options[i])); + Serial.print(dv.options[i][0]); if (i < dv.options_size - 1) { - Serial.print('|'); + Serial.print("\\|"); } } - Serial.print(')'); + Serial.print(']'); break; - } case DeviceValueType::USHORT: Serial.print("ushort"); @@ -1174,50 +1168,65 @@ void EMSdevice::dump_value_info() { Serial.print(dv.has_cmd ? "true" : "false"); Serial.print(","); - // MQTT Discovery entity name, assuming we're using the default v3.5 option - char entity_with_tag[50]; - if (dv.tag >= DeviceValueTAG::TAG_HC1) { - snprintf(entity_with_tag, - sizeof(entity_with_tag), - "%s_%s_%s", - device_type_2_device_name(device_type_), - EMSdevice::tag_to_mqtt(dv.tag).c_str(), - dv.short_name); - } else { - // should really test for which device types have tags (like hc, wwc etc) - // snprintf(entity_with_tag, sizeof(entity_with_tag), "%s_[_]%s", device_type_2_device_name(device_type_), dv.short_name); - snprintf(entity_with_tag, sizeof(entity_with_tag), "%s_%s", device_type_2_device_name(device_type_), dv.short_name); - } + // MQTT Discovery entity name + // do this twice for the old and new formats + char entity_with_tag[200]; + char entityid[500]; + char entity_name[100]; - char entityid[150]; - if (dv.has_cmd) { - switch (dv.type) { - case DeviceValueType::INT: - case DeviceValueType::UINT: - case DeviceValueType::SHORT: - case DeviceValueType::USHORT: - case DeviceValueType::ULONG: - snprintf(entityid, sizeof(entityid), "number.%s", entity_with_tag); - break; - case DeviceValueType::BOOL: - snprintf(entityid, sizeof(entityid), "switch.%s", entity_with_tag); - break; - case DeviceValueType::ENUM: - snprintf(entityid, sizeof(entityid), "select.%s", entity_with_tag); - break; - default: - snprintf(entityid, sizeof(entityid), "sensor.%s", entity_with_tag); - break; - } - } else { - if (dv.type == DeviceValueType::BOOL) { - snprintf(entityid, sizeof(entityid), "binary_sensor.%s", entity_with_tag); // binary sensor (for booleans) + for (uint8_t count = 0; count < 2; count++) { + if (count) { + // new name, comes as last + Serial.print(","); + strcpy(entity_name, dv.short_name); } else { - snprintf(entityid, sizeof(entityid), "sensor.%s", entity_with_tag); // normal HA sensor + // old format, comes first + char uniq_s[100]; + strlcpy(uniq_s, dv.fullname[0], sizeof(uniq_s)); + Helpers::replace_char(uniq_s, ' ', '_'); + strcpy(entity_name, uniq_s); } - } - Serial.print(entityid); + if (dv.tag >= DeviceValueTAG::TAG_HC1) { + snprintf(entity_with_tag, + sizeof(entity_with_tag), + "%s_%s_%s", + device_type_2_device_name(device_type_), + EMSdevice::tag_to_mqtt(dv.tag).c_str(), + entity_name); + } else { + snprintf(entity_with_tag, sizeof(entity_with_tag), "%s_%s", device_type_2_device_name(device_type_), entity_name); + } + + if (dv.has_cmd) { + switch (dv.type) { + case DeviceValueType::INT: + case DeviceValueType::UINT: + case DeviceValueType::SHORT: + case DeviceValueType::USHORT: + case DeviceValueType::ULONG: + snprintf(entityid, sizeof(entityid), "number.%s", entity_with_tag); + break; + case DeviceValueType::BOOL: + snprintf(entityid, sizeof(entityid), "switch.%s", entity_with_tag); + break; + case DeviceValueType::ENUM: + snprintf(entityid, sizeof(entityid), "select.%s", entity_with_tag); + break; + default: + snprintf(entityid, sizeof(entityid), "sensor.%s", entity_with_tag); + break; + } + } else { + if (dv.type == DeviceValueType::BOOL) { + snprintf(entityid, sizeof(entityid), "binary_sensor.%s", entity_with_tag); // binary sensor (for booleans) + } else { + snprintf(entityid, sizeof(entityid), "sensor.%s", entity_with_tag); // normal HA sensor + } + } + + Serial.print(entityid); + } Serial.println(); } diff --git a/src/emsesp.cpp b/src/emsesp.cpp index 8ebcc22db..ee4c8f0ef 100644 --- a/src/emsesp.cpp +++ b/src/emsesp.cpp @@ -313,7 +313,7 @@ void EMSESP::show_ems(uuid::console::Shell & shell) { void EMSESP::dump_all_values(uuid::console::Shell & shell) { Serial.println("---- CSV START ----"); // marker use by py script // add header for CSV - Serial.print("device name,device type,product_id,shortname,fullname,type [(enum values) | (min/max)],uom,writeable,discovery_entityid"); + Serial.print("device name,device type,product id,shortname,fullname,type [options...] \\| (min/max),uom,writeable,discovery entityid v3.4, discovery entityid"); Serial.println(); for (const auto & device_class : EMSFactory::device_handlers()) { @@ -323,7 +323,12 @@ void EMSESP::dump_all_values(uuid::console::Shell & shell) { uint8_t device_id = 0; // Mixer class looks at device_id to determine type, so fixing to 0x28 which will give all the settings except flowSetTemp if ((device.device_type == DeviceType::MIXER) && (device.flags == EMSdevice::EMS_DEVICE_FLAG_MMPLUS)) { - device_id = 0x28; // hard code + // pick one as hc and the other as having wwc + if (device.product_id == 160) { // MM100 + device_id = 0x28; // wwc + } else { + device_id = 0x20; // hc + } } emsdevices.push_back(