Skip to content

Commit 33ed33d

Browse files
marcelveldtagners
andauthored
A few small fixes to the share (open commissioning window) feature (#589)
Co-authored-by: Stefan Agner <stefan@agner.ch>
1 parent 8b7bb36 commit 33ed33d

File tree

1 file changed

+19
-2
lines changed

1 file changed

+19
-2
lines changed

matter_server/server/device_controller.py

+19-2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from datetime import datetime
1010
from functools import partial
1111
import logging
12+
from random import randint
1213
import time
1314
from typing import TYPE_CHECKING, Any, Callable, Iterable, TypeVar, cast
1415

@@ -98,6 +99,7 @@ def __init__(
9899
self._nodes: dict[int, MatterNodeData] = {}
99100
self._last_known_ip_addresses: dict[int, list[str]] = {}
100101
self._last_subscription_attempt: dict[int, int] = {}
102+
self._known_commissioning_params: dict[int, CommissioningParameters] = {}
101103
self.wifi_credentials_set: bool = False
102104
self.thread_credentials_set: bool = False
103105
self.compressed_fabric_id: int | None = None
@@ -403,8 +405,16 @@ async def open_commissioning_window(
403405
if self.chip_controller is None:
404406
raise RuntimeError("Device Controller not initialized.")
405407

408+
if (node := self._nodes.get(node_id)) is None or not node.available:
409+
raise NodeNotReady(f"Node {node_id} is not (yet) available.")
410+
411+
if node_id in self._known_commissioning_params:
412+
# node has already been put into commissioning mode,
413+
# return previous parameters
414+
return self._known_commissioning_params[node_id]
415+
406416
if discriminator is None:
407-
discriminator = 3840 # TODO generate random one
417+
discriminator = randint(0, 4095) # noqa: S311
408418

409419
sdk_result = await self._call_sdk(
410420
self.chip_controller.OpenCommissioningWindow,
@@ -414,11 +424,18 @@ async def open_commissioning_window(
414424
discriminator=discriminator,
415425
option=option,
416426
)
417-
return CommissioningParameters(
427+
self._known_commissioning_params[node_id] = params = CommissioningParameters(
418428
setup_pin_code=sdk_result.setupPinCode,
419429
setup_manual_code=sdk_result.setupManualCode,
420430
setup_qr_code=sdk_result.setupQRCode,
421431
)
432+
# we store the commission parameters and clear them after the timeout
433+
if TYPE_CHECKING:
434+
assert self.server.loop
435+
self.server.loop.call_later(
436+
timeout, self._known_commissioning_params.pop, node_id, None
437+
)
438+
return params
422439

423440
@api_command(APICommand.DISCOVER)
424441
async def discover_commissionable_nodes(

0 commit comments

Comments
 (0)