Slow down Tractive API polling to avoid 429 too many requests (#169057)

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
Maciej Bieniek
2026-04-24 19:51:07 +02:00
committed by GitHub
co-authored by Copilot
parent 8b2afb4e66
commit 9369a5dc93
2 changed files with 19 additions and 10 deletions
+15 -10
View File
@@ -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(
+4
View File
@@ -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"}