home-assistant/core · warning · UpdateFailed

Unable to fetch data: {err}

Error message

Unable to fetch data: {err}

What it means

UpdateFailed raised on every airthings_ble coordinator refresh when the BLE update_device() call raises any exception — the generic catch-all for periodic BLE polling failures. Entities become unavailable until a poll succeeds.

Source

Thrown at homeassistant/components/airthings_ble/coordinator.py:104

                ) from err

            self.hass.config_entries.async_update_entry(
                self.config_entry,
                data={**self.config_entry.data, DEVICE_MODEL: data.model.value},
            )
            self.update_interval = timedelta(
                seconds=DEVICE_SPECIFIC_SCAN_INTERVAL.get(
                    data.model.value, DEFAULT_SCAN_INTERVAL
                )
            )

    @override
    async def _async_update_data(self) -> AirthingsDevice:
        """Get data from Airthings BLE."""
        try:
            data = await self.airthings.update_device(self.ble_device)
        except Exception as err:
            raise UpdateFailed(f"Unable to fetch data: {err}") from err
        return data

View on GitHub (pinned to 58a3fdb3ea)

Solutions

  1. Improve signal path: move the device or add a Bluetooth proxy near it.
  2. Disable USB autosuspend / power management on the Bluetooth adapter if it disappears periodically.
  3. Replace the device battery.
  4. Verify the BLE address is stable (device does not use a rotating MAC).
  5. Accept occasional failures — single missed polls self-heal on the next interval; only persistent failures need action.
Defensive patterns

Strategy: retry

Type guard

def is_airthings_ble_poll_failed(err: Exception) -> bool:
    return isinstance(err, UpdateFailed) and str(err).startswith("Unable to fetch data")

Try / catch

try:
    await coordinator.async_refresh()
except UpdateFailed:
    # BLE polls are inherently lossy: single failures self-heal on the next interval
    pass

Prevention

When it happens

Trigger: airthings.update_device(self.ble_device) raises during the scheduled poll: GATT connect timeout, device out of range, stale BLEDevice handle after adapter restart, encryption error, or the device sleeping and not responding within the timeout.

Common situations: Intermittent BLE range (device at the edge of reception), Bluetooth adapter instability (USB power management), too many BLE devices saturating the adapter, or a dead battery.

Related errors


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