mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 13:17:32 +00:00
Wemo Insight devices need polling when off (#55348)
This commit is contained in:
parent
d277e0fb03
commit
88a08fdf57
@ -3,7 +3,7 @@ import asyncio
|
|||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from pywemo import WeMoDevice
|
from pywemo import Insight, WeMoDevice
|
||||||
from pywemo.exceptions import ActionException
|
from pywemo.exceptions import ActionException
|
||||||
from pywemo.subscribe import EVENT_TYPE_LONG_PRESS
|
from pywemo.subscribe import EVENT_TYPE_LONG_PRESS
|
||||||
|
|
||||||
@ -81,11 +81,26 @@ class DeviceCoordinator(DataUpdateCoordinator):
|
|||||||
else:
|
else:
|
||||||
self.async_set_updated_data(None)
|
self.async_set_updated_data(None)
|
||||||
|
|
||||||
|
@property
|
||||||
|
def should_poll(self) -> bool:
|
||||||
|
"""Return True if polling is needed to update the state for the device.
|
||||||
|
|
||||||
|
The alternative, when this returns False, is to rely on the subscription
|
||||||
|
"push updates" to update the device state in Home Assistant.
|
||||||
|
"""
|
||||||
|
if isinstance(self.wemo, Insight) and self.wemo.get_state() == 0:
|
||||||
|
# The WeMo Insight device does not send subscription updates for the
|
||||||
|
# insight_params values when the device is off. Polling is required in
|
||||||
|
# this case so the Sensor entities are properly populated.
|
||||||
|
return True
|
||||||
|
|
||||||
|
registry = self.hass.data[DOMAIN]["registry"]
|
||||||
|
return not (registry.is_subscribed(self.wemo) and self.last_update_success)
|
||||||
|
|
||||||
async def _async_update_data(self) -> None:
|
async def _async_update_data(self) -> None:
|
||||||
"""Update WeMo state."""
|
"""Update WeMo state."""
|
||||||
# No need to poll if the device will push updates.
|
# No need to poll if the device will push updates.
|
||||||
registry = self.hass.data[DOMAIN]["registry"]
|
if not self.should_poll:
|
||||||
if registry.is_subscribed(self.wemo) and self.last_update_success:
|
|
||||||
return
|
return
|
||||||
|
|
||||||
# If an update is in progress, we don't do anything.
|
# If an update is in progress, we don't do anything.
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
"""Tests for wemo_device.py."""
|
"""Tests for wemo_device.py."""
|
||||||
import asyncio
|
import asyncio
|
||||||
from unittest.mock import patch
|
from datetime import timedelta
|
||||||
|
from unittest.mock import call, patch
|
||||||
|
|
||||||
import async_timeout
|
import async_timeout
|
||||||
import pytest
|
import pytest
|
||||||
@ -14,9 +15,12 @@ from homeassistant.core import callback
|
|||||||
from homeassistant.helpers import device_registry
|
from homeassistant.helpers import device_registry
|
||||||
from homeassistant.helpers.update_coordinator import UpdateFailed
|
from homeassistant.helpers.update_coordinator import UpdateFailed
|
||||||
from homeassistant.setup import async_setup_component
|
from homeassistant.setup import async_setup_component
|
||||||
|
from homeassistant.util.dt import utcnow
|
||||||
|
|
||||||
from .conftest import MOCK_HOST
|
from .conftest import MOCK_HOST
|
||||||
|
|
||||||
|
from tests.common import async_fire_time_changed
|
||||||
|
|
||||||
asyncio.set_event_loop_policy(runner.HassEventLoopPolicy(True))
|
asyncio.set_event_loop_policy(runner.HassEventLoopPolicy(True))
|
||||||
|
|
||||||
|
|
||||||
@ -148,3 +152,53 @@ async def test_async_update_data_subscribed(
|
|||||||
pywemo_device.get_state.reset_mock()
|
pywemo_device.get_state.reset_mock()
|
||||||
await device._async_update_data()
|
await device._async_update_data()
|
||||||
pywemo_device.get_state.assert_not_called()
|
pywemo_device.get_state.assert_not_called()
|
||||||
|
|
||||||
|
|
||||||
|
class TestInsight:
|
||||||
|
"""Tests specific to the WeMo Insight device."""
|
||||||
|
|
||||||
|
@pytest.fixture
|
||||||
|
def pywemo_model(self):
|
||||||
|
"""Pywemo Dimmer models use the light platform (WemoDimmer class)."""
|
||||||
|
return "Insight"
|
||||||
|
|
||||||
|
@pytest.fixture(name="pywemo_device")
|
||||||
|
def pywemo_device_fixture(self, pywemo_device):
|
||||||
|
"""Fixture for WeMoDevice instances."""
|
||||||
|
pywemo_device.insight_params = {
|
||||||
|
"currentpower": 1.0,
|
||||||
|
"todaymw": 200000000.0,
|
||||||
|
"state": 0,
|
||||||
|
"onfor": 0,
|
||||||
|
"ontoday": 0,
|
||||||
|
"ontotal": 0,
|
||||||
|
"powerthreshold": 0,
|
||||||
|
}
|
||||||
|
yield pywemo_device
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
"subscribed,state,expected_calls",
|
||||||
|
[
|
||||||
|
(False, 0, [call(), call(True), call(), call()]),
|
||||||
|
(False, 1, [call(), call(True), call(), call()]),
|
||||||
|
(True, 0, [call(), call(True), call(), call()]),
|
||||||
|
(True, 1, [call(), call(), call()]),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
async def test_should_poll(
|
||||||
|
self,
|
||||||
|
hass,
|
||||||
|
subscribed,
|
||||||
|
state,
|
||||||
|
expected_calls,
|
||||||
|
wemo_entity,
|
||||||
|
pywemo_device,
|
||||||
|
pywemo_registry,
|
||||||
|
):
|
||||||
|
"""Validate the should_poll returns the correct value."""
|
||||||
|
pywemo_registry.is_subscribed.return_value = subscribed
|
||||||
|
pywemo_device.get_state.reset_mock()
|
||||||
|
pywemo_device.get_state.return_value = state
|
||||||
|
async_fire_time_changed(hass, utcnow() + timedelta(seconds=31))
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
pywemo_device.get_state.assert_has_calls(expected_calls)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user