Fix withings wrong sleep state entry (#29651)

* Fixing issue where wrong sleep state entry was being used. closes #28370,#29397

* Fixing formatting.

* Sorting imports to get black checks to pass.

* Using lambda for getting latest sleep serie.
This commit is contained in:
Robert Van Gorkom 2019-12-10 12:54:50 -08:00 committed by Pascal Vizeli
parent 899f6cf1a3
commit 66d2f5f61d
5 changed files with 43 additions and 23 deletions

View File

@ -7,11 +7,11 @@ import voluptuous as vol
from withings_api import WithingsAuth from withings_api import WithingsAuth
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.helpers import config_entry_oauth2_flow, config_validation as cv
from homeassistant.helpers.typing import ConfigType, HomeAssistantType from homeassistant.helpers.typing import ConfigType, HomeAssistantType
from homeassistant.helpers import config_validation as cv, config_entry_oauth2_flow
from . import config_flow, const from . import config_flow, const
from .common import _LOGGER, get_data_manager, NotAuthenticatedError from .common import _LOGGER, NotAuthenticatedError, get_data_manager
DOMAIN = const.DOMAIN DOMAIN = const.DOMAIN

View File

@ -1,4 +1,5 @@
"""Common code for Withings.""" """Common code for Withings."""
from asyncio import run_coroutine_threadsafe
import datetime import datetime
from functools import partial from functools import partial
import logging import logging
@ -6,15 +7,14 @@ import re
import time import time
from typing import Any, Dict from typing import Any, Dict
from asyncio import run_coroutine_threadsafe
import requests import requests
from withings_api import ( from withings_api import (
AbstractWithingsApi, AbstractWithingsApi,
SleepGetResponse,
MeasureGetMeasResponse, MeasureGetMeasResponse,
SleepGetResponse,
SleepGetSummaryResponse, SleepGetSummaryResponse,
) )
from withings_api.common import UnauthorizedException, AuthFailedException from withings_api.common import AuthFailedException, UnauthorizedException
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant

View File

@ -2,21 +2,21 @@
from typing import Callable, List, Union from typing import Callable, List, Union
from withings_api.common import ( from withings_api.common import (
MeasureType,
GetSleepSummaryField, GetSleepSummaryField,
MeasureGetMeasResponse, MeasureGetMeasResponse,
MeasureGroupAttribs,
MeasureType,
SleepGetResponse, SleepGetResponse,
SleepGetSummaryResponse, SleepGetSummaryResponse,
get_measure_value,
MeasureGroupAttribs,
SleepState, SleepState,
get_measure_value,
) )
from homeassistant.config_entries import ConfigEntry from homeassistant.config_entries import ConfigEntry
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from homeassistant.helpers import config_entry_oauth2_flow
from homeassistant.helpers.entity import Entity from homeassistant.helpers.entity import Entity
from homeassistant.util import slugify from homeassistant.util import slugify
from homeassistant.helpers import config_entry_oauth2_flow
from . import const from . import const
from .common import _LOGGER, WithingsDataManager, get_data_manager from .common import _LOGGER, WithingsDataManager, get_data_manager
@ -382,7 +382,8 @@ class WithingsHealthSensor(Entity):
self._state = None self._state = None
return return
serie = data.series[len(data.series) - 1] sorted_series = sorted(data.series, key=lambda serie: serie.startdate)
serie = sorted_series[len(sorted_series) - 1]
state = None state = None
if serie.state == SleepState.AWAKE: if serie.state == SleepState.AWAKE:
state = const.STATE_AWAKE state = const.STATE_AWAKE

View File

@ -1,15 +1,14 @@
"""Tests for the Withings component.""" """Tests for the Withings component."""
from asynctest import MagicMock from asynctest import MagicMock
import pytest import pytest
from withings_api import WithingsApi from withings_api import WithingsApi
from withings_api.common import UnauthorizedException, TimeoutException from withings_api.common import TimeoutException, UnauthorizedException
from homeassistant.exceptions import PlatformNotReady
from homeassistant.components.withings.common import ( from homeassistant.components.withings.common import (
NotAuthenticatedError, NotAuthenticatedError,
WithingsDataManager, WithingsDataManager,
) )
from homeassistant.exceptions import PlatformNotReady
@pytest.fixture(name="withings_api") @pytest.fixture(name="withings_api")

View File

@ -10,26 +10,26 @@ from withings_api.common import SleepModel, SleepState
import homeassistant.components.http as http import homeassistant.components.http as http
from homeassistant.components.withings import ( from homeassistant.components.withings import (
CONFIG_SCHEMA,
async_setup, async_setup,
async_setup_entry, async_setup_entry,
const, const,
CONFIG_SCHEMA,
) )
from homeassistant.const import STATE_UNKNOWN from homeassistant.const import STATE_UNKNOWN
from homeassistant.core import HomeAssistant from homeassistant.core import HomeAssistant
from .common import ( from .common import (
assert_state_equals,
configure_integration,
setup_hass,
WITHINGS_GET_DEVICE_RESPONSE, WITHINGS_GET_DEVICE_RESPONSE,
WITHINGS_GET_DEVICE_RESPONSE_EMPTY, WITHINGS_GET_DEVICE_RESPONSE_EMPTY,
WITHINGS_MEASURES_RESPONSE,
WITHINGS_MEASURES_RESPONSE_EMPTY,
WITHINGS_SLEEP_RESPONSE, WITHINGS_SLEEP_RESPONSE,
WITHINGS_SLEEP_RESPONSE_EMPTY, WITHINGS_SLEEP_RESPONSE_EMPTY,
WITHINGS_SLEEP_SUMMARY_RESPONSE, WITHINGS_SLEEP_SUMMARY_RESPONSE,
WITHINGS_SLEEP_SUMMARY_RESPONSE_EMPTY, WITHINGS_SLEEP_SUMMARY_RESPONSE_EMPTY,
WITHINGS_MEASURES_RESPONSE, assert_state_equals,
WITHINGS_MEASURES_RESPONSE_EMPTY, configure_integration,
setup_hass,
) )
@ -308,8 +308,13 @@ async def test_full_setup(hass: HomeAssistant, aiohttp_client, aioclient_mock) -
{ {
"startdate": "2019-02-01 00:00:00", "startdate": "2019-02-01 00:00:00",
"enddate": "2019-02-01 01:00:00", "enddate": "2019-02-01 01:00:00",
"state": SleepState.REM.real,
},
{
"startdate": "2019-02-01 01:00:00",
"enddate": "2019-02-01 02:00:00",
"state": SleepState.AWAKE.real, "state": SleepState.AWAKE.real,
} },
], ],
}, },
}, },
@ -329,11 +334,16 @@ async def test_full_setup(hass: HomeAssistant, aiohttp_client, aioclient_mock) -
"body": { "body": {
"model": SleepModel.TRACKER.real, "model": SleepModel.TRACKER.real,
"series": [ "series": [
{
"startdate": "2019-02-01 01:00:00",
"enddate": "2019-02-01 02:00:00",
"state": SleepState.LIGHT.real,
},
{ {
"startdate": "2019-02-01 00:00:00", "startdate": "2019-02-01 00:00:00",
"enddate": "2019-02-01 01:00:00", "enddate": "2019-02-01 01:00:00",
"state": SleepState.LIGHT.real, "state": SleepState.REM.real,
} },
], ],
}, },
}, },
@ -356,8 +366,18 @@ async def test_full_setup(hass: HomeAssistant, aiohttp_client, aioclient_mock) -
{ {
"startdate": "2019-02-01 00:00:00", "startdate": "2019-02-01 00:00:00",
"enddate": "2019-02-01 01:00:00", "enddate": "2019-02-01 01:00:00",
"state": SleepState.LIGHT.real,
},
{
"startdate": "2019-02-01 02:00:00",
"enddate": "2019-02-01 03:00:00",
"state": SleepState.REM.real, "state": SleepState.REM.real,
} },
{
"startdate": "2019-02-01 01:00:00",
"enddate": "2019-02-01 02:00:00",
"state": SleepState.AWAKE.real,
},
], ],
}, },
}, },