diff --git a/CHANGELOG_LATEST.md b/CHANGELOG_LATEST.md index 3a8cd3c30..8cded5a0b 100644 --- a/CHANGELOG_LATEST.md +++ b/CHANGELOG_LATEST.md @@ -15,8 +15,9 @@ - HA-discovery for analog sensor commands [#1035](https://github.com/emsesp/EMS-ESP32/issues/1035) - ## Changed - Use byte 0 for detection RC30 active heatingcircuit [#786](https://github.com/emsesp/EMS-ESP32/issues/786) -- Write repeated selflowtemp if tx-queue is empty without verify [#954](https://github.com/emsesp/EMS-ESP32/issues/954) \ No newline at end of file +- Write repeated selflowtemp if tx-queue is empty without verify [#954](https://github.com/emsesp/EMS-ESP32/issues/954) +- HA discovery recreate after disconnect by device [#1067](https://github.com/emsesp/EMS-ESP32/issues/1067) +- File upload: check flash size (overflow) instead of filesize diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index a8c3282b7..9b31a155f 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -1646,9 +1646,11 @@ bool EMSdevice::generate_values(JsonObject & output, const uint8_t tag_filter, c // this is called when an MQTT publish is done via an EMS Device in emsesp.cpp::publish_device_values() void EMSdevice::mqtt_ha_entity_config_remove() { for (auto & dv : devicevalues_) { - if (dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) + if ((dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) + || (!dv.has_state(DeviceValueState::DV_HA_CONFIG_CREATED) && dv.has_state(DeviceValueState::DV_HA_CONFIG_RECREATE))) && ((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 { @@ -1667,6 +1669,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); @@ -1694,8 +1700,7 @@ 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); + 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 dd7107b08..807ad26d9 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