mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 13:17:32 +00:00
Fix discovery schema for Matter switches (#103762)
* Fix discovery schema for matter switches * fix typo in function that generates device name * add test for switchunit
This commit is contained in:
parent
95e322c52e
commit
b604c1c222
@ -145,9 +145,7 @@ class MatterAdapter:
|
|||||||
get_clean_name(basic_info.nodeLabel)
|
get_clean_name(basic_info.nodeLabel)
|
||||||
or get_clean_name(basic_info.productLabel)
|
or get_clean_name(basic_info.productLabel)
|
||||||
or get_clean_name(basic_info.productName)
|
or get_clean_name(basic_info.productName)
|
||||||
or device_type.__name__
|
or (device_type.__name__ if device_type else None)
|
||||||
if device_type
|
|
||||||
else None
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# handle bridged devices
|
# handle bridged devices
|
||||||
|
@ -67,7 +67,15 @@ DISCOVERY_SCHEMAS = [
|
|||||||
),
|
),
|
||||||
entity_class=MatterSwitch,
|
entity_class=MatterSwitch,
|
||||||
required_attributes=(clusters.OnOff.Attributes.OnOff,),
|
required_attributes=(clusters.OnOff.Attributes.OnOff,),
|
||||||
# restrict device type to prevent discovery by the wrong platform
|
device_type=(device_types.OnOffPlugInUnit,),
|
||||||
|
),
|
||||||
|
MatterDiscoverySchema(
|
||||||
|
platform=Platform.SWITCH,
|
||||||
|
entity_description=SwitchEntityDescription(
|
||||||
|
key="MatterSwitch", device_class=SwitchDeviceClass.SWITCH, name=None
|
||||||
|
),
|
||||||
|
entity_class=MatterSwitch,
|
||||||
|
required_attributes=(clusters.OnOff.Attributes.OnOff,),
|
||||||
not_device_type=(
|
not_device_type=(
|
||||||
device_types.ColorTemperatureLight,
|
device_types.ColorTemperatureLight,
|
||||||
device_types.DimmableLight,
|
device_types.DimmableLight,
|
||||||
@ -76,7 +84,6 @@ DISCOVERY_SCHEMAS = [
|
|||||||
device_types.DoorLock,
|
device_types.DoorLock,
|
||||||
device_types.ColorDimmerSwitch,
|
device_types.ColorDimmerSwitch,
|
||||||
device_types.DimmerSwitch,
|
device_types.DimmerSwitch,
|
||||||
device_types.OnOffLightSwitch,
|
|
||||||
device_types.Thermostat,
|
device_types.Thermostat,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
119
tests/components/matter/fixtures/nodes/switch-unit.json
Normal file
119
tests/components/matter/fixtures/nodes/switch-unit.json
Normal file
@ -0,0 +1,119 @@
|
|||||||
|
{
|
||||||
|
"node_id": 1,
|
||||||
|
"date_commissioned": "2022-11-29T21:23:48.485051",
|
||||||
|
"last_interview": "2022-11-29T21:23:48.485057",
|
||||||
|
"interview_version": 2,
|
||||||
|
"attributes": {
|
||||||
|
"0/29/0": [
|
||||||
|
{
|
||||||
|
"deviceType": 99999,
|
||||||
|
"revision": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"0/29/1": [
|
||||||
|
4, 29, 31, 40, 42, 43, 44, 48, 49, 50, 51, 52, 53, 54, 55, 59, 60, 62, 63,
|
||||||
|
64, 65
|
||||||
|
],
|
||||||
|
"0/29/2": [41],
|
||||||
|
"0/29/3": [1],
|
||||||
|
"0/29/65532": 0,
|
||||||
|
"0/29/65533": 1,
|
||||||
|
"0/29/65528": [],
|
||||||
|
"0/29/65529": [],
|
||||||
|
"0/29/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533],
|
||||||
|
"0/40/0": 1,
|
||||||
|
"0/40/1": "Nabu Casa",
|
||||||
|
"0/40/2": 65521,
|
||||||
|
"0/40/3": "Mock SwitchUnit",
|
||||||
|
"0/40/4": 32768,
|
||||||
|
"0/40/5": "Mock SwitchUnit",
|
||||||
|
"0/40/6": "XX",
|
||||||
|
"0/40/7": 0,
|
||||||
|
"0/40/8": "v1.0",
|
||||||
|
"0/40/9": 1,
|
||||||
|
"0/40/10": "v1.0",
|
||||||
|
"0/40/11": "20221206",
|
||||||
|
"0/40/12": "",
|
||||||
|
"0/40/13": "",
|
||||||
|
"0/40/14": "",
|
||||||
|
"0/40/15": "TEST_SN",
|
||||||
|
"0/40/16": false,
|
||||||
|
"0/40/17": true,
|
||||||
|
"0/40/18": "mock-switch-unit",
|
||||||
|
"0/40/19": {
|
||||||
|
"caseSessionsPerFabric": 3,
|
||||||
|
"subscriptionsPerFabric": 3
|
||||||
|
},
|
||||||
|
"0/40/65532": 0,
|
||||||
|
"0/40/65533": 1,
|
||||||
|
"0/40/65528": [],
|
||||||
|
"0/40/65529": [],
|
||||||
|
"0/40/65531": [
|
||||||
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||||
|
65528, 65529, 65531, 65532, 65533
|
||||||
|
],
|
||||||
|
"1/3/0": 0,
|
||||||
|
"1/3/1": 2,
|
||||||
|
"1/3/65532": 0,
|
||||||
|
"1/3/65533": 4,
|
||||||
|
"1/3/65528": [],
|
||||||
|
"1/3/65529": [0, 64],
|
||||||
|
"1/3/65531": [0, 1, 65528, 65529, 65531, 65532, 65533],
|
||||||
|
"1/4/0": 128,
|
||||||
|
"1/4/65532": 1,
|
||||||
|
"1/4/65533": 4,
|
||||||
|
"1/4/65528": [0, 1, 2, 3],
|
||||||
|
"1/4/65529": [0, 1, 2, 3, 4, 5],
|
||||||
|
"1/4/65531": [0, 65528, 65529, 65531, 65532, 65533],
|
||||||
|
"1/5/0": 0,
|
||||||
|
"1/5/1": 0,
|
||||||
|
"1/5/2": 0,
|
||||||
|
"1/5/3": false,
|
||||||
|
"1/5/4": 0,
|
||||||
|
"1/5/65532": 0,
|
||||||
|
"1/5/65533": 4,
|
||||||
|
"1/5/65528": [0, 1, 2, 3, 4, 6],
|
||||||
|
"1/5/65529": [0, 1, 2, 3, 4, 5, 6],
|
||||||
|
"1/5/65531": [0, 1, 2, 3, 4, 65528, 65529, 65531, 65532, 65533],
|
||||||
|
"1/6/0": false,
|
||||||
|
"1/6/16384": true,
|
||||||
|
"1/6/16385": 0,
|
||||||
|
"1/6/16386": 0,
|
||||||
|
"1/6/16387": null,
|
||||||
|
"1/6/65532": 1,
|
||||||
|
"1/6/65533": 4,
|
||||||
|
"1/6/65528": [],
|
||||||
|
"1/6/65529": [0, 1, 2, 64, 65, 66],
|
||||||
|
"1/6/65531": [
|
||||||
|
0, 16384, 16385, 16386, 16387, 65528, 65529, 65531, 65532, 65533
|
||||||
|
],
|
||||||
|
"1/7/0": 0,
|
||||||
|
"1/7/16": 0,
|
||||||
|
"1/7/65532": 0,
|
||||||
|
"1/7/65533": 1,
|
||||||
|
"1/7/65528": [],
|
||||||
|
"1/7/65529": [],
|
||||||
|
"1/7/65531": [0, 16, 65528, 65529, 65531, 65532, 65533],
|
||||||
|
"1/29/0": [
|
||||||
|
{
|
||||||
|
"deviceType": 9999999,
|
||||||
|
"revision": 1
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"1/29/1": [
|
||||||
|
3, 4, 5, 6, 7, 8, 15, 29, 30, 37, 47, 59, 64, 65, 69, 80, 257, 258, 259,
|
||||||
|
512, 513, 514, 516, 768, 1024, 1026, 1027, 1028, 1029, 1030, 1283, 1284,
|
||||||
|
1285, 1286, 1287, 1288, 1289, 1290, 1291, 1292, 1293, 1294, 2820,
|
||||||
|
4294048773
|
||||||
|
],
|
||||||
|
"1/29/2": [],
|
||||||
|
"1/29/3": [],
|
||||||
|
"1/29/65532": 0,
|
||||||
|
"1/29/65533": 1,
|
||||||
|
"1/29/65528": [],
|
||||||
|
"1/29/65529": [],
|
||||||
|
"1/29/65531": [0, 1, 2, 3, 65528, 65529, 65531, 65532, 65533]
|
||||||
|
},
|
||||||
|
"available": true,
|
||||||
|
"attribute_subscriptions": []
|
||||||
|
}
|
@ -14,22 +14,30 @@ from .common import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture(name="switch_node")
|
@pytest.fixture(name="powerplug_node")
|
||||||
async def switch_node_fixture(
|
async def powerplug_node_fixture(
|
||||||
hass: HomeAssistant, matter_client: MagicMock
|
hass: HomeAssistant, matter_client: MagicMock
|
||||||
) -> MatterNode:
|
) -> MatterNode:
|
||||||
"""Fixture for a switch node."""
|
"""Fixture for a Powerplug node."""
|
||||||
return await setup_integration_with_node_fixture(
|
return await setup_integration_with_node_fixture(
|
||||||
hass, "on-off-plugin-unit", matter_client
|
hass, "on-off-plugin-unit", matter_client
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.fixture(name="switch_unit")
|
||||||
|
async def switch_unit_fixture(
|
||||||
|
hass: HomeAssistant, matter_client: MagicMock
|
||||||
|
) -> MatterNode:
|
||||||
|
"""Fixture for a Switch Unit node."""
|
||||||
|
return await setup_integration_with_node_fixture(hass, "switch-unit", matter_client)
|
||||||
|
|
||||||
|
|
||||||
# This tests needs to be adjusted to remove lingering tasks
|
# This tests needs to be adjusted to remove lingering tasks
|
||||||
@pytest.mark.parametrize("expected_lingering_tasks", [True])
|
@pytest.mark.parametrize("expected_lingering_tasks", [True])
|
||||||
async def test_turn_on(
|
async def test_turn_on(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
matter_client: MagicMock,
|
matter_client: MagicMock,
|
||||||
switch_node: MatterNode,
|
powerplug_node: MatterNode,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test turning on a switch."""
|
"""Test turning on a switch."""
|
||||||
state = hass.states.get("switch.mock_onoffpluginunit_powerplug_switch")
|
state = hass.states.get("switch.mock_onoffpluginunit_powerplug_switch")
|
||||||
@ -47,12 +55,12 @@ async def test_turn_on(
|
|||||||
|
|
||||||
assert matter_client.send_device_command.call_count == 1
|
assert matter_client.send_device_command.call_count == 1
|
||||||
assert matter_client.send_device_command.call_args == call(
|
assert matter_client.send_device_command.call_args == call(
|
||||||
node_id=switch_node.node_id,
|
node_id=powerplug_node.node_id,
|
||||||
endpoint_id=1,
|
endpoint_id=1,
|
||||||
command=clusters.OnOff.Commands.On(),
|
command=clusters.OnOff.Commands.On(),
|
||||||
)
|
)
|
||||||
|
|
||||||
set_node_attribute(switch_node, 1, 6, 0, True)
|
set_node_attribute(powerplug_node, 1, 6, 0, True)
|
||||||
await trigger_subscription_callback(hass, matter_client)
|
await trigger_subscription_callback(hass, matter_client)
|
||||||
|
|
||||||
state = hass.states.get("switch.mock_onoffpluginunit_powerplug_switch")
|
state = hass.states.get("switch.mock_onoffpluginunit_powerplug_switch")
|
||||||
@ -65,7 +73,7 @@ async def test_turn_on(
|
|||||||
async def test_turn_off(
|
async def test_turn_off(
|
||||||
hass: HomeAssistant,
|
hass: HomeAssistant,
|
||||||
matter_client: MagicMock,
|
matter_client: MagicMock,
|
||||||
switch_node: MatterNode,
|
powerplug_node: MatterNode,
|
||||||
) -> None:
|
) -> None:
|
||||||
"""Test turning off a switch."""
|
"""Test turning off a switch."""
|
||||||
state = hass.states.get("switch.mock_onoffpluginunit_powerplug_switch")
|
state = hass.states.get("switch.mock_onoffpluginunit_powerplug_switch")
|
||||||
@ -83,7 +91,24 @@ async def test_turn_off(
|
|||||||
|
|
||||||
assert matter_client.send_device_command.call_count == 1
|
assert matter_client.send_device_command.call_count == 1
|
||||||
assert matter_client.send_device_command.call_args == call(
|
assert matter_client.send_device_command.call_args == call(
|
||||||
node_id=switch_node.node_id,
|
node_id=powerplug_node.node_id,
|
||||||
endpoint_id=1,
|
endpoint_id=1,
|
||||||
command=clusters.OnOff.Commands.Off(),
|
command=clusters.OnOff.Commands.Off(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# This tests needs to be adjusted to remove lingering tasks
|
||||||
|
@pytest.mark.parametrize("expected_lingering_tasks", [True])
|
||||||
|
async def test_switch_unit(
|
||||||
|
hass: HomeAssistant,
|
||||||
|
matter_client: MagicMock,
|
||||||
|
switch_unit: MatterNode,
|
||||||
|
) -> None:
|
||||||
|
"""Test if a switch entity is discovered from any (non-light) OnOf cluster device."""
|
||||||
|
# A switch entity should be discovered as fallback for ANY Matter device (endpoint)
|
||||||
|
# that has the OnOff cluster and does not fall into an explicit discovery schema
|
||||||
|
# by another platform (e.g. light, lock etc.).
|
||||||
|
state = hass.states.get("switch.mock_switchunit")
|
||||||
|
assert state
|
||||||
|
assert state.state == "off"
|
||||||
|
assert state.attributes["friendly_name"] == "Mock SwitchUnit"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user