Update fitbit client to use asyncio (#100933)
This commit is contained in:
parent
bd40cbcb21
commit
822251a642
2 changed files with 36 additions and 16 deletions
|
@ -1,7 +1,7 @@
|
|||
"""API for fitbit bound to Home Assistant OAuth."""
|
||||
|
||||
import logging
|
||||
from typing import Any
|
||||
from typing import Any, cast
|
||||
|
||||
from fitbit import Fitbit
|
||||
|
||||
|
@ -34,10 +34,12 @@ class FitbitApi:
|
|||
"""Property to expose the underlying client library."""
|
||||
return self._client
|
||||
|
||||
def get_user_profile(self) -> FitbitProfile:
|
||||
async def async_get_user_profile(self) -> FitbitProfile:
|
||||
"""Return the user profile from the API."""
|
||||
if self._profile is None:
|
||||
response: dict[str, Any] = self._client.user_profile_get()
|
||||
response: dict[str, Any] = await self._hass.async_add_executor_job(
|
||||
self._client.user_profile_get
|
||||
)
|
||||
_LOGGER.debug("user_profile_get=%s", response)
|
||||
profile = response["user"]
|
||||
self._profile = FitbitProfile(
|
||||
|
@ -47,7 +49,7 @@ class FitbitApi:
|
|||
)
|
||||
return self._profile
|
||||
|
||||
def get_unit_system(self) -> FitbitUnitSystem:
|
||||
async def async_get_unit_system(self) -> FitbitUnitSystem:
|
||||
"""Get the unit system to use when fetching timeseries.
|
||||
|
||||
This is used in a couple ways. The first is to determine the request
|
||||
|
@ -62,16 +64,18 @@ class FitbitApi:
|
|||
return self._unit_system
|
||||
# Use units consistent with the account user profile or fallback to the
|
||||
# home assistant unit settings.
|
||||
profile = self.get_user_profile()
|
||||
profile = await self.async_get_user_profile()
|
||||
if profile.locale == FitbitUnitSystem.EN_GB:
|
||||
return FitbitUnitSystem.EN_GB
|
||||
if self._hass.config.units is METRIC_SYSTEM:
|
||||
return FitbitUnitSystem.METRIC
|
||||
return FitbitUnitSystem.EN_US
|
||||
|
||||
def get_devices(self) -> list[FitbitDevice]:
|
||||
async def async_get_devices(self) -> list[FitbitDevice]:
|
||||
"""Return available devices."""
|
||||
devices: list[dict[str, str]] = self._client.get_devices()
|
||||
devices: list[dict[str, str]] = await self._hass.async_add_executor_job(
|
||||
self._client.get_devices
|
||||
)
|
||||
_LOGGER.debug("get_devices=%s", devices)
|
||||
return [
|
||||
FitbitDevice(
|
||||
|
@ -84,13 +88,18 @@ class FitbitApi:
|
|||
for device in devices
|
||||
]
|
||||
|
||||
def get_latest_time_series(self, resource_type: str) -> dict[str, Any]:
|
||||
async def async_get_latest_time_series(self, resource_type: str) -> dict[str, Any]:
|
||||
"""Return the most recent value from the time series for the specified resource type."""
|
||||
|
||||
# Set request header based on the configured unit system
|
||||
self._client.system = self.get_unit_system()
|
||||
self._client.system = await self.async_get_unit_system()
|
||||
|
||||
response: dict[str, Any] = self._client.time_series(resource_type, period="7d")
|
||||
def _time_series() -> dict[str, Any]:
|
||||
return cast(
|
||||
dict[str, Any], self._client.time_series(resource_type, period="7d")
|
||||
)
|
||||
|
||||
response: dict[str, Any] = await self._hass.async_add_executor_job(_time_series)
|
||||
_LOGGER.debug("time_series(%s)=%s", resource_type, response)
|
||||
key = resource_type.replace("/", "-")
|
||||
dated_results: list[dict[str, Any]] = response[key]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue