Reduce the amount of data fetched in individual Hydrawise API calls (#120328)

This commit is contained in:
David Knowles 2024-06-24 14:58:54 -04:00 committed by GitHub
parent 46dcf1dc44
commit 3b79ab6e18
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 11 additions and 10 deletions

View file

@ -37,8 +37,8 @@ class HydrawiseConfigFlow(ConfigFlow, domain=DOMAIN):
# Verify that the provided credentials work.""" # Verify that the provided credentials work."""
api = client.Hydrawise(auth.Auth(username, password)) api = client.Hydrawise(auth.Auth(username, password))
try: try:
# Skip fetching zones to save on metered API calls. # Don't fetch zones because we don't need them yet.
user = await api.get_user() user = await api.get_user(fetch_zones=False)
except NotAuthorizedError: except NotAuthorizedError:
return on_failure("invalid_auth") return on_failure("invalid_auth")
except TimeoutError: except TimeoutError:

View file

@ -40,13 +40,17 @@ class HydrawiseDataUpdateCoordinator(DataUpdateCoordinator[HydrawiseData]):
async def _async_update_data(self) -> HydrawiseData: async def _async_update_data(self) -> HydrawiseData:
"""Fetch the latest data from Hydrawise.""" """Fetch the latest data from Hydrawise."""
user = await self.api.get_user() # Don't fetch zones. We'll fetch them for each controller later.
# This is to prevent 502 errors in some cases.
# See: https://github.com/home-assistant/core/issues/120128
user = await self.api.get_user(fetch_zones=False)
controllers = {} controllers = {}
zones = {} zones = {}
sensors = {} sensors = {}
daily_water_use: dict[int, ControllerWaterUseSummary] = {} daily_water_use: dict[int, ControllerWaterUseSummary] = {}
for controller in user.controllers: for controller in user.controllers:
controllers[controller.id] = controller controllers[controller.id] = controller
controller.zones = await self.api.get_zones(controller)
for zone in controller.zones: for zone in controller.zones:
zones[zone.id] = zone zones[zone.id] = zone
for sensor in controller.sensors: for sensor in controller.sensors:

View file

@ -1,6 +1,6 @@
"""Common fixtures for the Hydrawise tests.""" """Common fixtures for the Hydrawise tests."""
from collections.abc import Awaitable, Callable from collections.abc import Awaitable, Callable, Generator
from datetime import datetime, timedelta from datetime import datetime, timedelta
from unittest.mock import AsyncMock, patch from unittest.mock import AsyncMock, patch
@ -20,7 +20,6 @@ from pydrawise.schema import (
Zone, Zone,
) )
import pytest import pytest
from typing_extensions import Generator
from homeassistant.components.hydrawise.const import DOMAIN from homeassistant.components.hydrawise.const import DOMAIN
from homeassistant.const import CONF_API_KEY, CONF_PASSWORD, CONF_USERNAME from homeassistant.const import CONF_API_KEY, CONF_PASSWORD, CONF_USERNAME
@ -67,9 +66,9 @@ def mock_pydrawise(
"""Mock Hydrawise.""" """Mock Hydrawise."""
with patch("pydrawise.client.Hydrawise", autospec=True) as mock_pydrawise: with patch("pydrawise.client.Hydrawise", autospec=True) as mock_pydrawise:
user.controllers = [controller] user.controllers = [controller]
controller.zones = zones
controller.sensors = sensors controller.sensors = sensors
mock_pydrawise.return_value.get_user.return_value = user mock_pydrawise.return_value.get_user.return_value = user
mock_pydrawise.return_value.get_zones.return_value = zones
mock_pydrawise.return_value.get_water_use_summary.return_value = ( mock_pydrawise.return_value.get_water_use_summary.return_value = (
controller_water_use_summary controller_water_use_summary
) )
@ -142,7 +141,7 @@ def sensors() -> list[Sensor]:
), ),
status=SensorStatus( status=SensorStatus(
water_flow=LocalizedValueType(value=577.0044752010709, unit="gal"), water_flow=LocalizedValueType(value=577.0044752010709, unit="gal"),
active=None, active=False,
), ),
), ),
] ]
@ -154,7 +153,6 @@ def zones() -> list[Zone]:
return [ return [
Zone( Zone(
name="Zone One", name="Zone One",
number=1,
id=5965394, id=5965394,
scheduled_runs=ScheduledZoneRuns( scheduled_runs=ScheduledZoneRuns(
summary="", summary="",
@ -171,7 +169,6 @@ def zones() -> list[Zone]:
), ),
Zone( Zone(
name="Zone Two", name="Zone Two",
number=2,
id=5965395, id=5965395,
scheduled_runs=ScheduledZoneRuns( scheduled_runs=ScheduledZoneRuns(
current_run=ScheduledZoneRun( current_run=ScheduledZoneRun(

View file

@ -46,7 +46,7 @@ async def test_form(
CONF_PASSWORD: "__password__", CONF_PASSWORD: "__password__",
} }
assert len(mock_setup_entry.mock_calls) == 1 assert len(mock_setup_entry.mock_calls) == 1
mock_pydrawise.get_user.assert_called_once_with() mock_pydrawise.get_user.assert_called_once_with(fetch_zones=False)
async def test_form_api_error( async def test_form_api_error(