mirror of
https://github.com/home-assistant/core.git
synced 2025-07-14 08:47:10 +00:00
Only create an issue if push updates fail 5 times in a row for Shelly gen1 devices (#98747)
This commit is contained in:
parent
9123e13774
commit
f97f33fff7
@ -274,8 +274,23 @@ class ShellyBlockCoordinator(ShellyCoordinatorBase[BlockDevice]):
|
|||||||
except InvalidAuthError:
|
except InvalidAuthError:
|
||||||
self.entry.async_start_reauth(self.hass)
|
self.entry.async_start_reauth(self.hass)
|
||||||
else:
|
else:
|
||||||
|
device_update_info(self.hass, self.device, self.entry)
|
||||||
|
|
||||||
|
@callback
|
||||||
|
def _async_handle_update(
|
||||||
|
self, device_: BlockDevice, update_type: BlockUpdateType
|
||||||
|
) -> None:
|
||||||
|
"""Handle device update."""
|
||||||
|
if update_type == BlockUpdateType.COAP_PERIODIC:
|
||||||
|
self._push_update_failures = 0
|
||||||
|
ir.async_delete_issue(
|
||||||
|
self.hass,
|
||||||
|
DOMAIN,
|
||||||
|
PUSH_UPDATE_ISSUE_ID.format(unique=self.mac),
|
||||||
|
)
|
||||||
|
elif update_type == BlockUpdateType.COAP_REPLY:
|
||||||
self._push_update_failures += 1
|
self._push_update_failures += 1
|
||||||
if self._push_update_failures > MAX_PUSH_UPDATE_FAILURES:
|
if self._push_update_failures == MAX_PUSH_UPDATE_FAILURES:
|
||||||
LOGGER.debug(
|
LOGGER.debug(
|
||||||
"Creating issue %s", PUSH_UPDATE_ISSUE_ID.format(unique=self.mac)
|
"Creating issue %s", PUSH_UPDATE_ISSUE_ID.format(unique=self.mac)
|
||||||
)
|
)
|
||||||
@ -293,13 +308,9 @@ class ShellyBlockCoordinator(ShellyCoordinatorBase[BlockDevice]):
|
|||||||
"ip_address": self.device.ip_address,
|
"ip_address": self.device.ip_address,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
device_update_info(self.hass, self.device, self.entry)
|
LOGGER.debug(
|
||||||
|
"Push update failures for %s: %s", self.name, self._push_update_failures
|
||||||
@callback
|
)
|
||||||
def _async_handle_update(
|
|
||||||
self, device_: BlockDevice, update_type: BlockUpdateType
|
|
||||||
) -> None:
|
|
||||||
"""Handle device update."""
|
|
||||||
self.async_set_updated_data(None)
|
self.async_set_updated_data(None)
|
||||||
|
|
||||||
def async_setup(self) -> None:
|
def async_setup(self) -> None:
|
||||||
|
@ -251,6 +251,11 @@ async def mock_block_device():
|
|||||||
{}, BlockUpdateType.COAP_PERIODIC
|
{}, BlockUpdateType.COAP_PERIODIC
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def update_reply():
|
||||||
|
block_device_mock.return_value.subscribe_updates.call_args[0][0](
|
||||||
|
{}, BlockUpdateType.COAP_REPLY
|
||||||
|
)
|
||||||
|
|
||||||
device = Mock(
|
device = Mock(
|
||||||
spec=BlockDevice,
|
spec=BlockDevice,
|
||||||
blocks=MOCK_BLOCKS,
|
blocks=MOCK_BLOCKS,
|
||||||
@ -265,6 +270,9 @@ async def mock_block_device():
|
|||||||
type(device).name = PropertyMock(return_value="Test name")
|
type(device).name = PropertyMock(return_value="Test name")
|
||||||
block_device_mock.return_value = device
|
block_device_mock.return_value = device
|
||||||
block_device_mock.return_value.mock_update = Mock(side_effect=update)
|
block_device_mock.return_value.mock_update = Mock(side_effect=update)
|
||||||
|
block_device_mock.return_value.mock_update_reply = Mock(
|
||||||
|
side_effect=update_reply
|
||||||
|
)
|
||||||
|
|
||||||
yield block_device_mock.return_value
|
yield block_device_mock.return_value
|
||||||
|
|
||||||
|
@ -36,7 +36,6 @@ from . import (
|
|||||||
mock_rest_update,
|
mock_rest_update,
|
||||||
register_entity,
|
register_entity,
|
||||||
)
|
)
|
||||||
from .conftest import MOCK_BLOCKS
|
|
||||||
|
|
||||||
from tests.common import async_fire_time_changed
|
from tests.common import async_fire_time_changed
|
||||||
|
|
||||||
@ -259,24 +258,25 @@ async def test_block_device_push_updates_failure(
|
|||||||
"""Test block device with push updates failure."""
|
"""Test block device with push updates failure."""
|
||||||
issue_registry: ir.IssueRegistry = ir.async_get(hass)
|
issue_registry: ir.IssueRegistry = ir.async_get(hass)
|
||||||
|
|
||||||
monkeypatch.setattr(
|
|
||||||
mock_block_device,
|
|
||||||
"update",
|
|
||||||
AsyncMock(return_value=MOCK_BLOCKS),
|
|
||||||
)
|
|
||||||
await init_integration(hass, 1)
|
await init_integration(hass, 1)
|
||||||
|
|
||||||
# Move time to force polling
|
# Updates with COAP_REPLAY type should create an issue
|
||||||
for _ in range(MAX_PUSH_UPDATE_FAILURES + 1):
|
for _ in range(MAX_PUSH_UPDATE_FAILURES):
|
||||||
async_fire_time_changed(
|
mock_block_device.mock_update_reply()
|
||||||
hass, dt_util.utcnow() + timedelta(seconds=UPDATE_PERIOD_MULTIPLIER * 15)
|
|
||||||
)
|
|
||||||
await hass.async_block_till_done()
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
assert issue_registry.async_get_issue(
|
assert issue_registry.async_get_issue(
|
||||||
domain=DOMAIN, issue_id=f"push_update_{MOCK_MAC}"
|
domain=DOMAIN, issue_id=f"push_update_{MOCK_MAC}"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# An update with COAP_PERIODIC type should clear the issue
|
||||||
|
mock_block_device.mock_update()
|
||||||
|
await hass.async_block_till_done()
|
||||||
|
|
||||||
|
assert not issue_registry.async_get_issue(
|
||||||
|
domain=DOMAIN, issue_id=f"push_update_{MOCK_MAC}"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
async def test_block_button_click_event(
|
async def test_block_button_click_event(
|
||||||
hass: HomeAssistant, mock_block_device, events, monkeypatch
|
hass: HomeAssistant, mock_block_device, events, monkeypatch
|
||||||
|
Loading…
x
Reference in New Issue
Block a user