mirror of
https://github.com/home-assistant/core.git
synced 2025-07-16 17:57:11 +00:00
Do not allow to enable BT scanner for Shelly Gen4 device with Zigbee enabled (#143824)
* Bluetooth is not supported when Zigbee is enabled * Update tests * Format
This commit is contained in:
parent
b2fcab20a6
commit
ae3925118c
@ -293,6 +293,7 @@ async def _async_setup_rpc_entry(hass: HomeAssistant, entry: ShellyConfigEntry)
|
||||
translation_key="firmware_unsupported",
|
||||
translation_placeholders={"device": entry.title},
|
||||
)
|
||||
runtime_data.rpc_zigbee_enabled = device.zigbee_enabled
|
||||
runtime_data.rpc_supports_scripts = await device.supports_scripts()
|
||||
if runtime_data.rpc_supports_scripts:
|
||||
runtime_data.rpc_script_events = await get_rpc_scripts_event_types(
|
||||
|
@ -475,6 +475,8 @@ class OptionsFlowHandler(OptionsFlow):
|
||||
return self.async_abort(reason="cannot_connect")
|
||||
if not supports_scripts:
|
||||
return self.async_abort(reason="no_scripts_support")
|
||||
if self.config_entry.runtime_data.rpc_zigbee_enabled:
|
||||
return self.async_abort(reason="zigbee_enabled")
|
||||
|
||||
if user_input is not None:
|
||||
return self.async_create_entry(title="", data=user_input)
|
||||
|
@ -90,6 +90,7 @@ class ShellyEntryData:
|
||||
rpc_poll: ShellyRpcPollingCoordinator | None = None
|
||||
rpc_script_events: dict[int, list[str]] | None = None
|
||||
rpc_supports_scripts: bool | None = None
|
||||
rpc_zigbee_enabled: bool | None = None
|
||||
|
||||
|
||||
type ShellyConfigEntry = ConfigEntry[ShellyEntryData]
|
||||
@ -717,7 +718,10 @@ class ShellyRpcCoordinator(ShellyCoordinatorBase[RpcDevice]):
|
||||
is updated.
|
||||
"""
|
||||
if not self.sleep_period:
|
||||
if self.config_entry.runtime_data.rpc_supports_scripts:
|
||||
if (
|
||||
self.config_entry.runtime_data.rpc_supports_scripts
|
||||
and not self.config_entry.runtime_data.rpc_zigbee_enabled
|
||||
):
|
||||
await self._async_connect_ble_scanner()
|
||||
else:
|
||||
await self._async_setup_outbound_websocket()
|
||||
|
@ -104,7 +104,8 @@
|
||||
},
|
||||
"abort": {
|
||||
"cannot_connect": "[%key:common::config_flow::error::cannot_connect%]",
|
||||
"no_scripts_support": "Device does not support scripts and cannot be used as a Bluetooth scanner."
|
||||
"no_scripts_support": "Device does not support scripts and cannot be used as a Bluetooth scanner.",
|
||||
"zigbee_enabled": "Device with Zigbee enabled cannot be used as a Bluetooth scanner. Please disable it to use the device as a Bluetooth scanner."
|
||||
}
|
||||
},
|
||||
"selector": {
|
||||
|
@ -498,6 +498,7 @@ def _mock_rpc_device(version: str | None = None):
|
||||
}
|
||||
),
|
||||
xmod_info={},
|
||||
zigbee_enabled=False,
|
||||
)
|
||||
type(device).name = PropertyMock(return_value="Test name")
|
||||
return device
|
||||
|
@ -870,6 +870,19 @@ async def test_options_flow_abort_no_scripts_support(
|
||||
assert result["reason"] == "no_scripts_support"
|
||||
|
||||
|
||||
async def test_options_flow_abort_zigbee_enabled(
|
||||
hass: HomeAssistant, mock_rpc_device: Mock, monkeypatch: pytest.MonkeyPatch
|
||||
) -> None:
|
||||
"""Test ble options abort if Zigbee is enabled for the device."""
|
||||
monkeypatch.setattr(mock_rpc_device, "zigbee_enabled", True)
|
||||
entry = await init_integration(hass, 4)
|
||||
|
||||
result = await hass.config_entries.options.async_init(entry.entry_id)
|
||||
|
||||
assert result["type"] is FlowResultType.ABORT
|
||||
assert result["reason"] == "zigbee_enabled"
|
||||
|
||||
|
||||
async def test_zeroconf_already_configured(hass: HomeAssistant) -> None:
|
||||
"""Test we get the form."""
|
||||
|
||||
|
@ -853,17 +853,28 @@ async def test_rpc_update_entry_fw_ver(
|
||||
assert device.sw_version == "99.0.0"
|
||||
|
||||
|
||||
@pytest.mark.parametrize(("supports_scripts"), [True, False])
|
||||
@pytest.mark.parametrize(
|
||||
("supports_scripts", "zigbee_enabled", "result"),
|
||||
[
|
||||
(True, False, True),
|
||||
(True, True, False),
|
||||
(False, True, False),
|
||||
(False, False, False),
|
||||
],
|
||||
)
|
||||
async def test_rpc_runs_connected_events_when_initialized(
|
||||
hass: HomeAssistant,
|
||||
mock_rpc_device: Mock,
|
||||
monkeypatch: pytest.MonkeyPatch,
|
||||
supports_scripts: bool,
|
||||
zigbee_enabled: bool,
|
||||
result: bool,
|
||||
) -> None:
|
||||
"""Test RPC runs connected events when initialized."""
|
||||
monkeypatch.setattr(
|
||||
mock_rpc_device, "supports_scripts", AsyncMock(return_value=supports_scripts)
|
||||
)
|
||||
monkeypatch.setattr(mock_rpc_device, "zigbee_enabled", zigbee_enabled)
|
||||
monkeypatch.setattr(mock_rpc_device, "initialized", False)
|
||||
await init_integration(hass, 2)
|
||||
|
||||
@ -876,7 +887,8 @@ async def test_rpc_runs_connected_events_when_initialized(
|
||||
|
||||
assert call.supports_scripts() in mock_rpc_device.mock_calls
|
||||
# BLE script list is called during connected events if device supports scripts
|
||||
assert bool(call.script_list() in mock_rpc_device.mock_calls) == supports_scripts
|
||||
# and Zigbee is disabled
|
||||
assert bool(call.script_list() in mock_rpc_device.mock_calls) == result
|
||||
|
||||
|
||||
async def test_rpc_sleeping_device_unload_ignore_ble_scanner(
|
||||
|
Loading…
x
Reference in New Issue
Block a user