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
- Improve signal path: move the device or add a Bluetooth proxy near it.
- Disable USB autosuspend / power management on the Bluetooth adapter if it disappears periodically.
- Replace the device battery.
- Verify the BLE address is stable (device does not use a rotating MAC).
- 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
- Position a Bluetooth proxy within a few meters of BLE devices.
- Disable USB power management (autosuspend) on the Bluetooth adapter.
- Treat isolated update failures as noise; act only on consecutive failures.
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
- Could not find Airthings device with address {address}: {rea
- Unable to fetch data for migration: {err}
- Unable to fetch data: {err}
- outdated_version
- integrations_disabled
AI-assisted analysis of home-assistant/core@58a3fdb3ea (2026-08-14).
Data as JSON: /api/errors/59de6a36c63a72b0.
Report an issue: GitHub.