diff --git a/src/emsdevice.cpp b/src/emsdevice.cpp index 3c1cbe402..f61b2ff39 100644 --- a/src/emsdevice.cpp +++ b/src/emsdevice.cpp @@ -1687,6 +1687,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 { @@ -1705,6 +1706,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); @@ -1732,8 +1737,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