{"record":{"id":"cfe55609e6a9a700","repo":"home-assistant/core","slug":"no-data-was-returned-from-airnow","errorCode":null,"errorMessage":"No data was returned from AirNow","messagePattern":"No data was returned from AirNow","errorType":"exception","errorClass":"UpdateFailed","httpStatus":null,"severity":"warning","filePath":"homeassistant/components/airnow/coordinator.py","lineNumber":84,"sourceCode":"            name=DOMAIN,\n            update_interval=update_interval,\n        )\n\n    @override\n    async def _async_update_data(self) -> dict[str, Any]:\n        \"\"\"Update data via library.\"\"\"\n        data: dict[str, Any] = {}\n        try:\n            obs = await self.airnow.observations.latLong(\n                self.latitude,\n                self.longitude,\n            )\n\n        except (AirNowError, ClientConnectorError, InvalidJsonError) as error:\n            raise UpdateFailed(error) from error\n\n        if not obs:\n            raise UpdateFailed(\"No data was returned from AirNow\")\n\n        max_aqi = 0\n        max_aqi_level = 0\n        max_aqi_desc = \"\"\n        max_aqi_poll = \"\"\n        for obv in obs:\n            # Convert AQIs to Concentration\n            pollutant = obv[ATTR_API_AQI_PARAM]\n            concentration = aqi_to_concentration(obv[ATTR_API_AQI], pollutant)\n            data[obv[ATTR_API_AQI_PARAM]] = concentration\n\n            # Overall AQI is the max of all pollutant AQIs\n            if obv[ATTR_API_AQI] > max_aqi:\n                max_aqi = obv[ATTR_API_AQI]\n                max_aqi_level = obv[ATTR_API_CATEGORY][ATTR_API_CAT_LEVEL]\n                max_aqi_desc = obv[ATTR_API_CATEGORY][ATTR_API_CAT_DESCRIPTION]\n                max_aqi_poll = pollutant\n","sourceCodeStart":66,"sourceCodeEnd":102,"githubUrl":"https://github.com/home-assistant/core/blob/58a3fdb3ea0538617f0a07efcfba6294de64fd59/homeassistant/components/airnow/coordinator.py#L66-L102","documentation":"Raised by the AirNow coordinator when the API call succeeds but returns an empty observation list for the requested lat/long. UpdateFailed with a literal message; the entry retries on its interval but will keep failing until the location has reporting stations.","triggerScenarios":"observations.latLong() returns [] — the point has no AirNow reporting stations nearby (rural/remote US areas, or coordinates just outside coverage), or stations are temporarily not reporting.","commonSituations":"US location far from any monitoring station, coordinates slightly off (e.g. in water/wilderness), or nighttime/maintenance gaps in station reporting.","solutions":["Double-check the coordinates in the config entry are correct","Move the query point closer to a known monitoring station (see fire.airnow.gov monitor map)","If the nearest station is simply offline, wait — the coordinator retries automatically","If the area has permanent coverage gaps, use a different air-quality integration"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"# Before relying on the entity, check station coverage at fire.airnow.gov\n# for the configured lat/long; empty observations mean no nearby reporting monitors.","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Place the query point near a known monitoring station","Treat empty-data failures as coverage gaps, not bugs","Prefer a denser provider (e.g. AirNow by zip alternative or PurpleAir) for remote areas"],"tags":["airnow","home-assistant","geolocation","coverage"],"backgroundTag":null,"analyzedSha":"58a3fdb3ea0538617f0a07efcfba6294de64fd59","analyzedAt":"2026-08-14T20:54:38.818Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}