diff --git a/interface/src/framework/system/GeneralFileUpload.tsx b/interface/src/framework/system/GeneralFileUpload.tsx index 51c8a48b2..e2ffd4396 100644 --- a/interface/src/framework/system/GeneralFileUpload.tsx +++ b/interface/src/framework/system/GeneralFileUpload.tsx @@ -46,6 +46,7 @@ const GeneralFileUpload: FC = ({ uploadGeneralFile }) => { const response = await EMSESP.getSettings(); if (response.status !== 200) { toast.error(LL.PROBLEM_LOADING()); + } else { saveFile(response.data, 'settings'); } } catch (error) { @@ -71,6 +72,7 @@ const GeneralFileUpload: FC = ({ uploadGeneralFile }) => { const response = await EMSESP.readSchedule(); if (response.status !== 200) { toast.error(LL.PROBLEM_LOADING()); + } else { saveFile(response.data, 'schedule'); } } catch (error) { diff --git a/lib/framework/UploadFileService.cpp b/lib/framework/UploadFileService.cpp index 7ed969b2d..865e453d8 100644 --- a/lib/framework/UploadFileService.cpp +++ b/lib/framework/UploadFileService.cpp @@ -63,7 +63,7 @@ void UploadFileService::handleUpload(AsyncWebServerRequest * request, const Stri return; } #elif CONFIG_IDF_TARGET_ESP32S3 - if (len > 12 && (data[0] != 0xE9 || data[12] != 3)) { + if (len > 12 && (data[0] != 0xE9 || data[12] != 9)) { handleError(request, 503); // service unavailable return; } diff --git a/src/analogsensor.cpp b/src/analogsensor.cpp index dbcdc61c3..0fc13f839 100644 --- a/src/analogsensor.cpp +++ b/src/analogsensor.cpp @@ -497,7 +497,7 @@ void AnalogSensor::publish_values(const bool force) { config["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + " else " + sample_val + "}}"; char uniq_s[70]; - if (Mqtt::entity_format() == 2) { + if (Mqtt::entity_format() == Mqtt::entitiyFormat::MULTI_SHORT) { snprintf(uniq_s, sizeof(uniq_s), "%s_analogsensor_%02d", Mqtt::basename().c_str(), sensor.gpio()); } else { snprintf(uniq_s, sizeof(uniq_s), "analogsensor_%02d", sensor.gpio()); diff --git a/src/dallassensor.cpp b/src/dallassensor.cpp index 8c11c0fe8..e10a9f7f5 100644 --- a/src/dallassensor.cpp +++ b/src/dallassensor.cpp @@ -528,7 +528,7 @@ void DallasSensor::publish_values(const bool force) { config["val_tpl"] = (std::string) "{{" + val_obj + " if " + val_cond + " else -55}}"; char uniq_s[70]; - if (Mqtt::entity_format() == 2) { + if (Mqtt::entity_format() == Mqtt::entitiyFormat::MULTI_SHORT) { snprintf(uniq_s, sizeof(uniq_s), "%s_dallassensor_%s", Mqtt::basename().c_str(), sensor.id().c_str()); } else { snprintf(uniq_s, sizeof(uniq_s), "dallassensor_%s", sensor.id().c_str()); diff --git a/src/mqtt.cpp b/src/mqtt.cpp index 00039d1d7..3280bc2bc 100644 --- a/src/mqtt.cpp +++ b/src/mqtt.cpp @@ -612,7 +612,7 @@ void Mqtt::ha_status() { StaticJsonDocument doc; char uniq[70]; - if (Mqtt::entity_format() == 2) { + if (Mqtt::entity_format() == entitiyFormat::MULTI_SHORT) { snprintf(uniq, sizeof(uniq), "%s_system_status", mqtt_basename_.c_str()); } else { strcpy(uniq, "system_status"); @@ -998,10 +998,10 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev // build unique identifier also used as object_id which also becomes the Entity ID in HA char uniq_id[80]; - if (Mqtt::entity_format() == 2) { + if (Mqtt::entity_format() == entitiyFormat::MULTI_SHORT) { // prefix base name to each uniq_id and use the shortname snprintf(uniq_id, sizeof(uniq_id), "%s_%s_%s", mqtt_basename_.c_str(), device_name, entity_with_tag); - } else if (Mqtt::entity_format() == 1) { + } else if (Mqtt::entity_format() == entitiyFormat::SINGLE_SHORT) { // shortname, no mqtt base. This is the default version. snprintf(uniq_id, sizeof(uniq_id), "%s_%s", device_name, entity_with_tag); } else { @@ -1010,10 +1010,11 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev char uniq_s[60]; strlcpy(uniq_s, en_name, sizeof(uniq_s)); Helpers::replace_char(uniq_s, ' ', '_'); + Helpers::replace_char(uniq_s, '+', '2'); //changes 'eco+_switch_off' to 'eco2_switch_off' (HA ignores '+') if (has_tag) { - snprintf(uniq_id, sizeof(uniq_id), "%s_%s", device_name, Helpers::toLower(uniq_s).c_str()); - } else { snprintf(uniq_id, sizeof(uniq_id), "%s_%s_%s", device_name, DeviceValue::DeviceValueTAG_s[tag][0], Helpers::toLower(uniq_s).c_str()); + } else { + snprintf(uniq_id, sizeof(uniq_id), "%s_%s", device_name, Helpers::toLower(uniq_s).c_str()); } } @@ -1034,7 +1035,7 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev case DeviceValueType::SHORT: case DeviceValueType::USHORT: case DeviceValueType::ULONG: - if (discovery_type() == 0) { + if (discovery_type() == discoveryType::HOMEASSISTANT) { // Home Assistant // number - https://www.home-assistant.io/integrations/number.mqtt snprintf(topic, sizeof(topic), "number/%s", config_topic); @@ -1152,7 +1153,7 @@ void Mqtt::publish_ha_sensor_config(uint8_t type, // EMSdev Helpers::CharToUpperUTF8(F_name); // capitalize first letter if (has_tag) { // exclude heartbeat tag - snprintf(ha_name, sizeof(ha_name), "%s %s", DeviceValue::DeviceValueTAG_s[tag][0], F_name); + snprintf(ha_name, sizeof(ha_name), "%s %s", EMSdevice::tag_to_string(tag), F_name); } else { snprintf(ha_name, sizeof(ha_name), "%s", F_name); // no tag } @@ -1367,7 +1368,7 @@ void Mqtt::publish_ha_climate_config(const uint8_t tag, const bool has_roomtemp, snprintf(name_s, sizeof(name_s), "Hc%d", hc_num); - if (Mqtt::entity_format() == 2) { + if (Mqtt::entity_format() == entitiyFormat::MULTI_SHORT) { snprintf(uniq_id_s, sizeof(uniq_id_s), "%s_thermostat_hc%d", mqtt_basename_.c_str(), hc_num); // add basename } else { snprintf(uniq_id_s, sizeof(uniq_id_s), "thermostat_hc%d", hc_num); // backward compatible with v3.4 diff --git a/src/mqtt.h b/src/mqtt.h index 19db5c866..c1be14df7 100644 --- a/src/mqtt.h +++ b/src/mqtt.h @@ -53,6 +53,9 @@ struct MqttMessage { class Mqtt { public: + enum discoveryType : uint8_t { HOMEASSISTANT, DOMOTICZ }; + enum entitiyFormat : uint8_t { SINGLE_LONG, SINGLE_SHORT, MULTI_SHORT }; + void loop(); void start(); diff --git a/src/shower.cpp b/src/shower.cpp index d5ad3af12..847801d13 100644 --- a/src/shower.cpp +++ b/src/shower.cpp @@ -155,7 +155,7 @@ void Shower::set_shower_state(bool state, bool force) { doc["name"] = "Shower Active"; char str[70]; - if (Mqtt::entity_format() == 2) { + if (Mqtt::entity_format() == Mqtt::entitiyFormat::MULTI_SHORT) { snprintf(str, sizeof(str), "%s_shower_active", Mqtt::basename().c_str()); } else { snprintf(str, sizeof(str), "shower_active"); // v3.4 compatible diff --git a/src/system.cpp b/src/system.cpp index 5f9c03cf6..e227037ea 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -529,7 +529,8 @@ void System::loop() { // send MQTT info topic appended with the version information as JSON, as a retained flag void System::send_info_mqtt(const char * event_str, bool send_ntp) { - StaticJsonDocument doc; + // use dynamic json becaues it is called from NTP-callback from lwip task with small stack + DynamicJsonDocument doc = DynamicJsonDocument(EMSESP_JSON_SIZE_MEDIUM); doc["event"] = event_str; doc["version"] = EMSESP_APP_VERSION;