Prevent connecting to a Shelly device that is already connected (#122105)

This commit is contained in:
Shay Levy 2024-07-18 23:27:03 +03:00 committed by GitHub
parent cf0aef079b
commit d2cc25cee6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 31 additions and 0 deletions

View file

@ -669,6 +669,9 @@ class ShellyRpcCoordinator(ShellyCoordinatorBase[RpcDevice]):
"""Handle device update."""
LOGGER.debug("Shelly %s handle update, type: %s", self.name, update_type)
if update_type is RpcUpdateType.ONLINE:
if self.device.connected:
LOGGER.debug("Device %s already connected", self.name)
return
self.entry.async_create_background_task(
self.hass,
self._async_device_connect_task(),

View file

@ -353,6 +353,7 @@ def _mock_rpc_device(version: str | None = None):
status=MOCK_STATUS_RPC,
firmware_version="some fw string",
initialized=True,
connected=True,
)
type(device).name = PropertyMock(return_value="Test name")
return device

View file

@ -265,6 +265,7 @@ async def test_rpc_sleeping_binary_sensor(
) -> None:
"""Test RPC online sleeping binary sensor."""
entity_id = f"{BINARY_SENSOR_DOMAIN}.test_name_cloud"
monkeypatch.setattr(mock_rpc_device, "connected", False)
monkeypatch.setitem(mock_rpc_device.status["sys"], "wakeup_period", 1000)
config_entry = await init_integration(hass, 2, sleep_period=1000)

View file

@ -1114,6 +1114,7 @@ async def test_zeroconf_sleeping_device_not_triggers_refresh(
caplog: pytest.LogCaptureFixture,
) -> None:
"""Test zeroconf discovery does not triggers refresh for sleeping device."""
monkeypatch.setattr(mock_rpc_device, "connected", False)
monkeypatch.setitem(mock_rpc_device.status["sys"], "wakeup_period", 1000)
entry = MockConfigEntry(
domain="shelly",

View file

@ -545,6 +545,7 @@ async def test_rpc_update_entry_sleep_period(
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test RPC update entry sleep period."""
monkeypatch.setattr(mock_rpc_device, "connected", False)
monkeypatch.setitem(mock_rpc_device.status["sys"], "wakeup_period", 600)
entry = await init_integration(hass, 2, sleep_period=600)
register_entity(
@ -578,6 +579,7 @@ async def test_rpc_sleeping_device_no_periodic_updates(
) -> None:
"""Test RPC sleeping device no periodic updates."""
entity_id = f"{SENSOR_DOMAIN}.test_name_temperature"
monkeypatch.setattr(mock_rpc_device, "connected", False)
monkeypatch.setitem(mock_rpc_device.status["sys"], "wakeup_period", 1000)
entry = await init_integration(hass, 2, sleep_period=1000)
register_entity(
@ -609,6 +611,7 @@ async def test_rpc_sleeping_device_firmware_unsupported(
issue_registry: ir.IssueRegistry,
) -> None:
"""Test RPC sleeping device firmware not supported."""
monkeypatch.setattr(mock_rpc_device, "connected", False)
monkeypatch.setattr(mock_rpc_device, "firmware_supported", False)
entry = await init_integration(hass, 2, sleep_period=3600)
@ -912,6 +915,7 @@ async def test_rpc_sleeping_device_connection_error(
hass, BINARY_SENSOR_DOMAIN, "test_name_cloud", "cloud-cloud", entry
)
mock_restore_cache(hass, [State(entity_id, STATE_ON)])
monkeypatch.setattr(mock_rpc_device, "connected", False)
monkeypatch.setattr(mock_rpc_device, "initialized", False)
await hass.config_entries.async_setup(entry.entry_id)
await hass.async_block_till_done()
@ -939,3 +943,19 @@ async def test_rpc_sleeping_device_connection_error(
assert "Sleeping device did not update" in caplog.text
assert get_entity_state(hass, entity_id) == STATE_UNAVAILABLE
async def test_rpc_already_connected(
hass: HomeAssistant,
freezer: FrozenDateTimeFactory,
mock_rpc_device: Mock,
caplog: pytest.LogCaptureFixture,
) -> None:
"""Test RPC ignore connect event if already connected."""
await init_integration(hass, 2)
mock_rpc_device.mock_online()
await hass.async_block_till_done(wait_background_tasks=True)
assert "already connected" in caplog.text
mock_rpc_device.initialize.assert_called_once()

View file

@ -279,6 +279,7 @@ async def test_sleeping_rpc_device_online(
caplog: pytest.LogCaptureFixture,
) -> None:
"""Test sleeping RPC device online."""
monkeypatch.setattr(mock_rpc_device, "connected", False)
monkeypatch.setitem(mock_rpc_device.status["sys"], "wakeup_period", device_sleep)
entry = await init_integration(hass, 2, sleep_period=entry_sleep)
assert "will resume when device is online" in caplog.text
@ -297,6 +298,7 @@ async def test_sleeping_rpc_device_online_new_firmware(
caplog: pytest.LogCaptureFixture,
) -> None:
"""Test sleeping device Gen2 with firmware 1.0.0 or later."""
monkeypatch.setattr(mock_rpc_device, "connected", False)
entry = await init_integration(hass, 2, sleep_period=None)
assert "will resume when device is online" in caplog.text

View file

@ -450,6 +450,7 @@ async def test_rpc_sleeping_sensor(
) -> None:
"""Test RPC online sleeping sensor."""
entity_id = f"{SENSOR_DOMAIN}.test_name_temperature"
monkeypatch.setattr(mock_rpc_device, "connected", False)
monkeypatch.setitem(mock_rpc_device.status["sys"], "wakeup_period", 1000)
entry = await init_integration(hass, 2, sleep_period=1000)
@ -601,6 +602,7 @@ async def test_rpc_sleeping_update_entity_service(
await async_setup_component(hass, "homeassistant", {})
entity_id = f"{SENSOR_DOMAIN}.test_name_temperature"
monkeypatch.setattr(mock_rpc_device, "connected", False)
monkeypatch.setitem(mock_rpc_device.status["sys"], "wakeup_period", 1000)
await init_integration(hass, 2, sleep_period=1000)

View file

@ -334,6 +334,7 @@ async def test_rpc_sleeping_update(
monkeypatch: pytest.MonkeyPatch,
) -> None:
"""Test RPC sleeping device update entity."""
monkeypatch.setattr(mock_rpc_device, "connected", False)
monkeypatch.setitem(mock_rpc_device.status["sys"], "wakeup_period", 1000)
monkeypatch.setitem(mock_rpc_device.shelly, "ver", "1")
monkeypatch.setitem(