diff --git a/matter_server/client/client.py b/matter_server/client/client.py index b99bdbe7..3734c812 100644 --- a/matter_server/client/client.py +++ b/matter_server/client/client.py @@ -120,7 +120,9 @@ async def commission_with_code(self, code: str) -> MatterNodeData: data = await self.send_command(APICommand.COMMISSION_WITH_CODE, code=code) return dataclass_from_dict(MatterNodeData, data) - async def commission_on_network(self, setup_pin_code: int) -> MatterNodeData: + async def commission_on_network( + self, setup_pin_code: int, ip_addr: str | None = None + ) -> MatterNodeData: """ Do the routine for OnNetworkCommissioning. @@ -130,7 +132,9 @@ async def commission_on_network(self, setup_pin_code: int) -> MatterNodeData: Returns basic MatterNodeData once complete. """ data = await self.send_command( - APICommand.COMMISSION_ON_NETWORK, setup_pin_code=setup_pin_code + APICommand.COMMISSION_ON_NETWORK, + setup_pin_code=setup_pin_code, + ip_addr=ip_addr, ) return dataclass_from_dict(MatterNodeData, data) diff --git a/matter_server/server/device_controller.py b/matter_server/server/device_controller.py index fb3f939c..46515253 100644 --- a/matter_server/server/device_controller.py +++ b/matter_server/server/device_controller.py @@ -203,6 +203,7 @@ async def commission_on_network( setup_pin_code: int, filter_type: int = 0, filter: Any = None, # pylint: disable=redefined-builtin + ip_addr: str | None = None, ) -> MatterNodeData: """ Do the routine for OnNetworkCommissioning, with a filter for mDNS discovery. @@ -226,20 +227,36 @@ async def commission_on_network( node_id = self._get_next_node_id() - LOGGER.info( - "Starting Matter commissioning on network using Node ID %s.", node_id - ) - success = await self._call_sdk( - self.chip_controller.CommissionOnNetwork, - nodeId=node_id, - setupPinCode=setup_pin_code, - filterType=filter_type, - filter=filter, - ) - if not success: - raise NodeCommissionFailed( - f"Commission on network failed for node {node_id}" + if ip_addr is None: + LOGGER.info( + "Starting Matter commissioning on network using Node ID %s.", node_id + ) + success = await self._call_sdk( + self.chip_controller.CommissionOnNetwork, + nodeId=node_id, + setupPinCode=setup_pin_code, + filterType=filter_type, + filter=filter, ) + if not success: + raise NodeCommissionFailed( + f"Commission on network failed for node {node_id}" + ) + else: + LOGGER.info( + "Starting Matter commissioning with IP using Node ID %s.", node_id + ) + success = await self._call_sdk( + self.chip_controller.CommissionIP, + nodeid=node_id, + setupPinCode=setup_pin_code, + ipaddr=ip_addr, + ) + if not success: + raise NodeCommissionFailed( + f"Commission using IP failed for node {node_id}" + ) + LOGGER.info("Matter commissioning of Node ID %s successful.", node_id) # full interview of the device diff --git a/tests/server/test_server.py b/tests/server/test_server.py index f4f13bef..438de666 100644 --- a/tests/server/test_server.py +++ b/tests/server/test_server.py @@ -192,7 +192,20 @@ async def test_server_start( {"setup_pin_code": 1234}, strict=True, ) - ) == {"setup_pin_code": 1234, "filter_type": 0, "filter": None} + ) == {"setup_pin_code": 1234, "filter_type": 0, "filter": None, "ip_addr": None} + assert ( + parse_arguments( + server.command_handlers[APICommand.COMMISSION_ON_NETWORK].signature, + server.command_handlers[APICommand.COMMISSION_ON_NETWORK].type_hints, + {"setup_pin_code": 1234, "ip_addr": "fd82:c9e9:5cb7:1:2c5c:ed99:ecf:4460"}, + strict=True, + ) + ) == { + "setup_pin_code": 1234, + "filter_type": 0, + "filter": None, + "ip_addr": "fd82:c9e9:5cb7:1:2c5c:ed99:ecf:4460", + } assert ( parse_arguments( server.command_handlers[APICommand.SET_WIFI_CREDENTIALS].signature,