home-assistant/core · error · AbortFlow

outdated_version

outdated_version

Error message

This device is using outdated firmware. Please update it to at least v1.2.0 and try again.

What it means

AbortFlow with reason 'outdated_version' in the Aranet config flow. It fires during Bluetooth discovery when the advertised manufacturer data is missing or reports a firmware version below MIN_VERSION (v1.2.0), because old Aranet4 firmware does not expose sensor data in advertisements and cannot be set up passively.

Solutions

  1. Update the Aranet4 firmware to at least v1.2.0 using the official Aranet app.
  2. Re-pair/re-discover the device in Home Assistant after the update (force a Bluetooth re-scan or restart discovery).
  3. If the device is already updated, move it closer to the Bluetooth adapter so complete manufacturer data is received.
Defensive patterns

Strategy: validation

Validate before calling

from aranet4 import Aranet4Advertisement

def is_setup_capable(adv: Aranet4Advertisement, min_version: int) -> bool:
    md = adv.manufacturer_data
    return md is not None and md.version >= min_version

Try / catch

Wrap flow steps in try/except AbortFlow and inspect flow.reason == 'outdated_version' to show a firmware-update hint to the user.

Prevention

When it happens

Trigger: async_step_bluetooth (or the manual user step) processes an Aranet4Advertisement where adv.manufacturer_data is None or adv.manufacturer_data.version < MIN_VERSION; _raise_for_advertisement_errors raises AbortFlow('outdated_version') and the flow aborts with the localized message.

Common situations: A newly bought or long-unused Aranet4 running factory firmware; a device that was reset to an old firmware; orphan devices discovered via BLE that never received OTA updates.

Related errors


AI-assisted analysis of home-assistant/core@58a3fdb3ea (2026-08-14). Data as JSON: /api/errors/5dc4c29089fa8f88. Report an issue: GitHub.

Appendix: source

Thrown at homeassistant/components/aranet/config_flow.py:43

    )


class AranetConfigFlow(ConfigFlow, domain=DOMAIN):
    """Handle a config flow for Aranet."""

    VERSION = 1

    def __init__(self) -> None:
        """Set up a new config flow for Aranet."""
        self._discovery_info: BluetoothServiceInfoBleak | None = None
        self._discovered_device: Aranet4Advertisement | None = None
        self._discovered_devices: dict[str, tuple[str, Aranet4Advertisement]] = {}

    def _raise_for_advertisement_errors(self, adv: Aranet4Advertisement) -> None:
        """Raise any configuration errors that apply to an advertisement."""
        # Old versions of firmware don't expose sensor data in advertisements.
        if not adv.manufacturer_data or adv.manufacturer_data.version < MIN_VERSION:
            raise AbortFlow("outdated_version")

        # If integrations are disabled, we get no sensor data.
        if not adv.manufacturer_data.integrations:
            raise AbortFlow("integrations_disabled")

    @override
    async def async_step_bluetooth(
        self, discovery_info: BluetoothServiceInfoBleak
    ) -> ConfigFlowResult:
        """Handle the Bluetooth discovery step."""
        await self.async_set_unique_id(discovery_info.address)
        self._abort_if_unique_id_configured()
        adv = Aranet4Advertisement(discovery_info.device, discovery_info.advertisement)
        self._raise_for_advertisement_errors(adv)

        self._discovery_info = discovery_info
        self._discovered_device = adv
        return await self.async_step_bluetooth_confirm()

View on GitHub (pinned to 58a3fdb3ea)