mirror of
https://github.com/home-assistant/core.git
synced 2026-08-24 10:13:52 -05:00
Slow down Tractive API polling to avoid 429 too many requests (#169057)
Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
co-authored by
Copilot
parent
8b2afb4e66
commit
9369a5dc93
@@ -102,13 +102,19 @@ async def async_setup_entry(hass: HomeAssistant, entry: TractiveConfigEntry) ->
|
||||
|
||||
tractive = TractiveClient(hass, client, creds["user_id"], entry)
|
||||
|
||||
trackables = []
|
||||
try:
|
||||
trackable_objects = await client.trackable_objects()
|
||||
trackables = await asyncio.gather(
|
||||
*(_generate_trackables(client, item) for item in trackable_objects)
|
||||
)
|
||||
for obj in await client.trackable_objects():
|
||||
# To avoid hitting Tractive API rate limits, we add a small
|
||||
# delay between requests to fetch trackable details.
|
||||
await asyncio.sleep(2)
|
||||
trackables.append(await _generate_trackables(client, obj))
|
||||
except aiotractive.exceptions.TractiveError as error:
|
||||
await client.close()
|
||||
raise ConfigEntryNotReady from error
|
||||
except ConfigEntryNotReady:
|
||||
await client.close()
|
||||
raise
|
||||
|
||||
# When the pet defined in Tractive has no tracker linked we get None as `trackable`.
|
||||
# So we have to remove None values from trackables list.
|
||||
@@ -164,12 +170,11 @@ async def _generate_trackables(
|
||||
tracker = client.tracker(trackable_data["device_id"])
|
||||
trackable_pet = client.trackable_object(trackable_data["_id"])
|
||||
|
||||
tracker_details, hw_info, pos_report, health_overview = await asyncio.gather(
|
||||
tracker.details(),
|
||||
tracker.hw_info(),
|
||||
tracker.pos_report(),
|
||||
trackable_pet.health_overview(),
|
||||
)
|
||||
# Sequential fetching to prevent HTTP 429 Rate Limits
|
||||
tracker_details = await tracker.details()
|
||||
hw_info = await tracker.hw_info()
|
||||
pos_report = await tracker.pos_report()
|
||||
health_overview = await trackable_pet.health_overview()
|
||||
|
||||
if not tracker_details.get("_id"):
|
||||
raise ConfigEntryNotReady(
|
||||
|
||||
@@ -89,6 +89,10 @@ def mock_tractive_client() -> Generator[AsyncMock]:
|
||||
patch(
|
||||
"homeassistant.components.tractive.aiotractive.Tractive", autospec=True
|
||||
) as mock_client,
|
||||
patch(
|
||||
"homeassistant.components.tractive.asyncio.sleep",
|
||||
new_callable=AsyncMock,
|
||||
),
|
||||
):
|
||||
client = mock_client.return_value
|
||||
client.authenticate.return_value = {"user_id": "12345"}
|
||||
|
||||
Reference in New Issue
Block a user