Reduce the amount of data fetched in individual Hydrawise API calls (#120328)
This commit is contained in:
parent
46dcf1dc44
commit
3b79ab6e18
4 changed files with 11 additions and 10 deletions
|
@ -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:
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue