diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 657175d03..1a44b9450 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -1676,6 +1676,7 @@ void EMSdevice::mqtt_ha_entity_config_remove() { if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && ((dv.has_state(DeviceValueState::DV_API_MQTT_EXCLUDE)) || (!dv.has_state(DeviceValueState::DV_ACTIVE)))) { dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); + dv.remove_state(DeviceValueState::DV_HA_CONFIG_RECREATE); if (dv.short_name == FL_(climate)[0]) { Mqtt::publish_ha_climate_config(dv.tag, false, true); // delete topic (remove = true) } else { @@ -1694,6 +1695,10 @@ void EMSdevice::mqtt_ha_entity_config_create() { // create climate if roomtemp is visible // create the discovery topic if if hasn't already been created, not a command (like reset) and is active and visible for (auto & dv : devicevalues_) { + if (dv.has_state(DeviceValueState::DV_HA_CONFIG_RECREATE)) { + dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); + dv.remove_state(DeviceValueState::DV_HA_CONFIG_RECREATE); + } if ((dv.short_name == FL_(climate)[0]) && !dv.has_state(DeviceValueState::DV_API_MQTT_EXCLUDE) && dv.has_state(DeviceValueState::DV_ACTIVE)) { if (*(int8_t *)(dv.value_p) == 1 && (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) || dv.has_state(DeviceValueState::DV_HA_CLIMATE_NO_RT))) { dv.remove_state(DeviceValueState::DV_HA_CLIMATE_NO_RT); @@ -1721,8 +1726,9 @@ void EMSdevice::mqtt_ha_entity_config_create() { // remove all config topics in HA void EMSdevice::ha_config_clear() { for (auto & dv : devicevalues_) { - Mqtt::publish_ha_sensor_config(dv, "", "", true); // delete topic (remove = true) - dv.remove_state(DeviceValueState::DV_HA_CONFIG_CREATED); + if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED)) { + dv.add_state(DeviceValueState::DV_HA_CONFIG_RECREATE); + } } ha_config_done(false); // this will force the recreation of the main HA device config diff --git a/src/emsdevicevalue.h b/src/emsdevicevalue.h index 6a2d0b72b..9e2e6beea 100644 --- a/src/emsdevicevalue.h +++ b/src/emsdevicevalue.h @@ -120,10 +120,11 @@ class DeviceValue { // states of a device value enum DeviceValueState : uint8_t { // low nibble active state of the device value - DV_DEFAULT = 0, // 0 - does not yet have a value - DV_ACTIVE = (1 << 0), // 1 - has a validated real value - DV_HA_CONFIG_CREATED = (1 << 1), // 2 - set if the HA config topic has been created - DV_HA_CLIMATE_NO_RT = (1 << 2), // 4 - climate created without roomTemp + DV_DEFAULT = 0, // 0 - does not yet have a value + DV_ACTIVE = (1 << 0), // 1 - has a validated real value + DV_HA_CONFIG_CREATED = (1 << 1), // 2 - set if the HA config topic has been created + DV_HA_CLIMATE_NO_RT = (1 << 2), // 4 - climate created without roomTemp + DV_HA_CONFIG_RECREATE = (1 << 3), // 8 - set on reconnect to recreate HA config topic // high nibble as mask for exclusions & special functions DV_WEB_EXCLUDE = (1 << 4), // 16 - not shown on web diff --git a/src/system.cpp b/src/system.cpp index 0f99ab9c1..207adeaae 100644 --- a/src/system.cpp +++ b/src/system.cpp @@ -18,6 +18,8 @@ #include "system.h" #include "emsesp.h" // for send_raw_telegram() command +#include "esp_ota_ops.h" + #include @@ -268,7 +270,6 @@ void System::syslog_init() { syslog_.mark_interval(0); syslog_.destination(""); } - if (Mqtt::publish_single()) { if (Mqtt::publish_single2cmd()) { Mqtt::publish("system/syslog", syslog_enabled_ ? (FL_(list_syslog_level)[syslog_level_ + 1]) : "off"); @@ -397,7 +398,7 @@ void System::start() { fstotal_ = LittleFS.totalBytes() / 1024; // read only once, it takes 500 ms to read psram_ = ESP.getPsramSize() / 1024; appused_ = ESP.getSketchSize() / 1024; - appfree_ = ESP.getFreeSketchSpace() / 1024 - appused_; + appfree_ = esp_ota_get_running_partition()->size / 1024 - appused_; refreshHeapMem(); // refresh free heap and max alloc heap #endif