Skip to content

Commit

Permalink
Prevent connecting to a Shelly device that is already connected (#122105
Browse files Browse the repository at this point in the history
)
  • Loading branch information
thecode authored and frenck committed Jul 19, 2024
1 parent 977a55e commit a3a99cc
Show file tree
Hide file tree
Showing 8 changed files with 31 additions and 0 deletions.
3 changes: 3 additions & 0 deletions homeassistant/components/shelly/coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -668,6 +668,9 @@ def _async_handle_update(
"""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(),
Expand Down
1 change: 1 addition & 0 deletions tests/components/shelly/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,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
Expand Down
1 change: 1 addition & 0 deletions tests/components/shelly/test_binary_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,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)

Expand Down
1 change: 1 addition & 0 deletions tests/components/shelly/test_config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
20 changes: 20 additions & 0 deletions tests/components/shelly/test_coordinator.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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()
2 changes: 2 additions & 0 deletions tests/components/shelly/test_init.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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

Expand Down
2 changes: 2 additions & 0 deletions tests/components/shelly/test_sensor.py
Original file line number Diff line number Diff line change
Expand Up @@ -449,6 +449,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)

Expand Down Expand Up @@ -600,6 +601,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)

Expand Down
1 change: 1 addition & 0 deletions tests/components/shelly/test_update.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down

0 comments on commit a3a99cc

Please sign in to comment.