Skip to content

[BUG] ESPHome entities not found after Home Assistant 2026.8.3 unique_id migration #175

Description

@ggutierrezdelc

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

  1. Configure SAT to use an ESPHome gateway in esphome mode.
  2. Use an ESPHome device exposing OpenTherm entities, including t_set, max_t_set, boiler temperature, burner status, etc.
  3. Run SAT with Home Assistant prior to 2026.8.
  4. Upgrade Home Assistant to 2026.8.3.
  5. Restart Home Assistant and SAT.
  6. Check the SAT logs and the ESPHome entities used by SAT.
  7. 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions