Summary of the bug
After upgrading to Home Assistant 2026.8.3, SAT in ESPHome mode can no longer find the ESPHome entities exposed by the gateway. As a result, SAT stops reading boiler data and no longer writes the t_set control setpoint to the boiler. The issue appears to be caused by Home Assistant changing the unique_id format of ESPHome entities in 2026.8, while SAT still searches using the legacy unique_id format.
Steps to reproduce
- Configure SAT to use an ESPHome gateway in
esphome mode.
- Use an ESPHome device exposing OpenTherm entities, including
t_set, max_t_set, boiler temperature, burner status, etc.
- Run SAT with Home Assistant prior to 2026.8.
- Upgrade Home Assistant to 2026.8.3.
- Restart Home Assistant and SAT.
- Check the SAT logs and the ESPHome entities used by SAT.
- Observe that SAT can no longer resolve the ESPHome entity IDs.
Expected behavior
SAT should continue to find and use the existing ESPHome entities after upgrading Home Assistant.
The t_set entity should be writable, and SAT should continue reading the boiler data and controlling the OpenTherm setpoint normally.
Actual behavior
SAT cannot find the ESPHome entities after the Home Assistant upgrade.
async_get_entity_id() returns None because SAT searches for the legacy ESPHome unique_id format:
{MAC}-{domain}-{key}
However, Home Assistant 2026.8 migrated the ESPHome unique_ids to the new format:
{mac}/{sub_device_id}/{platform}/{object_id}
For example, the entity registry contains:
unique_id:
94:E6:86:3C:EE:6C/0/number/t_set
previous_unique_id:
94:E6:86:3C:EE:6C-number-t_set
Because SAT still searches for the old format, it cannot resolve the entity.
As a consequence:
- Boiler data is not available to SAT.
t_set is never written.
max_t_set cannot be read.
- The PWM component reports missing values and turns off.
- SAT may report
hvac_action as idle even though the boiler burner is active.
Home Assistant version
2026.8.3
Integration version
4.2.1
Relevant logs
Home Assistant entity registry:
{
"entity_id": "number.lavanderia_opentherm_t_set",
"unique_id": "94:E6:86:3C:EE:6C/0/number/t_set",
"previous_unique_id": "94:E6:86:3C:EE:6C-number-t_set",
"platform": "esphome",
"modified_at": "2026-09-01T02:31:29.708082+00:00"
}
Symptoms observed:
- custom_components.sat.pwm: PWM turned off due missing values. Logged every 30 seconds.
- hvac_action: idle while binary_sensor.*_burner_flame is on and central heating is active.
- max_t_set cannot be read.
- The t_set number entity is never written.
Suggested fix:
def _get_entity_id(self, domain: str, key: str):
mac = self._mac_address.upper()
# Legacy ESPHome unique_id format (Home Assistant < 2026.8)
legacy_unique_id = f"{mac}-{domain}-{key}"
_LOGGER.debug(f"Attempting to find the unique_id of {legacy_unique_id}")
if (entity_id := self._entity_registry.async_get_entity_id(
domain, esphome.DOMAIN, legacy_unique_id
)) is not None:
return entity_id
# Current ESPHome unique_id format:
# {mac}/{sub_device_id}/{platform}/{object_id}
prefix, suffix = f"{mac}/", f"/{domain}/{key}"
_LOGGER.debug(
f"Attempting to find an entity with a unique_id matching "
f"{prefix}*{suffix}"
)
for entry in self._entity_registry.entities.values():
if entry.platform != esphome.DOMAIN or entry.domain != domain:
continue
if entry.unique_id.startswith(prefix) and entry.unique_id.endswith(suffix):
return entry.entity_id
return None
Summary of the bug
After upgrading to Home Assistant 2026.8.3, SAT in ESPHome mode can no longer find the ESPHome entities exposed by the gateway. As a result, SAT stops reading boiler data and no longer writes the t_set control setpoint to the boiler. The issue appears to be caused by Home Assistant changing the unique_id format of ESPHome entities in 2026.8, while SAT still searches using the legacy unique_id format.
Steps to reproduce
esphomemode.t_set,max_t_set, boiler temperature, burner status, etc.Expected behavior
SAT should continue to find and use the existing ESPHome entities after upgrading Home Assistant.
The
t_setentity should be writable, and SAT should continue reading the boiler data and controlling the OpenTherm setpoint normally.Actual behavior
SAT cannot find the ESPHome entities after the Home Assistant upgrade.
async_get_entity_id()returnsNonebecause SAT searches for the legacy ESPHome unique_id format:{MAC}-{domain}-{key}
However, Home Assistant 2026.8 migrated the ESPHome unique_ids to the new format:
{mac}/{sub_device_id}/{platform}/{object_id}
For example, the entity registry contains:
unique_id:
94:E6:86:3C:EE:6C/0/number/t_set
previous_unique_id:
94:E6:86:3C:EE:6C-number-t_set
Because SAT still searches for the old format, it cannot resolve the entity.
As a consequence:
t_setis never written.max_t_setcannot be read.hvac_actionas idle even though the boiler burner is active.Home Assistant version
2026.8.3
Integration version
4.2.1
Relevant logs
Home Assistant entity registry: { "entity_id": "number.lavanderia_opentherm_t_set", "unique_id": "94:E6:86:3C:EE:6C/0/number/t_set", "previous_unique_id": "94:E6:86:3C:EE:6C-number-t_set", "platform": "esphome", "modified_at": "2026-09-01T02:31:29.708082+00:00" } Symptoms observed: - custom_components.sat.pwm: PWM turned off due missing values. Logged every 30 seconds. - hvac_action: idle while binary_sensor.*_burner_flame is on and central heating is active. - max_t_set cannot be read. - The t_set number entity is never written. Suggested fix: def _get_entity_id(self, domain: str, key: str): mac = self._mac_address.upper() # Legacy ESPHome unique_id format (Home Assistant < 2026.8) legacy_unique_id = f"{mac}-{domain}-{key}" _LOGGER.debug(f"Attempting to find the unique_id of {legacy_unique_id}") if (entity_id := self._entity_registry.async_get_entity_id( domain, esphome.DOMAIN, legacy_unique_id )) is not None: return entity_id # Current ESPHome unique_id format: # {mac}/{sub_device_id}/{platform}/{object_id} prefix, suffix = f"{mac}/", f"/{domain}/{key}" _LOGGER.debug( f"Attempting to find an entity with a unique_id matching " f"{prefix}*{suffix}" ) for entry in self._entity_registry.entities.values(): if entry.platform != esphome.DOMAIN or entry.domain != domain: continue if entry.unique_id.startswith(prefix) and entry.unique_id.endswith(suffix): return entry.entity_id return None