From 4234e246283bc57b86753c23b7648082d5ad58b7 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 2 Feb 2023 09:45:57 -0500 Subject: [PATCH 01/25] Fix missing cases in some door lock switch statements. (#24797) Some credential types were missing from switch statements in door lock cluster server code, so we did not handle those credentials correctly. --- .../door-lock-server-callback.cpp | 36 +++++++++ .../door-lock-server/door-lock-server.cpp | 23 ++++++ .../door-lock-server/door-lock-server.h | 80 +++++++++++++++++++ 3 files changed, 139 insertions(+) diff --git a/src/app/clusters/door-lock-server/door-lock-server-callback.cpp b/src/app/clusters/door-lock-server/door-lock-server-callback.cpp index 0259f6100516b4..3a319ab5d494f2 100644 --- a/src/app/clusters/door-lock-server/door-lock-server-callback.cpp +++ b/src/app/clusters/door-lock-server/door-lock-server-callback.cpp @@ -195,3 +195,39 @@ emberAfPluginDoorLockSetSchedule(chip::EndpointId endpointId, uint8_t holidayInd void __attribute__((weak)) emberAfPluginDoorLockLockoutStarted(chip::EndpointId endpointId, chip::System::Clock::Timestamp lockoutEndTime) {} + +bool __attribute__((weak)) +emberAfPluginDoorLockGetNumberOfFingerprintCredentialsSupported(chip::EndpointId endpointId, uint16_t & maxNumberOfCredentials) +{ + return false; +} + +bool __attribute__((weak)) +emberAfPluginDoorLockGetNumberOfFingerVeinCredentialsSupported(chip::EndpointId endpointId, uint16_t & maxNumberOfCredentials) +{ + return false; +} + +bool __attribute__((weak)) +emberAfPluginDoorLockGetNumberOfFaceCredentialsSupported(chip::EndpointId endpointId, uint16_t & maxNumberOfCredentials) +{ + return false; +} + +bool __attribute__((weak)) +emberAfPluginDoorLockGetFingerprintCredentialLengthConstraints(chip::EndpointId endpointId, uint8_t & minLen, uint8_t & maxLen) +{ + return false; +} + +bool __attribute__((weak)) +emberAfPluginDoorLockGetFingerVeinCredentialLengthConstraints(chip::EndpointId endpointId, uint8_t & minLen, uint8_t & maxLen) +{ + return false; +} + +bool __attribute__((weak)) +emberAfPluginDoorLockGetFaceCredentialLengthConstraints(chip::EndpointId endpointId, uint8_t & minLen, uint8_t & maxLen) +{ + return false; +} diff --git a/src/app/clusters/door-lock-server/door-lock-server.cpp b/src/app/clusters/door-lock-server/door-lock-server.cpp index 35fc3c954dc40d..a08abd8ac3f20f 100644 --- a/src/app/clusters/door-lock-server/door-lock-server.cpp +++ b/src/app/clusters/door-lock-server/door-lock-server.cpp @@ -1457,6 +1457,15 @@ DlStatus DoorLockServer::credentialLengthWithinRange(chip::EndpointId endpointId statusMin = GetAttribute(endpointId, Attributes::MinRFIDCodeLength::Id, Attributes::MinRFIDCodeLength::Get, minLen); statusMax = GetAttribute(endpointId, Attributes::MaxRFIDCodeLength::Id, Attributes::MaxRFIDCodeLength::Get, maxLen); break; + case CredentialTypeEnum::kFingerprint: + statusMin = statusMax = emberAfPluginDoorLockGetFingerprintCredentialLengthConstraints(endpointId, minLen, maxLen); + break; + case CredentialTypeEnum::kFingerVein: + statusMin = statusMax = emberAfPluginDoorLockGetFingerVeinCredentialLengthConstraints(endpointId, minLen, maxLen); + break; + case CredentialTypeEnum::kFace: + statusMin = statusMax = emberAfPluginDoorLockGetFaceCredentialLengthConstraints(endpointId, minLen, maxLen); + break; default: return DlStatus::kFailure; } @@ -1496,6 +1505,15 @@ bool DoorLockServer::getMaxNumberOfCredentials(chip::EndpointId endpointId, Cred case CredentialTypeEnum::kRfid: status = GetNumberOfRFIDCredentialsSupported(endpointId, maxNumberOfCredentials); break; + case CredentialTypeEnum::kFingerprint: + status = emberAfPluginDoorLockGetNumberOfFingerprintCredentialsSupported(endpointId, maxNumberOfCredentials); + break; + case CredentialTypeEnum::kFingerVein: + status = emberAfPluginDoorLockGetNumberOfFingerVeinCredentialsSupported(endpointId, maxNumberOfCredentials); + break; + case CredentialTypeEnum::kFace: + status = emberAfPluginDoorLockGetNumberOfFaceCredentialsSupported(endpointId, maxNumberOfCredentials); + break; default: return false; } @@ -2391,6 +2409,11 @@ bool DoorLockServer::credentialTypeSupported(chip::EndpointId endpointId, Creden return SupportsPIN(endpointId); case CredentialTypeEnum::kRfid: return SupportsRFID(endpointId); + case CredentialTypeEnum::kFingerprint: + case CredentialTypeEnum::kFingerVein: + return SupportsFingers(endpointId); + case CredentialTypeEnum::kFace: + return SupportsFace(endpointId); default: return false; } diff --git a/src/app/clusters/door-lock-server/door-lock-server.h b/src/app/clusters/door-lock-server/door-lock-server.h index edf6a439e7042a..3f8fab53e8cd62 100644 --- a/src/app/clusters/door-lock-server/door-lock-server.h +++ b/src/app/clusters/door-lock-server/door-lock-server.h @@ -992,3 +992,83 @@ bool emberAfPluginDoorLockSetCredential(chip::EndpointId endpointId, uint16_t cr * @param lockoutEndTime Monotonic time of when lockout ends. */ void emberAfPluginDoorLockLockoutStarted(chip::EndpointId endpointId, chip::System::Clock::Timestamp lockoutEndTime); + +/** + * @brief This callback is called when the Door Lock server needs to find out + * the number of Fingerprint credentials supported, since there is no attribute + * that represents that value. + * + * @param[in] endpointId ID of the endpoint that contains the door lock. + * @param[out] maxNumberOfCredentials the number of Fingerprint credentials supported by the lock. + * + * @return false on failure, true on success. On failure, the cluster + * implementation will assume that 0 Fingerprint credentials are supported. + */ +bool emberAfPluginDoorLockGetNumberOfFingerprintCredentialsSupported(chip::EndpointId endpointId, + uint16_t & maxNumberOfCredentials); + +/** + * @brief This callback is called when the Door Lock server needs to find out + * the number of FingerVein credentials supported, since there is no attribute + * that represents that value. + * + * @param[in] endpointId ID of the endpoint that contains the door lock. + * @param[out] maxNumberOfCredentials the number of FingerVein credentials supported by the lock. + * + * @return false on failure, true on success. On failure, the cluster + * implementation will assume that 0 FingerVein credentials are supported. + */ +bool emberAfPluginDoorLockGetNumberOfFingerVeinCredentialsSupported(chip::EndpointId endpointId, uint16_t & maxNumberOfCredentials); + +/** + * @brief This callback is called when the Door Lock server needs to find out + * the number of Face credentials supported, since there is no attribute + * that represents that value. + * + * @param[in] endpointId ID of the endpoint that contains the door lock. + * @param[out] maxNumberOfCredentials the number of Face credentials supported by the lock. + * + * @return false on failure, true on success. On failure, the cluster + * implementation will assume that 0 Face credentials are supported. + */ +bool emberAfPluginDoorLockGetNumberOfFaceCredentialsSupported(chip::EndpointId endpointId, uint16_t & maxNumberOfCredentials); + +/** + * @brief This callback is called when the Door Lock server needs to find out + * the min and max lengths of Fingerprint credentials supported, since there are no + * attributes that represents those values. + * + * @param[in] endpointId ID of the endpoint that contains the door lock. + * @param[out] minLen the minimal length, in bytes, of a Fingerprint credential supported by the lock. + * @param[out] maxLen the minimal length, in bytes, of a Fingerprint credential supported by the lock. + * + * @return false on failure, true on success. + */ +bool emberAfPluginDoorLockGetFingerprintCredentialLengthConstraints(chip::EndpointId endpointId, uint8_t & minLen, + uint8_t & maxLen); + +/** + * @brief This callback is called when the Door Lock server needs to find out + * the min and max lengths of FingerVein credentials supported, since there are no + * attributes that represents those values. + * + * @param[in] endpointId ID of the endpoint that contains the door lock. + * @param[out] minLen the minimal length, in bytes, of a FingerVein credential supported by the lock. + * @param[out] maxLen the minimal length, in bytes, of a FingerVein credential supported by the lock. + * + * @return false on failure, true on success. + */ +bool emberAfPluginDoorLockGetFingerVeinCredentialLengthConstraints(chip::EndpointId endpointId, uint8_t & minLen, uint8_t & maxLen); + +/** + * @brief This callback is called when the Door Lock server needs to find out + * the min and max lengths of Face credentials supported, since there are no + * attributes that represents those values. + * + * @param[in] endpointId ID of the endpoint that contains the door lock. + * @param[out] minLen the minimal length, in bytes, of a Face credential supported by the lock. + * @param[out] maxLen the minimal length, in bytes, of a Face credential supported by the lock. + * + * @return false on failure, true on success. + */ +bool emberAfPluginDoorLockGetFaceCredentialLengthConstraints(chip::EndpointId endpointId, uint8_t & minLen, uint8_t & maxLen); From 5bf0b8d53131bc4ba06250253de37e14271efa78 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 2 Feb 2023 09:46:08 -0500 Subject: [PATCH 02/25] Fix crash if chip-tool gets an error status response. (#24799) We are trying to do JSON logging without a delegate in that case. --- examples/chip-tool/commands/common/RemoteDataModelLogger.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp b/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp index ccde7acd9781e4..1b397dfe8989d0 100644 --- a/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp +++ b/examples/chip-tool/commands/common/RemoteDataModelLogger.cpp @@ -144,6 +144,8 @@ CHIP_ERROR LogErrorAsJSON(const chip::app::EventHeader & header, const chip::app CHIP_ERROR LogErrorAsJSON(const CHIP_ERROR & error) { + VerifyOrReturnError(gDelegate != nullptr, CHIP_NO_ERROR); + Json::Value value; chip::app::StatusIB status; status.InitFromChipError(error); From 2fba6d65f66a4406ac2bb21df48bfc87fd3aeaa6 Mon Sep 17 00:00:00 2001 From: Terence Hampson Date: Thu, 2 Feb 2023 09:46:26 -0500 Subject: [PATCH 03/25] Only update placeholder if pics is enabled (#24795) --- .../py_matter_yamltests/matter_yamltests/parser.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/scripts/py_matter_yamltests/matter_yamltests/parser.py b/scripts/py_matter_yamltests/matter_yamltests/parser.py index 258693b0ec20a7..2c9a14a4e92b43 100644 --- a/scripts/py_matter_yamltests/matter_yamltests/parser.py +++ b/scripts/py_matter_yamltests/matter_yamltests/parser.py @@ -401,12 +401,13 @@ def __init__(self, test: _TestStepWithPlaceholders, runtime_config_variable_stor self._runtime_config_variable_storage = runtime_config_variable_storage self.arguments = copy.deepcopy(test.arguments_with_placeholders) self.response = copy.deepcopy(test.response_with_placeholders) - self._update_placeholder_values(self.arguments) - self._update_placeholder_values(self.response) - self._test.node_id = self._config_variable_substitution( - self._test.node_id) - test.update_arguments(self.arguments) - test.update_response(self.response) + if test.is_pics_enabled: + self._update_placeholder_values(self.arguments) + self._update_placeholder_values(self.response) + self._test.node_id = self._config_variable_substitution( + self._test.node_id) + test.update_arguments(self.arguments) + test.update_response(self.response) @property def is_enabled(self): From 94c7f68adef9c1341ccc851575d333e6f32fc4e9 Mon Sep 17 00:00:00 2001 From: Yufeng Wang Date: Thu, 2 Feb 2023 06:47:12 -0800 Subject: [PATCH 04/25] Fix program crash when try to show command helper info (#24809) --- .../java/src/com/matter/controller/Main.java | 3 --- .../controller/commands/common/CommandManager.java | 10 ++++++++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/examples/java-matter-controller/java/src/com/matter/controller/Main.java b/examples/java-matter-controller/java/src/com/matter/controller/Main.java index ffeefb43699a2e..0e24c6dc1c212d 100644 --- a/examples/java-matter-controller/java/src/com/matter/controller/Main.java +++ b/examples/java-matter-controller/java/src/com/matter/controller/Main.java @@ -112,9 +112,6 @@ public static void main(String[] args) { try { commandManager.run(args); - } catch (IllegalArgumentException e) { - logger.log(Level.INFO, "Arguments init failed with exception: " + e.getMessage()); - System.exit(1); } catch (Exception e) { logger.log(Level.INFO, "Run command failed with exception: " + e.getMessage()); System.exit(1); diff --git a/examples/java-matter-controller/java/src/com/matter/controller/commands/common/CommandManager.java b/examples/java-matter-controller/java/src/com/matter/controller/commands/common/CommandManager.java index 2e1b373873478a..47e184ec3ae4d7 100644 --- a/examples/java-matter-controller/java/src/com/matter/controller/commands/common/CommandManager.java +++ b/examples/java-matter-controller/java/src/com/matter/controller/commands/common/CommandManager.java @@ -96,8 +96,14 @@ public final void run(String[] args) throws Exception { // need skip over binary and command name and only get arguments String[] temp = Arrays.copyOfRange(args, 2, args.length); - command.initArguments(temp.length, temp); - showCommand(args[0], command); + try { + command.initArguments(temp.length, temp); + } catch (IllegalArgumentException e) { + logger.log(Level.INFO, "Arguments init failed with exception: " + e.getMessage()); + showCommand(args[0], command); + System.exit(1); + } + command.run(); } From 64d8ae1ec8f9d913abaafaaa0cc12bc64f536bd4 Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Thu, 2 Feb 2023 10:08:51 -0500 Subject: [PATCH 05/25] Add "DiscoveryCommands" to yaml repl tests, make `TestDiscovery.yaml` pass (#24763) * Make discoverCommissionable work for now. More items to follow * TestDiscovery now passes * Minor update because short discriminator was wrong before * Stop trying to auto-cast short discriminator in discovery commands * Undo minmdns high verbosity * Restyle * Disable Test_TC_OO_2_4 * Set filter for MC to none (not needed) * Update after review comments * Update double-disable of flaky test... separating flaky from todo * Undo restyle only change * Make Test flaky instead of failing ... since it seems sometimes it may pass --------- Co-authored-by: Andrei Litvin --- scripts/tests/chiptest/__init__.py | 10 +- .../yamltest_with_chip_repl_tester.py | 8 +- src/app/tests/suites/TestDiscovery.yaml | 5 +- .../commands/discovery/DiscoveryCommands.cpp | 3 +- src/controller/python/chip/yaml/runner.py | 147 ++++++++++++++++-- .../chip-tool/zap-generated/test/Commands.h | 4 +- 6 files changed, 152 insertions(+), 25 deletions(-) diff --git a/scripts/tests/chiptest/__init__.py b/scripts/tests/chiptest/__init__.py index d8698e7a110a34..08153207f1420e 100644 --- a/scripts/tests/chiptest/__init__.py +++ b/scripts/tests/chiptest/__init__.py @@ -88,7 +88,6 @@ def _GetManualTests() -> Set[ManualTest]: manualtests.add(ManualTest(yaml="Test_TC_MEDIAPLAYBACK_6_2.yaml", reason="TODO")) manualtests.add(ManualTest(yaml="Test_TC_MEDIAPLAYBACK_6_3.yaml", reason="TODO")) manualtests.add(ManualTest(yaml="Test_TC_MEDIAPLAYBACK_6_4.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_OO_2_4.yaml", reason="Flaky")) manualtests.add(ManualTest(yaml="Test_TC_PCC_2_1.yaml", reason="TODO")) manualtests.add(ManualTest(yaml="Test_TC_PS_2_1.yaml", reason="TODO")) manualtests.add(ManualTest(yaml="Test_TC_SC_5_1.yaml", reason="TODO")) @@ -101,11 +100,15 @@ def _GetManualTests() -> Set[ManualTest]: manualtests.add(ManualTest(yaml="Test_TC_WNCV_2_5.yaml", reason="TODO")) manualtests.add(ManualTest(yaml="TestClusterMultiFabric.yaml", reason="TODO")) manualtests.add(ManualTest(yaml="TestCommissionerNodeId.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="TestDiscovery.yaml", reason="TODO")) manualtests.add(ManualTest(yaml="TestEvents.yaml", reason="TODO")) manualtests.add(ManualTest(yaml="TestGroupMessaging.yaml", reason="TODO")) manualtests.add(ManualTest(yaml="TestMultiAdmin.yaml", reason="TODO")) + # Failing, unclear why. Likely repl specific, used to pass however first + # failure point seems unrelated. Historically this seems (very?) flaky + # in repl. + manualtests.add(ManualTest(yaml="Test_TC_OO_2_4.yaml", reason="Flaky")) + # Examples: # # Currently these are not in ciTests.json, however yaml logic currently @@ -114,8 +117,7 @@ def _GetManualTests() -> Set[ManualTest]: # This is on purpose for now to make it harder to orphan files, however # we can reconsider as things evolve. manualtests.add(ManualTest(yaml="Config_Example.yaml", reason="Example")) - manualtests.add(ManualTest( - yaml="Config_Variables_Example.yaml", reason="Example")) + manualtests.add(ManualTest(yaml="Config_Variables_Example.yaml", reason="Example")) manualtests.add(ManualTest(yaml="PICS_Example.yaml", reason="Example")) manualtests.add(ManualTest(yaml="Response_Example.yaml", reason="Example")) manualtests.add(ManualTest(yaml="Test_Example.yaml", reason="Example")) diff --git a/scripts/tests/chiptest/yamltest_with_chip_repl_tester.py b/scripts/tests/chiptest/yamltest_with_chip_repl_tester.py index f852d30c9b4a53..f1d5583feb865c 100644 --- a/scripts/tests/chiptest/yamltest_with_chip_repl_tester.py +++ b/scripts/tests/chiptest/yamltest_with_chip_repl_tester.py @@ -15,6 +15,7 @@ # limitations under the License. import atexit +import logging import os import tempfile import traceback @@ -32,7 +33,7 @@ from chip.ChipStack import * from chip.yaml.runner import ReplTestRunner from matter_yamltests.definitions import SpecDefinitionsFromPaths -from matter_yamltests.parser import TestParser +from matter_yamltests.parser import PostProcessCheckStatus, TestParser _DEFAULT_CHIP_ROOT = os.path.abspath( os.path.join(os.path.dirname(__file__), "..", "..", "..")) @@ -118,6 +119,11 @@ def _StackShutDown(): post_processing_result = test_step.post_process_response( decoded_response) if not post_processing_result.is_success(): + logging.warning(f"Test step failure in 'test_step.label'") + for entry in post_processing_result.entries: + if entry.state == PostProcessCheckStatus.SUCCESS: + continue + logging.warning("%s: %s", entry.state, entry.message) raise Exception(f'Test step failed {test_step.label}') except Exception: print(traceback.format_exc()) diff --git a/src/app/tests/suites/TestDiscovery.yaml b/src/app/tests/suites/TestDiscovery.yaml index fc01f5c1cfef8b..474bfb02945884 100644 --- a/src/app/tests/suites/TestDiscovery.yaml +++ b/src/app/tests/suites/TestDiscovery.yaml @@ -20,6 +20,9 @@ config: discriminator: type: int16u defaultValue: 3840 + shortDiscriminator: + type: int16u + defaultValue: 15 vendorId: type: int16u defaultValue: 65521 @@ -146,7 +149,7 @@ tests: arguments: values: - name: "value" - value: discriminator + value: shortDiscriminator - label: "Check Commissioning Mode (_CM)" cluster: "DiscoveryCommands" diff --git a/src/app/tests/suites/commands/discovery/DiscoveryCommands.cpp b/src/app/tests/suites/commands/discovery/DiscoveryCommands.cpp index 7cf0dde53f525e..c3ba7b4ca0e65e 100644 --- a/src/app/tests/suites/commands/discovery/DiscoveryCommands.cpp +++ b/src/app/tests/suites/commands/discovery/DiscoveryCommands.cpp @@ -37,8 +37,7 @@ CHIP_ERROR DiscoveryCommands::FindCommissionableByShortDiscriminator( { ReturnErrorOnFailure(SetupDiscoveryCommands()); - uint64_t shortDiscriminator = static_cast((value.value >> 8) & 0x0F); - chip::Dnssd::DiscoveryFilter filter(chip::Dnssd::DiscoveryFilterType::kShortDiscriminator, shortDiscriminator); + chip::Dnssd::DiscoveryFilter filter(chip::Dnssd::DiscoveryFilterType::kShortDiscriminator, value.value); return mDNSResolver.DiscoverCommissionableNodes(filter); } diff --git a/src/controller/python/chip/yaml/runner.py b/src/controller/python/chip/yaml/runner.py index 0318d5262b9b79..8d8f6c970d8b7a 100644 --- a/src/controller/python/chip/yaml/runner.py +++ b/src/controller/python/chip/yaml/runner.py @@ -25,7 +25,7 @@ import chip.interaction_model import chip.yaml.format_converter as Converter import stringcase -from chip import ChipDeviceCtrl +from chip.ChipDeviceCtrl import ChipDeviceController, discovery from chip.clusters.Attribute import AttributeStatus, SubscriptionTransaction, TypedAttributePath, ValueDecodeFailure from chip.exceptions import ChipStackError from chip.yaml.errors import ParsingError, UnexpectedParsingError @@ -98,7 +98,7 @@ def pics_enabled(self): return self._pics_enabled @abstractmethod - def run_action(self, dev_ctrl: ChipDeviceCtrl) -> _ActionResult: + def run_action(self, dev_ctrl: ChipDeviceController) -> _ActionResult: pass @@ -109,7 +109,7 @@ def __init__(self, test_step): if not _PSEUDO_CLUSTERS.supports(test_step): raise ParsingError(f'Default cluster {test_step.cluster} {test_step.command}, not supported') - def run_action(self, dev_ctrl: ChipDeviceCtrl) -> _ActionResult: + def run_action(self, dev_ctrl: ChipDeviceController) -> _ActionResult: resp = asyncio.run(_PSEUDO_CLUSTERS.execute(self._test_step)) return _ActionResult(status=_ActionStatus.SUCCESS, response=None) @@ -118,7 +118,7 @@ class InvokeAction(BaseAction): '''Single invoke action to be executed.''' def __init__(self, test_step, cluster: str, context: _ExecutionContext): - '''Converts 'test_step' to invoke command action that can execute with ChipDeviceCtrl. + '''Converts 'test_step' to invoke command action that can execute with ChipDeviceController. Args: 'test_step': Step containing information required to run invoke command action. @@ -162,7 +162,7 @@ def __init__(self, test_step, cluster: str, context: _ExecutionContext): else: self._request_object = command_object - def run_action(self, dev_ctrl: ChipDeviceCtrl) -> _ActionResult: + def run_action(self, dev_ctrl: ChipDeviceController) -> _ActionResult: try: resp = asyncio.run(dev_ctrl.SendCommand( self._node_id, self._endpoint, self._request_object, @@ -179,7 +179,7 @@ class ReadAttributeAction(BaseAction): '''Single read attribute action to be executed.''' def __init__(self, test_step, cluster: str, context: _ExecutionContext): - '''Converts 'test_step' to read attribute action that can execute with ChipDeviceCtrl. + '''Converts 'test_step' to read attribute action that can execute with ChipDeviceController. Args: 'test_step': Step containing information required to run read attribute action. @@ -224,7 +224,7 @@ def __init__(self, test_step, cluster: str, context: _ExecutionContext): raise UnexpectedParsingError( f'ReadAttribute doesnt have valid attribute_type. {self.label}') - def run_action(self, dev_ctrl: ChipDeviceCtrl) -> _ActionResult: + def run_action(self, dev_ctrl: ChipDeviceController) -> _ActionResult: try: raw_resp = asyncio.run(dev_ctrl.ReadAttribute(self._node_id, [(self._endpoint, self._request_object)], @@ -289,7 +289,7 @@ def __init__(self, test_step): # Timeout is provided in seconds we need to conver to milliseconds. self._timeout_ms = request_data_as_dict['timeout'] * 1000 - def run_action(self, dev_ctrl: ChipDeviceCtrl) -> _ActionResult: + def run_action(self, dev_ctrl: ChipDeviceController) -> _ActionResult: try: if self._expire_existing_session: dev_ctrl.ExpireSessions(self._node_id) @@ -326,7 +326,7 @@ class SubscribeAttributeAction(ReadAttributeAction): '''Single subscribe attribute action to be executed.''' def __init__(self, test_step, cluster: str, context: _ExecutionContext): - '''Converts 'test_step' to subscribe attribute action that can execute with ChipDeviceCtrl. + '''Converts 'test_step' to subscribe attribute action that can execute with ChipDeviceController. Args: 'test_step': Step containing information required to run write attribute action. @@ -349,7 +349,7 @@ def __init__(self, test_step, cluster: str, context: _ExecutionContext): f'SubscribeAttribute action does not have max_interval {self.label}') self._max_interval = test_step.max_interval - def run_action(self, dev_ctrl: ChipDeviceCtrl) -> _ActionResult: + def run_action(self, dev_ctrl: ChipDeviceController) -> _ActionResult: try: subscription = asyncio.run( dev_ctrl.ReadAttribute(self._node_id, [(self._endpoint, self._request_object)], @@ -381,7 +381,7 @@ class WriteAttributeAction(BaseAction): '''Single write attribute action to be executed.''' def __init__(self, test_step, cluster: str, context: _ExecutionContext): - '''Converts 'test_step' to write attribute action that can execute with ChipDeviceCtrl. + '''Converts 'test_step' to write attribute action that can execute with ChipDeviceController. Args: 'test_step': Step containing information required to run write attribute action. @@ -425,7 +425,7 @@ def __init__(self, test_step, cluster: str, context: _ExecutionContext): # Create a cluster object for the request from the provided YAML data. self._request_object = attribute(request_data) - def run_action(self, dev_ctrl: ChipDeviceCtrl) -> _ActionResult: + def run_action(self, dev_ctrl: ChipDeviceController) -> _ActionResult: try: resp = asyncio.run( dev_ctrl.WriteAttribute(self._node_id, [(self._endpoint, self._request_object)], @@ -463,7 +463,7 @@ def __init__(self, test_step, context: _ExecutionContext): if self._output_queue is None: raise UnexpectedParsingError(f'Could not find output queue') - def run_action(self, dev_ctrl: ChipDeviceCtrl) -> _ActionResult: + def run_action(self, dev_ctrl: ChipDeviceController) -> _ActionResult: try: # While there should be a timeout here provided by the test, the current codegen version # of YAML tests doesn't have a per test step timeout, only a global timeout for the @@ -495,7 +495,7 @@ def __init__(self, test_step): self._setup_payload = request_data_as_dict['payload'] self._node_id = request_data_as_dict['nodeId'] - def run_action(self, dev_ctrl: ChipDeviceCtrl) -> _ActionResult: + def run_action(self, dev_ctrl: ChipDeviceController) -> _ActionResult: resp = dev_ctrl.CommissionWithCode(self._setup_payload, self._node_id) if resp: @@ -504,10 +504,78 @@ def run_action(self, dev_ctrl: ChipDeviceCtrl) -> _ActionResult: return _ActionResult(status=_ActionStatus.ERROR, response=None) +class DiscoveryCommandAction(BaseAction): + """DiscoveryCommand implementation (FindCommissionable* methods).""" + + @staticmethod + def _filter_for_step(test_step) -> (discovery.FilterType, any): + """Given a test step, figure out the correct filters to give to + DiscoverCommissionableNodes. + """ + + if test_step.command == 'FindCommissionable': + return discovery.FilterType.NONE, None + + if test_step.command == 'FindCommissionableByCommissioningMode': + # this is just a "_CM" subtype + return discovery.FilterType.COMMISSIONING_MODE, None + + # all the items below require a "value" to use for filtering + args = test_step.arguments['values'] + request_data_as_dict = Converter.convert_list_of_name_value_pair_to_dict(args) + + filter = request_data_as_dict['value'] + + if test_step.command == 'FindCommissionableByDeviceType': + return discovery.FilterType.DEVICE_TYPE, filter + + if test_step.command == 'FindCommissionableByLongDiscriminator': + return discovery.FilterType.LONG_DISCRIMINATOR, filter + + if test_step.command == 'FindCommissionableByShortDiscriminator': + return discovery.FilterType.SHORT_DISCRIMINATOR, filter + + if test_step.command == 'FindCommissionableByVendorId': + return discovery.FilterType.VENDOR_ID, filter + + raise UnexpectedParsingError(f'Invalid command: {test_step.command}') + + def __init__(self, test_step): + super().__init__(test_step) + self.filterType, self.filter = DiscoveryCommandAction._filter_for_step(test_step) + + def run_action(self, dev_ctrl: ChipDeviceController) -> _ActionResult: + devices = dev_ctrl.DiscoverCommissionableNodes( + filterType=self.filterType, filter=self.filter, stopOnFirst=True, timeoutSecond=5) + + # Devices will be a list: [CommissionableNode(), ...] + logging.info("Discovered devices: %r" % devices) + + if not devices: + logging.error("No devices found") + return _ActionResult(status=_ActionStatus.ERROR, response="NO DEVICES FOUND") + elif len(devices) > 1: + logging.warning("Commissionable discovery found multiple results!") + + return _ActionResult(status=_ActionStatus.SUCCESS, response=devices[0]) + + +class NotImplementedAction(BaseAction): + """Raises a "NOT YET IMPLEMENTED" exception when run.""" + + def __init__(self, test_step, cluster, command): + super().__init__(test_step) + self.cluster = cluster + self.command = command + + def run_action(self, dev_ctrl: ChipDeviceController) -> _ActionResult: + raise Exception(f"NOT YET IMPLEMENTED: {self.cluster}::{self.command}") + + class ReplTestRunner: '''Test runner to encode/decode values from YAML test Parser for executing the TestStep. - Uses ChipDeviceCtrl from chip-repl to execute parsed YAML TestSteps. + Uses ChipDeviceController from chip-repl to execute parsed YAML TestSteps. ''' def __init__(self, test_spec_definition, certificate_authority_manager, alpha_dev_ctrl): @@ -624,7 +692,9 @@ def encode(self, request) -> BaseAction: # Some of the tests contain 'cluster over-rides' that refer to a different # cluster than that specified in 'config'. - if cluster == 'DelayCommands' and command == 'WaitForCommissionee': + elif cluster == 'DiscoveryCommands': + return DiscoveryCommandAction(request) + elif cluster == 'DelayCommands' and command == 'WaitForCommissionee': action = self._wait_for_commissionee_action_factory(request) elif command == 'writeAttribute': action = self._attribute_write_action_factory(request, cluster) @@ -668,6 +738,51 @@ def decode(self, result: _ActionResult): decoded_response['error'] = stringcase.snakecase(response.name).upper() return decoded_response + if isinstance(response, chip.discovery.CommissionableNode): + # CommissionableNode( + # instanceName='04DD55352DD2AC53', + # hostName='E6A32C6DBA8D0000', + # port=5540, + # longDiscriminator=3840, + # vendorId=65521, + # productId=32769, + # commissioningMode=1, + # deviceType=0, + # deviceName='', + # pairingInstruction='', + # pairingHint=36, + # mrpRetryIntervalIdle=None, + # mrpRetryIntervalActive=None, + # supportsTcp=True, + # addresses=['fd00:0:1:1::3', '10.10.10.1'] + # ), ... + decoded_response['value'] = { + 'instanceName': response.instanceName, + 'hostName': response.hostName, + 'port': response.port, + 'longDiscriminator': response.longDiscriminator, + 'vendorId': response.vendorId, + 'productId': response.productId, + 'commissioningMode': response.commissioningMode, + 'deviceType': response.deviceType, + 'deviceName': response.deviceName, + 'pairingInstruction': response.pairingInstruction, + 'pairingHint': response.pairingHint, + 'mrpRetryIntervalIdle': response.mrpRetryIntervalIdle, + 'mrpRetryIntervalActive': response.mrpRetryIntervalActive, + 'supportsTcp': response.supportsTcp, + 'addresses': response.addresses, + + # TODO: NOT AVAILABLE + 'rotatingIdLen': 0, + + # derived values + 'numIPs': len(response.addresses), + + } + + return decoded_response + if isinstance(response, ChipStackError): decoded_response['error'] = 'FAILURE' return decoded_response diff --git a/zzz_generated/chip-tool/zap-generated/test/Commands.h b/zzz_generated/chip-tool/zap-generated/test/Commands.h index c69097fde2ab1f..995f4a5e66bdff 100644 --- a/zzz_generated/chip-tool/zap-generated/test/Commands.h +++ b/zzz_generated/chip-tool/zap-generated/test/Commands.h @@ -65274,6 +65274,7 @@ class TestDiscoverySuite : public TestCommand AddArgument("nodeId", 0, UINT64_MAX, &mNodeId); AddArgument("endpoint", 0, UINT16_MAX, &mEndpoint); AddArgument("discriminator", 0, UINT16_MAX, &mDiscriminator); + AddArgument("shortDiscriminator", 0, UINT16_MAX, &mShortDiscriminator); AddArgument("vendorId", 0, UINT16_MAX, &mVendorId); AddArgument("productId", 0, UINT16_MAX, &mProductId); AddArgument("deviceType", 0, UINT16_MAX, &mDeviceType); @@ -65298,6 +65299,7 @@ class TestDiscoverySuite : public TestCommand chip::Optional mNodeId; chip::Optional mEndpoint; chip::Optional mDiscriminator; + chip::Optional mShortDiscriminator; chip::Optional mVendorId; chip::Optional mProductId; chip::Optional mDeviceType; @@ -65619,7 +65621,7 @@ class TestDiscoverySuite : public TestCommand LogStep(8, "Check Short Discriminator (_S)"); ListFreer listFreer; chip::app::Clusters::DiscoveryCommands::Commands::FindCommissionableByShortDiscriminator::Type value; - value.value = mDiscriminator.HasValue() ? mDiscriminator.Value() : 3840ULL; + value.value = mShortDiscriminator.HasValue() ? mShortDiscriminator.Value() : 15ULL; return FindCommissionableByShortDiscriminator(kIdentityAlpha, value); } case 9: { From 6b8e32eea27e0d44caed5b5499cb401241a3540f Mon Sep 17 00:00:00 2001 From: Terence Hampson Date: Thu, 2 Feb 2023 10:09:15 -0500 Subject: [PATCH 06/25] Allow checking constraint type by struct name (#24802) --- .../matter_yamltests/constraints.py | 44 ++++++++++--------- .../matter_yamltests/parser.py | 9 +++- 2 files changed, 31 insertions(+), 22 deletions(-) diff --git a/scripts/py_matter_yamltests/matter_yamltests/constraints.py b/scripts/py_matter_yamltests/matter_yamltests/constraints.py index 22d461c960dd43..b186fb1bef6282 100644 --- a/scripts/py_matter_yamltests/matter_yamltests/constraints.py +++ b/scripts/py_matter_yamltests/matter_yamltests/constraints.py @@ -32,7 +32,7 @@ def __init__(self, types: list, is_null_allowed: bool = False): self._types = types self._is_null_allowed = is_null_allowed - def is_met(self, value): + def is_met(self, value, value_type_name): if value is None: return self._is_null_allowed @@ -43,10 +43,10 @@ def is_met(self, value): if not found_type_match: return False - return self.check_response(value) + return self.check_response(value, value_type_name) @abstractmethod - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: pass @@ -55,13 +55,13 @@ def __init__(self, has_value): super().__init__(types=[]) self._has_value = has_value - def is_met(self, value): + def is_met(self, value, value_type_name): # We are overriding the BaseConstraint of is_met since has value is a special case where # we might not be expecting a value at all, but the basic null check in BaseConstraint # is not what we want. - return self.check_response(value) + return self.check_response(value, value_type_name) - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: has_value = value is not None return self._has_value == has_value @@ -71,7 +71,7 @@ def __init__(self, type): super().__init__(types=[], is_null_allowed=True) self._type = type - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: success = False if self._type == 'boolean' and type(value) is bool: success = True @@ -195,6 +195,8 @@ def check_response(self, value) -> bool: success = value >= -36028797018963967 and value <= 36028797018963967 elif self._type == 'nullable_int64s' and type(value) is int: success = value >= -9223372036854775807 and value <= 9223372036854775807 + else: + success = self._type == value_type_name return success @@ -203,7 +205,7 @@ def __init__(self, min_length): super().__init__(types=[str, bytes, list]) self._min_length = min_length - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: return len(value) >= self._min_length @@ -212,7 +214,7 @@ def __init__(self, max_length): super().__init__(types=[str, bytes, list]) self._max_length = max_length - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: return len(value) <= self._max_length @@ -221,7 +223,7 @@ def __init__(self, is_hex_string: bool): super().__init__(types=[str]) self._is_hex_string = is_hex_string - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: return all(c in string.hexdigits for c in value) == self._is_hex_string @@ -230,7 +232,7 @@ def __init__(self, starts_with): super().__init__(types=[str]) self._starts_with = starts_with - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: return value.startswith(self._starts_with) @@ -239,7 +241,7 @@ def __init__(self, ends_with): super().__init__(types=[str]) self._ends_with = ends_with - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: return value.endswith(self._ends_with) @@ -248,7 +250,7 @@ def __init__(self, is_upper_case): super().__init__(types=[str]) self._is_upper_case = is_upper_case - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: return value.isupper() == self._is_upper_case @@ -257,7 +259,7 @@ def __init__(self, is_lower_case): super().__init__(types=[str]) self._is_lower_case = is_lower_case - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: return value.islower() == self._is_lower_case @@ -266,7 +268,7 @@ def __init__(self, min_value): super().__init__(types=[int, float], is_null_allowed=True) self._min_value = min_value - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: return value >= self._min_value @@ -275,7 +277,7 @@ def __init__(self, max_value): super().__init__(types=[int, float], is_null_allowed=True) self._max_value = max_value - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: return value <= self._max_value @@ -284,7 +286,7 @@ def __init__(self, contains): super().__init__(types=[list]) self._contains = contains - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: return set(self._contains).issubset(value) @@ -293,7 +295,7 @@ def __init__(self, excludes): super().__init__(types=[list]) self._excludes = excludes - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: return set(self._excludes).isdisjoint(value) @@ -302,7 +304,7 @@ def __init__(self, has_masks_set): super().__init__(types=[int]) self._has_masks_set = has_masks_set - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: return all([(value & mask) == mask for mask in self._has_masks_set]) @@ -311,7 +313,7 @@ def __init__(self, has_masks_clear): super().__init__(types=[int]) self._has_masks_clear = has_masks_clear - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: return all([(value & mask) == 0 for mask in self._has_masks_clear]) @@ -320,7 +322,7 @@ def __init__(self, not_value): super().__init__(types=[], is_null_allowed=True) self._not_value = not_value - def check_response(self, value) -> bool: + def check_response(self, value, value_type_name) -> bool: return value != self._not_value diff --git a/scripts/py_matter_yamltests/matter_yamltests/parser.py b/scripts/py_matter_yamltests/matter_yamltests/parser.py index 2c9a14a4e92b43..cb17d7a35846f8 100644 --- a/scripts/py_matter_yamltests/matter_yamltests/parser.py +++ b/scripts/py_matter_yamltests/matter_yamltests/parser.py @@ -233,6 +233,7 @@ def __init__(self, test: dict, config: dict, definitions: SpecDefinitions, pics_ argument_mapping = None response_mapping = None + response_mapping_name = None if self.is_attribute: attribute = definitions.get_attribute_by_name( @@ -242,6 +243,7 @@ def __init__(self, test: dict, config: dict, definitions: SpecDefinitions, pics_ attribute.definition.data_type.name) argument_mapping = attribute_mapping response_mapping = attribute_mapping + response_mapping_name = attribute.definition.data_type.name else: command = definitions.get_command_by_name( self.cluster, self.command) @@ -250,9 +252,11 @@ def __init__(self, test: dict, config: dict, definitions: SpecDefinitions, pics_ definitions, self.cluster, command.input_param) response_mapping = self._as_mapping( definitions, self.cluster, command.output_param) + response_mapping_name = command.output_param self.argument_mapping = argument_mapping self.response_mapping = response_mapping + self.response_mapping_name = response_mapping_name self.update_arguments(self.arguments_with_placeholders) self.update_response(self.response_with_placeholders) @@ -678,6 +682,7 @@ def _response_constraints_validation(self, response, result): error_success = 'Constraints check passed' error_failure = 'Constraints check failed' + response_type_name = self._test.response_mapping_name for value in self.response['values']: if 'constraints' not in value: continue @@ -685,6 +690,8 @@ def _response_constraints_validation(self, response, result): received_value = response.get('value') if not self.is_attribute: expected_name = value.get('name') + response_type_name = self._test.response_mapping.get( + expected_name) if received_value is None or expected_name not in received_value: received_value = None else: @@ -693,7 +700,7 @@ def _response_constraints_validation(self, response, result): constraints = get_constraints(value['constraints']) - if all([constraint.is_met(received_value) for constraint in constraints]): + if all([constraint.is_met(received_value, response_type_name) for constraint in constraints]): result.success(check_type, error_success) else: # TODO would be helpful to be more verbose here From 67c5ee4cca147b5ca4d63d20edbd28bedb393650 Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Thu, 2 Feb 2023 10:29:29 -0500 Subject: [PATCH 07/25] Add namespace usage to fix android tv compile (#24820) --- examples/tv-app/android/java/AppImpl.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/tv-app/android/java/AppImpl.cpp b/examples/tv-app/android/java/AppImpl.cpp index 0b08f5591b4261..2941b2a8f83499 100644 --- a/examples/tv-app/android/java/AppImpl.cpp +++ b/examples/tv-app/android/java/AppImpl.cpp @@ -45,6 +45,7 @@ #include #include +using namespace app::Clusters; using namespace chip; using namespace chip::AppPlatform; using namespace chip::DeviceLayer; From 10a46777d29b240cda2f9576a26e7968bb119d8d Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 2 Feb 2023 10:34:01 -0500 Subject: [PATCH 08/25] Don't try to relock the lock if it's locked when the auto-relock timer fires. (#24769) Fixes https://github.com/project-chip/connectedhomeip/issues/24766 --- .../door-lock-server/door-lock-server.cpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/app/clusters/door-lock-server/door-lock-server.cpp b/src/app/clusters/door-lock-server/door-lock-server.cpp index a08abd8ac3f20f..6fb25e34e3d02c 100644 --- a/src/app/clusters/door-lock-server/door-lock-server.cpp +++ b/src/app/clusters/door-lock-server/door-lock-server.cpp @@ -3801,8 +3801,19 @@ void MatterDoorLockClusterServerAttributeChangedCallback(const app::ConcreteAttr void DoorLockServer::DoorLockOnAutoRelockCallback(chip::EndpointId endpointId) { - emberAfDoorLockClusterPrintln("Door Auto relock timer expired. Locking..."); emberEventControlSetInactive(&DoorLockServer::Instance().AutolockEvent); - DoorLockServer::Instance().SetLockState(endpointId, DlLockState::kLocked, OperationSourceEnum::kAuto); - emberAfPluginDoorLockOnAutoRelock(endpointId); + + Nullable lockState; + if (Attributes::LockState::Get(endpointId, lockState) != EMBER_ZCL_STATUS_SUCCESS || lockState.IsNull() || + lockState.Value() != DlLockState::kLocked) + { + emberAfDoorLockClusterPrintln("Door Auto relock timer expired. %s", "Locking..."); + + DoorLockServer::Instance().SetLockState(endpointId, DlLockState::kLocked, OperationSourceEnum::kAuto); + emberAfPluginDoorLockOnAutoRelock(endpointId); + } + else + { + emberAfDoorLockClusterPrintln("Door Auto relock timer expired. %s", "Already locked."); + } } From 79d5ac4b0c4663be64695ccd9e5b7411a656aed1 Mon Sep 17 00:00:00 2001 From: Wang Qixiang <43193572+wqx6@users.noreply.github.com> Date: Thu, 2 Feb 2023 23:56:47 +0800 Subject: [PATCH 09/25] Add a method to send the NOC with CATs when pairing devices (#24774) * controller: Add interface for setting CATs in ExampleOperationalCredentialsIssuer * chiptool: Add option to set CATs encoded in device's NOC for pairing command * Update examples/chip-tool/commands/common/CredentialIssuerCommands.h Co-authored-by: Boris Zbarsky --------- Co-authored-by: Boris Zbarsky --- .../commands/common/CredentialIssuerCommands.h | 2 ++ .../example/ExampleCredentialIssuerCommands.h | 1 + .../chip-tool/commands/pairing/PairingCommand.cpp | 15 +++++++++++++++ .../chip-tool/commands/pairing/PairingCommand.h | 2 ++ .../ExampleOperationalCredentialsIssuer.cpp | 2 +- .../ExampleOperationalCredentialsIssuer.h | 3 +++ 6 files changed, 24 insertions(+), 1 deletion(-) diff --git a/examples/chip-tool/commands/common/CredentialIssuerCommands.h b/examples/chip-tool/commands/common/CredentialIssuerCommands.h index 1ea712ffa9593f..afb36773529e1e 100644 --- a/examples/chip-tool/commands/common/CredentialIssuerCommands.h +++ b/examples/chip-tool/commands/common/CredentialIssuerCommands.h @@ -73,6 +73,8 @@ class CredentialIssuerCommands virtual chip::Controller::OperationalCredentialsDelegate * GetCredentialIssuer() = 0; + virtual void SetCredentialIssuerCATValues(chip::CATValues cats) = 0; + /** * @brief * This function is used to Generate NOC Chain for the Controller/Commissioner. Parameters follow the example implementation, diff --git a/examples/chip-tool/commands/example/ExampleCredentialIssuerCommands.h b/examples/chip-tool/commands/example/ExampleCredentialIssuerCommands.h index e06466ca4ab67d..a8694f02ff894e 100644 --- a/examples/chip-tool/commands/example/ExampleCredentialIssuerCommands.h +++ b/examples/chip-tool/commands/example/ExampleCredentialIssuerCommands.h @@ -45,6 +45,7 @@ class ExampleCredentialIssuerCommands : public CredentialIssuerCommands return CHIP_NO_ERROR; } chip::Controller::OperationalCredentialsDelegate * GetCredentialIssuer() override { return &mOpCredsIssuer; } + void SetCredentialIssuerCATValues(chip::CATValues cats) override { mOpCredsIssuer.SetCATValuesForNextNOCRequest(cats); } CHIP_ERROR GenerateControllerNOCChain(chip::NodeId nodeId, chip::FabricId fabricId, const chip::CATValues & cats, chip::Crypto::P256Keypair & keypair, chip::MutableByteSpan & rcac, chip::MutableByteSpan & icac, chip::MutableByteSpan & noc) override diff --git a/examples/chip-tool/commands/pairing/PairingCommand.cpp b/examples/chip-tool/commands/pairing/PairingCommand.cpp index ec8deb76a6081f..6467e8ffcbe989 100644 --- a/examples/chip-tool/commands/pairing/PairingCommand.cpp +++ b/examples/chip-tool/commands/pairing/PairingCommand.cpp @@ -33,6 +33,21 @@ using namespace ::chip::Controller; CHIP_ERROR PairingCommand::RunCommand() { CurrentCommissioner().RegisterPairingDelegate(this); + // Clear the CATs in OperationalCredentialsIssuer + mCredIssuerCmds->SetCredentialIssuerCATValues(kUndefinedCATs); + + if (mCASEAuthTags.HasValue() && mCASEAuthTags.Value().size() <= kMaxSubjectCATAttributeCount) + { + CATValues cats = kUndefinedCATs; + for (size_t index = 0; index < mCASEAuthTags.Value().size(); ++index) + { + cats.values[index] = mCASEAuthTags.Value()[index]; + } + if (cats.AreValid()) + { + mCredIssuerCmds->SetCredentialIssuerCATValues(cats); + } + } return RunInternal(mNodeId); } diff --git a/examples/chip-tool/commands/pairing/PairingCommand.h b/examples/chip-tool/commands/pairing/PairingCommand.h index 142a09013806af..656b4c60d4db02 100644 --- a/examples/chip-tool/commands/pairing/PairingCommand.h +++ b/examples/chip-tool/commands/pairing/PairingCommand.h @@ -64,6 +64,7 @@ class PairingCommand : public CHIPCommand, AddArgument("bypass-attestation-verifier", 0, 1, &mBypassAttestationVerifier, "Bypass the attestation verifier. If not provided or false, the attestation verifier is not bypassed." " If true, the commissioning will continue in case of attestation verification failure."); + AddArgument("case-auth-tags", 1, UINT32_MAX, &mCASEAuthTags, "The CATs to be encoded in the NOC sent to the commissionee"); switch (networkType) { @@ -188,6 +189,7 @@ class PairingCommand : public CHIPCommand, chip::Optional mPaseOnly; chip::Optional mSkipCommissioningComplete; chip::Optional mBypassAttestationVerifier; + chip::Optional> mCASEAuthTags; uint16_t mRemotePort; uint16_t mDiscriminator; uint32_t mSetupPINCode; diff --git a/src/controller/ExampleOperationalCredentialsIssuer.cpp b/src/controller/ExampleOperationalCredentialsIssuer.cpp index a651c0d070d9a9..132f111a18c3e0 100644 --- a/src/controller/ExampleOperationalCredentialsIssuer.cpp +++ b/src/controller/ExampleOperationalCredentialsIssuer.cpp @@ -374,7 +374,7 @@ CHIP_ERROR ExampleOperationalCredentialsIssuer::GenerateNOCChain(const ByteSpan MutableByteSpan rcacSpan(rcac.Get(), kMaxDERCertLength); ReturnErrorOnFailure( - GenerateNOCChainAfterValidation(assignedId, mNextFabricId, chip::kUndefinedCATs, pubkey, rcacSpan, icacSpan, nocSpan)); + GenerateNOCChainAfterValidation(assignedId, mNextFabricId, mNextCATs, pubkey, rcacSpan, icacSpan, nocSpan)); // TODO(#13825): Should always generate some IPK. Using a temporary fixed value until APIs are plumbed in to set it end-to-end // TODO: Force callers to set IPK if used before GenerateNOCChain will succeed. diff --git a/src/controller/ExampleOperationalCredentialsIssuer.h b/src/controller/ExampleOperationalCredentialsIssuer.h index 6e3b1e554d4288..0f779f753dfaec 100644 --- a/src/controller/ExampleOperationalCredentialsIssuer.h +++ b/src/controller/ExampleOperationalCredentialsIssuer.h @@ -69,6 +69,8 @@ class DLL_EXPORT ExampleOperationalCredentialsIssuer : public OperationalCredent void SetFabricIdForNextNOCRequest(FabricId fabricId) override { mNextFabricId = fabricId; } + void SetCATValuesForNextNOCRequest(CATValues cats) { mNextCATs = cats; } + /** * @brief Initialize the issuer with the keypair in the storage. * If the storage doesn't have one, it'll create one, and it to the storage. @@ -123,6 +125,7 @@ class DLL_EXPORT ExampleOperationalCredentialsIssuer : public OperationalCredent NodeId mNextRequestedNodeId = 1; FabricId mNextFabricId = 1; + CATValues mNextCATs = kUndefinedCATs; bool mNodeIdRequested = false; uint64_t mIndex = 0; }; From 836390ed636ca36126dbcbe763d0f127626cba8d Mon Sep 17 00:00:00 2001 From: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> Date: Thu, 2 Feb 2023 11:17:47 -0500 Subject: [PATCH 10/25] Fix MoveToLevelWithOnOff to only set the SceneGlobalControl to true if it produced a On value. Also we were not checking the featuremap of the right cluster (#24800) --- src/app/clusters/level-control/level-control.cpp | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/app/clusters/level-control/level-control.cpp b/src/app/clusters/level-control/level-control.cpp index c97fad07a2fae3..497d3cb718f085 100644 --- a/src/app/clusters/level-control/level-control.cpp +++ b/src/app/clusters/level-control/level-control.cpp @@ -761,15 +761,14 @@ static EmberAfStatus moveToLevelHandler(EndpointId endpoint, CommandId commandId schedule(endpoint, computeCallbackWaitTimeMs(state->callbackSchedule, state->eventDurationMs)); status = EMBER_ZCL_STATUS_SUCCESS; - if (commandId == Commands::MoveToLevelWithOnOff::Id) +#ifdef EMBER_AF_PLUGIN_ON_OFF + // Check that the received MoveToLevelWithOnOff produces a On action and that the onoff support the lighting featuremap + if (commandId == Commands::MoveToLevelWithOnOff::Id && state->moveToLevel != state->minLevel && + OnOffServer::Instance().SupportsLightingApplications(endpoint)) { - uint32_t featureMap; - if (Attributes::FeatureMap::Get(endpoint, &featureMap) == EMBER_ZCL_STATUS_SUCCESS && - READBITS(featureMap, EMBER_AF_LEVEL_CONTROL_FEATURE_LIGHTING)) - { - OnOff::Attributes::GlobalSceneControl::Set(endpoint, true); - } + OnOff::Attributes::GlobalSceneControl::Set(endpoint, true); } +#endif // EMBER_AF_PLUGIN_ON_OFF return status; } From b12dbc352ef402c473ab6cf06a657c620c37c346 Mon Sep 17 00:00:00 2001 From: Terence Hampson Date: Thu, 2 Feb 2023 11:38:18 -0500 Subject: [PATCH 11/25] Fix issue where CI is failing because pseduo cluster does not have response mapping (#24823) --- .../py_matter_yamltests/matter_yamltests/parser.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/scripts/py_matter_yamltests/matter_yamltests/parser.py b/scripts/py_matter_yamltests/matter_yamltests/parser.py index cb17d7a35846f8..9c5b6247380d5f 100644 --- a/scripts/py_matter_yamltests/matter_yamltests/parser.py +++ b/scripts/py_matter_yamltests/matter_yamltests/parser.py @@ -690,14 +690,21 @@ def _response_constraints_validation(self, response, result): received_value = response.get('value') if not self.is_attribute: expected_name = value.get('name') - response_type_name = self._test.response_mapping.get( - expected_name) if received_value is None or expected_name not in received_value: received_value = None else: received_value = received_value.get( expected_name) if received_value else None + if self._test.response_mapping: + response_type_name = self._test.response_mapping.get( + expected_name) + else: + # We don't have a mapping for this type. This happens for pseduo clusters. + # If there is a constraint check for the type it is likely an incorrect + # constraint check by the test writter. + response_type_name = None + constraints = get_constraints(value['constraints']) if all([constraint.is_met(received_value, response_type_name) for constraint in constraints]): From c3a5b9ee8b2a29befbde723460a42e0d1d3d8350 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 2 Feb 2023 12:44:29 -0500 Subject: [PATCH 12/25] Fix memory leaks in MTRAsyncCallbackQueueWorkItem. (#24817) The item API pretty much requires a readyHandler that holds a reference to the item. Instead of assuming all consumers use __weak correctly to hold that reference, manually break cycles in MTRAsyncCallbackQueueWorkItem. --- .../CHIP/MTRAsyncCallbackWorkQueue.mm | 28 +++++- .../CHIPTests/MTRAsyncCallbackQueueTests.m | 86 +++++++++++++++++++ 2 files changed, 111 insertions(+), 3 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRAsyncCallbackWorkQueue.mm b/src/darwin/Framework/CHIP/MTRAsyncCallbackWorkQueue.mm index edb2265dfc5db7..e97ee154022cf6 100644 --- a/src/darwin/Framework/CHIP/MTRAsyncCallbackWorkQueue.mm +++ b/src/darwin/Framework/CHIP/MTRAsyncCallbackWorkQueue.mm @@ -168,9 +168,23 @@ - (instancetype)initWithQueue:(dispatch_queue_t)queue return self; } +- (void)invalidate +{ + // Make sure we don't leak via handlers that close over us, as ours must. + // This is a bit odd, since these are supposed to be non-nullable + // properties, but it's the best we can do given our API surface, unless we + // assume that all consumers consistently use __weak refs to us inside their + // handlers. + // + // Setting the attributes to nil will not compile; set the ivars directly. + _readyHandler = nil; + _cancelHandler = nil; +} + - (void)endWork { [self.workQueue endWork:self]; + [self invalidate]; } - (void)retryWork @@ -182,8 +196,13 @@ - (void)retryWork - (void)callReadyHandlerWithContext:(id)context { dispatch_async(self.queue, ^{ - self.readyHandler(context, self.retryCount); - self.retryCount++; + if (self.readyHandler == nil) { + // Nothing to do here. + [self endWork]; + } else { + self.readyHandler(context, self.retryCount); + self.retryCount++; + } }); } @@ -191,7 +210,10 @@ - (void)callReadyHandlerWithContext:(id)context - (void)cancel { dispatch_async(self.queue, ^{ - self.cancelHandler(); + if (self.cancelHandler != nil) { + self.cancelHandler(); + } + [self invalidate]; }); } @end diff --git a/src/darwin/Framework/CHIPTests/MTRAsyncCallbackQueueTests.m b/src/darwin/Framework/CHIPTests/MTRAsyncCallbackQueueTests.m index 7676d2051b9f5a..6612d8f2e3cebc 100644 --- a/src/darwin/Framework/CHIPTests/MTRAsyncCallbackQueueTests.m +++ b/src/darwin/Framework/CHIPTests/MTRAsyncCallbackQueueTests.m @@ -46,6 +46,12 @@ - (void)testRunItem }; [workQueue enqueueWorkItem:workItem1]; + // Check for leaks. + MTRAsyncCallbackQueueWorkItem * __weak weakItem = workItem1; + [self addTeardownBlock:^() { + XCTAssertNil(weakItem); + }]; + [self waitForExpectationsWithTimeout:5 handler:nil]; // see that it only ran once @@ -170,4 +176,84 @@ - (void)testRunItemsAfterDrain [self waitForExpectationsWithTimeout:5 handler:nil]; } +- (void)testRunItemNoHandlers +{ + XCTestExpectation * expectation = [self expectationWithDescription:@"Work item called"]; + + MTRAsyncCallbackWorkQueue * workQueue = [[MTRAsyncCallbackWorkQueue alloc] initWithContext:nil queue:dispatch_get_main_queue()]; + + MTRAsyncCallbackQueueWorkItem * workItem1 = + [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)]; + MTRAsyncCallbackQueueWorkItem * workItem2 = + [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)]; + + __block int counter = 0; + MTRAsyncCallbackReadyHandler readyHandler = ^(MTRDevice * _Nonnull device, NSUInteger retryCount) { + counter++; + [workItem2 endWork]; + [expectation fulfill]; + }; + workItem2.readyHandler = readyHandler; + workItem2.cancelHandler = ^{ + }; + + // Check that trying to run workItem1 does not crash. + [workQueue enqueueWorkItem:workItem1]; + [workQueue enqueueWorkItem:workItem2]; + + [self waitForExpectationsWithTimeout:5 handler:nil]; + + // see that it only ran once + XCTAssertEqual(counter, 1); +} + +- (void)testInvalidation +{ + XCTestExpectation * expectation = [self expectationWithDescription:@"Work item called"]; + XCTestExpectation * cancelExpectation = [self expectationWithDescription:@"Work item canceled"]; + + MTRAsyncCallbackWorkQueue * workQueue = [[MTRAsyncCallbackWorkQueue alloc] initWithContext:nil queue:dispatch_get_main_queue()]; + + MTRAsyncCallbackQueueWorkItem * workItem1 = + [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)]; + MTRAsyncCallbackReadyHandler readyHandler1 = ^(MTRDevice * _Nonnull device, NSUInteger retryCount) { + // Give the code enqueing the other items a chance to run, so they can + // actually get canceled. + sleep(1); + [workQueue invalidate]; + [workItem1 endWork]; + [expectation fulfill]; + }; + workItem1.readyHandler = readyHandler1; + // No cancel handler on purpose. + [workQueue enqueueWorkItem:workItem1]; + + MTRAsyncCallbackQueueWorkItem * workItem2 = + [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)]; + MTRAsyncCallbackReadyHandler readyHandler2 = ^(MTRDevice * _Nonnull device, NSUInteger retryCount) { + // This should never get called. + XCTAssertFalse(YES); + [workItem2 endWork]; + }; + workItem2.readyHandler = readyHandler2; + // No cancel handler on purpose. + [workQueue enqueueWorkItem:workItem2]; + + MTRAsyncCallbackQueueWorkItem * workItem3 = + [[MTRAsyncCallbackQueueWorkItem alloc] initWithQueue:dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)]; + MTRAsyncCallbackReadyHandler readyHandler3 = ^(MTRDevice * _Nonnull device, NSUInteger retryCount) { + // This should never get called. + XCTAssertFalse(YES); + [workItem3 endWork]; + }; + dispatch_block_t cancelHandler3 = ^() { + [cancelExpectation fulfill]; + }; + workItem3.readyHandler = readyHandler3; + workItem3.cancelHandler = cancelHandler3; + [workQueue enqueueWorkItem:workItem3]; + + [self waitForExpectations:@[ expectation, cancelExpectation ] timeout:5]; +} + @end From 653a5c021c376b1a9eb3ebfd09601e5876bfc696 Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Thu, 2 Feb 2023 13:00:18 -0500 Subject: [PATCH 13/25] Import chip::app::Clusters instead of app::Clusters (#24822) --- examples/tv-app/android/java/AppImpl.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/tv-app/android/java/AppImpl.cpp b/examples/tv-app/android/java/AppImpl.cpp index 2941b2a8f83499..91d177bba831b5 100644 --- a/examples/tv-app/android/java/AppImpl.cpp +++ b/examples/tv-app/android/java/AppImpl.cpp @@ -45,8 +45,8 @@ #include #include -using namespace app::Clusters; using namespace chip; +using namespace chip::app::Clusters; using namespace chip::AppPlatform; using namespace chip::DeviceLayer; From fbf362a95acb223567bf19142324aaf74522cabc Mon Sep 17 00:00:00 2001 From: Arkadiusz Bokowy Date: Thu, 2 Feb 2023 20:10:52 +0100 Subject: [PATCH 14/25] [Tizen] Docker image with QEMU for IoT app tests (#24813) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Tizen] Docker image with QEMU for IoT app tests * [Tizen] Simplify QEMU docker image * Uniform way for testing targets * Provide GN SDK for Tizen QEMU runner * Test Tizen QEMU Docker image --------- Co-authored-by: Damian Michalak-Szmaciński --- .github/workflows/docker_img.yaml | 1 + .../images/chip-build-tizen-qemu/Dockerfile | 180 +++++++++++++++ .../images/chip-build-tizen-qemu/build.sh | 1 + .../0001-smack-add-permissive-mode.patch | 208 ++++++++++++++++++ .../images/chip-build-tizen-qemu/run.sh | 1 + .../images/chip-build-tizen-qemu/version | 1 + .../docker/images/chip-build-tizen/Dockerfile | 6 +- .../docker/images/chip-build/Dockerfile | 7 +- integrations/docker/images/chip-build/version | 2 +- third_party/tizen/tizen_dev_certificate.py | 2 +- third_party/tizen/tizen_manifest_parser.py | 2 +- third_party/tizen/tizen_qemu.py | 119 ++++++++++ third_party/tizen/tizen_sdk.gni | 71 ++++++ 13 files changed, 590 insertions(+), 11 deletions(-) create mode 100644 integrations/docker/images/chip-build-tizen-qemu/Dockerfile create mode 120000 integrations/docker/images/chip-build-tizen-qemu/build.sh create mode 100644 integrations/docker/images/chip-build-tizen-qemu/files/0001-smack-add-permissive-mode.patch create mode 120000 integrations/docker/images/chip-build-tizen-qemu/run.sh create mode 120000 integrations/docker/images/chip-build-tizen-qemu/version create mode 100755 third_party/tizen/tizen_qemu.py diff --git a/.github/workflows/docker_img.yaml b/.github/workflows/docker_img.yaml index a0fc677dfc06d4..b7d93bc49279ce 100644 --- a/.github/workflows/docker_img.yaml +++ b/.github/workflows/docker_img.yaml @@ -54,6 +54,7 @@ jobs: - "-telink" - "-ti" - "-tizen" + - "-tizen-qemu" - "-openiotsdk" # NOTE: vscode image consumes ~52 GB disk space but GitHub-hosted runners provide ~10 GB free disk space(https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners#supported-runners-and-hardware-resources) #- "-vscode" diff --git a/integrations/docker/images/chip-build-tizen-qemu/Dockerfile b/integrations/docker/images/chip-build-tizen-qemu/Dockerfile new file mode 100644 index 00000000000000..8d2c3abb2ecbe1 --- /dev/null +++ b/integrations/docker/images/chip-build-tizen-qemu/Dockerfile @@ -0,0 +1,180 @@ +ARG VERSION=latest +FROM connectedhomeip/chip-build-tizen:${VERSION} + +ENV TIZEN_IOT_QEMU_KERNEL $TIZEN_SDK_ROOT/iot-qemu-virt-zImage +ENV TIZEN_IOT_IMAGE_ROOT $TIZEN_SDK_ROOT/iot-rootfs.img +ENV TIZEN_IOT_IMAGE_DATA $TIZEN_SDK_ROOT/iot-sysdata.img + +# ------------------------------------------------------------------------------ +# Switch to the root user so we could install things +USER root + +# ------------------------------------------------------------------------------ +# Install QEMU and build dependencies +RUN set -x \ + && apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -fy --no-install-recommends \ + bc \ + genisoimage \ + qemu-system-arm \ + # Cleanup + && apt-get clean \ + && rm -rf /var/lib/apt/lists \ + && : # last line + +# It seems that Linux kernel does not support overlay FS with SMACK enabled. In +# order not to disable SMACK LSM support completely (it could break some tools +# in Tizen ecosystem) we will add "permissive" mode to SMACK. +COPY files/0001-smack-add-permissive-mode.patch $TIZEN_SDK_ROOT/files/ + +# ------------------------------------------------------------------------------ +# Build Tizen kernel +RUN set -x \ + && mkdir -p /tmp/workdir && cd /tmp/workdir \ + # Download Linux rpi4 kernel + && wget --progress=dot:giga -r -nd --no-parent -A 'rpi4-linux-kernel-*.src.rpm' \ + http://download.tizen.org/snapshots/tizen/$TIZEN_VERSION-unified/latest/repos/standard/source/ \ + # Prepare kernel source (Linux kernel + Tizen patchset) + && unrpm rpi4-linux-kernel-*.src.rpm \ + && tar -xJf linux-kernel-*.tar.xz \ + && rm linux-kernel-*.tar.xz \ + && cd linux-kernel-* \ + && zcat ../*-to-*.diff.gz | patch -p1 \ + && patch -p1 < $TIZEN_SDK_ROOT/files/0001-smack-add-permissive-mode.patch \ + # Compile + && export MAKEFLAGS=-j$(nproc) \ + && export ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- \ + && make tizen_bcm2711_defconfig \ + && ./scripts/config -e ARCH_VIRT \ + && ./scripts/config -e VIRTIO_MMIO -e HW_RANDOM_VIRTIO \ + && ./scripts/config -e VIRTIO_PCI -e VIRTIO_BLK \ + && ./scripts/config -e VIRTIO_NET -e VETH \ + && ./scripts/config -e IKCONFIG -e IKCONFIG_PROC \ + && ./scripts/config -e BT_HCIVHCI -e CRYPTO_USER_API_HASH -e CRYPTO_USER_API_SKCIPHER \ + && ./scripts/config -e OVERLAY_FS -e ISO9660_FS \ + && ./scripts/config -e SECURITY_SMACK_PERMISSIVE_MODE \ + && make olddefconfig \ + && make zImage \ + && mv arch/arm/boot/zImage $TIZEN_IOT_QEMU_KERNEL \ + # Cleanup + && rm -rf /tmp/workdir \ + && : # last line + +# ------------------------------------------------------------------------------ +# Create Tizen IoT File System +RUN set -x \ + && mkdir -p /tmp/workdir && cd /tmp/workdir \ + && SYSTEMD_SYSTEM=/usr/lib/systemd/system \ + # Download Tizen images + && wget --progress=dot:giga -r -nd --no-parent -A 'tizen-*.tar.gz' \ + http://download.tizen.org/snapshots/tizen/unified/latest/images/standard/tizen-headless-armv7l/ \ + # Unpack + && tar -xzf tizen-*.tar.gz \ + && mv system-data.img $TIZEN_IOT_IMAGE_DATA \ + && mv rootfs.img $TIZEN_IOT_IMAGE_ROOT \ + # Install libguestfs and linux-image-generic required for in-place + # modifications of the rootfs image + && apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -fy --no-install-recommends libguestfs-tools linux-image-generic \ + # Add extra libraries to the root image + && guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda glob copy-in \ + $TIZEN_SDK_TOOLCHAIN/arm-tizen-linux-gnueabi/lib/libasan.so.* \ + $TIZEN_SDK_TOOLCHAIN/arm-tizen-linux-gnueabi/lib/libubsan.so.* \ + $TIZEN_SDK_SYSROOT/usr/lib/libcapi-network-thread.so.* \ + $TIZEN_SDK_SYSROOT/usr/lib/libnsd-dns-sd.so.* \ + /usr/lib/ \ + # Disable failing systemd services + && guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda glob rm $SYSTEMD_SYSTEM/deviced.service \ + && guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda glob rm $SYSTEMD_SYSTEM/mnt-inform.mount \ + && guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda glob rm $SYSTEMD_SYSTEM/murphyd.service \ + && guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda glob rm $SYSTEMD_SYSTEM/pulseaudio.service \ + # Mount Tizen system partition on /opt-ro instead of /opt + && SYSTEMD_UNIT_OPT_RO_MOUNT=$SYSTEMD_SYSTEM/opt\\x2dro.mount \ + && guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda ln-sf $SYSTEMD_UNIT_OPT_RO_MOUNT $SYSTEMD_SYSTEM/local-fs.target.requires \ + && guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda mv $SYSTEMD_SYSTEM/opt.mount $SYSTEMD_UNIT_OPT_RO_MOUNT \ + && virt-edit $TIZEN_IOT_IMAGE_ROOT -e 's#/opt#/opt-ro#g' $SYSTEMD_UNIT_OPT_RO_MOUNT \ + && virt-edit $TIZEN_IOT_IMAGE_ROOT -e 's#Options=#Options=ro,#' $SYSTEMD_UNIT_OPT_RO_MOUNT \ + && guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda mkdir /opt-ro \ + # Create /tmp/.opt-upper and /tmp/.opt-work after /tmp is mounted + && SYSTEMD_UNIT_OPT_PRE_MOUNT=$SYSTEMD_SYSTEM/opt.pre-mount.service \ + && echo -n \ + "[Unit]\n" \ + "DefaultDependencies=no\n" \ + "RequiresMountsFor=/tmp\n" \ + "[Service]\n" \ + "Type=oneshot\n" \ + "ExecStart=mkdir -p /tmp/.opt-upper /tmp/.opt-work\n" \ + "RemainAfterExit=yes\n" \ + | guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - $SYSTEMD_UNIT_OPT_PRE_MOUNT \ + # Mount Tizen system partition as a tmp-based overlay + && SYSTEMD_UNIT_OPT_MOUNT=$SYSTEMD_SYSTEM/opt.mount \ + && guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda ln-sf $SYSTEMD_UNIT_OPT_MOUNT $SYSTEMD_SYSTEM/local-fs.target.requires \ + && echo -n \ + "[Unit]\nConditionPathIsMountPoint=!/opt\n" \ + "RequiresMountsFor=/opt-ro /tmp\n" \ + "Wants=opt.pre-mount.service\n" \ + "After=opt.pre-mount.service\n" \ + "[Mount]\n" \ + "What=overlay\n" \ + "Where=/opt\n" \ + "Type=overlay\n" \ + "Options=lowerdir=/opt-ro,upperdir=/tmp/.opt-upper,workdir=/tmp/.opt-work\n" \ + | guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - $SYSTEMD_UNIT_OPT_MOUNT \ + # Fix SMACK label for /tmp/.opt-work/work + && SYSTEMD_UNIT_OPT_POST_MOUNT=$SYSTEMD_SYSTEM/opt.post-mount.service \ + && guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda ln-sf $SYSTEMD_UNIT_OPT_POST_MOUNT $SYSTEMD_SYSTEM/local-fs.target.requires \ + && echo -n \ + "[Unit]\n" \ + "DefaultDependencies=no\n" \ + "RequiresMountsFor=/opt\n" \ + "[Service]\n" \ + "Type=oneshot\n" \ + "ExecStart=chsmack -a * /tmp/.opt-work/work\n" \ + "RemainAfterExit=yes\n" \ + | guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - $SYSTEMD_UNIT_OPT_POST_MOUNT \ + # Mount Matter ISO image on startup + && SYSTEMD_UNIT_CHIP_MOUNT=$SYSTEMD_SYSTEM/mnt-chip.mount \ + && guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda ln-sf $SYSTEMD_UNIT_CHIP_MOUNT $SYSTEMD_SYSTEM/local-fs.target.requires \ + && echo -n \ + "[Unit]\n" \ + "ConditionPathIsMountPoint=!/mnt/chip\n" \ + "[Mount]\n" \ + "What=/dev/disk/by-label/CHIP\n" \ + "Where=/mnt/chip\n" \ + "Options=nofail\n" \ + | guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - $SYSTEMD_UNIT_CHIP_MOUNT \ + && guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda mkdir /mnt/chip \ + # Setup auto-login for root user + && SYSTEMD_UNIT_SERIAL_GETTY=$SYSTEMD_SYSTEM/serial-getty@.service \ + && virt-edit $TIZEN_IOT_IMAGE_ROOT -e \ + 's#^ExecStart=.*#ExecStart=-/sbin/agetty -o "-p -f root" --noclear -a root --keep-baud 115200 %I \$TERM#' $SYSTEMD_UNIT_SERIAL_GETTY \ + # Execute launcher script after root login + && echo -n \ + "[ -x /launcher.sh ] && /launcher.sh\n" \ + | guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - /root/.profile \ + # Launcher script + && echo -n \ + "#!/bin/bash\n" \ + "if [[ -x /mnt/chip/runner.sh ]]; then\n" \ + " echo '### RUNNER START ###'\n" \ + " /mnt/chip/runner.sh\n" \ + " echo '### RUNNER STOP:' $?\n" \ + "else\n" \ + " read -r -t 5 -p 'Press ENTER to access root shell...' && exit || echo ' timeout.'\n" \ + "fi\n" \ + "echo 'Shutting down emulated system...'\n" \ + "echo o > /proc/sysrq-trigger\n" \ + | guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda upload - /launcher.sh \ + && guestfish --rw -a $TIZEN_IOT_IMAGE_ROOT -m /dev/sda chmod 0755 /launcher.sh \ + # Remove ALL previously installed packages + && apt-get autopurge -fy $(tail -2 /var/log/apt/history.log | grep ^Install | cut -c 10- | sed 's/([^)]*),\?//g') \ + && rm -rf /var/lib/apt/lists \ + && rm -rf /var/tmp/.guestfs-0 \ + # Cleanup + && rm -rf /tmp/workdir \ + && : # last line + +# ------------------------------------------------------------------------------ +# Switch back to the non-root user +USER $USER_NAME +WORKDIR $USER_HOME diff --git a/integrations/docker/images/chip-build-tizen-qemu/build.sh b/integrations/docker/images/chip-build-tizen-qemu/build.sh new file mode 120000 index 00000000000000..fcb4d4ee75d531 --- /dev/null +++ b/integrations/docker/images/chip-build-tizen-qemu/build.sh @@ -0,0 +1 @@ +../../build.sh \ No newline at end of file diff --git a/integrations/docker/images/chip-build-tizen-qemu/files/0001-smack-add-permissive-mode.patch b/integrations/docker/images/chip-build-tizen-qemu/files/0001-smack-add-permissive-mode.patch new file mode 100644 index 00000000000000..2328f7fae4cb05 --- /dev/null +++ b/integrations/docker/images/chip-build-tizen-qemu/files/0001-smack-add-permissive-mode.patch @@ -0,0 +1,208 @@ +From: Chanho Park +Date: Tue, 3 Jun 2014 19:54:53 +0900 +Subject: [PATCH] LOCAL / smack: add permissive mode for debugging purpose + +This patch adds smack permissive mode. + +Signed-off-by: Chanho Park +Signed-off-by: Seung-Woo Kim +[k.kozlowski: rebased on 4.1] +Signed-off-by: Krzysztof Kozlowski +[m.szyprowski: rebased on 5.4] +Signed-off-by: Marek Szyprowski +--- + security/smack/Kconfig | 8 ++++ + security/smack/smack.h | 9 +++++ + security/smack/smack_access.c | 12 ++++++ + security/smack/smack_lsm.c | 11 ++++++ + security/smack/smackfs.c | 72 +++++++++++++++++++++++++++++++++++ + 5 files changed, 112 insertions(+) + +diff --git a/security/smack/Kconfig b/security/smack/Kconfig +index 5a8dfad469c3..39ded0b9bf38 100644 +--- a/security/smack/Kconfig ++++ b/security/smack/Kconfig +@@ -53,3 +53,11 @@ config SECURITY_SMACK_APPEND_SIGNALS + to differentiate between delivering a network packet and + delivering a signal in the Smack rules. + If you are unsure how to answer this question, answer N. ++ ++config SECURITY_SMACK_PERMISSIVE_MODE ++ bool "Enable Permissive mode for debugging purpose" ++ depends on SECURITY_SMACK ++ help ++ This selects the permissive mode of smack for debug purpose. This ++ do not block any access of the smack policy and just warn the block ++ by log message. +diff --git a/security/smack/smack.h b/security/smack/smack.h +index 335d2411abe4..9e8000c283cc 100644 +--- a/security/smack/smack.h ++++ b/security/smack/smack.h +@@ -424,6 +424,15 @@ static inline struct smack_known *smk_of_current(void) + return smk_of_task(smack_cred(current_cred())); + } + ++#ifdef CONFIG_SECURITY_SMACK_PERMISSIVE_MODE ++/* ++ * permissive mode ++ */ ++#define SMACK_PERMISSIVE_DENIED 0x0 ++#define SMACK_PERMISSIVE_ALLOWED 0x1 ++extern int permissive_mode; ++#endif ++ + /* + * logging functions + */ +diff --git a/security/smack/smack_access.c b/security/smack/smack_access.c +index 38ac3da4e791..2b63a2643ef5 100644 +--- a/security/smack/smack_access.c ++++ b/security/smack/smack_access.c +@@ -45,6 +45,14 @@ LIST_HEAD(smack_known_list); + */ + static u32 smack_next_secid = 10; + ++/* ++ * are we running in permissive mode? ++ * can be overwritten at run-time by /smack/permissive ++ */ ++#ifdef CONFIG_SECURITY_SMACK_PERMISSIVE_MODE ++int permissive_mode = SMACK_PERMISSIVE_ALLOWED; ++#endif ++ + /* + * what events do we log + * can be overwritten at run-time by /smack/logging +@@ -200,6 +208,10 @@ int smk_access(struct smack_known *subject, struct smack_known *object, + smack_log(subject->smk_known, object->smk_known, + request, rc, a); + #endif ++#ifdef CONFIG_SECURITY_SMACK_PERMISSIVE_MODE ++ if (permissive_mode == SMACK_PERMISSIVE_ALLOWED) ++ return 0; ++#endif + + return rc; + } +diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c +index 12c0fa85d9f8..a8d2f81690e4 100644 +--- a/security/smack/smack_lsm.c ++++ b/security/smack/smack_lsm.c +@@ -4796,6 +4796,17 @@ static __init int smack_init(void) + return 0; + } + ++#ifdef CONFIG_SECURITY_SMACK_PERMISSIVE_MODE ++static int __init mode_setup(char *str) ++{ ++ unsigned long mode; ++ if (!kstrtoul(str, 10, &mode)) ++ permissive_mode = mode ? 1 : 0; ++ return 1; ++} ++__setup("permissive=", mode_setup); ++#endif ++ + /* + * Smack requires early initialization in order to label + * all processes and objects when they are created. +diff --git a/security/smack/smackfs.c b/security/smack/smackfs.c +index c21b656b3263..fc033626085f 100644 +--- a/security/smack/smackfs.c ++++ b/security/smack/smackfs.c +@@ -59,6 +59,9 @@ enum smk_inos { + SMK_NET6ADDR = 23, /* single label IPv6 hosts */ + #endif /* CONFIG_IPV6 */ + SMK_RELABEL_SELF = 24, /* relabel possible without CAP_MAC_ADMIN */ ++#ifdef CONFIG_SECURITY_SMACK_PERMISSIVE_MODE ++ SMK_PERMISSIVE = 25, /* permissive mode */ ++#endif + }; + + /* +@@ -677,6 +680,71 @@ static const struct file_operations smk_load_ops = { + .release = seq_release, + }; + ++#ifdef CONFIG_SECURITY_SMACK_PERMISSIVE_MODE ++/** ++ * smk_read_permissive - read() for /smack/permissive ++ * @filp: file pointer, not actually used ++ * @buf: where to put the result ++ * @cn: maximum to send along ++ * @ppos: where to start ++ * ++ * Returns number of bytes read or error code, as appropriate ++ */ ++static ssize_t smk_read_permissive(struct file *filp, char __user *buf, ++ size_t count, loff_t *ppos) ++{ ++ char temp[32]; ++ ssize_t rc; ++ ++ if (*ppos != 0) ++ return 0; ++ ++ sprintf(temp, "%d\n", permissive_mode); ++ rc = simple_read_from_buffer(buf, count, ppos, temp, strlen(temp)); ++ return rc; ++} ++ ++/** ++ * smk_write_permissive - write() for /smack/permissive ++ * @file: file pointer, not actually used ++ * @buf: where to get the data from ++ * @count: bytes sent ++ * @ppos: where to start ++ * ++ * Returns number of bytes written or error code, as appropriate ++ */ ++static ssize_t smk_write_permissive(struct file *file, const char __user *buf, ++ size_t count, loff_t *ppos) ++{ ++ char temp[32]; ++ int i; ++ ++ if (!capable(CAP_MAC_ADMIN)) ++ return -EPERM; ++ ++ if (count >= sizeof(temp) || count == 0) ++ return -EINVAL; ++ ++ if (copy_from_user(temp, buf, count) != 0) ++ return -EFAULT; ++ ++ temp[count] = '\0'; ++ ++ if (sscanf(temp, "%d", &i) != 1) ++ return -EINVAL; ++ if (i < 0 || i > 1) ++ return -EINVAL; ++ permissive_mode = i; ++ return count; ++} ++ ++static const struct file_operations smk_permissive_ops = { ++ .read = smk_read_permissive, ++ .write = smk_write_permissive, ++ .llseek = default_llseek, ++}; ++#endif /* End of CONFIG_SECURITY_SMACK_PERMISSIVE_MODE */ ++ + /** + * smk_cipso_doi - initialize the CIPSO domain + */ +@@ -2881,6 +2949,10 @@ static int smk_fill_super(struct super_block *sb, struct fs_context *fc) + [SMK_UNCONFINED] = { + "unconfined", &smk_unconfined_ops, S_IRUGO|S_IWUSR}, + #endif ++#ifdef CONFIG_SECURITY_SMACK_PERMISSIVE_MODE ++ [SMK_PERMISSIVE] = { ++ "permissive", &smk_permissive_ops, S_IRUGO|S_IWUSR}, ++#endif + #if IS_ENABLED(CONFIG_IPV6) + [SMK_NET6ADDR] = { + "ipv6host", &smk_net6addr_ops, S_IRUGO|S_IWUSR}, +-- +2.17.1 + diff --git a/integrations/docker/images/chip-build-tizen-qemu/run.sh b/integrations/docker/images/chip-build-tizen-qemu/run.sh new file mode 120000 index 00000000000000..ccbd3501b330d9 --- /dev/null +++ b/integrations/docker/images/chip-build-tizen-qemu/run.sh @@ -0,0 +1 @@ +../../run.sh \ No newline at end of file diff --git a/integrations/docker/images/chip-build-tizen-qemu/version b/integrations/docker/images/chip-build-tizen-qemu/version new file mode 120000 index 00000000000000..a4280acd348e7f --- /dev/null +++ b/integrations/docker/images/chip-build-tizen-qemu/version @@ -0,0 +1 @@ +../chip-build/version \ No newline at end of file diff --git a/integrations/docker/images/chip-build-tizen/Dockerfile b/integrations/docker/images/chip-build-tizen/Dockerfile index 4aac9c1846f01a..f0334106b6cbbe 100644 --- a/integrations/docker/images/chip-build-tizen/Dockerfile +++ b/integrations/docker/images/chip-build-tizen/Dockerfile @@ -33,15 +33,13 @@ RUN set -x \ ENV TIZEN_VERSION 6.0 ENV TIZEN_SDK_ROOT /opt/tizen-sdk -COPY tizen-sdk-installer /tmp/tizen-sdk-installer +COPY tizen-sdk-installer $TIZEN_SDK_ROOT/files/installer RUN set -x \ - && bash /tmp/tizen-sdk-installer/install.sh \ + && bash $TIZEN_SDK_ROOT/files/installer/install.sh \ --tizen-sdk-path $TIZEN_SDK_ROOT \ --tizen-sdk-data-path $USER_HOME/tizen-sdk-data \ --tizen-version $TIZEN_VERSION \ --override-secret-tool \ - # Cleanup - && rm -rf /tmp/tizen-sdk-installer \ && : # last line # ------------------------------------------------------------------------------ diff --git a/integrations/docker/images/chip-build/Dockerfile b/integrations/docker/images/chip-build/Dockerfile index 8c0eaf7e486010..7b2f5c4593e3d3 100644 --- a/integrations/docker/images/chip-build/Dockerfile +++ b/integrations/docker/images/chip-build/Dockerfile @@ -95,7 +95,7 @@ RUN set -x \ && : # last line RUN set -x \ - && pip3 install \ + && pip3 install --no-cache-dir \ attrs \ click \ coloredlogs \ @@ -109,8 +109,6 @@ RUN set -x \ pygit \ PyGithub \ tabulate \ - # Cleanup - && pip3 cache purge \ && : # last line # build and install gn @@ -151,7 +149,7 @@ RUN set -x \ # Save clang-12 files, so we can restore them after build dependencies cleanup && tar -cf clang-12-files.tar $(dpkg -L libclang-common-12-dev |grep /include) /usr/lib/llvm-12/lib/libLLVM-12.so.1 \ # Cleanup build dependencies - && apt autoremove -fy clang-12 libclang-12-dev \ + && apt autopurge -fy clang-12 libclang-12-dev \ && rm -rf /var/lib/apt/lists/ \ # Restore clang-12 files && tar -xf clang-12-files.tar -C / \ @@ -168,6 +166,7 @@ RUN set -x \ ENV LD_LIBRARY_PATH_TSAN=/usr/lib/x86_64-linux-gnu-tsan RUN set -x \ && mkdir -p $LD_LIBRARY_PATH_TSAN \ + && export CCACHE_DISABLE=1 PYTHONDONTWRITEBYTECODE=1 \ && GLIB_VERSION=$(pkg-config --modversion glib-2.0) \ && git clone --depth=1 --branch=$GLIB_VERSION https://github.com/GNOME/glib.git \ && CFLAGS="-O2 -g -fsanitize=thread" meson glib/build glib \ diff --git a/integrations/docker/images/chip-build/version b/integrations/docker/images/chip-build/version index 0eb25cce600a57..d003f9e89eb144 100644 --- a/integrations/docker/images/chip-build/version +++ b/integrations/docker/images/chip-build/version @@ -1 +1 @@ -0.6.37 Version bump reason: removed ZAP from docker as CIPD now has it. +0.6.38 Version bump reason: [Tizen] Add QEMU docker image for running tests diff --git a/third_party/tizen/tizen_dev_certificate.py b/third_party/tizen/tizen_dev_certificate.py index 073561bad69ddd..9e43991fa51296 100755 --- a/third_party/tizen/tizen_dev_certificate.py +++ b/third_party/tizen/tizen_dev_certificate.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Copyright (c) 2022 Project CHIP Authors # diff --git a/third_party/tizen/tizen_manifest_parser.py b/third_party/tizen/tizen_manifest_parser.py index 3266a4adcb858e..ddb41ed9da07e6 100755 --- a/third_party/tizen/tizen_manifest_parser.py +++ b/third_party/tizen/tizen_manifest_parser.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # Copyright (c) 2022 Project CHIP Authors # diff --git a/third_party/tizen/tizen_qemu.py b/third_party/tizen/tizen_qemu.py new file mode 100755 index 00000000000000..548cc7f85431f4 --- /dev/null +++ b/third_party/tizen/tizen_qemu.py @@ -0,0 +1,119 @@ +#!/usr/bin/env python3 + +# Copyright (c) 2022 Project CHIP Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import argparse +import os +import re +import subprocess +import sys + +# Absolute path to Tizen Studio CLI tool. +tizen_sdk_root = os.environ["TIZEN_SDK_ROOT"] + +parser = argparse.ArgumentParser( + description="Run Tizen on QEMU.") +parser.add_argument( + '--smp', metavar='NUM', type=int, default=2, + help=("the number of CPUs available in QEMU; default: %(default)s")) +parser.add_argument( + '--memory', metavar='SIZE', type=int, default=512, + help=("the size of RAM assigned to QEMU; default: %(default)s")) +parser.add_argument( + '--virtio-net', action='store_true', + help="enable external network access via virtio-net") +parser.add_argument( + '--kernel', metavar='PATH', + default=os.path.join(tizen_sdk_root, "iot-qemu-virt-zImage"), + help=("path to the kernel image; " + "default: $TIZEN_SDK_ROOT/iot-qemu-virt-zImage")) +parser.add_argument( + '--image-root', metavar='IMAGE', + default=os.path.join(tizen_sdk_root, "iot-rootfs.img"), + help=("path to the root image; " + "default: $TIZEN_SDK_ROOT/iot-rootfs.img")) +parser.add_argument( + '--image-data', metavar='IMAGE', + default=os.path.join(tizen_sdk_root, "iot-sysdata.img"), + help=("path to the system data image; " + "default: $TIZEN_SDK_ROOT/iot-sysdata.img")) +parser.add_argument( + '--image-iso', metavar='IMAGE', + help=("path to the ISO image with the runner script; the ISO image " + "should have 'CHIP' label and a file named 'runner.sh' at the " + "root directory")) +parser.add_argument( + '--output', metavar='FILE', default="/dev/null", + help="store the QEMU output in a FILE") + +args = parser.parse_args() + +qemu_args = [ + 'qemu-system-arm', + '-monitor', 'null', + '-serial', 'stdio', + '-display', 'none', + '-M', 'virt', + '-smp', str(args.smp), + '-m', str(args.memory), +] + +if args.virtio_net: + # Add network support. + qemu_args += [ + '-device', 'virtio-net-device,netdev=virtio-net', + '-netdev', 'user,id=virtio-net', + ] + +if args.image_iso: + # Add a block device for the runner ISO image. + qemu_args += [ + '-device', 'virtio-blk-device,drive=virtio-blk3', + '-drive', 'file=%s,id=virtio-blk3,if=none,format=raw' % args.image_iso, + ] + +# Add Tizen image block devices. +qemu_args += [ + '-device', 'virtio-blk-device,drive=virtio-blk2', + '-drive', 'file=%s,id=virtio-blk2,if=none,format=raw,readonly=on' % args.image_data, + # XXX: Device for the root image has to be added as the last one so we can + # use /dev/vda as the root device in the kernel command line arguments. + '-device', 'virtio-blk-device,drive=virtio-blk1', + '-drive', 'file=%s,id=virtio-blk1,if=none,format=raw,readonly=on' % args.image_root, +] + +qemu_args += [ + '-kernel', args.kernel, + '-append', "console=ttyAMA0 earlyprintk earlycon root=/dev/vda", +] + +status = 0 +# Run QEMU. +with open(args.output, "wb") as output: + with subprocess.Popen(qemu_args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) as proc: + for line in iter(proc.stdout.readline, b''): + + # Forward the output to the stdout and the log file. + sys.stdout.write(line.decode(sys.stdout.encoding)) + sys.stdout.flush() + output.write(line) + + # Check if the runner script has finished and save the status. + stop = re.match(rb'^### RUNNER STOP: (?P\d+)', line) + if stop: + status = int(stop.group('status')) + +# Return with the status of the runner script. +sys.exit(status) diff --git a/third_party/tizen/tizen_sdk.gni b/third_party/tizen/tizen_sdk.gni index b3d3d8bc40ecda..0ac79b3fb5ba3a 100644 --- a/third_party/tizen/tizen_sdk.gni +++ b/third_party/tizen/tizen_sdk.gni @@ -20,6 +20,7 @@ import("${build_root}/config/tizen/config.gni") tizen_dev_certificate = get_path_info("tizen_dev_certificate.py", "abspath") tizen_manifest_parser = get_path_info("tizen_manifest_parser.py", "abspath") +tizen_qemu = get_path_info("tizen_qemu.py", "abspath") # Run Tizen Studio CLI as a project builder. # @@ -161,3 +162,73 @@ template("tizen_sdk_package") { ] } } + +# Create ISO image for Tizen QEMU. +# +# Parameters: +# runner: Path to the Tizen QEMU runner script. +# assets: List of assets to copy to the ISO image. +template("tizen_qemu_mkisofs") { + # This target shall only be used for testing purposes. + testonly = true + + assert(defined(invoker.runner), "It is required to specify runner script.") + assert(get_path_info(invoker.runner, "file") == "runner.sh", + "Runner script must be named 'runner.sh'") + + image_file = "${target_gen_dir}/${target_name}.iso" + + action(target_name) { + forward_variables_from(invoker, [ "deps" ]) + inputs = [ invoker.runner ] + outputs = [ image_file ] + + args = [ + "mkisofs", + "-input-charset=default", + "-VCHIP", # Volume ID = CHIP + "-JRU", # Joliet + Rock Ridge with untranslated filenames + "-o", + rebase_path(image_file), + rebase_path(invoker.runner, root_build_dir), + ] + if (defined(invoker.assets)) { + args += invoker.assets + inputs += invoker.assets + } + + script = "${build_root}/gn_run_binary.py" + } +} + +# Run Tizen in QEMU. +# +# Parameters: +# iso_image: The path to ISO image with the runner script. +# virtio_net: Enable external network access. +template("tizen_qemu_run") { + # This target shall only be used for testing purposes. + testonly = true + + assert(defined(invoker.iso_image), + "It is required to specify ISO runner image.") + + # Store QEMU output in a dedicated log file. + output_log_file = "${root_build_dir}/tizen-qemu-" + target_name + ".log" + + action(target_name) { + forward_variables_from(invoker, [ "deps" ]) + inputs = [ invoker.iso_image ] + outputs = [ output_log_file ] + + args = [ + "--image-iso=" + invoker.iso_image, + "--output=" + rebase_path(output_log_file), + ] + if (defined(invoker.virtio_net)) { + args += [ "--virtio-net" ] + } + + script = tizen_qemu + } +} From 2249d63299b7caf045b9a443cb0fc439bcb0a356 Mon Sep 17 00:00:00 2001 From: Vivien Nicolas Date: Thu, 2 Feb 2023 20:31:09 +0100 Subject: [PATCH 15/25] [types-silabs.xml] Remove enums/structs related to the old ZCL payload format and status (#24827) --- .../zcl/data-model/silabs/types-silabs.xml | 83 ------------------- 1 file changed, 83 deletions(-) diff --git a/src/app/zap-templates/zcl/data-model/silabs/types-silabs.xml b/src/app/zap-templates/zcl/data-model/silabs/types-silabs.xml index da1a8539d5a85c..5d0be8324e2bd1 100644 --- a/src/app/zap-templates/zcl/data-model/silabs/types-silabs.xml +++ b/src/app/zap-templates/zcl/data-model/silabs/types-silabs.xml @@ -149,89 +149,6 @@ limitations under the License. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 95b39cf7464d364739081711330cbef26b043be4 Mon Sep 17 00:00:00 2001 From: Douglas Rocha Ferraz Date: Thu, 2 Feb 2023 16:37:30 -0300 Subject: [PATCH 16/25] [nrfconnect] new: sleepy behaviour for lighting app (#23935) * new: sleepy behaviour for lighting app * chg: restyle * chg: removed prj_sleepy.conf. Left changes to AppTask.cpp to allow building sample using CSL * fix: should keep the router thread device on the basic use case for lighting --- examples/lighting-app/nrfconnect/main/AppTask.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/lighting-app/nrfconnect/main/AppTask.cpp b/examples/lighting-app/nrfconnect/main/AppTask.cpp index 7a9d8038314a45..8948ae1d3b3d33 100644 --- a/examples/lighting-app/nrfconnect/main/AppTask.cpp +++ b/examples/lighting-app/nrfconnect/main/AppTask.cpp @@ -156,7 +156,13 @@ CHIP_ERROR AppTask::Init() return err; } +#if CONFIG_CHIP_THREAD_SSED + err = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_SynchronizedSleepyEndDevice); +#elif CONFIG_OPENTHREAD_MTD_SED + err = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_SleepyEndDevice); +#else err = ConnectivityMgr().SetThreadDeviceType(ConnectivityManager::kThreadDeviceType_Router); +#endif if (err != CHIP_NO_ERROR) { From 624ba3b7508fd9a40a0db1ada314add78bf1110d Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 2 Feb 2023 14:55:03 -0500 Subject: [PATCH 17/25] Add the ability for OperationalSessionSetup to retry a few times automatically. (#24808) The basic idea is that if CASE establishment fails we try again, after a brief backoff. --- src/app/CASESessionManager.cpp | 11 ++- src/app/CASESessionManager.h | 10 +- src/app/OperationalSessionSetup.cpp | 119 ++++++++++++++++++++++-- src/app/OperationalSessionSetup.h | 25 ++++- src/controller/CHIPDeviceController.cpp | 7 +- src/include/platform/CHIPDeviceConfig.h | 32 +++++++ 6 files changed, 193 insertions(+), 11 deletions(-) diff --git a/src/app/CASESessionManager.cpp b/src/app/CASESessionManager.cpp index 9d4f3814943e42..3fca62d5cc37ed 100644 --- a/src/app/CASESessionManager.cpp +++ b/src/app/CASESessionManager.cpp @@ -30,7 +30,12 @@ CHIP_ERROR CASESessionManager::Init(chip::System::Layer * systemLayer, const CAS } void CASESessionManager::FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback * onConnection, - Callback::Callback * onFailure) + Callback::Callback * onFailure +#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + , + uint8_t attemptCount +#endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES +) { ChipLogDetail(CASESessionManager, "FindOrEstablishSession: PeerId = [%d:" ChipLogFormatX64 "]", peerId.GetFabricIndex(), ChipLogValueX64(peerId.GetNodeId())); @@ -53,6 +58,10 @@ void CASESessionManager::FindOrEstablishSession(const ScopedNodeId & peerId, Cal } } +#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + session->UpdateAttemptCount(attemptCount); +#endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + session->Connect(onConnection, onFailure); } diff --git a/src/app/CASESessionManager.h b/src/app/CASESessionManager.h index 1e901478aaf6b7..455ca0b3b36fe1 100644 --- a/src/app/CASESessionManager.h +++ b/src/app/CASESessionManager.h @@ -77,9 +77,17 @@ class CASESessionManager : public OperationalSessionReleaseDelegate, public Sess * * The `onFailure` callback may be called before the FindOrEstablishSession * call returns, for error cases that are detected synchronously. + * + * attemptCount can be used to automatically retry multiple times if session + * setup is not successful. */ void FindOrEstablishSession(const ScopedNodeId & peerId, Callback::Callback * onConnection, - Callback::Callback * onFailure); + Callback::Callback * onFailure +#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + , + uint8_t attemptCount = 1 +#endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + ); void ReleaseSessionsForFabric(FabricIndex fabricIndex); diff --git a/src/app/OperationalSessionSetup.cpp b/src/app/OperationalSessionSetup.cpp index f4e76ed700a370..a87741ea3a246b 100644 --- a/src/app/OperationalSessionSetup.cpp +++ b/src/app/OperationalSessionSetup.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include using namespace chip::Callback; @@ -49,7 +50,7 @@ void OperationalSessionSetup::MoveToState(State aTargetState) { if (mState != aTargetState) { - ChipLogDetail(Controller, "OperationalSessionSetup[%u:" ChipLogFormatX64 "]: State change %d --> %d", + ChipLogDetail(Discovery, "OperationalSessionSetup[%u:" ChipLogFormatX64 "]: State change %d --> %d", mPeerId.GetFabricIndex(), ChipLogValueX64(mPeerId.GetNodeId()), to_underlying(mState), to_underlying(aTargetState)); mState = aTargetState; @@ -70,7 +71,7 @@ bool OperationalSessionSetup::AttachToExistingSecureSession() if (!sessionHandle.HasValue()) return false; - ChipLogProgress(Controller, "Found an existing secure session to [%u:" ChipLogFormatX64 "]!", mPeerId.GetFabricIndex(), + ChipLogProgress(Discovery, "Found an existing secure session to [%u:" ChipLogFormatX64 "]!", mPeerId.GetFabricIndex(), ChipLogValueX64(mPeerId.GetNodeId())); mDeviceAddress = sessionHandle.Value()->AsSecureSession()->GetPeerAddress(); @@ -214,7 +215,7 @@ void OperationalSessionSetup::UpdateDeviceData(const Transport::PeerAddress & ad return; } - ChipLogError(Controller, "Received UpdateDeviceData in incorrect state"); + ChipLogError(Discovery, "Received UpdateDeviceData in incorrect state"); DequeueConnectionCallbacks(CHIP_ERROR_INCORRECT_STATE); // Do not touch `this` instance anymore; it has been destroyed in DequeueConnectionCallbacks. } @@ -304,7 +305,7 @@ void OperationalSessionSetup::DequeueConnectionCallbacks(CHIP_ERROR error) void OperationalSessionSetup::OnSessionEstablishmentError(CHIP_ERROR error) { VerifyOrReturn(mState != State::Uninitialized && mState != State::NeedsAddress, - ChipLogError(Controller, "HandleCASEConnectionFailure was called while the device was not initialized")); + ChipLogError(Discovery, "HandleCASEConnectionFailure was called while the device was not initialized")); if (CHIP_ERROR_TIMEOUT == error) { @@ -313,6 +314,17 @@ void OperationalSessionSetup::OnSessionEstablishmentError(CHIP_ERROR error) MoveToState(State::ResolvingAddress); return; } + +#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + if (mRemainingAttempts > 0) + { + CHIP_ERROR err = ScheduleSessionSetupReattempt(); + if (err == CHIP_NO_ERROR) + { + return; + } + } +#endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES } DequeueConnectionCallbacks(error); @@ -322,7 +334,7 @@ void OperationalSessionSetup::OnSessionEstablishmentError(CHIP_ERROR error) void OperationalSessionSetup::OnSessionEstablished(const SessionHandle & session) { VerifyOrReturn(mState != State::Uninitialized, - ChipLogError(Controller, "HandleCASEConnected was called while the device was not initialized")); + ChipLogError(Discovery, "HandleCASEConnected was called while the device was not initialized")); if (!mSecureSession.Grab(session)) return; // Got an invalid session, do not change any state @@ -377,6 +389,17 @@ OperationalSessionSetup::~OperationalSessionSetup() CHIP_ERROR OperationalSessionSetup::LookupPeerAddress() { +#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + if (mRemainingAttempts > 0) + { + --mRemainingAttempts; + } + if (mAttemptsDone < UINT8_MAX) + { + ++mAttemptsDone; + } +#endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + // NOTE: This is public API that can be used to update our stored peer // address even when we are in State::Connected, so we do not make any // MoveToState calls in this method. @@ -418,7 +441,7 @@ void OperationalSessionSetup::PerformAddressUpdate() CHIP_ERROR err = LookupPeerAddress(); if (err != CHIP_NO_ERROR) { - ChipLogError(Controller, "Failed to look up peer address: %" CHIP_ERROR_FORMAT, err.Format()); + ChipLogError(Discovery, "Failed to look up peer address: %" CHIP_ERROR_FORMAT, err.Format()); DequeueConnectionCallbacks(err); // Do not touch `this` instance anymore; it has been destroyed in DequeueConnectionCallbacks. return; @@ -435,9 +458,93 @@ void OperationalSessionSetup::OnNodeAddressResolutionFailed(const PeerId & peerI ChipLogError(Discovery, "OperationalSessionSetup[%u:" ChipLogFormatX64 "]: operational discovery failed: %" CHIP_ERROR_FORMAT, mPeerId.GetFabricIndex(), ChipLogValueX64(mPeerId.GetNodeId()), reason.Format()); + // Does it make sense to ScheduleSessionSetupReattempt() here? DNS-SD + // resolution has its own retry/backoff mechanisms, so if it's failed we + // have already done a lot of that. + // No need to modify any variables in `this` since call below releases `this`. DequeueConnectionCallbacks(reason); // Do not touch `this` instance anymore; it has been destroyed in DequeueConnectionCallbacks. } +#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES +void OperationalSessionSetup::UpdateAttemptCount(uint8_t attemptCount) +{ + if (attemptCount == 0) + { + // Nothing to do. + return; + } + + if (mState != State::NeedsAddress) + { + // We're in the middle of an attempt already, so decrement attemptCount + // by 1 to account for that. + --attemptCount; + } + + if (attemptCount > mRemainingAttempts) + { + mRemainingAttempts = attemptCount; + } +} + +CHIP_ERROR OperationalSessionSetup::ScheduleSessionSetupReattempt() +{ + VerifyOrDie(mRemainingAttempts > 0); + // Try again, but not if things are in shutdown such that we can't get + // to a system layer, and not if we've run out of attempts. + if (!mInitParams.exchangeMgr->GetSessionManager() || !mInitParams.exchangeMgr->GetSessionManager()->SystemLayer()) + { + return CHIP_ERROR_INCORRECT_STATE; + } + + MoveToState(State::NeedsAddress); + System::Clock::Seconds16 timerDelay; + // Stop exponential backoff before our delays get too large. + // + // Note that mAttemptsDone is always > 0 here, because we have + // just finished one attempt. + VerifyOrDie(mAttemptsDone > 0); + static_assert(UINT16_MAX / CHIP_DEVICE_CONFIG_AUTOMATIC_CASE_RETRY_INITIAL_DELAY_SECONDS >= + (1 << CHIP_DEVICE_CONFIG_AUTOMATIC_CASE_RETRY_MAX_BACKOFF), + "Our backoff calculation will overflow."); + timerDelay = System::Clock::Seconds16( + static_cast(CHIP_DEVICE_CONFIG_AUTOMATIC_CASE_RETRY_INITIAL_DELAY_SECONDS + << min((mAttemptsDone - 1), CHIP_DEVICE_CONFIG_AUTOMATIC_CASE_RETRY_MAX_BACKOFF))); + CHIP_ERROR err = mInitParams.exchangeMgr->GetSessionManager()->SystemLayer()->StartTimer(timerDelay, TrySetupAgain, this); + // The cast on count() is needed because the type count() returns might not + // actually be uint16_t; on some platforms it's int. + ChipLogProgress(Discovery, + "OperationalSessionSetup:attempts done: %u, attempts left: %u, retry delay %us, status %" CHIP_ERROR_FORMAT, + mAttemptsDone, mRemainingAttempts, static_cast(timerDelay.count()), err.Format()); + return err; +} + +void OperationalSessionSetup::TrySetupAgain(System::Layer * systemLayer, void * state) +{ + auto * self = static_cast(state); + + CHIP_ERROR err = CHIP_NO_ERROR; + + if (self->mState != State::NeedsAddress) + { + err = CHIP_ERROR_INCORRECT_STATE; + } + else + { + self->MoveToState(State::ResolvingAddress); + err = self->LookupPeerAddress(); + if (err == CHIP_NO_ERROR) + { + return; + } + } + + // Give up; we're either in a bad state or could not start a lookup. + self->DequeueConnectionCallbacks(err); + // Do not touch `self` instance anymore; it has been destroyed in DequeueConnectionCallbacks. +} +#endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + } // namespace chip diff --git a/src/app/OperationalSessionSetup.h b/src/app/OperationalSessionSetup.h index 825278ab771cab..029d355e25ef21 100644 --- a/src/app/OperationalSessionSetup.h +++ b/src/app/OperationalSessionSetup.h @@ -36,6 +36,7 @@ #include #include #include +#include #include #include #include @@ -158,7 +159,6 @@ class DLL_EXPORT OperationalSessionSetup : public SessionDelegate, } mClientPool = clientPool; - mSystemLayer = params.exchangeMgr->GetSessionManager()->SystemLayer(); mPeerId = peerId; mReleaseDelegate = releaseDelegate; mState = State::NeedsAddress; @@ -224,6 +224,11 @@ class DLL_EXPORT OperationalSessionSetup : public SessionDelegate, void OnNodeAddressResolved(const PeerId & peerId, const AddressResolve::ResolveResult & result) override; void OnNodeAddressResolutionFailed(const PeerId & peerId, CHIP_ERROR reason) override; +#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + // Update our remaining attempt count to be at least the given value. + void UpdateAttemptCount(uint8_t attemptCount); +#endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + private: enum class State : uint8_t { @@ -237,7 +242,6 @@ class DLL_EXPORT OperationalSessionSetup : public SessionDelegate, CASEClientInitParams mInitParams; CASEClientPoolDelegate * mClientPool = nullptr; - System::Layer * mSystemLayer; // mCASEClient is only non-null if we are in State::Connecting or just // allocated it as part of an attempt to enter State::Connecting. @@ -261,6 +265,11 @@ class DLL_EXPORT OperationalSessionSetup : public SessionDelegate, bool mPerformingAddressUpdate = false; +#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + uint8_t mRemainingAttempts = 0; + uint8_t mAttemptsDone = 0; +#endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + void MoveToState(State aTargetState); CHIP_ERROR EstablishConnection(const ReliableMessageProtocolConfig & config); @@ -301,6 +310,18 @@ class DLL_EXPORT OperationalSessionSetup : public SessionDelegate, * This function will set new IP address, port and MRP retransmission intervals of the device. */ void UpdateDeviceData(const Transport::PeerAddress & addr, const ReliableMessageProtocolConfig & config); + +#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + /** + * Schedule a setup reattempt, if possible. + */ + CHIP_ERROR ScheduleSessionSetupReattempt(); + + /** + * Helper for our backoff retry timer. + */ + static void TrySetupAgain(System::Layer * systemLayer, void * state); +#endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES }; } // namespace chip diff --git a/src/controller/CHIPDeviceController.cpp b/src/controller/CHIPDeviceController.cpp index a5bd64a78b98fa..f0caac0d738907 100644 --- a/src/controller/CHIPDeviceController.cpp +++ b/src/controller/CHIPDeviceController.cpp @@ -2441,7 +2441,12 @@ void DeviceCommissioner::PerformCommissioningStep(DeviceProxy * proxy, Commissio // If there is an error, CommissioningStageComplete will be called from OnDeviceConnectionFailureFn. auto scopedPeerId = GetPeerScopedId(proxy->GetDeviceId()); mSystemState->CASESessionMgr()->FindOrEstablishSession(scopedPeerId, &mOnDeviceConnectedCallback, - &mOnDeviceConnectionFailureCallback); + &mOnDeviceConnectionFailureCallback +#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + , + /* attemptCount = */ 3 +#endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + ); } break; case CommissioningStage::kSendComplete: { diff --git a/src/include/platform/CHIPDeviceConfig.h b/src/include/platform/CHIPDeviceConfig.h index 4b2d93013988b0..72cdf6e36c620d 100755 --- a/src/include/platform/CHIPDeviceConfig.h +++ b/src/include/platform/CHIPDeviceConfig.h @@ -1282,6 +1282,38 @@ #define CHIP_DEVICE_CONFIG_PAIRING_SECONDARY_INSTRUCTION "" #endif +/** + * CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + * + * If 1, enable support for automatic CASE establishment retries. + */ +#ifndef CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES +#define CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES 1 +#endif + +#if CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + +/** + * CHIP_DEVICE_CONFIG_AUTOMATIC_CASE_RETRY_INITIAL_DELAY_SECONDS + * + * The initial retry delay, in seconds, for our automatic CASE retries. + */ +#ifndef CHIP_DEVICE_CONFIG_AUTOMATIC_CASE_RETRY_INITIAL_DELAY_SECONDS +#define CHIP_DEVICE_CONFIG_AUTOMATIC_CASE_RETRY_INITIAL_DELAY_SECONDS 1 +#endif + +/** + * CHIP_DEVICE_CONFIG_AUTOMATIC_CASE_RETRY_MAX_BACKOFF + * + * The maximum number of times we back off, by a factor of 2 each time, from our + * initial CASE retry interval before we plateau. + */ +#ifndef CHIP_DEVICE_CONFIG_AUTOMATIC_CASE_RETRY_MAX_BACKOFF +#define CHIP_DEVICE_CONFIG_AUTOMATIC_CASE_RETRY_MAX_BACKOFF 5 +#endif + +#endif // CHIP_DEVICE_CONFIG_ENABLE_AUTOMATIC_CASE_RETRIES + // -------------------- App Platform Configuration -------------------- /** From fc41449659582354b44ed92905a6dc6ef9c9c227 Mon Sep 17 00:00:00 2001 From: Vivien Nicolas Date: Thu, 2 Feb 2023 21:09:29 +0100 Subject: [PATCH 18/25] [chip-tool] Add force-write to allow writing to non-writable attributes (#24788) * [chip-tool] Add write-override to allow writing to non-writable attributes * Update generated chip-tool commands --- .../commands/clusters/WriteAttributeCommand.h | 49 +- .../chip-tool/commands/common/Commands.cpp | 8 +- examples/chip-tool/templates/commands.zapt | 10 +- .../zap-generated/cluster/Commands.h | 3639 +++++++++++++---- 4 files changed, 2967 insertions(+), 739 deletions(-) diff --git a/examples/chip-tool/commands/clusters/WriteAttributeCommand.h b/examples/chip-tool/commands/clusters/WriteAttributeCommand.h index 1b92da403d3dab..c3cea8783dbdd0 100644 --- a/examples/chip-tool/commands/clusters/WriteAttributeCommand.h +++ b/examples/chip-tool/commands/clusters/WriteAttributeCommand.h @@ -23,12 +23,22 @@ #include "DataModelLogger.h" #include "ModelCommand.h" +constexpr const char * kWriteCommandKey = "write"; +constexpr const char * kWriteByIdCommandKey = "write-by-id"; +constexpr const char * kForceWriteCommandKey = "force-write"; + +enum class WriteCommandType +{ + kWrite, // regular, writable attributes + kForceWrite, // forced writes, send a write command on something expected to fail +}; + template > class WriteAttribute : public InteractionModelWriter, public ModelCommand, public chip::app::WriteClient::Callback { public: WriteAttribute(CredentialIssuerCommands * credsIssuerConfig) : - InteractionModelWriter(this), ModelCommand("write-by-id", credsIssuerConfig) + InteractionModelWriter(this), ModelCommand(kWriteByIdCommandKey, credsIssuerConfig) { AddArgumentClusterIds(); AddArgumentAttributeIds(); @@ -37,7 +47,7 @@ class WriteAttribute : public InteractionModelWriter, public ModelCommand, publi } WriteAttribute(chip::ClusterId clusterId, CredentialIssuerCommands * credsIssuerConfig) : - InteractionModelWriter(this), ModelCommand("write-by-id", credsIssuerConfig), mClusterIds(1, clusterId) + InteractionModelWriter(this), ModelCommand(kWriteByIdCommandKey, credsIssuerConfig), mClusterIds(1, clusterId) { AddArgumentAttributeIds(); AddArgumentAttributeValues(); @@ -46,8 +56,8 @@ class WriteAttribute : public InteractionModelWriter, public ModelCommand, publi template WriteAttribute(chip::ClusterId clusterId, const char * attributeName, minType minValue, maxType maxValue, - chip::AttributeId attributeId, CredentialIssuerCommands * credsIssuerConfig) : - WriteAttribute(clusterId, attributeId, credsIssuerConfig) + chip::AttributeId attributeId, WriteCommandType commandType, CredentialIssuerCommands * credsIssuerConfig) : + WriteAttribute(clusterId, attributeId, commandType, credsIssuerConfig) { AddArgumentAttributeName(attributeName); AddArgumentAttributeValues(static_cast(minValue), static_cast(maxValue)); @@ -55,8 +65,8 @@ class WriteAttribute : public InteractionModelWriter, public ModelCommand, publi } WriteAttribute(chip::ClusterId clusterId, const char * attributeName, float minValue, float maxValue, - chip::AttributeId attributeId, CredentialIssuerCommands * credsIssuerConfig) : - WriteAttribute(clusterId, attributeId, credsIssuerConfig) + chip::AttributeId attributeId, WriteCommandType commandType, CredentialIssuerCommands * credsIssuerConfig) : + WriteAttribute(clusterId, attributeId, commandType, credsIssuerConfig) { AddArgumentAttributeName(attributeName); AddArgumentAttributeValues(minValue, maxValue); @@ -64,8 +74,8 @@ class WriteAttribute : public InteractionModelWriter, public ModelCommand, publi } WriteAttribute(chip::ClusterId clusterId, const char * attributeName, double minValue, double maxValue, - chip::AttributeId attributeId, CredentialIssuerCommands * credsIssuerConfig) : - WriteAttribute(clusterId, attributeId, credsIssuerConfig) + chip::AttributeId attributeId, WriteCommandType commandType, CredentialIssuerCommands * credsIssuerConfig) : + WriteAttribute(clusterId, attributeId, commandType, credsIssuerConfig) { AddArgumentAttributeName(attributeName); AddArgumentAttributeValues(minValue, maxValue); @@ -73,8 +83,8 @@ class WriteAttribute : public InteractionModelWriter, public ModelCommand, publi } WriteAttribute(chip::ClusterId clusterId, const char * attributeName, chip::AttributeId attributeId, - CredentialIssuerCommands * credsIssuerConfig) : - WriteAttribute(clusterId, attributeId, credsIssuerConfig) + WriteCommandType commandType, CredentialIssuerCommands * credsIssuerConfig) : + WriteAttribute(clusterId, attributeId, commandType, credsIssuerConfig) { AddArgumentAttributeName(attributeName); AddArgumentAttributeValues(); @@ -82,8 +92,9 @@ class WriteAttribute : public InteractionModelWriter, public ModelCommand, publi } WriteAttribute(chip::ClusterId clusterId, const char * attributeName, chip::AttributeId attributeId, - TypedComplexArgument & attributeParser, CredentialIssuerCommands * credsIssuerConfig) : - WriteAttribute(clusterId, attributeId, credsIssuerConfig) + TypedComplexArgument & attributeParser, WriteCommandType commandType, + CredentialIssuerCommands * credsIssuerConfig) : + WriteAttribute(clusterId, attributeId, commandType, credsIssuerConfig) { AddArgumentAttributeName(attributeName); AddArgumentAttributeValues(attributeParser); @@ -159,7 +170,7 @@ class WriteAttribute : public InteractionModelWriter, public ModelCommand, publi protected: WriteAttribute(const char * attributeName, CredentialIssuerCommands * credsIssuerConfig) : - InteractionModelWriter(this), ModelCommand("write", credsIssuerConfig) + InteractionModelWriter(this), ModelCommand(kWriteCommandKey, credsIssuerConfig) { // Subclasses are responsible for calling AddArguments. } @@ -244,9 +255,11 @@ class WriteAttribute : public InteractionModelWriter, public ModelCommand, publi private: // This constructor is private as it is not intended to be used from outside the class. - WriteAttribute(chip::ClusterId clusterId, chip::AttributeId attributeId, CredentialIssuerCommands * credsIssuerConfig) : - InteractionModelWriter(this), ModelCommand("write", credsIssuerConfig), mClusterIds(1, clusterId), - mAttributeIds(1, attributeId) + WriteAttribute(chip::ClusterId clusterId, chip::AttributeId attributeId, WriteCommandType commandType, + CredentialIssuerCommands * credsIssuerConfig) : + InteractionModelWriter(this), + ModelCommand(commandType == WriteCommandType::kWrite ? kWriteCommandKey : kForceWriteCommandKey, credsIssuerConfig), + mClusterIds(1, clusterId), mAttributeIds(1, attributeId) {} std::vector mClusterIds; @@ -261,8 +274,8 @@ class WriteAttributeAsComplex : public WriteAttribute { public: WriteAttributeAsComplex(chip::ClusterId clusterId, const char * attributeName, chip::AttributeId attributeId, - CredentialIssuerCommands * credsIssuerConfig) : - WriteAttribute(clusterId, attributeName, attributeId, mAttributeParser, credsIssuerConfig) + WriteCommandType commandType, CredentialIssuerCommands * credsIssuerConfig) : + WriteAttribute(clusterId, attributeName, attributeId, mAttributeParser, commandType, credsIssuerConfig) {} private: diff --git a/examples/chip-tool/commands/common/Commands.cpp b/examples/chip-tool/commands/common/Commands.cpp index fb675ee96acb4d..adab8a12be75f5 100644 --- a/examples/chip-tool/commands/common/Commands.cpp +++ b/examples/chip-tool/commands/common/Commands.cpp @@ -267,7 +267,8 @@ Command * Commands::GetGlobalCommand(CommandsVector & commands, std::string comm bool Commands::IsAttributeCommand(std::string commandName) const { - return commandName.compare("read") == 0 || commandName.compare("write") == 0 || commandName.compare("subscribe") == 0; + return commandName.compare("read") == 0 || commandName.compare("write") == 0 || commandName.compare("force-write") == 0 || + commandName.compare("subscribe") == 0; } bool Commands::IsEventCommand(std::string commandName) const @@ -308,6 +309,7 @@ void Commands::ShowCluster(std::string executable, std::string clusterName, Comm fprintf(stderr, " +-------------------------------------------------------------------------------------+\n"); bool readCommand = false; bool writeCommand = false; + bool writeOverrideCommand = false; bool subscribeCommand = false; bool readEventCommand = false; bool subscribeEventCommand = false; @@ -325,6 +327,10 @@ void Commands::ShowCluster(std::string executable, std::string clusterName, Comm { writeCommand = true; } + else if (strcmp(command->GetName(), "force-write") == 0 && !writeOverrideCommand) + { + writeOverrideCommand = true; + } else if (strcmp(command->GetName(), "subscribe") == 0 && !subscribeCommand) { subscribeCommand = true; diff --git a/examples/chip-tool/templates/commands.zapt b/examples/chip-tool/templates/commands.zapt index b56772d44a5ad5..2fcc7e1abb94e2 100644 --- a/examples/chip-tool/templates/commands.zapt +++ b/examples/chip-tool/templates/commands.zapt @@ -93,21 +93,17 @@ void registerCluster{{asUpperCamelCase name}}(Commands & commands, CredentialIss {{/zcl_attributes_server}} make_unique>(Id, credsIssuerConfig), // {{#zcl_attributes_server}} - {{#if isWritable}} {{#if_chip_complex}} - make_unique>(Id, "{{cleanse_label_as_kebab_case (asUpperCamelCase name)}}", Attributes::{{asUpperCamelCase name}}::Id, credsIssuerConfig), // + make_unique>(Id, "{{cleanse_label_as_kebab_case (asUpperCamelCase name)}}", Attributes::{{asUpperCamelCase name}}::Id, WriteCommandType::k{{#unless isWritable}}Force{{/unless}}Write, credsIssuerConfig), // {{else if (isString type)}} - make_unique>(Id, "{{cleanse_label_as_kebab_case (asUpperCamelCase name)}}", Attributes::{{asUpperCamelCase name}}::Id, credsIssuerConfig), // + make_unique>(Id, "{{cleanse_label_as_kebab_case (asUpperCamelCase name)}}", Attributes::{{asUpperCamelCase name}}::Id, WriteCommandType::k{{#unless isWritable}}Force{{/unless}}Write, credsIssuerConfig), // {{else}} - make_unique>(Id, "{{cleanse_label_as_kebab_case (asUpperCamelCase name)}}", {{as_type_min_value type language='c++'}}, {{as_type_max_value type language='c++'}}, Attributes::{{asUpperCamelCase name}}::Id, credsIssuerConfig), // + make_unique>(Id, "{{cleanse_label_as_kebab_case (asUpperCamelCase name)}}", {{as_type_min_value type language='c++'}}, {{as_type_max_value type language='c++'}}, Attributes::{{asUpperCamelCase name}}::Id, WriteCommandType::k{{#unless isWritable}}Force{{/unless}}Write, credsIssuerConfig), // {{/if_chip_complex}} - {{/if}} {{/zcl_attributes_server}} make_unique(Id, credsIssuerConfig), // {{#zcl_attributes_server}} - {{#if isReportable}} make_unique(Id, "{{cleanse_label_as_kebab_case (asUpperCamelCase name)}}", Attributes::{{asUpperCamelCase name}}::Id, credsIssuerConfig), // - {{/if}} {{/zcl_attributes_server}} // // Events diff --git a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h index dfdbc2601f6d62..399f590a0ca7c8 100644 --- a/zzz_generated/chip-tool/zap-generated/cluster/Commands.h +++ b/zzz_generated/chip-tool/zap-generated/cluster/Commands.h @@ -8382,7 +8382,20 @@ void registerClusterIdentify(Commands & commands, CredentialIssuerCommands * cre make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // make_unique>(Id, "identify-time", 0, UINT16_MAX, Attributes::IdentifyTime::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "identify-type", 0, UINT8_MAX, Attributes::IdentifyType::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "identify-time", Attributes::IdentifyTime::Id, credsIssuerConfig), // make_unique(Id, "identify-type", Attributes::IdentifyType::Id, credsIssuerConfig), // @@ -8420,14 +8433,27 @@ void registerClusterGroups(Commands & commands, CredentialIssuerCommands * creds // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "name-support", Attributes::NameSupport::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "name-support", Attributes::NameSupport::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "name-support", 0, UINT8_MAX, Attributes::NameSupport::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "name-support", Attributes::NameSupport::Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // @@ -8468,19 +8494,43 @@ void registerClusterScenes(Commands & commands, CredentialIssuerCommands * creds // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "scene-count", Attributes::SceneCount::Id, credsIssuerConfig), // - make_unique(Id, "current-scene", Attributes::CurrentScene::Id, credsIssuerConfig), // - make_unique(Id, "current-group", Attributes::CurrentGroup::Id, credsIssuerConfig), // - make_unique(Id, "scene-valid", Attributes::SceneValid::Id, credsIssuerConfig), // - make_unique(Id, "name-support", Attributes::NameSupport::Id, credsIssuerConfig), // - make_unique(Id, "last-configured-by", Attributes::LastConfiguredBy::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "scene-count", Attributes::SceneCount::Id, credsIssuerConfig), // + make_unique(Id, "current-scene", Attributes::CurrentScene::Id, credsIssuerConfig), // + make_unique(Id, "current-group", Attributes::CurrentGroup::Id, credsIssuerConfig), // + make_unique(Id, "scene-valid", Attributes::SceneValid::Id, credsIssuerConfig), // + make_unique(Id, "name-support", Attributes::NameSupport::Id, credsIssuerConfig), // + make_unique(Id, "last-configured-by", Attributes::LastConfiguredBy::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "scene-count", 0, UINT8_MAX, Attributes::SceneCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "current-scene", 0, UINT8_MAX, Attributes::CurrentScene::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "current-group", 0, UINT16_MAX, Attributes::CurrentGroup::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "scene-valid", 0, 1, Attributes::SceneValid::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "name-support", 0, UINT8_MAX, Attributes::NameSupport::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "last-configured-by", 0, UINT64_MAX, Attributes::LastConfiguredBy::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "scene-count", Attributes::SceneCount::Id, credsIssuerConfig), // make_unique(Id, "current-scene", Attributes::CurrentScene::Id, credsIssuerConfig), // @@ -8534,11 +8584,27 @@ void registerClusterOnOff(Commands & commands, CredentialIssuerCommands * credsI make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // - make_unique>(Id, "on-time", 0, UINT16_MAX, Attributes::OnTime::Id, credsIssuerConfig), // - make_unique>(Id, "off-wait-time", 0, UINT16_MAX, Attributes::OffWaitTime::Id, + make_unique>(Id, "on-off", 0, 1, Attributes::OnOff::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "global-scene-control", 0, 1, Attributes::GlobalSceneControl::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "on-time", 0, UINT16_MAX, Attributes::OnTime::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "off-wait-time", 0, UINT16_MAX, Attributes::OffWaitTime::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "start-up-on-off", 0, UINT8_MAX, Attributes::StartUpOnOff::Id, credsIssuerConfig), // + Id, "start-up-on-off", 0, UINT8_MAX, Attributes::StartUpOnOff::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "on-off", Attributes::OnOff::Id, credsIssuerConfig), // make_unique(Id, "global-scene-control", Attributes::GlobalSceneControl::Id, credsIssuerConfig), // @@ -8582,8 +8648,21 @@ void registerClusterOnOffSwitchConfiguration(Commands & commands, CredentialIssu make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "switch-type", 0, UINT8_MAX, Attributes::SwitchType::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>(Id, "switch-actions", 0, UINT8_MAX, Attributes::SwitchActions::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "switch-type", Attributes::SwitchType::Id, credsIssuerConfig), // make_unique(Id, "switch-actions", Attributes::SwitchActions::Id, credsIssuerConfig), // @@ -8645,20 +8724,48 @@ void registerClusterLevelControl(Commands & commands, CredentialIssuerCommands * make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "current-level", 0, UINT8_MAX, Attributes::CurrentLevel::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "remaining-time", 0, UINT16_MAX, Attributes::RemainingTime::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "min-level", 0, UINT8_MAX, Attributes::MinLevel::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "max-level", 0, UINT8_MAX, Attributes::MaxLevel::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "current-frequency", 0, UINT16_MAX, Attributes::CurrentFrequency::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "min-frequency", 0, UINT16_MAX, Attributes::MinFrequency::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "max-frequency", 0, UINT16_MAX, Attributes::MaxFrequency::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>>( - Id, "options", 0, UINT8_MAX, Attributes::Options::Id, credsIssuerConfig), // + Id, "options", 0, UINT8_MAX, Attributes::Options::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "on-off-transition-time", 0, UINT16_MAX, Attributes::OnOffTransitionTime::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>(Id, "on-level", 0, UINT8_MAX, Attributes::OnLevel::Id, - credsIssuerConfig), // - make_unique>>( - Id, "on-transition-time", 0, UINT16_MAX, Attributes::OnTransitionTime::Id, credsIssuerConfig), // - make_unique>>( - Id, "off-transition-time", 0, UINT16_MAX, Attributes::OffTransitionTime::Id, credsIssuerConfig), // - make_unique>>(Id, "default-move-rate", 0, UINT8_MAX, - Attributes::DefaultMoveRate::Id, credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>(Id, "on-transition-time", 0, UINT16_MAX, + Attributes::OnTransitionTime::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>(Id, "off-transition-time", 0, UINT16_MAX, + Attributes::OffTransitionTime::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "start-up-current-level", 0, UINT8_MAX, Attributes::StartUpCurrentLevel::Id, credsIssuerConfig), // + Id, "default-move-rate", 0, UINT8_MAX, Attributes::DefaultMoveRate::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>(Id, "start-up-current-level", 0, UINT8_MAX, + Attributes::StartUpCurrentLevel::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "current-level", Attributes::CurrentLevel::Id, credsIssuerConfig), // make_unique(Id, "remaining-time", Attributes::RemainingTime::Id, credsIssuerConfig), // @@ -8702,28 +8809,51 @@ void registerClusterBinaryInputBasic(Commands & commands, CredentialIssuerComman // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "active-text", Attributes::ActiveText::Id, credsIssuerConfig), // - make_unique(Id, "description", Attributes::Description::Id, credsIssuerConfig), // - make_unique(Id, "inactive-text", Attributes::InactiveText::Id, credsIssuerConfig), // - make_unique(Id, "out-of-service", Attributes::OutOfService::Id, credsIssuerConfig), // - make_unique(Id, "polarity", Attributes::Polarity::Id, credsIssuerConfig), // - make_unique(Id, "present-value", Attributes::PresentValue::Id, credsIssuerConfig), // - make_unique(Id, "reliability", Attributes::Reliability::Id, credsIssuerConfig), // - make_unique(Id, "status-flags", Attributes::StatusFlags::Id, credsIssuerConfig), // - make_unique(Id, "application-type", Attributes::ApplicationType::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // - make_unique>(Id, "active-text", Attributes::ActiveText::Id, credsIssuerConfig), // - make_unique>(Id, "description", Attributes::Description::Id, credsIssuerConfig), // - make_unique>(Id, "inactive-text", Attributes::InactiveText::Id, credsIssuerConfig), // - make_unique>(Id, "out-of-service", 0, 1, Attributes::OutOfService::Id, credsIssuerConfig), // - make_unique>(Id, "present-value", 0, 1, Attributes::PresentValue::Id, credsIssuerConfig), // - make_unique>(Id, "reliability", 0, UINT8_MAX, Attributes::Reliability::Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "active-text", Attributes::ActiveText::Id, credsIssuerConfig), // + make_unique(Id, "description", Attributes::Description::Id, credsIssuerConfig), // + make_unique(Id, "inactive-text", Attributes::InactiveText::Id, credsIssuerConfig), // + make_unique(Id, "out-of-service", Attributes::OutOfService::Id, credsIssuerConfig), // + make_unique(Id, "polarity", Attributes::Polarity::Id, credsIssuerConfig), // + make_unique(Id, "present-value", Attributes::PresentValue::Id, credsIssuerConfig), // + make_unique(Id, "reliability", Attributes::Reliability::Id, credsIssuerConfig), // + make_unique(Id, "status-flags", Attributes::StatusFlags::Id, credsIssuerConfig), // + make_unique(Id, "application-type", Attributes::ApplicationType::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "active-text", Attributes::ActiveText::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "description", Attributes::Description::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "inactive-text", Attributes::InactiveText::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "out-of-service", 0, 1, Attributes::OutOfService::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "polarity", 0, UINT8_MAX, Attributes::Polarity::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "present-value", 0, 1, Attributes::PresentValue::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "reliability", 0, UINT8_MAX, Attributes::Reliability::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "status-flags", 0, UINT8_MAX, Attributes::StatusFlags::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "application-type", 0, UINT32_MAX, Attributes::ApplicationType::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "active-text", Attributes::ActiveText::Id, credsIssuerConfig), // make_unique(Id, "description", Attributes::Description::Id, credsIssuerConfig), // @@ -8762,13 +8892,24 @@ void registerClusterPulseWidthModulation(Commands & commands, CredentialIssuerCo // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // @@ -8798,17 +8939,37 @@ void registerClusterDescriptor(Commands & commands, CredentialIssuerCommands * c // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "device-type-list", Attributes::DeviceTypeList::Id, credsIssuerConfig), // - make_unique(Id, "server-list", Attributes::ServerList::Id, credsIssuerConfig), // - make_unique(Id, "client-list", Attributes::ClientList::Id, credsIssuerConfig), // - make_unique(Id, "parts-list", Attributes::PartsList::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "device-type-list", Attributes::DeviceTypeList::Id, credsIssuerConfig), // + make_unique(Id, "server-list", Attributes::ServerList::Id, credsIssuerConfig), // + make_unique(Id, "client-list", Attributes::ClientList::Id, credsIssuerConfig), // + make_unique(Id, "parts-list", Attributes::PartsList::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "device-type-list", Attributes::DeviceTypeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "server-list", Attributes::ServerList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "client-list", Attributes::ClientList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "parts-list", Attributes::PartsList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "device-type-list", Attributes::DeviceTypeList::Id, credsIssuerConfig), // make_unique(Id, "server-list", Attributes::ServerList::Id, credsIssuerConfig), // @@ -8852,7 +9013,18 @@ void registerClusterBinding(Commands & commands, CredentialIssuerCommands * cred make_unique>(Id, credsIssuerConfig), // make_unique< WriteAttributeAsComplex>>( - Id, "binding", Attributes::Binding::Id, credsIssuerConfig), // + Id, "binding", Attributes::Binding::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "binding", Attributes::Binding::Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // @@ -8900,10 +9072,30 @@ void registerClusterAccessControl(Commands & commands, CredentialIssuerCommands make_unique>(Id, credsIssuerConfig), // make_unique>>( - Id, "acl", Attributes::Acl::Id, credsIssuerConfig), // + Id, "acl", Attributes::Acl::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "extension", Attributes::Extension::Id, credsIssuerConfig), // + Id, "extension", Attributes::Extension::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "subjects-per-access-control-entry", 0, UINT16_MAX, + Attributes::SubjectsPerAccessControlEntry::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "targets-per-access-control-entry", 0, UINT16_MAX, + Attributes::TargetsPerAccessControlEntry::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "access-control-entries-per-fabric", 0, UINT16_MAX, + Attributes::AccessControlEntriesPerFabric::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "acl", Attributes::Acl::Id, credsIssuerConfig), // make_unique(Id, "extension", Attributes::Extension::Id, credsIssuerConfig), // @@ -8960,16 +9152,35 @@ void registerClusterActions(Commands & commands, CredentialIssuerCommands * cred // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "action-list", Attributes::ActionList::Id, credsIssuerConfig), // - make_unique(Id, "endpoint-lists", Attributes::EndpointLists::Id, credsIssuerConfig), // - make_unique(Id, "setup-url", Attributes::SetupURL::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "action-list", Attributes::ActionList::Id, credsIssuerConfig), // + make_unique(Id, "endpoint-lists", Attributes::EndpointLists::Id, credsIssuerConfig), // + make_unique(Id, "setup-url", Attributes::SetupURL::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique< + WriteAttributeAsComplex>>( + Id, "action-list", Attributes::ActionList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "endpoint-lists", Attributes::EndpointLists::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "setup-url", Attributes::SetupURL::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "action-list", Attributes::ActionList::Id, credsIssuerConfig), // make_unique(Id, "endpoint-lists", Attributes::EndpointLists::Id, credsIssuerConfig), // @@ -9034,10 +9245,57 @@ void registerClusterBasicInformation(Commands & commands, CredentialIssuerComman make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // - make_unique>(Id, "node-label", Attributes::NodeLabel::Id, credsIssuerConfig), // - make_unique>(Id, "location", Attributes::Location::Id, credsIssuerConfig), // + make_unique>(Id, "data-model-revision", 0, UINT16_MAX, Attributes::DataModelRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "vendor-name", Attributes::VendorName::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "vendor-id", 0, UINT16_MAX, Attributes::VendorID::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "product-name", Attributes::ProductName::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "product-id", 0, UINT16_MAX, Attributes::ProductID::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "node-label", Attributes::NodeLabel::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "location", Attributes::Location::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "hardware-version", 0, UINT16_MAX, Attributes::HardwareVersion::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "hardware-version-string", Attributes::HardwareVersionString::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "software-version", 0, UINT32_MAX, Attributes::SoftwareVersion::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "software-version-string", Attributes::SoftwareVersionString::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "manufacturing-date", Attributes::ManufacturingDate::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "part-number", Attributes::PartNumber::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "product-url", Attributes::ProductURL::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "product-label", Attributes::ProductLabel::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "serial-number", Attributes::SerialNumber::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>(Id, "local-config-disabled", 0, 1, Attributes::LocalConfigDisabled::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "reachable", 0, 1, Attributes::Reachable::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "unique-id", Attributes::UniqueID::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>( + Id, "capability-minima", Attributes::CapabilityMinima::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "data-model-revision", Attributes::DataModelRevision::Id, credsIssuerConfig), // make_unique(Id, "vendor-name", Attributes::VendorName::Id, credsIssuerConfig), // @@ -9098,13 +9356,24 @@ void registerClusterOtaSoftwareUpdateProvider(Commands & commands, CredentialIss // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // @@ -9148,7 +9417,25 @@ void registerClusterOtaSoftwareUpdateRequestor(Commands & commands, CredentialIs make_unique>(Id, credsIssuerConfig), // make_unique>>( - Id, "default-otaproviders", Attributes::DefaultOTAProviders::Id, credsIssuerConfig), // + Id, "default-otaproviders", Attributes::DefaultOTAProviders::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "update-possible", 0, 1, Attributes::UpdatePossible::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>( + Id, "update-state", 0, UINT8_MAX, Attributes::UpdateState::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "update-state-progress", 0, UINT8_MAX, + Attributes::UpdateStateProgress::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "default-otaproviders", Attributes::DefaultOTAProviders::Id, credsIssuerConfig), // make_unique(Id, "update-possible", Attributes::UpdatePossible::Id, credsIssuerConfig), // @@ -9188,16 +9475,30 @@ void registerClusterLocalizationConfiguration(Commands & commands, CredentialIss // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "active-locale", Attributes::ActiveLocale::Id, credsIssuerConfig), // - make_unique(Id, "supported-locales", Attributes::SupportedLocales::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // - make_unique>(Id, "active-locale", Attributes::ActiveLocale::Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "active-locale", Attributes::ActiveLocale::Id, credsIssuerConfig), // + make_unique(Id, "supported-locales", Attributes::SupportedLocales::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "active-locale", Attributes::ActiveLocale::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>>( + Id, "supported-locales", Attributes::SupportedLocales::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "active-locale", Attributes::ActiveLocale::Id, credsIssuerConfig), // make_unique(Id, "supported-locales", Attributes::SupportedLocales::Id, credsIssuerConfig), // @@ -9240,9 +9541,25 @@ void registerClusterTimeFormatLocalization(Commands & commands, CredentialIssuer make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // make_unique>( - Id, "hour-format", 0, UINT8_MAX, Attributes::HourFormat::Id, credsIssuerConfig), // + Id, "hour-format", 0, UINT8_MAX, Attributes::HourFormat::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>( - Id, "active-calendar-type", 0, UINT8_MAX, Attributes::ActiveCalendarType::Id, credsIssuerConfig), // + Id, "active-calendar-type", 0, UINT8_MAX, Attributes::ActiveCalendarType::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique< + WriteAttributeAsComplex>>( + Id, "supported-calendar-types", Attributes::SupportedCalendarTypes::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "hour-format", Attributes::HourFormat::Id, credsIssuerConfig), // make_unique(Id, "active-calendar-type", Attributes::ActiveCalendarType::Id, credsIssuerConfig), // @@ -9285,7 +9602,18 @@ void registerClusterUnitLocalization(Commands & commands, CredentialIssuerComman make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // make_unique>( - Id, "temperature-unit", 0, UINT8_MAX, Attributes::TemperatureUnit::Id, credsIssuerConfig), // + Id, "temperature-unit", 0, UINT8_MAX, Attributes::TemperatureUnit::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "temperature-unit", Attributes::TemperatureUnit::Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // @@ -9316,14 +9644,27 @@ void registerClusterPowerSourceConfiguration(Commands & commands, CredentialIssu // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "sources", Attributes::Sources::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "sources", Attributes::Sources::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "sources", Attributes::Sources::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "sources", Attributes::Sources::Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // @@ -9396,10 +9737,95 @@ void registerClusterPowerSource(Commands & commands, CredentialIssuerCommands * make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "status", Attributes::Status::Id, credsIssuerConfig), // - make_unique(Id, "order", Attributes::Order::Id, credsIssuerConfig), // - make_unique(Id, "description", Attributes::Description::Id, credsIssuerConfig), // + make_unique>( + Id, "status", 0, UINT8_MAX, Attributes::Status::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "order", 0, UINT8_MAX, Attributes::Order::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "description", Attributes::Description::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>(Id, "wired-assessed-input-voltage", 0, UINT32_MAX, + Attributes::WiredAssessedInputVoltage::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "wired-assessed-input-frequency", 0, UINT16_MAX, + Attributes::WiredAssessedInputFrequency::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>( + Id, "wired-current-type", 0, UINT8_MAX, Attributes::WiredCurrentType::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>(Id, "wired-assessed-current", 0, UINT32_MAX, + Attributes::WiredAssessedCurrent::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "wired-nominal-voltage", 0, UINT32_MAX, Attributes::WiredNominalVoltage::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "wired-maximum-current", 0, UINT32_MAX, Attributes::WiredMaximumCurrent::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "wired-present", 0, 1, Attributes::WiredPresent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "active-wired-faults", Attributes::ActiveWiredFaults::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "bat-voltage", 0, UINT32_MAX, Attributes::BatVoltage::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "bat-percent-remaining", 0, UINT8_MAX, + Attributes::BatPercentRemaining::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "bat-time-remaining", 0, UINT32_MAX, + Attributes::BatTimeRemaining::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>( + Id, "bat-charge-level", 0, UINT8_MAX, Attributes::BatChargeLevel::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "bat-replacement-needed", 0, 1, Attributes::BatReplacementNeeded::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>( + Id, "bat-replaceability", 0, UINT8_MAX, Attributes::BatReplaceability::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "bat-present", 0, 1, Attributes::BatPresent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "active-bat-faults", Attributes::ActiveBatFaults::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "bat-replacement-description", Attributes::BatReplacementDescription::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "bat-common-designation", 0, UINT32_MAX, Attributes::BatCommonDesignation::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "bat-ansidesignation", Attributes::BatANSIDesignation::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "bat-iecdesignation", Attributes::BatIECDesignation::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "bat-approved-chemistry", 0, UINT32_MAX, Attributes::BatApprovedChemistry::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "bat-capacity", 0, UINT32_MAX, Attributes::BatCapacity::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "bat-quantity", 0, UINT8_MAX, Attributes::BatQuantity::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>( + Id, "bat-charge-state", 0, UINT8_MAX, Attributes::BatChargeState::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>(Id, "bat-time-to-full-charge", 0, UINT32_MAX, + Attributes::BatTimeToFullCharge::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "bat-functional-while-charging", 0, 1, Attributes::BatFunctionalWhileCharging::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "bat-charging-current", 0, UINT32_MAX, + Attributes::BatChargingCurrent::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "active-bat-charge-faults", Attributes::ActiveBatChargeFaults::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "status", Attributes::Status::Id, credsIssuerConfig), // + make_unique(Id, "order", Attributes::Order::Id, credsIssuerConfig), // + make_unique(Id, "description", Attributes::Description::Id, credsIssuerConfig), // make_unique(Id, "wired-assessed-input-voltage", Attributes::WiredAssessedInputVoltage::Id, credsIssuerConfig), // make_unique(Id, "wired-assessed-input-frequency", Attributes::WiredAssessedInputFrequency::Id, @@ -9476,16 +9902,39 @@ void registerClusterGeneralCommissioning(Commands & commands, CredentialIssuerCo make_unique(Id, "regulatory-config", Attributes::RegulatoryConfig::Id, credsIssuerConfig), // make_unique(Id, "location-capability", Attributes::LocationCapability::Id, credsIssuerConfig), // make_unique(Id, "supports-concurrent-connection", Attributes::SupportsConcurrentConnection::Id, - credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // - make_unique>(Id, "breadcrumb", 0, UINT64_MAX, Attributes::Breadcrumb::Id, credsIssuerConfig), // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "breadcrumb", Attributes::Breadcrumb::Id, credsIssuerConfig), // + credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "breadcrumb", 0, UINT64_MAX, Attributes::Breadcrumb::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>( + Id, "basic-commissioning-info", Attributes::BasicCommissioningInfo::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>( + Id, "regulatory-config", 0, UINT8_MAX, Attributes::RegulatoryConfig::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>( + Id, "location-capability", 0, UINT8_MAX, Attributes::LocationCapability::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "supports-concurrent-connection", 0, 1, Attributes::SupportsConcurrentConnection::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "breadcrumb", Attributes::Breadcrumb::Id, credsIssuerConfig), // make_unique(Id, "basic-commissioning-info", Attributes::BasicCommissioningInfo::Id, credsIssuerConfig), // make_unique(Id, "regulatory-config", Attributes::RegulatoryConfig::Id, credsIssuerConfig), // @@ -9526,26 +9975,56 @@ void registerClusterNetworkCommissioning(Commands & commands, CredentialIssuerCo // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "max-networks", Attributes::MaxNetworks::Id, credsIssuerConfig), // - make_unique(Id, "networks", Attributes::Networks::Id, credsIssuerConfig), // - make_unique(Id, "scan-max-time-seconds", Attributes::ScanMaxTimeSeconds::Id, credsIssuerConfig), // - make_unique(Id, "connect-max-time-seconds", Attributes::ConnectMaxTimeSeconds::Id, credsIssuerConfig), // - make_unique(Id, "interface-enabled", Attributes::InterfaceEnabled::Id, credsIssuerConfig), // - make_unique(Id, "last-networking-status", Attributes::LastNetworkingStatus::Id, credsIssuerConfig), // - make_unique(Id, "last-network-id", Attributes::LastNetworkID::Id, credsIssuerConfig), // - make_unique(Id, "last-connect-error-value", Attributes::LastConnectErrorValue::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // - make_unique>(Id, "interface-enabled", 0, 1, Attributes::InterfaceEnabled::Id, credsIssuerConfig), // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "max-networks", Attributes::MaxNetworks::Id, credsIssuerConfig), // - make_unique(Id, "networks", Attributes::Networks::Id, credsIssuerConfig), // - make_unique(Id, "scan-max-time-seconds", Attributes::ScanMaxTimeSeconds::Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "max-networks", Attributes::MaxNetworks::Id, credsIssuerConfig), // + make_unique(Id, "networks", Attributes::Networks::Id, credsIssuerConfig), // + make_unique(Id, "scan-max-time-seconds", Attributes::ScanMaxTimeSeconds::Id, credsIssuerConfig), // + make_unique(Id, "connect-max-time-seconds", Attributes::ConnectMaxTimeSeconds::Id, credsIssuerConfig), // + make_unique(Id, "interface-enabled", Attributes::InterfaceEnabled::Id, credsIssuerConfig), // + make_unique(Id, "last-networking-status", Attributes::LastNetworkingStatus::Id, credsIssuerConfig), // + make_unique(Id, "last-network-id", Attributes::LastNetworkID::Id, credsIssuerConfig), // + make_unique(Id, "last-connect-error-value", Attributes::LastConnectErrorValue::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "max-networks", 0, UINT8_MAX, Attributes::MaxNetworks::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "networks", Attributes::Networks::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "scan-max-time-seconds", 0, UINT8_MAX, Attributes::ScanMaxTimeSeconds::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "connect-max-time-seconds", 0, UINT8_MAX, Attributes::ConnectMaxTimeSeconds::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "interface-enabled", 0, 1, Attributes::InterfaceEnabled::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique< + WriteAttribute>>( + Id, "last-networking-status", 0, UINT8_MAX, Attributes::LastNetworkingStatus::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "last-network-id", Attributes::LastNetworkID::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "last-connect-error-value", INT32_MIN, INT32_MAX, + Attributes::LastConnectErrorValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "max-networks", Attributes::MaxNetworks::Id, credsIssuerConfig), // + make_unique(Id, "networks", Attributes::Networks::Id, credsIssuerConfig), // + make_unique(Id, "scan-max-time-seconds", Attributes::ScanMaxTimeSeconds::Id, credsIssuerConfig), // make_unique(Id, "connect-max-time-seconds", Attributes::ConnectMaxTimeSeconds::Id, credsIssuerConfig), // make_unique(Id, "interface-enabled", Attributes::InterfaceEnabled::Id, credsIssuerConfig), // @@ -9582,13 +10061,24 @@ void registerClusterDiagnosticLogs(Commands & commands, CredentialIssuerCommands // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // @@ -9629,13 +10119,47 @@ void registerClusterGeneralDiagnostics(Commands & commands, CredentialIssuerComm make_unique(Id, "active-radio-faults", Attributes::ActiveRadioFaults::Id, credsIssuerConfig), // make_unique(Id, "active-network-faults", Attributes::ActiveNetworkFaults::Id, credsIssuerConfig), // make_unique(Id, "test-event-triggers-enabled", Attributes::TestEventTriggersEnabled::Id, - credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "network-interfaces", Attributes::NetworkInterfaces::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "reboot-count", 0, UINT16_MAX, Attributes::RebootCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "up-time", 0, UINT64_MAX, Attributes::UpTime::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "total-operational-hours", 0, UINT32_MAX, Attributes::TotalOperationalHours::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>( + Id, "boot-reason", 0, UINT8_MAX, Attributes::BootReason::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique< + WriteAttributeAsComplex>>( + Id, "active-hardware-faults", Attributes::ActiveHardwareFaults::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique< + WriteAttributeAsComplex>>( + Id, "active-radio-faults", Attributes::ActiveRadioFaults::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique< + WriteAttributeAsComplex>>( + Id, "active-network-faults", Attributes::ActiveNetworkFaults::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "test-event-triggers-enabled", 0, 1, Attributes::TestEventTriggersEnabled::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "network-interfaces", Attributes::NetworkInterfaces::Id, credsIssuerConfig), // make_unique(Id, "reboot-count", Attributes::RebootCount::Id, credsIssuerConfig), // @@ -9696,10 +10220,31 @@ void registerClusterSoftwareDiagnostics(Commands & commands, CredentialIssuerCom make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "thread-metrics", Attributes::ThreadMetrics::Id, credsIssuerConfig), // - make_unique(Id, "current-heap-free", Attributes::CurrentHeapFree::Id, credsIssuerConfig), // - make_unique(Id, "current-heap-used", Attributes::CurrentHeapUsed::Id, credsIssuerConfig), // + make_unique>>( + Id, "thread-metrics", Attributes::ThreadMetrics::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "current-heap-free", 0, UINT64_MAX, Attributes::CurrentHeapFree::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "current-heap-used", 0, UINT64_MAX, Attributes::CurrentHeapUsed::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "current-heap-high-watermark", 0, UINT64_MAX, + Attributes::CurrentHeapHighWatermark::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "thread-metrics", Attributes::ThreadMetrics::Id, credsIssuerConfig), // + make_unique(Id, "current-heap-free", Attributes::CurrentHeapFree::Id, credsIssuerConfig), // + make_unique(Id, "current-heap-used", Attributes::CurrentHeapUsed::Id, credsIssuerConfig), // make_unique(Id, "current-heap-high-watermark", Attributes::CurrentHeapHighWatermark::Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // @@ -9810,26 +10355,183 @@ void registerClusterThreadNetworkDiagnostics(Commands & commands, CredentialIssu make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "channel", Attributes::Channel::Id, credsIssuerConfig), // - make_unique(Id, "routing-role", Attributes::RoutingRole::Id, credsIssuerConfig), // - make_unique(Id, "network-name", Attributes::NetworkName::Id, credsIssuerConfig), // - make_unique(Id, "pan-id", Attributes::PanId::Id, credsIssuerConfig), // - make_unique(Id, "extended-pan-id", Attributes::ExtendedPanId::Id, credsIssuerConfig), // - make_unique(Id, "mesh-local-prefix", Attributes::MeshLocalPrefix::Id, credsIssuerConfig), // - make_unique(Id, "overrun-count", Attributes::OverrunCount::Id, credsIssuerConfig), // - make_unique(Id, "neighbor-table", Attributes::NeighborTable::Id, credsIssuerConfig), // - make_unique(Id, "route-table", Attributes::RouteTable::Id, credsIssuerConfig), // - make_unique(Id, "partition-id", Attributes::PartitionId::Id, credsIssuerConfig), // - make_unique(Id, "weighting", Attributes::Weighting::Id, credsIssuerConfig), // - make_unique(Id, "data-version", Attributes::DataVersion::Id, credsIssuerConfig), // - make_unique(Id, "stable-data-version", Attributes::StableDataVersion::Id, credsIssuerConfig), // - make_unique(Id, "leader-router-id", Attributes::LeaderRouterId::Id, credsIssuerConfig), // - make_unique(Id, "detached-role-count", Attributes::DetachedRoleCount::Id, credsIssuerConfig), // - make_unique(Id, "child-role-count", Attributes::ChildRoleCount::Id, credsIssuerConfig), // - make_unique(Id, "router-role-count", Attributes::RouterRoleCount::Id, credsIssuerConfig), // - make_unique(Id, "leader-role-count", Attributes::LeaderRoleCount::Id, credsIssuerConfig), // - make_unique(Id, "attach-attempt-count", Attributes::AttachAttemptCount::Id, credsIssuerConfig), // + make_unique>>(Id, "channel", 0, UINT16_MAX, Attributes::Channel::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "routing-role", 0, UINT8_MAX, Attributes::RoutingRole::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "network-name", Attributes::NetworkName::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "pan-id", 0, UINT16_MAX, Attributes::PanId::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "extended-pan-id", 0, UINT64_MAX, + Attributes::ExtendedPanId::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "mesh-local-prefix", Attributes::MeshLocalPrefix::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "overrun-count", 0, UINT64_MAX, Attributes::OverrunCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "neighbor-table", Attributes::NeighborTable::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "route-table", Attributes::RouteTable::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "partition-id", 0, UINT32_MAX, Attributes::PartitionId::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "weighting", 0, UINT8_MAX, Attributes::Weighting::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "data-version", 0, UINT8_MAX, Attributes::DataVersion::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "stable-data-version", 0, UINT8_MAX, + Attributes::StableDataVersion::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "leader-router-id", 0, UINT8_MAX, + Attributes::LeaderRouterId::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "detached-role-count", 0, UINT16_MAX, Attributes::DetachedRoleCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "child-role-count", 0, UINT16_MAX, Attributes::ChildRoleCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "router-role-count", 0, UINT16_MAX, Attributes::RouterRoleCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "leader-role-count", 0, UINT16_MAX, Attributes::LeaderRoleCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "attach-attempt-count", 0, UINT16_MAX, Attributes::AttachAttemptCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "partition-id-change-count", 0, UINT16_MAX, + Attributes::PartitionIdChangeCount::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "better-partition-attach-attempt-count", 0, UINT16_MAX, + Attributes::BetterPartitionAttachAttemptCount::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "parent-change-count", 0, UINT16_MAX, Attributes::ParentChangeCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-total-count", 0, UINT32_MAX, Attributes::TxTotalCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-unicast-count", 0, UINT32_MAX, Attributes::TxUnicastCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-broadcast-count", 0, UINT32_MAX, Attributes::TxBroadcastCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-ack-requested-count", 0, UINT32_MAX, Attributes::TxAckRequestedCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-acked-count", 0, UINT32_MAX, Attributes::TxAckedCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-no-ack-requested-count", 0, UINT32_MAX, Attributes::TxNoAckRequestedCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-data-count", 0, UINT32_MAX, Attributes::TxDataCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-data-poll-count", 0, UINT32_MAX, Attributes::TxDataPollCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-beacon-count", 0, UINT32_MAX, Attributes::TxBeaconCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-beacon-request-count", 0, UINT32_MAX, Attributes::TxBeaconRequestCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-other-count", 0, UINT32_MAX, Attributes::TxOtherCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-retry-count", 0, UINT32_MAX, Attributes::TxRetryCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-direct-max-retry-expiry-count", 0, UINT32_MAX, + Attributes::TxDirectMaxRetryExpiryCount::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "tx-indirect-max-retry-expiry-count", 0, UINT32_MAX, + Attributes::TxIndirectMaxRetryExpiryCount::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "tx-err-cca-count", 0, UINT32_MAX, Attributes::TxErrCcaCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-err-abort-count", 0, UINT32_MAX, Attributes::TxErrAbortCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-err-busy-channel-count", 0, UINT32_MAX, Attributes::TxErrBusyChannelCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rx-total-count", 0, UINT32_MAX, Attributes::RxTotalCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rx-unicast-count", 0, UINT32_MAX, Attributes::RxUnicastCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rx-broadcast-count", 0, UINT32_MAX, Attributes::RxBroadcastCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rx-data-count", 0, UINT32_MAX, Attributes::RxDataCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rx-data-poll-count", 0, UINT32_MAX, Attributes::RxDataPollCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rx-beacon-count", 0, UINT32_MAX, Attributes::RxBeaconCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rx-beacon-request-count", 0, UINT32_MAX, Attributes::RxBeaconRequestCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rx-other-count", 0, UINT32_MAX, Attributes::RxOtherCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rx-address-filtered-count", 0, UINT32_MAX, + Attributes::RxAddressFilteredCount::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rx-dest-addr-filtered-count", 0, UINT32_MAX, + Attributes::RxDestAddrFilteredCount::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rx-duplicated-count", 0, UINT32_MAX, Attributes::RxDuplicatedCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rx-err-no-frame-count", 0, UINT32_MAX, Attributes::RxErrNoFrameCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rx-err-unknown-neighbor-count", 0, UINT32_MAX, + Attributes::RxErrUnknownNeighborCount::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rx-err-invalid-src-addr-count", 0, UINT32_MAX, + Attributes::RxErrInvalidSrcAddrCount::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rx-err-sec-count", 0, UINT32_MAX, Attributes::RxErrSecCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rx-err-fcs-count", 0, UINT32_MAX, Attributes::RxErrFcsCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rx-err-other-count", 0, UINT32_MAX, Attributes::RxErrOtherCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "active-timestamp", 0, UINT64_MAX, + Attributes::ActiveTimestamp::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "pending-timestamp", 0, UINT64_MAX, + Attributes::PendingTimestamp::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "delay", 0, UINT32_MAX, Attributes::Delay::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "security-policy", Attributes::SecurityPolicy::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "channel-page0mask", Attributes::ChannelPage0Mask::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "operational-dataset-components", Attributes::OperationalDatasetComponents::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique< + WriteAttributeAsComplex>>( + Id, "active-network-faults-list", Attributes::ActiveNetworkFaultsList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "channel", Attributes::Channel::Id, credsIssuerConfig), // + make_unique(Id, "routing-role", Attributes::RoutingRole::Id, credsIssuerConfig), // + make_unique(Id, "network-name", Attributes::NetworkName::Id, credsIssuerConfig), // + make_unique(Id, "pan-id", Attributes::PanId::Id, credsIssuerConfig), // + make_unique(Id, "extended-pan-id", Attributes::ExtendedPanId::Id, credsIssuerConfig), // + make_unique(Id, "mesh-local-prefix", Attributes::MeshLocalPrefix::Id, credsIssuerConfig), // + make_unique(Id, "overrun-count", Attributes::OverrunCount::Id, credsIssuerConfig), // + make_unique(Id, "neighbor-table", Attributes::NeighborTable::Id, credsIssuerConfig), // + make_unique(Id, "route-table", Attributes::RouteTable::Id, credsIssuerConfig), // + make_unique(Id, "partition-id", Attributes::PartitionId::Id, credsIssuerConfig), // + make_unique(Id, "weighting", Attributes::Weighting::Id, credsIssuerConfig), // + make_unique(Id, "data-version", Attributes::DataVersion::Id, credsIssuerConfig), // + make_unique(Id, "stable-data-version", Attributes::StableDataVersion::Id, credsIssuerConfig), // + make_unique(Id, "leader-router-id", Attributes::LeaderRouterId::Id, credsIssuerConfig), // + make_unique(Id, "detached-role-count", Attributes::DetachedRoleCount::Id, credsIssuerConfig), // + make_unique(Id, "child-role-count", Attributes::ChildRoleCount::Id, credsIssuerConfig), // + make_unique(Id, "router-role-count", Attributes::RouterRoleCount::Id, credsIssuerConfig), // + make_unique(Id, "leader-role-count", Attributes::LeaderRoleCount::Id, credsIssuerConfig), // + make_unique(Id, "attach-attempt-count", Attributes::AttachAttemptCount::Id, credsIssuerConfig), // make_unique(Id, "partition-id-change-count", Attributes::PartitionIdChangeCount::Id, credsIssuerConfig), // make_unique(Id, "better-partition-attach-attempt-count", @@ -9939,14 +10641,59 @@ void registerClusterWiFiNetworkDiagnostics(Commands & commands, CredentialIssuer make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "bssid", Attributes::Bssid::Id, credsIssuerConfig), // - make_unique(Id, "security-type", Attributes::SecurityType::Id, credsIssuerConfig), // - make_unique(Id, "wi-fi-version", Attributes::WiFiVersion::Id, credsIssuerConfig), // - make_unique(Id, "channel-number", Attributes::ChannelNumber::Id, credsIssuerConfig), // - make_unique(Id, "rssi", Attributes::Rssi::Id, credsIssuerConfig), // - make_unique(Id, "beacon-lost-count", Attributes::BeaconLostCount::Id, credsIssuerConfig), // - make_unique(Id, "beacon-rx-count", Attributes::BeaconRxCount::Id, credsIssuerConfig), // + make_unique>>( + Id, "bssid", Attributes::Bssid::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "security-type", 0, UINT8_MAX, Attributes::SecurityType::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "wi-fi-version", 0, UINT8_MAX, Attributes::WiFiVersion::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "channel-number", 0, UINT16_MAX, + Attributes::ChannelNumber::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "rssi", INT8_MIN, INT8_MAX, Attributes::Rssi::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "beacon-lost-count", 0, UINT32_MAX, + Attributes::BeaconLostCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "beacon-rx-count", 0, UINT32_MAX, + Attributes::BeaconRxCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "packet-multicast-rx-count", 0, UINT32_MAX, + Attributes::PacketMulticastRxCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "packet-multicast-tx-count", 0, UINT32_MAX, + Attributes::PacketMulticastTxCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "packet-unicast-rx-count", 0, UINT32_MAX, + Attributes::PacketUnicastRxCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "packet-unicast-tx-count", 0, UINT32_MAX, + Attributes::PacketUnicastTxCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "current-max-rate", 0, UINT64_MAX, + Attributes::CurrentMaxRate::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "overrun-count", 0, UINT64_MAX, Attributes::OverrunCount::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "bssid", Attributes::Bssid::Id, credsIssuerConfig), // + make_unique(Id, "security-type", Attributes::SecurityType::Id, credsIssuerConfig), // + make_unique(Id, "wi-fi-version", Attributes::WiFiVersion::Id, credsIssuerConfig), // + make_unique(Id, "channel-number", Attributes::ChannelNumber::Id, credsIssuerConfig), // + make_unique(Id, "rssi", Attributes::Rssi::Id, credsIssuerConfig), // + make_unique(Id, "beacon-lost-count", Attributes::BeaconLostCount::Id, credsIssuerConfig), // + make_unique(Id, "beacon-rx-count", Attributes::BeaconRxCount::Id, credsIssuerConfig), // make_unique(Id, "packet-multicast-rx-count", Attributes::PacketMulticastRxCount::Id, credsIssuerConfig), // make_unique(Id, "packet-multicast-tx-count", Attributes::PacketMulticastTxCount::Id, @@ -9990,22 +10737,51 @@ void registerClusterEthernetNetworkDiagnostics(Commands & commands, CredentialIs // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "phyrate", Attributes::PHYRate::Id, credsIssuerConfig), // - make_unique(Id, "full-duplex", Attributes::FullDuplex::Id, credsIssuerConfig), // - make_unique(Id, "packet-rx-count", Attributes::PacketRxCount::Id, credsIssuerConfig), // - make_unique(Id, "packet-tx-count", Attributes::PacketTxCount::Id, credsIssuerConfig), // - make_unique(Id, "tx-err-count", Attributes::TxErrCount::Id, credsIssuerConfig), // - make_unique(Id, "collision-count", Attributes::CollisionCount::Id, credsIssuerConfig), // - make_unique(Id, "overrun-count", Attributes::OverrunCount::Id, credsIssuerConfig), // - make_unique(Id, "carrier-detect", Attributes::CarrierDetect::Id, credsIssuerConfig), // - make_unique(Id, "time-since-reset", Attributes::TimeSinceReset::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "phyrate", Attributes::PHYRate::Id, credsIssuerConfig), // + make_unique(Id, "full-duplex", Attributes::FullDuplex::Id, credsIssuerConfig), // + make_unique(Id, "packet-rx-count", Attributes::PacketRxCount::Id, credsIssuerConfig), // + make_unique(Id, "packet-tx-count", Attributes::PacketTxCount::Id, credsIssuerConfig), // + make_unique(Id, "tx-err-count", Attributes::TxErrCount::Id, credsIssuerConfig), // + make_unique(Id, "collision-count", Attributes::CollisionCount::Id, credsIssuerConfig), // + make_unique(Id, "overrun-count", Attributes::OverrunCount::Id, credsIssuerConfig), // + make_unique(Id, "carrier-detect", Attributes::CarrierDetect::Id, credsIssuerConfig), // + make_unique(Id, "time-since-reset", Attributes::TimeSinceReset::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "phyrate", 0, UINT8_MAX, Attributes::PHYRate::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "full-duplex", 0, 1, Attributes::FullDuplex::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "packet-rx-count", 0, UINT64_MAX, Attributes::PacketRxCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "packet-tx-count", 0, UINT64_MAX, Attributes::PacketTxCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tx-err-count", 0, UINT64_MAX, Attributes::TxErrCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "collision-count", 0, UINT64_MAX, Attributes::CollisionCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "overrun-count", 0, UINT64_MAX, Attributes::OverrunCount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "carrier-detect", 0, 1, Attributes::CarrierDetect::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "time-since-reset", 0, UINT64_MAX, Attributes::TimeSinceReset::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "phyrate", Attributes::PHYRate::Id, credsIssuerConfig), // make_unique(Id, "full-duplex", Attributes::FullDuplex::Id, credsIssuerConfig), // @@ -10062,16 +10838,41 @@ void registerClusterTimeSynchronization(Commands & commands, CredentialIssuerCom make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // - make_unique>>( - Id, "trusted-time-node-id", 0, UINT64_MAX, Attributes::TrustedTimeNodeId::Id, credsIssuerConfig), // + make_unique>>(Id, "utctime", 0, UINT64_MAX, Attributes::UTCTime::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>( + Id, "granularity", 0, UINT8_MAX, Attributes::Granularity::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>( + Id, "time-source", 0, UINT8_MAX, Attributes::TimeSource::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "trusted-time-node-id", 0, UINT64_MAX, + Attributes::TrustedTimeNodeId::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>(Id, "default-ntp", Attributes::DefaultNtp::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "time-zone", Attributes::TimeZone::Id, credsIssuerConfig), // + Id, "time-zone", Attributes::TimeZone::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "dst-offset", Attributes::DstOffset::Id, credsIssuerConfig), // + Id, "dst-offset", Attributes::DstOffset::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "local-time", 0, UINT64_MAX, Attributes::LocalTime::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "time-zone-database", 0, 1, Attributes::TimeZoneDatabase::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "ntp-server-port", 0, UINT16_MAX, + Attributes::NtpServerPort::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "utctime", Attributes::UTCTime::Id, credsIssuerConfig), // make_unique(Id, "granularity", Attributes::Granularity::Id, credsIssuerConfig), // @@ -10111,29 +10912,69 @@ void registerClusterBridgedDeviceBasicInformation(Commands & commands, Credentia // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "vendor-name", Attributes::VendorName::Id, credsIssuerConfig), // - make_unique(Id, "vendor-id", Attributes::VendorID::Id, credsIssuerConfig), // - make_unique(Id, "product-name", Attributes::ProductName::Id, credsIssuerConfig), // - make_unique(Id, "node-label", Attributes::NodeLabel::Id, credsIssuerConfig), // - make_unique(Id, "hardware-version", Attributes::HardwareVersion::Id, credsIssuerConfig), // - make_unique(Id, "hardware-version-string", Attributes::HardwareVersionString::Id, credsIssuerConfig), // - make_unique(Id, "software-version", Attributes::SoftwareVersion::Id, credsIssuerConfig), // - make_unique(Id, "software-version-string", Attributes::SoftwareVersionString::Id, credsIssuerConfig), // - make_unique(Id, "manufacturing-date", Attributes::ManufacturingDate::Id, credsIssuerConfig), // - make_unique(Id, "part-number", Attributes::PartNumber::Id, credsIssuerConfig), // - make_unique(Id, "product-url", Attributes::ProductURL::Id, credsIssuerConfig), // - make_unique(Id, "product-label", Attributes::ProductLabel::Id, credsIssuerConfig), // - make_unique(Id, "serial-number", Attributes::SerialNumber::Id, credsIssuerConfig), // - make_unique(Id, "reachable", Attributes::Reachable::Id, credsIssuerConfig), // - make_unique(Id, "unique-id", Attributes::UniqueID::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // - make_unique>(Id, "node-label", Attributes::NodeLabel::Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "vendor-name", Attributes::VendorName::Id, credsIssuerConfig), // + make_unique(Id, "vendor-id", Attributes::VendorID::Id, credsIssuerConfig), // + make_unique(Id, "product-name", Attributes::ProductName::Id, credsIssuerConfig), // + make_unique(Id, "node-label", Attributes::NodeLabel::Id, credsIssuerConfig), // + make_unique(Id, "hardware-version", Attributes::HardwareVersion::Id, credsIssuerConfig), // + make_unique(Id, "hardware-version-string", Attributes::HardwareVersionString::Id, credsIssuerConfig), // + make_unique(Id, "software-version", Attributes::SoftwareVersion::Id, credsIssuerConfig), // + make_unique(Id, "software-version-string", Attributes::SoftwareVersionString::Id, credsIssuerConfig), // + make_unique(Id, "manufacturing-date", Attributes::ManufacturingDate::Id, credsIssuerConfig), // + make_unique(Id, "part-number", Attributes::PartNumber::Id, credsIssuerConfig), // + make_unique(Id, "product-url", Attributes::ProductURL::Id, credsIssuerConfig), // + make_unique(Id, "product-label", Attributes::ProductLabel::Id, credsIssuerConfig), // + make_unique(Id, "serial-number", Attributes::SerialNumber::Id, credsIssuerConfig), // + make_unique(Id, "reachable", Attributes::Reachable::Id, credsIssuerConfig), // + make_unique(Id, "unique-id", Attributes::UniqueID::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "vendor-name", Attributes::VendorName::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "vendor-id", 0, UINT16_MAX, Attributes::VendorID::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "product-name", Attributes::ProductName::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "node-label", Attributes::NodeLabel::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "hardware-version", 0, UINT16_MAX, Attributes::HardwareVersion::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "hardware-version-string", Attributes::HardwareVersionString::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "software-version", 0, UINT32_MAX, Attributes::SoftwareVersion::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "software-version-string", Attributes::SoftwareVersionString::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "manufacturing-date", Attributes::ManufacturingDate::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "part-number", Attributes::PartNumber::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "product-url", Attributes::ProductURL::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "product-label", Attributes::ProductLabel::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "serial-number", Attributes::SerialNumber::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "reachable", 0, 1, Attributes::Reachable::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "unique-id", Attributes::UniqueID::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "vendor-name", Attributes::VendorName::Id, credsIssuerConfig), // make_unique(Id, "vendor-id", Attributes::VendorID::Id, credsIssuerConfig), // @@ -10186,16 +11027,33 @@ void registerClusterSwitch(Commands & commands, CredentialIssuerCommands * creds // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "number-of-positions", Attributes::NumberOfPositions::Id, credsIssuerConfig), // - make_unique(Id, "current-position", Attributes::CurrentPosition::Id, credsIssuerConfig), // - make_unique(Id, "multi-press-max", Attributes::MultiPressMax::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "number-of-positions", Attributes::NumberOfPositions::Id, credsIssuerConfig), // + make_unique(Id, "current-position", Attributes::CurrentPosition::Id, credsIssuerConfig), // + make_unique(Id, "multi-press-max", Attributes::MultiPressMax::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "number-of-positions", 0, UINT8_MAX, Attributes::NumberOfPositions::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "current-position", 0, UINT8_MAX, Attributes::CurrentPosition::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "multi-press-max", 0, UINT8_MAX, Attributes::MultiPressMax::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "number-of-positions", Attributes::NumberOfPositions::Id, credsIssuerConfig), // make_unique(Id, "current-position", Attributes::CurrentPosition::Id, credsIssuerConfig), // @@ -10245,16 +11103,35 @@ void registerClusterAdministratorCommissioning(Commands & commands, CredentialIs // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "window-status", Attributes::WindowStatus::Id, credsIssuerConfig), // - make_unique(Id, "admin-fabric-index", Attributes::AdminFabricIndex::Id, credsIssuerConfig), // - make_unique(Id, "admin-vendor-id", Attributes::AdminVendorId::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "window-status", Attributes::WindowStatus::Id, credsIssuerConfig), // + make_unique(Id, "admin-fabric-index", Attributes::AdminFabricIndex::Id, credsIssuerConfig), // + make_unique(Id, "admin-vendor-id", Attributes::AdminVendorId::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>( + Id, "window-status", 0, UINT8_MAX, Attributes::WindowStatus::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "admin-fabric-index", 0, UINT8_MAX, Attributes::AdminFabricIndex::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>(Id, "admin-vendor-id", 0, UINT16_MAX, + Attributes::AdminVendorId::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "window-status", Attributes::WindowStatus::Id, credsIssuerConfig), // make_unique(Id, "admin-fabric-index", Attributes::AdminFabricIndex::Id, credsIssuerConfig), // @@ -10308,11 +11185,37 @@ void registerClusterOperationalCredentials(Commands & commands, CredentialIssuer make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "nocs", Attributes::NOCs::Id, credsIssuerConfig), // - make_unique(Id, "fabrics", Attributes::Fabrics::Id, credsIssuerConfig), // - make_unique(Id, "supported-fabrics", Attributes::SupportedFabrics::Id, credsIssuerConfig), // - make_unique(Id, "commissioned-fabrics", Attributes::CommissionedFabrics::Id, credsIssuerConfig), // + make_unique>>( + Id, "nocs", Attributes::NOCs::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "fabrics", Attributes::Fabrics::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "supported-fabrics", 0, UINT8_MAX, Attributes::SupportedFabrics::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "commissioned-fabrics", 0, UINT8_MAX, Attributes::CommissionedFabrics::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "trusted-root-certificates", Attributes::TrustedRootCertificates::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "current-fabric-index", 0, UINT8_MAX, Attributes::CurrentFabricIndex::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "nocs", Attributes::NOCs::Id, credsIssuerConfig), // + make_unique(Id, "fabrics", Attributes::Fabrics::Id, credsIssuerConfig), // + make_unique(Id, "supported-fabrics", Attributes::SupportedFabrics::Id, credsIssuerConfig), // + make_unique(Id, "commissioned-fabrics", Attributes::CommissionedFabrics::Id, credsIssuerConfig), // make_unique(Id, "trusted-root-certificates", Attributes::TrustedRootCertificates::Id, credsIssuerConfig), // make_unique(Id, "current-fabric-index", Attributes::CurrentFabricIndex::Id, credsIssuerConfig), // @@ -10361,7 +11264,25 @@ void registerClusterGroupKeyManagement(Commands & commands, CredentialIssuerComm make_unique>(Id, credsIssuerConfig), // make_unique>>( - Id, "group-key-map", Attributes::GroupKeyMap::Id, credsIssuerConfig), // + Id, "group-key-map", Attributes::GroupKeyMap::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "group-table", Attributes::GroupTable::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "max-groups-per-fabric", 0, UINT16_MAX, Attributes::MaxGroupsPerFabric::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "max-group-keys-per-fabric", 0, UINT16_MAX, Attributes::MaxGroupKeysPerFabric::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "group-key-map", Attributes::GroupKeyMap::Id, credsIssuerConfig), // make_unique(Id, "group-table", Attributes::GroupTable::Id, credsIssuerConfig), // @@ -10396,14 +11317,28 @@ void registerClusterFixedLabel(Commands & commands, CredentialIssuerCommands * c // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "label-list", Attributes::LabelList::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "label-list", Attributes::LabelList::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique< + WriteAttributeAsComplex>>( + Id, "label-list", Attributes::LabelList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "label-list", Attributes::LabelList::Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // @@ -10444,7 +11379,18 @@ void registerClusterUserLabel(Commands & commands, CredentialIssuerCommands * cr make_unique>(Id, credsIssuerConfig), // make_unique< WriteAttributeAsComplex>>( - Id, "label-list", Attributes::LabelList::Id, credsIssuerConfig), // + Id, "label-list", Attributes::LabelList::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "label-list", Attributes::LabelList::Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // @@ -10475,13 +11421,24 @@ void registerClusterProxyConfiguration(Commands & commands, CredentialIssuerComm // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // @@ -10511,13 +11468,24 @@ void registerClusterProxyDiscovery(Commands & commands, CredentialIssuerCommands // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // @@ -10547,13 +11515,24 @@ void registerClusterProxyValid(Commands & commands, CredentialIssuerCommands * c // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // @@ -10583,14 +11562,27 @@ void registerClusterBooleanState(Commands & commands, CredentialIssuerCommands * // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "state-value", Attributes::StateValue::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "state-value", Attributes::StateValue::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "state-value", 0, 1, Attributes::StateValue::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "state-value", Attributes::StateValue::Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // @@ -10637,10 +11629,31 @@ void registerClusterModeSelect(Commands & commands, CredentialIssuerCommands * c make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // - make_unique>>(Id, "start-up-mode", 0, UINT8_MAX, - Attributes::StartUpMode::Id, credsIssuerConfig), // + make_unique>(Id, "description", Attributes::Description::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>(Id, "standard-namespace", 0, UINT16_MAX, + Attributes::StandardNamespace::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "supported-modes", Attributes::SupportedModes::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "current-mode", 0, UINT8_MAX, Attributes::CurrentMode::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "start-up-mode", 0, UINT8_MAX, Attributes::StartUpMode::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>(Id, "on-mode", 0, UINT8_MAX, Attributes::OnMode::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "description", Attributes::Description::Id, credsIssuerConfig), // make_unique(Id, "standard-namespace", Attributes::StandardNamespace::Id, credsIssuerConfig), // @@ -10748,38 +11761,101 @@ void registerClusterDoorLock(Commands & commands, CredentialIssuerCommands * cre make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "lock-state", 0, UINT8_MAX, Attributes::LockState::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>( + Id, "lock-type", 0, UINT8_MAX, Attributes::LockType::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "actuator-enabled", 0, 1, Attributes::ActuatorEnabled::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "door-state", 0, UINT8_MAX, Attributes::DoorState::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>(Id, "door-open-events", 0, UINT32_MAX, Attributes::DoorOpenEvents::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "door-closed-events", 0, UINT32_MAX, Attributes::DoorClosedEvents::Id, - credsIssuerConfig), // - make_unique>(Id, "open-period", 0, UINT16_MAX, Attributes::OpenPeriod::Id, credsIssuerConfig), // - make_unique>(Id, "language", Attributes::Language::Id, credsIssuerConfig), // - make_unique>(Id, "ledsettings", 0, UINT8_MAX, Attributes::LEDSettings::Id, credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "open-period", 0, UINT16_MAX, Attributes::OpenPeriod::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "number-of-total-users-supported", 0, UINT16_MAX, + Attributes::NumberOfTotalUsersSupported::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "number-of-pinusers-supported", 0, UINT16_MAX, + Attributes::NumberOfPINUsersSupported::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "number-of-rfidusers-supported", 0, UINT16_MAX, + Attributes::NumberOfRFIDUsersSupported::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "number-of-week-day-schedules-supported-per-user", 0, UINT8_MAX, + Attributes::NumberOfWeekDaySchedulesSupportedPerUser::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "number-of-year-day-schedules-supported-per-user", 0, UINT8_MAX, + Attributes::NumberOfYearDaySchedulesSupportedPerUser::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "number-of-holiday-schedules-supported", 0, UINT8_MAX, + Attributes::NumberOfHolidaySchedulesSupported::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "max-pincode-length", 0, UINT8_MAX, Attributes::MaxPINCodeLength::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "min-pincode-length", 0, UINT8_MAX, Attributes::MinPINCodeLength::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "max-rfidcode-length", 0, UINT8_MAX, Attributes::MaxRFIDCodeLength::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "min-rfidcode-length", 0, UINT8_MAX, Attributes::MinRFIDCodeLength::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "credential-rules-support", 0, UINT8_MAX, Attributes::CredentialRulesSupport::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "number-of-credentials-supported-per-user", 0, UINT8_MAX, + Attributes::NumberOfCredentialsSupportedPerUser::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "language", Attributes::Language::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "ledsettings", 0, UINT8_MAX, Attributes::LEDSettings::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "auto-relock-time", 0, UINT32_MAX, Attributes::AutoRelockTime::Id, - credsIssuerConfig), // - make_unique>(Id, "sound-volume", 0, UINT8_MAX, Attributes::SoundVolume::Id, credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "sound-volume", 0, UINT8_MAX, Attributes::SoundVolume::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>( - Id, "operating-mode", 0, UINT8_MAX, Attributes::OperatingMode::Id, credsIssuerConfig), // + Id, "operating-mode", 0, UINT8_MAX, Attributes::OperatingMode::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "supported-operating-modes", 0, UINT16_MAX, Attributes::SupportedOperatingModes::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "default-configuration-register", 0, UINT16_MAX, Attributes::DefaultConfigurationRegister::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>(Id, "enable-local-programming", 0, 1, Attributes::EnableLocalProgramming::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "enable-one-touch-locking", 0, 1, Attributes::EnableOneTouchLocking::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "enable-inside-status-led", 0, 1, Attributes::EnableInsideStatusLED::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "enable-privacy-mode-button", 0, 1, Attributes::EnablePrivacyModeButton::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "local-programming-features", 0, UINT8_MAX, Attributes::LocalProgrammingFeatures::Id, credsIssuerConfig), // + Id, "local-programming-features", 0, UINT8_MAX, Attributes::LocalProgrammingFeatures::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "wrong-code-entry-limit", 0, UINT8_MAX, Attributes::WrongCodeEntryLimit::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "user-code-temporary-disable-time", 0, UINT8_MAX, - Attributes::UserCodeTemporaryDisableTime::Id, credsIssuerConfig), // + Attributes::UserCodeTemporaryDisableTime::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "send-pinover-the-air", 0, 1, Attributes::SendPINOverTheAir::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "require-pinfor-remote-operation", 0, 1, Attributes::RequirePINforRemoteOperation::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "expiring-user-timeout", 0, UINT16_MAX, Attributes::ExpiringUserTimeout::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "lock-state", Attributes::LockState::Id, credsIssuerConfig), // make_unique(Id, "lock-type", Attributes::LockType::Id, credsIssuerConfig), // @@ -10916,10 +11992,81 @@ void registerClusterWindowCovering(Commands & commands, CredentialIssuerCommands make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "type", 0, UINT8_MAX, Attributes::Type::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "physical-closed-limit-lift", 0, UINT16_MAX, + Attributes::PhysicalClosedLimitLift::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "physical-closed-limit-tilt", 0, UINT16_MAX, + Attributes::PhysicalClosedLimitTilt::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>(Id, "current-position-lift", 0, UINT16_MAX, + Attributes::CurrentPositionLift::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "current-position-tilt", 0, UINT16_MAX, + Attributes::CurrentPositionTilt::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "number-of-actuations-lift", 0, UINT16_MAX, + Attributes::NumberOfActuationsLift::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "number-of-actuations-tilt", 0, UINT16_MAX, + Attributes::NumberOfActuationsTilt::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "config-status", 0, UINT8_MAX, Attributes::ConfigStatus::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "current-position-lift-percentage", 0, UINT8_MAX, Attributes::CurrentPositionLiftPercentage::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "current-position-tilt-percentage", 0, UINT8_MAX, Attributes::CurrentPositionTiltPercentage::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "operational-status", 0, UINT8_MAX, Attributes::OperationalStatus::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "target-position-lift-percent100ths", 0, UINT16_MAX, Attributes::TargetPositionLiftPercent100ths::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "target-position-tilt-percent100ths", 0, UINT16_MAX, Attributes::TargetPositionTiltPercent100ths::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>( + Id, "end-product-type", 0, UINT8_MAX, Attributes::EndProductType::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "current-position-lift-percent100ths", 0, UINT16_MAX, Attributes::CurrentPositionLiftPercent100ths::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "current-position-tilt-percent100ths", 0, UINT16_MAX, Attributes::CurrentPositionTiltPercent100ths::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "installed-open-limit-lift", 0, UINT16_MAX, + Attributes::InstalledOpenLimitLift::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "installed-closed-limit-lift", 0, UINT16_MAX, + Attributes::InstalledClosedLimitLift::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "installed-open-limit-tilt", 0, UINT16_MAX, + Attributes::InstalledOpenLimitTilt::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "installed-closed-limit-tilt", 0, UINT16_MAX, + Attributes::InstalledClosedLimitTilt::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // make_unique>>( - Id, "mode", 0, UINT8_MAX, Attributes::Mode::Id, credsIssuerConfig), // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "type", Attributes::Type::Id, credsIssuerConfig), // + Id, "mode", 0, UINT8_MAX, Attributes::Mode::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "safety-status", 0, UINT16_MAX, Attributes::SafetyStatus::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "type", Attributes::Type::Id, credsIssuerConfig), // make_unique(Id, "physical-closed-limit-lift", Attributes::PhysicalClosedLimitLift::Id, credsIssuerConfig), // make_unique(Id, "physical-closed-limit-tilt", Attributes::PhysicalClosedLimitTilt::Id, @@ -11004,18 +12151,39 @@ void registerClusterBarrierControl(Commands & commands, CredentialIssuerCommands make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "barrier-moving-state", 0, UINT8_MAX, Attributes::BarrierMovingState::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "barrier-safety-status", 0, UINT16_MAX, Attributes::BarrierSafetyStatus::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "barrier-capabilities", 0, UINT8_MAX, Attributes::BarrierCapabilities::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>(Id, "barrier-open-events", 0, UINT16_MAX, Attributes::BarrierOpenEvents::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "barrier-close-events", 0, UINT16_MAX, Attributes::BarrierCloseEvents::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "barrier-command-open-events", 0, UINT16_MAX, - Attributes::BarrierCommandOpenEvents::Id, credsIssuerConfig), // + Attributes::BarrierCommandOpenEvents::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "barrier-command-close-events", 0, UINT16_MAX, - Attributes::BarrierCommandCloseEvents::Id, credsIssuerConfig), // - make_unique>(Id, "barrier-open-period", 0, UINT16_MAX, Attributes::BarrierOpenPeriod::Id, + Attributes::BarrierCommandCloseEvents::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "barrier-open-period", 0, UINT16_MAX, Attributes::BarrierOpenPeriod::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "barrier-close-period", 0, UINT16_MAX, Attributes::BarrierClosePeriod::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "barrier-position", 0, UINT8_MAX, Attributes::BarrierPosition::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "barrier-moving-state", Attributes::BarrierMovingState::Id, credsIssuerConfig), // make_unique(Id, "barrier-safety-status", Attributes::BarrierSafetyStatus::Id, credsIssuerConfig), // @@ -11087,14 +12255,76 @@ void registerClusterPumpConfigurationAndControl(Commands & commands, CredentialI make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // - make_unique>>( - Id, "lifetime-running-hours", 0, UINT32_MAX, Attributes::LifetimeRunningHours::Id, credsIssuerConfig), // - make_unique>>( - Id, "lifetime-energy-consumed", 0, UINT32_MAX, Attributes::LifetimeEnergyConsumed::Id, credsIssuerConfig), // + make_unique>>(Id, "max-pressure", INT16_MIN, INT16_MAX, + Attributes::MaxPressure::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "max-speed", 0, UINT16_MAX, Attributes::MaxSpeed::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "max-flow", 0, UINT16_MAX, Attributes::MaxFlow::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "min-const-pressure", INT16_MIN, INT16_MAX, + Attributes::MinConstPressure::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "max-const-pressure", INT16_MIN, INT16_MAX, + Attributes::MaxConstPressure::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "min-comp-pressure", INT16_MIN, INT16_MAX, + Attributes::MinCompPressure::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "max-comp-pressure", INT16_MIN, INT16_MAX, + Attributes::MaxCompPressure::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "min-const-speed", 0, UINT16_MAX, + Attributes::MinConstSpeed::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "max-const-speed", 0, UINT16_MAX, + Attributes::MaxConstSpeed::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "min-const-flow", 0, UINT16_MAX, Attributes::MinConstFlow::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "max-const-flow", 0, UINT16_MAX, Attributes::MaxConstFlow::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "min-const-temp", INT16_MIN, INT16_MAX, + Attributes::MinConstTemp::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "max-const-temp", INT16_MIN, INT16_MAX, + Attributes::MaxConstTemp::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "pump-status", 0, UINT16_MAX, Attributes::PumpStatus::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>( + Id, "effective-operation-mode", 0, UINT8_MAX, Attributes::EffectiveOperationMode::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>( + Id, "effective-control-mode", 0, UINT8_MAX, Attributes::EffectiveControlMode::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "capacity", INT16_MIN, INT16_MAX, Attributes::Capacity::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "speed", 0, UINT16_MAX, Attributes::Speed::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "lifetime-running-hours", 0, UINT32_MAX, + Attributes::LifetimeRunningHours::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>(Id, "power", 0, UINT32_MAX, Attributes::Power::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "lifetime-energy-consumed", 0, UINT32_MAX, + Attributes::LifetimeEnergyConsumed::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>( - Id, "operation-mode", 0, UINT8_MAX, Attributes::OperationMode::Id, credsIssuerConfig), // + Id, "operation-mode", 0, UINT8_MAX, Attributes::OperationMode::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>( - Id, "control-mode", 0, UINT8_MAX, Attributes::ControlMode::Id, credsIssuerConfig), // + Id, "control-mode", 0, UINT8_MAX, Attributes::ControlMode::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "max-pressure", Attributes::MaxPressure::Id, credsIssuerConfig), // make_unique(Id, "max-speed", Attributes::MaxSpeed::Id, credsIssuerConfig), // @@ -11258,57 +12488,140 @@ void registerClusterThermostat(Commands & commands, CredentialIssuerCommands * c make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // + make_unique>>(Id, "local-temperature", INT16_MIN, INT16_MAX, + Attributes::LocalTemperature::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "outdoor-temperature", INT16_MIN, INT16_MAX, + Attributes::OutdoorTemperature::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "occupancy", 0, UINT8_MAX, Attributes::Occupancy::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "abs-min-heat-setpoint-limit", INT16_MIN, INT16_MAX, + Attributes::AbsMinHeatSetpointLimit::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "abs-max-heat-setpoint-limit", INT16_MIN, INT16_MAX, + Attributes::AbsMaxHeatSetpointLimit::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "abs-min-cool-setpoint-limit", INT16_MIN, INT16_MAX, + Attributes::AbsMinCoolSetpointLimit::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "abs-max-cool-setpoint-limit", INT16_MIN, INT16_MAX, + Attributes::AbsMaxCoolSetpointLimit::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "picooling-demand", 0, UINT8_MAX, Attributes::PICoolingDemand::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "piheating-demand", 0, UINT8_MAX, Attributes::PIHeatingDemand::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>(Id, "hvacsystem-type-configuration", 0, UINT8_MAX, - Attributes::HVACSystemTypeConfiguration::Id, credsIssuerConfig), // + Attributes::HVACSystemTypeConfiguration::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "local-temperature-calibration", INT8_MIN, INT8_MAX, - Attributes::LocalTemperatureCalibration::Id, credsIssuerConfig), // + Attributes::LocalTemperatureCalibration::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "occupied-cooling-setpoint", INT16_MIN, INT16_MAX, - Attributes::OccupiedCoolingSetpoint::Id, credsIssuerConfig), // + Attributes::OccupiedCoolingSetpoint::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "occupied-heating-setpoint", INT16_MIN, INT16_MAX, - Attributes::OccupiedHeatingSetpoint::Id, credsIssuerConfig), // + Attributes::OccupiedHeatingSetpoint::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "unoccupied-cooling-setpoint", INT16_MIN, INT16_MAX, - Attributes::UnoccupiedCoolingSetpoint::Id, credsIssuerConfig), // + Attributes::UnoccupiedCoolingSetpoint::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "unoccupied-heating-setpoint", INT16_MIN, INT16_MAX, - Attributes::UnoccupiedHeatingSetpoint::Id, credsIssuerConfig), // + Attributes::UnoccupiedHeatingSetpoint::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "min-heat-setpoint-limit", INT16_MIN, INT16_MAX, - Attributes::MinHeatSetpointLimit::Id, credsIssuerConfig), // + Attributes::MinHeatSetpointLimit::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "max-heat-setpoint-limit", INT16_MIN, INT16_MAX, - Attributes::MaxHeatSetpointLimit::Id, credsIssuerConfig), // + Attributes::MaxHeatSetpointLimit::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "min-cool-setpoint-limit", INT16_MIN, INT16_MAX, - Attributes::MinCoolSetpointLimit::Id, credsIssuerConfig), // + Attributes::MinCoolSetpointLimit::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "max-cool-setpoint-limit", INT16_MIN, INT16_MAX, - Attributes::MaxCoolSetpointLimit::Id, credsIssuerConfig), // + Attributes::MaxCoolSetpointLimit::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "min-setpoint-dead-band", INT8_MIN, INT8_MAX, Attributes::MinSetpointDeadBand::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "remote-sensing", 0, UINT8_MAX, Attributes::RemoteSensing::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>( - Id, "control-sequence-of-operation", 0, UINT8_MAX, Attributes::ControlSequenceOfOperation::Id, credsIssuerConfig), // - make_unique>(Id, "system-mode", 0, UINT8_MAX, Attributes::SystemMode::Id, credsIssuerConfig), // - make_unique>(Id, "temperature-setpoint-hold", 0, UINT8_MAX, Attributes::TemperatureSetpointHold::Id, + Id, "control-sequence-of-operation", 0, UINT8_MAX, Attributes::ControlSequenceOfOperation::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "system-mode", 0, UINT8_MAX, Attributes::SystemMode::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "thermostat-running-mode", 0, UINT8_MAX, Attributes::ThermostatRunningMode::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "start-of-week", 0, UINT8_MAX, Attributes::StartOfWeek::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "number-of-weekly-transitions", 0, UINT8_MAX, + Attributes::NumberOfWeeklyTransitions::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "number-of-daily-transitions", 0, UINT8_MAX, + Attributes::NumberOfDailyTransitions::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "temperature-setpoint-hold", 0, UINT8_MAX, Attributes::TemperatureSetpointHold::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( Id, "temperature-setpoint-hold-duration", 0, UINT16_MAX, Attributes::TemperatureSetpointHoldDuration::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "thermostat-programming-operation-mode", 0, UINT8_MAX, - Attributes::ThermostatProgrammingOperationMode::Id, credsIssuerConfig), // - make_unique>>(Id, "occupied-setback", 0, UINT8_MAX, - Attributes::OccupiedSetback::Id, credsIssuerConfig), // + Attributes::ThermostatProgrammingOperationMode::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "thermostat-running-state", 0, UINT16_MAX, Attributes::ThermostatRunningState::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "setpoint-change-source", 0, UINT8_MAX, Attributes::SetpointChangeSource::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "setpoint-change-amount", INT16_MIN, INT16_MAX, + Attributes::SetpointChangeAmount::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "setpoint-change-source-timestamp", 0, UINT32_MAX, + Attributes::SetpointChangeSourceTimestamp::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // make_unique>>( - Id, "unoccupied-setback", 0, UINT8_MAX, Attributes::UnoccupiedSetback::Id, credsIssuerConfig), // + Id, "occupied-setback", 0, UINT8_MAX, Attributes::OccupiedSetback::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>(Id, "occupied-setback-min", 0, UINT8_MAX, + Attributes::OccupiedSetbackMin::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "occupied-setback-max", 0, UINT8_MAX, + Attributes::OccupiedSetbackMax::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "unoccupied-setback", 0, UINT8_MAX, + Attributes::UnoccupiedSetback::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>(Id, "unoccupied-setback-min", 0, UINT8_MAX, + Attributes::UnoccupiedSetbackMin::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "unoccupied-setback-max", 0, UINT8_MAX, + Attributes::UnoccupiedSetbackMax::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>(Id, "emergency-heat-delta", 0, UINT8_MAX, Attributes::EmergencyHeatDelta::Id, - credsIssuerConfig), // - make_unique>(Id, "actype", 0, UINT8_MAX, Attributes::ACType::Id, credsIssuerConfig), // - make_unique>(Id, "accapacity", 0, UINT16_MAX, Attributes::ACCapacity::Id, credsIssuerConfig), // - make_unique>(Id, "acrefrigerant-type", 0, UINT8_MAX, Attributes::ACRefrigerantType::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "actype", 0, UINT8_MAX, Attributes::ACType::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "accapacity", 0, UINT16_MAX, Attributes::ACCapacity::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "acrefrigerant-type", 0, UINT8_MAX, Attributes::ACRefrigerantType::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "accompressor-type", 0, UINT8_MAX, Attributes::ACCompressorType::Id, - credsIssuerConfig), // - make_unique>(Id, "acerror-code", 0, UINT32_MAX, Attributes::ACErrorCode::Id, credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "acerror-code", 0, UINT32_MAX, Attributes::ACErrorCode::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "aclouver-position", 0, UINT8_MAX, Attributes::ACLouverPosition::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>(Id, "accoil-temperature", INT16_MIN, INT16_MAX, + Attributes::ACCoilTemperature::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>(Id, "accapacityformat", 0, UINT8_MAX, Attributes::ACCapacityformat::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "local-temperature", Attributes::LocalTemperature::Id, credsIssuerConfig), // make_unique(Id, "outdoor-temperature", Attributes::OutdoorTemperature::Id, credsIssuerConfig), // @@ -11423,16 +12736,39 @@ void registerClusterFanControl(Commands & commands, CredentialIssuerCommands * c make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // - make_unique>(Id, "fan-mode", 0, UINT8_MAX, - Attributes::FanMode::Id, credsIssuerConfig), // + make_unique>( + Id, "fan-mode", 0, UINT8_MAX, Attributes::FanMode::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>( - Id, "fan-mode-sequence", 0, UINT8_MAX, Attributes::FanModeSequence::Id, credsIssuerConfig), // - make_unique>>(Id, "percent-setting", 0, UINT8_MAX, - Attributes::PercentSetting::Id, credsIssuerConfig), // - make_unique>>(Id, "speed-setting", 0, UINT8_MAX, - Attributes::SpeedSetting::Id, credsIssuerConfig), // - make_unique>(Id, "rock-setting", 0, UINT8_MAX, Attributes::RockSetting::Id, credsIssuerConfig), // - make_unique>(Id, "wind-setting", 0, UINT8_MAX, Attributes::WindSetting::Id, credsIssuerConfig), // + Id, "fan-mode-sequence", 0, UINT8_MAX, Attributes::FanModeSequence::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "percent-setting", 0, UINT8_MAX, Attributes::PercentSetting::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "percent-current", 0, UINT8_MAX, Attributes::PercentCurrent::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "speed-max", 0, UINT8_MAX, Attributes::SpeedMax::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "speed-setting", 0, UINT8_MAX, Attributes::SpeedSetting::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "speed-current", 0, UINT8_MAX, Attributes::SpeedCurrent::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rock-support", 0, UINT8_MAX, Attributes::RockSupport::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rock-setting", 0, UINT8_MAX, Attributes::RockSetting::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "wind-support", 0, UINT8_MAX, Attributes::WindSupport::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "wind-setting", 0, UINT8_MAX, Attributes::WindSetting::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "fan-mode", Attributes::FanMode::Id, credsIssuerConfig), // make_unique(Id, "fan-mode-sequence", Attributes::FanModeSequence::Id, credsIssuerConfig), // @@ -11485,12 +12821,24 @@ void registerClusterThermostatUserInterfaceConfiguration(Commands & commands, Cr make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // make_unique>(Id, "temperature-display-mode", 0, UINT8_MAX, Attributes::TemperatureDisplayMode::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "keypad-lockout", 0, UINT8_MAX, Attributes::KeypadLockout::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "schedule-programming-visibility", 0, UINT8_MAX, - Attributes::ScheduleProgrammingVisibility::Id, credsIssuerConfig), // - make_unique(Id, credsIssuerConfig), // + Attributes::ScheduleProgrammingVisibility::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // make_unique(Id, "temperature-display-mode", Attributes::TemperatureDisplayMode::Id, credsIssuerConfig), // make_unique(Id, "keypad-lockout", Attributes::KeypadLockout::Id, credsIssuerConfig), // @@ -11608,32 +12956,137 @@ void registerClusterColorControl(Commands & commands, CredentialIssuerCommands * make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // - make_unique>(Id, "options", 0, UINT8_MAX, Attributes::Options::Id, credsIssuerConfig), // + make_unique>(Id, "current-hue", 0, UINT8_MAX, Attributes::CurrentHue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "current-saturation", 0, UINT8_MAX, Attributes::CurrentSaturation::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "remaining-time", 0, UINT16_MAX, Attributes::RemainingTime::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "current-x", 0, UINT16_MAX, Attributes::CurrentX::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "current-y", 0, UINT16_MAX, Attributes::CurrentY::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "drift-compensation", 0, UINT8_MAX, Attributes::DriftCompensation::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "compensation-text", Attributes::CompensationText::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "color-temperature-mireds", 0, UINT16_MAX, Attributes::ColorTemperatureMireds::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "color-mode", 0, UINT8_MAX, Attributes::ColorMode::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "options", 0, UINT8_MAX, Attributes::Options::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>>(Id, "number-of-primaries", 0, UINT8_MAX, + Attributes::NumberOfPrimaries::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "primary1x", 0, UINT16_MAX, Attributes::Primary1X::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "primary1y", 0, UINT16_MAX, Attributes::Primary1Y::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "primary1intensity", 0, UINT8_MAX, + Attributes::Primary1Intensity::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "primary2x", 0, UINT16_MAX, Attributes::Primary2X::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "primary2y", 0, UINT16_MAX, Attributes::Primary2Y::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "primary2intensity", 0, UINT8_MAX, + Attributes::Primary2Intensity::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "primary3x", 0, UINT16_MAX, Attributes::Primary3X::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "primary3y", 0, UINT16_MAX, Attributes::Primary3Y::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "primary3intensity", 0, UINT8_MAX, + Attributes::Primary3Intensity::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "primary4x", 0, UINT16_MAX, Attributes::Primary4X::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "primary4y", 0, UINT16_MAX, Attributes::Primary4Y::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "primary4intensity", 0, UINT8_MAX, + Attributes::Primary4Intensity::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "primary5x", 0, UINT16_MAX, Attributes::Primary5X::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "primary5y", 0, UINT16_MAX, Attributes::Primary5Y::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "primary5intensity", 0, UINT8_MAX, + Attributes::Primary5Intensity::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "primary6x", 0, UINT16_MAX, Attributes::Primary6X::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "primary6y", 0, UINT16_MAX, Attributes::Primary6Y::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "primary6intensity", 0, UINT8_MAX, + Attributes::Primary6Intensity::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>(Id, "white-point-x", 0, UINT16_MAX, Attributes::WhitePointX::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "white-point-y", 0, UINT16_MAX, Attributes::WhitePointY::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "color-point-rx", 0, UINT16_MAX, Attributes::ColorPointRX::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "color-point-ry", 0, UINT16_MAX, Attributes::ColorPointRY::Id, - credsIssuerConfig), // - make_unique>>( - Id, "color-point-rintensity", 0, UINT8_MAX, Attributes::ColorPointRIntensity::Id, credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>(Id, "color-point-rintensity", 0, UINT8_MAX, + Attributes::ColorPointRIntensity::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "color-point-gx", 0, UINT16_MAX, Attributes::ColorPointGX::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "color-point-gy", 0, UINT16_MAX, Attributes::ColorPointGY::Id, - credsIssuerConfig), // - make_unique>>( - Id, "color-point-gintensity", 0, UINT8_MAX, Attributes::ColorPointGIntensity::Id, credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>(Id, "color-point-gintensity", 0, UINT8_MAX, + Attributes::ColorPointGIntensity::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "color-point-bx", 0, UINT16_MAX, Attributes::ColorPointBX::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "color-point-by", 0, UINT16_MAX, Attributes::ColorPointBY::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>(Id, "color-point-bintensity", 0, UINT8_MAX, + Attributes::ColorPointBIntensity::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "enhanced-current-hue", 0, UINT16_MAX, Attributes::EnhancedCurrentHue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "enhanced-color-mode", 0, UINT8_MAX, Attributes::EnhancedColorMode::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "color-loop-active", 0, UINT8_MAX, Attributes::ColorLoopActive::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "color-loop-direction", 0, UINT8_MAX, Attributes::ColorLoopDirection::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "color-loop-time", 0, UINT16_MAX, Attributes::ColorLoopTime::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "color-loop-start-enhanced-hue", 0, UINT16_MAX, + Attributes::ColorLoopStartEnhancedHue::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "color-loop-stored-enhanced-hue", 0, UINT16_MAX, + Attributes::ColorLoopStoredEnhancedHue::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "color-capabilities", 0, UINT16_MAX, Attributes::ColorCapabilities::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "color-temp-physical-min-mireds", 0, UINT16_MAX, + Attributes::ColorTempPhysicalMinMireds::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "color-temp-physical-max-mireds", 0, UINT16_MAX, + Attributes::ColorTempPhysicalMaxMireds::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "couple-color-temp-to-level-min-mireds", 0, UINT16_MAX, + Attributes::CoupleColorTempToLevelMinMireds::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // - make_unique>>( - Id, "color-point-bintensity", 0, UINT8_MAX, Attributes::ColorPointBIntensity::Id, credsIssuerConfig), // make_unique>>( Id, "start-up-color-temperature-mireds", 0, UINT16_MAX, Attributes::StartUpColorTemperatureMireds::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "current-hue", Attributes::CurrentHue::Id, credsIssuerConfig), // make_unique(Id, "current-saturation", Attributes::CurrentSaturation::Id, credsIssuerConfig), // @@ -11743,29 +13196,54 @@ void registerClusterBallastConfiguration(Commands & commands, CredentialIssuerCo make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // - make_unique>(Id, "min-level", 0, UINT8_MAX, Attributes::MinLevel::Id, credsIssuerConfig), // - make_unique>(Id, "max-level", 0, UINT8_MAX, Attributes::MaxLevel::Id, credsIssuerConfig), // - make_unique>>( - Id, "intrinsic-ballast-factor", 0, UINT8_MAX, Attributes::IntrinsicBallastFactor::Id, credsIssuerConfig), // - make_unique>>( - Id, "ballast-factor-adjustment", 0, UINT8_MAX, Attributes::BallastFactorAdjustment::Id, credsIssuerConfig), // - make_unique>(Id, "lamp-type", Attributes::LampType::Id, credsIssuerConfig), // - make_unique>(Id, "lamp-manufacturer", Attributes::LampManufacturer::Id, - credsIssuerConfig), // - make_unique>>(Id, "lamp-rated-hours", 0, UINT32_MAX, - Attributes::LampRatedHours::Id, credsIssuerConfig), // - make_unique>>(Id, "lamp-burn-hours", 0, UINT32_MAX, - Attributes::LampBurnHours::Id, credsIssuerConfig), // - make_unique>(Id, "lamp-alarm-mode", 0, UINT8_MAX, Attributes::LampAlarmMode::Id, + make_unique>(Id, "physical-min-level", 0, UINT8_MAX, Attributes::PhysicalMinLevel::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "physical-max-level", 0, UINT8_MAX, Attributes::PhysicalMaxLevel::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "ballast-status", 0, UINT8_MAX, Attributes::BallastStatus::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "min-level", 0, UINT8_MAX, Attributes::MinLevel::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "max-level", 0, UINT8_MAX, Attributes::MaxLevel::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>>(Id, "intrinsic-ballast-factor", 0, UINT8_MAX, + Attributes::IntrinsicBallastFactor::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>(Id, "ballast-factor-adjustment", 0, UINT8_MAX, + Attributes::BallastFactorAdjustment::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "lamp-quantity", 0, UINT8_MAX, Attributes::LampQuantity::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "lamp-type", Attributes::LampType::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "lamp-manufacturer", Attributes::LampManufacturer::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "lamp-burn-hours-trip-point", 0, UINT32_MAX, Attributes::LampBurnHoursTripPoint::Id, credsIssuerConfig), // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "physical-min-level", Attributes::PhysicalMinLevel::Id, credsIssuerConfig), // - make_unique(Id, "physical-max-level", Attributes::PhysicalMaxLevel::Id, credsIssuerConfig), // - make_unique(Id, "ballast-status", Attributes::BallastStatus::Id, credsIssuerConfig), // - make_unique(Id, "min-level", Attributes::MinLevel::Id, credsIssuerConfig), // - make_unique(Id, "max-level", Attributes::MaxLevel::Id, credsIssuerConfig), // + Id, "lamp-rated-hours", 0, UINT32_MAX, Attributes::LampRatedHours::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "lamp-burn-hours", 0, UINT32_MAX, Attributes::LampBurnHours::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "lamp-alarm-mode", 0, UINT8_MAX, Attributes::LampAlarmMode::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>(Id, "lamp-burn-hours-trip-point", 0, UINT32_MAX, + Attributes::LampBurnHoursTripPoint::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "physical-min-level", Attributes::PhysicalMinLevel::Id, credsIssuerConfig), // + make_unique(Id, "physical-max-level", Attributes::PhysicalMaxLevel::Id, credsIssuerConfig), // + make_unique(Id, "ballast-status", Attributes::BallastStatus::Id, credsIssuerConfig), // + make_unique(Id, "min-level", Attributes::MinLevel::Id, credsIssuerConfig), // + make_unique(Id, "max-level", Attributes::MaxLevel::Id, credsIssuerConfig), // make_unique(Id, "intrinsic-ballast-factor", Attributes::IntrinsicBallastFactor::Id, credsIssuerConfig), // make_unique(Id, "ballast-factor-adjustment", Attributes::BallastFactorAdjustment::Id, @@ -11806,18 +13284,43 @@ void registerClusterIlluminanceMeasurement(Commands & commands, CredentialIssuer // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "measured-value", Attributes::MeasuredValue::Id, credsIssuerConfig), // - make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id, credsIssuerConfig), // - make_unique(Id, "max-measured-value", Attributes::MaxMeasuredValue::Id, credsIssuerConfig), // - make_unique(Id, "tolerance", Attributes::Tolerance::Id, credsIssuerConfig), // - make_unique(Id, "light-sensor-type", Attributes::LightSensorType::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "measured-value", Attributes::MeasuredValue::Id, credsIssuerConfig), // + make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id, credsIssuerConfig), // + make_unique(Id, "max-measured-value", Attributes::MaxMeasuredValue::Id, credsIssuerConfig), // + make_unique(Id, "tolerance", Attributes::Tolerance::Id, credsIssuerConfig), // + make_unique(Id, "light-sensor-type", Attributes::LightSensorType::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>(Id, "measured-value", 0, UINT16_MAX, + Attributes::MeasuredValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "min-measured-value", 0, UINT16_MAX, + Attributes::MinMeasuredValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "max-measured-value", 0, UINT16_MAX, + Attributes::MaxMeasuredValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tolerance", 0, UINT16_MAX, Attributes::Tolerance::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "light-sensor-type", 0, UINT8_MAX, + Attributes::LightSensorType::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "measured-value", Attributes::MeasuredValue::Id, credsIssuerConfig), // make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id, credsIssuerConfig), // @@ -11852,17 +13355,39 @@ void registerClusterTemperatureMeasurement(Commands & commands, CredentialIssuer // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "measured-value", Attributes::MeasuredValue::Id, credsIssuerConfig), // - make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id, credsIssuerConfig), // - make_unique(Id, "max-measured-value", Attributes::MaxMeasuredValue::Id, credsIssuerConfig), // - make_unique(Id, "tolerance", Attributes::Tolerance::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "measured-value", Attributes::MeasuredValue::Id, credsIssuerConfig), // + make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id, credsIssuerConfig), // + make_unique(Id, "max-measured-value", Attributes::MaxMeasuredValue::Id, credsIssuerConfig), // + make_unique(Id, "tolerance", Attributes::Tolerance::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>(Id, "measured-value", INT16_MIN, INT16_MAX, + Attributes::MeasuredValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "min-measured-value", INT16_MIN, INT16_MAX, + Attributes::MinMeasuredValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "max-measured-value", INT16_MIN, INT16_MAX, + Attributes::MaxMeasuredValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tolerance", 0, UINT16_MAX, Attributes::Tolerance::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "measured-value", Attributes::MeasuredValue::Id, credsIssuerConfig), // make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id, credsIssuerConfig), // @@ -11896,22 +13421,57 @@ void registerClusterPressureMeasurement(Commands & commands, CredentialIssuerCom // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "measured-value", Attributes::MeasuredValue::Id, credsIssuerConfig), // - make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id, credsIssuerConfig), // - make_unique(Id, "max-measured-value", Attributes::MaxMeasuredValue::Id, credsIssuerConfig), // - make_unique(Id, "tolerance", Attributes::Tolerance::Id, credsIssuerConfig), // - make_unique(Id, "scaled-value", Attributes::ScaledValue::Id, credsIssuerConfig), // - make_unique(Id, "min-scaled-value", Attributes::MinScaledValue::Id, credsIssuerConfig), // - make_unique(Id, "max-scaled-value", Attributes::MaxScaledValue::Id, credsIssuerConfig), // - make_unique(Id, "scaled-tolerance", Attributes::ScaledTolerance::Id, credsIssuerConfig), // - make_unique(Id, "scale", Attributes::Scale::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "measured-value", Attributes::MeasuredValue::Id, credsIssuerConfig), // + make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id, credsIssuerConfig), // + make_unique(Id, "max-measured-value", Attributes::MaxMeasuredValue::Id, credsIssuerConfig), // + make_unique(Id, "tolerance", Attributes::Tolerance::Id, credsIssuerConfig), // + make_unique(Id, "scaled-value", Attributes::ScaledValue::Id, credsIssuerConfig), // + make_unique(Id, "min-scaled-value", Attributes::MinScaledValue::Id, credsIssuerConfig), // + make_unique(Id, "max-scaled-value", Attributes::MaxScaledValue::Id, credsIssuerConfig), // + make_unique(Id, "scaled-tolerance", Attributes::ScaledTolerance::Id, credsIssuerConfig), // + make_unique(Id, "scale", Attributes::Scale::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>(Id, "measured-value", INT16_MIN, INT16_MAX, + Attributes::MeasuredValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "min-measured-value", INT16_MIN, INT16_MAX, + Attributes::MinMeasuredValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "max-measured-value", INT16_MIN, INT16_MAX, + Attributes::MaxMeasuredValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tolerance", 0, UINT16_MAX, Attributes::Tolerance::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "scaled-value", INT16_MIN, INT16_MAX, + Attributes::ScaledValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "min-scaled-value", INT16_MIN, INT16_MAX, + Attributes::MinScaledValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "max-scaled-value", INT16_MIN, INT16_MAX, + Attributes::MaxScaledValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "scaled-tolerance", 0, UINT16_MAX, Attributes::ScaledTolerance::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "scale", INT8_MIN, INT8_MAX, Attributes::Scale::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "measured-value", Attributes::MeasuredValue::Id, credsIssuerConfig), // make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id, credsIssuerConfig), // @@ -11950,17 +13510,39 @@ void registerClusterFlowMeasurement(Commands & commands, CredentialIssuerCommand // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "measured-value", Attributes::MeasuredValue::Id, credsIssuerConfig), // - make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id, credsIssuerConfig), // - make_unique(Id, "max-measured-value", Attributes::MaxMeasuredValue::Id, credsIssuerConfig), // - make_unique(Id, "tolerance", Attributes::Tolerance::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "measured-value", Attributes::MeasuredValue::Id, credsIssuerConfig), // + make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id, credsIssuerConfig), // + make_unique(Id, "max-measured-value", Attributes::MaxMeasuredValue::Id, credsIssuerConfig), // + make_unique(Id, "tolerance", Attributes::Tolerance::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>(Id, "measured-value", 0, UINT16_MAX, + Attributes::MeasuredValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "min-measured-value", 0, UINT16_MAX, + Attributes::MinMeasuredValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "max-measured-value", 0, UINT16_MAX, + Attributes::MaxMeasuredValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tolerance", 0, UINT16_MAX, Attributes::Tolerance::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "measured-value", Attributes::MeasuredValue::Id, credsIssuerConfig), // make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id, credsIssuerConfig), // @@ -11994,17 +13576,39 @@ void registerClusterRelativeHumidityMeasurement(Commands & commands, CredentialI // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "measured-value", Attributes::MeasuredValue::Id, credsIssuerConfig), // - make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id, credsIssuerConfig), // - make_unique(Id, "max-measured-value", Attributes::MaxMeasuredValue::Id, credsIssuerConfig), // - make_unique(Id, "tolerance", Attributes::Tolerance::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "measured-value", Attributes::MeasuredValue::Id, credsIssuerConfig), // + make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id, credsIssuerConfig), // + make_unique(Id, "max-measured-value", Attributes::MaxMeasuredValue::Id, credsIssuerConfig), // + make_unique(Id, "tolerance", Attributes::Tolerance::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>(Id, "measured-value", 0, UINT16_MAX, + Attributes::MeasuredValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "min-measured-value", 0, UINT16_MAX, + Attributes::MinMeasuredValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "max-measured-value", 0, UINT16_MAX, + Attributes::MaxMeasuredValue::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "tolerance", 0, UINT16_MAX, Attributes::Tolerance::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "measured-value", Attributes::MeasuredValue::Id, credsIssuerConfig), // make_unique(Id, "min-measured-value", Attributes::MinMeasuredValue::Id, credsIssuerConfig), // @@ -12067,27 +13671,54 @@ void registerClusterOccupancySensing(Commands & commands, CredentialIssuerComman make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "occupancy", 0, UINT8_MAX, Attributes::Occupancy::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "occupancy-sensor-type", 0, UINT8_MAX, Attributes::OccupancySensorType::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "occupancy-sensor-type-bitmap", 0, UINT8_MAX, + Attributes::OccupancySensorTypeBitmap::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // make_unique>(Id, "piroccupied-to-unoccupied-delay", 0, UINT16_MAX, - Attributes::PIROccupiedToUnoccupiedDelay::Id, credsIssuerConfig), // + Attributes::PIROccupiedToUnoccupiedDelay::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "pirunoccupied-to-occupied-delay", 0, UINT16_MAX, - Attributes::PIRUnoccupiedToOccupiedDelay::Id, credsIssuerConfig), // + Attributes::PIRUnoccupiedToOccupiedDelay::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "pirunoccupied-to-occupied-threshold", 0, UINT8_MAX, - Attributes::PIRUnoccupiedToOccupiedThreshold::Id, credsIssuerConfig), // + Attributes::PIRUnoccupiedToOccupiedThreshold::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "ultrasonic-occupied-to-unoccupied-delay", 0, UINT16_MAX, - Attributes::UltrasonicOccupiedToUnoccupiedDelay::Id, credsIssuerConfig), // + Attributes::UltrasonicOccupiedToUnoccupiedDelay::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "ultrasonic-unoccupied-to-occupied-delay", 0, UINT16_MAX, - Attributes::UltrasonicUnoccupiedToOccupiedDelay::Id, credsIssuerConfig), // + Attributes::UltrasonicUnoccupiedToOccupiedDelay::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "ultrasonic-unoccupied-to-occupied-threshold", 0, UINT8_MAX, - Attributes::UltrasonicUnoccupiedToOccupiedThreshold::Id, credsIssuerConfig), // + Attributes::UltrasonicUnoccupiedToOccupiedThreshold::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "physical-contact-occupied-to-unoccupied-delay", 0, UINT16_MAX, - Attributes::PhysicalContactOccupiedToUnoccupiedDelay::Id, credsIssuerConfig), // + Attributes::PhysicalContactOccupiedToUnoccupiedDelay::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "physical-contact-unoccupied-to-occupied-delay", 0, UINT16_MAX, - Attributes::PhysicalContactUnoccupiedToOccupiedDelay::Id, credsIssuerConfig), // + Attributes::PhysicalContactUnoccupiedToOccupiedDelay::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "physical-contact-unoccupied-to-occupied-threshold", 0, UINT8_MAX, - Attributes::PhysicalContactUnoccupiedToOccupiedThreshold::Id, credsIssuerConfig), // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "occupancy", Attributes::Occupancy::Id, credsIssuerConfig), // - make_unique(Id, "occupancy-sensor-type", Attributes::OccupancySensorType::Id, credsIssuerConfig), // + Attributes::PhysicalContactUnoccupiedToOccupiedThreshold::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "occupancy", Attributes::Occupancy::Id, credsIssuerConfig), // + make_unique(Id, "occupancy-sensor-type", Attributes::OccupancySensorType::Id, credsIssuerConfig), // make_unique(Id, "occupancy-sensor-type-bitmap", Attributes::OccupancySensorTypeBitmap::Id, credsIssuerConfig), // make_unique(Id, "piroccupied-to-unoccupied-delay", Attributes::PIROccupiedToUnoccupiedDelay::Id, @@ -12136,14 +13767,27 @@ void registerClusterWakeOnLan(Commands & commands, CredentialIssuerCommands * cr // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "macaddress", Attributes::MACAddress::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "macaddress", Attributes::MACAddress::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "macaddress", Attributes::MACAddress::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "macaddress", Attributes::MACAddress::Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // @@ -12177,16 +13821,36 @@ void registerClusterChannel(Commands & commands, CredentialIssuerCommands * cred // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "channel-list", Attributes::ChannelList::Id, credsIssuerConfig), // - make_unique(Id, "lineup", Attributes::Lineup::Id, credsIssuerConfig), // - make_unique(Id, "current-channel", Attributes::CurrentChannel::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "channel-list", Attributes::ChannelList::Id, credsIssuerConfig), // + make_unique(Id, "lineup", Attributes::Lineup::Id, credsIssuerConfig), // + make_unique(Id, "current-channel", Attributes::CurrentChannel::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "channel-list", Attributes::ChannelList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique< + WriteAttributeAsComplex>>( + Id, "lineup", Attributes::Lineup::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "current-channel", Attributes::CurrentChannel::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "channel-list", Attributes::ChannelList::Id, credsIssuerConfig), // make_unique(Id, "lineup", Attributes::Lineup::Id, credsIssuerConfig), // @@ -12220,15 +13884,31 @@ void registerClusterTargetNavigator(Commands & commands, CredentialIssuerCommand // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "target-list", Attributes::TargetList::Id, credsIssuerConfig), // - make_unique(Id, "current-target", Attributes::CurrentTarget::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "target-list", Attributes::TargetList::Id, credsIssuerConfig), // + make_unique(Id, "current-target", Attributes::CurrentTarget::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "target-list", Attributes::TargetList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "current-target", 0, UINT8_MAX, Attributes::CurrentTarget::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "target-list", Attributes::TargetList::Id, credsIssuerConfig), // make_unique(Id, "current-target", Attributes::CurrentTarget::Id, credsIssuerConfig), // @@ -12271,20 +13951,48 @@ void registerClusterMediaPlayback(Commands & commands, CredentialIssuerCommands // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "current-state", Attributes::CurrentState::Id, credsIssuerConfig), // - make_unique(Id, "start-time", Attributes::StartTime::Id, credsIssuerConfig), // - make_unique(Id, "duration", Attributes::Duration::Id, credsIssuerConfig), // - make_unique(Id, "sampled-position", Attributes::SampledPosition::Id, credsIssuerConfig), // - make_unique(Id, "playback-speed", Attributes::PlaybackSpeed::Id, credsIssuerConfig), // - make_unique(Id, "seek-range-end", Attributes::SeekRangeEnd::Id, credsIssuerConfig), // - make_unique(Id, "seek-range-start", Attributes::SeekRangeStart::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "current-state", Attributes::CurrentState::Id, credsIssuerConfig), // + make_unique(Id, "start-time", Attributes::StartTime::Id, credsIssuerConfig), // + make_unique(Id, "duration", Attributes::Duration::Id, credsIssuerConfig), // + make_unique(Id, "sampled-position", Attributes::SampledPosition::Id, credsIssuerConfig), // + make_unique(Id, "playback-speed", Attributes::PlaybackSpeed::Id, credsIssuerConfig), // + make_unique(Id, "seek-range-end", Attributes::SeekRangeEnd::Id, credsIssuerConfig), // + make_unique(Id, "seek-range-start", Attributes::SeekRangeStart::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>( + Id, "current-state", 0, UINT8_MAX, Attributes::CurrentState::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "start-time", 0, UINT64_MAX, Attributes::StartTime::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "duration", 0, UINT64_MAX, Attributes::Duration::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "sampled-position", Attributes::SampledPosition::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "playback-speed", -std::numeric_limits::infinity(), + std::numeric_limits::infinity(), Attributes::PlaybackSpeed::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "seek-range-end", 0, UINT64_MAX, Attributes::SeekRangeEnd::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>(Id, "seek-range-start", 0, UINT64_MAX, + Attributes::SeekRangeStart::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "current-state", Attributes::CurrentState::Id, credsIssuerConfig), // make_unique(Id, "start-time", Attributes::StartTime::Id, credsIssuerConfig), // @@ -12325,15 +14033,31 @@ void registerClusterMediaInput(Commands & commands, CredentialIssuerCommands * c // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "input-list", Attributes::InputList::Id, credsIssuerConfig), // - make_unique(Id, "current-input", Attributes::CurrentInput::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "input-list", Attributes::InputList::Id, credsIssuerConfig), // + make_unique(Id, "current-input", Attributes::CurrentInput::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "input-list", Attributes::InputList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "current-input", 0, UINT8_MAX, Attributes::CurrentInput::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "input-list", Attributes::InputList::Id, credsIssuerConfig), // make_unique(Id, "current-input", Attributes::CurrentInput::Id, credsIssuerConfig), // @@ -12366,13 +14090,24 @@ void registerClusterLowPower(Commands & commands, CredentialIssuerCommands * cre // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // @@ -12403,13 +14138,24 @@ void registerClusterKeypadInput(Commands & commands, CredentialIssuerCommands * // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // @@ -12451,8 +14197,22 @@ void registerClusterContentLauncher(Commands & commands, CredentialIssuerCommand make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "accept-header", Attributes::AcceptHeader::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>(Id, "supported-streaming-protocols", 0, UINT32_MAX, - Attributes::SupportedStreamingProtocols::Id, credsIssuerConfig), // + Attributes::SupportedStreamingProtocols::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "accept-header", Attributes::AcceptHeader::Id, credsIssuerConfig), // make_unique(Id, "supported-streaming-protocols", Attributes::SupportedStreamingProtocols::Id, @@ -12487,15 +14247,31 @@ void registerClusterAudioOutput(Commands & commands, CredentialIssuerCommands * // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "output-list", Attributes::OutputList::Id, credsIssuerConfig), // - make_unique(Id, "current-output", Attributes::CurrentOutput::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "output-list", Attributes::OutputList::Id, credsIssuerConfig), // + make_unique(Id, "current-output", Attributes::CurrentOutput::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "output-list", Attributes::OutputList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "current-output", 0, UINT8_MAX, Attributes::CurrentOutput::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "output-list", Attributes::OutputList::Id, credsIssuerConfig), // make_unique(Id, "current-output", Attributes::CurrentOutput::Id, credsIssuerConfig), // @@ -12539,9 +14315,22 @@ void registerClusterApplicationLauncher(Commands & commands, CredentialIssuerCom make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "catalog-list", Attributes::CatalogList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>>( - Id, "current-app", Attributes::CurrentApp::Id, credsIssuerConfig), // + Id, "current-app", Attributes::CurrentApp::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "catalog-list", Attributes::CatalogList::Id, credsIssuerConfig), // make_unique(Id, "current-app", Attributes::CurrentApp::Id, credsIssuerConfig), // @@ -12573,21 +14362,48 @@ void registerClusterApplicationBasic(Commands & commands, CredentialIssuerComman // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "vendor-name", Attributes::VendorName::Id, credsIssuerConfig), // - make_unique(Id, "vendor-id", Attributes::VendorID::Id, credsIssuerConfig), // - make_unique(Id, "application-name", Attributes::ApplicationName::Id, credsIssuerConfig), // - make_unique(Id, "product-id", Attributes::ProductID::Id, credsIssuerConfig), // - make_unique(Id, "application", Attributes::Application::Id, credsIssuerConfig), // - make_unique(Id, "status", Attributes::Status::Id, credsIssuerConfig), // - make_unique(Id, "application-version", Attributes::ApplicationVersion::Id, credsIssuerConfig), // - make_unique(Id, "allowed-vendor-list", Attributes::AllowedVendorList::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "vendor-name", Attributes::VendorName::Id, credsIssuerConfig), // + make_unique(Id, "vendor-id", Attributes::VendorID::Id, credsIssuerConfig), // + make_unique(Id, "application-name", Attributes::ApplicationName::Id, credsIssuerConfig), // + make_unique(Id, "product-id", Attributes::ProductID::Id, credsIssuerConfig), // + make_unique(Id, "application", Attributes::Application::Id, credsIssuerConfig), // + make_unique(Id, "status", Attributes::Status::Id, credsIssuerConfig), // + make_unique(Id, "application-version", Attributes::ApplicationVersion::Id, credsIssuerConfig), // + make_unique(Id, "allowed-vendor-list", Attributes::AllowedVendorList::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "vendor-name", Attributes::VendorName::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "vendor-id", 0, UINT16_MAX, Attributes::VendorID::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "application-name", Attributes::ApplicationName::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "product-id", 0, UINT16_MAX, Attributes::ProductID::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>( + Id, "application", Attributes::Application::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>( + Id, "status", 0, UINT8_MAX, Attributes::Status::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "application-version", Attributes::ApplicationVersion::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "allowed-vendor-list", Attributes::AllowedVendorList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "vendor-name", Attributes::VendorName::Id, credsIssuerConfig), // make_unique(Id, "vendor-id", Attributes::VendorID::Id, credsIssuerConfig), // @@ -12628,13 +14444,24 @@ void registerClusterAccountLogin(Commands & commands, CredentialIssuerCommands * // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // @@ -12836,22 +14663,325 @@ void registerClusterElectricalMeasurement(Commands & commands, CredentialIssuerC make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "measurement-type", 0, UINT32_MAX, Attributes::MeasurementType::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "dc-voltage", INT16_MIN, INT16_MAX, Attributes::DcVoltage::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "dc-voltage-min", INT16_MIN, INT16_MAX, Attributes::DcVoltageMin::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "dc-voltage-max", INT16_MIN, INT16_MAX, Attributes::DcVoltageMax::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "dc-current", INT16_MIN, INT16_MAX, Attributes::DcCurrent::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "dc-current-min", INT16_MIN, INT16_MAX, Attributes::DcCurrentMin::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "dc-current-max", INT16_MIN, INT16_MAX, Attributes::DcCurrentMax::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "dc-power", INT16_MIN, INT16_MAX, Attributes::DcPower::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "dc-power-min", INT16_MIN, INT16_MAX, Attributes::DcPowerMin::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "dc-power-max", INT16_MIN, INT16_MAX, Attributes::DcPowerMax::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "dc-voltage-multiplier", 0, UINT16_MAX, Attributes::DcVoltageMultiplier::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "dc-voltage-divisor", 0, UINT16_MAX, Attributes::DcVoltageDivisor::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "dc-current-multiplier", 0, UINT16_MAX, Attributes::DcCurrentMultiplier::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "dc-current-divisor", 0, UINT16_MAX, Attributes::DcCurrentDivisor::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "dc-power-multiplier", 0, UINT16_MAX, Attributes::DcPowerMultiplier::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "dc-power-divisor", 0, UINT16_MAX, Attributes::DcPowerDivisor::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "ac-frequency", 0, UINT16_MAX, Attributes::AcFrequency::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "ac-frequency-min", 0, UINT16_MAX, Attributes::AcFrequencyMin::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "ac-frequency-max", 0, UINT16_MAX, Attributes::AcFrequencyMax::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "neutral-current", 0, UINT16_MAX, Attributes::NeutralCurrent::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "total-active-power", INT32_MIN, INT32_MAX, Attributes::TotalActivePower::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "total-reactive-power", INT32_MIN, INT32_MAX, Attributes::TotalReactivePower::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "total-apparent-power", 0, UINT32_MAX, Attributes::TotalApparentPower::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "measured1st-harmonic-current", INT16_MIN, INT16_MAX, + Attributes::Measured1stHarmonicCurrent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "measured3rd-harmonic-current", INT16_MIN, INT16_MAX, + Attributes::Measured3rdHarmonicCurrent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "measured5th-harmonic-current", INT16_MIN, INT16_MAX, + Attributes::Measured5thHarmonicCurrent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "measured7th-harmonic-current", INT16_MIN, INT16_MAX, + Attributes::Measured7thHarmonicCurrent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "measured9th-harmonic-current", INT16_MIN, INT16_MAX, + Attributes::Measured9thHarmonicCurrent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "measured11th-harmonic-current", INT16_MIN, INT16_MAX, + Attributes::Measured11thHarmonicCurrent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "measured-phase1st-harmonic-current", INT16_MIN, INT16_MAX, + Attributes::MeasuredPhase1stHarmonicCurrent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "measured-phase3rd-harmonic-current", INT16_MIN, INT16_MAX, + Attributes::MeasuredPhase3rdHarmonicCurrent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "measured-phase5th-harmonic-current", INT16_MIN, INT16_MAX, + Attributes::MeasuredPhase5thHarmonicCurrent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "measured-phase7th-harmonic-current", INT16_MIN, INT16_MAX, + Attributes::MeasuredPhase7thHarmonicCurrent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "measured-phase9th-harmonic-current", INT16_MIN, INT16_MAX, + Attributes::MeasuredPhase9thHarmonicCurrent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "measured-phase11th-harmonic-current", INT16_MIN, INT16_MAX, + Attributes::MeasuredPhase11thHarmonicCurrent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "ac-frequency-multiplier", 0, UINT16_MAX, Attributes::AcFrequencyMultiplier::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "ac-frequency-divisor", 0, UINT16_MAX, Attributes::AcFrequencyDivisor::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "power-multiplier", 0, UINT32_MAX, Attributes::PowerMultiplier::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "power-divisor", 0, UINT32_MAX, Attributes::PowerDivisor::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "harmonic-current-multiplier", INT8_MIN, INT8_MAX, + Attributes::HarmonicCurrentMultiplier::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "phase-harmonic-current-multiplier", INT8_MIN, INT8_MAX, + Attributes::PhaseHarmonicCurrentMultiplier::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "instantaneous-voltage", INT16_MIN, INT16_MAX, + Attributes::InstantaneousVoltage::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "instantaneous-line-current", 0, UINT16_MAX, + Attributes::InstantaneousLineCurrent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "instantaneous-active-current", INT16_MIN, INT16_MAX, + Attributes::InstantaneousActiveCurrent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "instantaneous-reactive-current", INT16_MIN, INT16_MAX, + Attributes::InstantaneousReactiveCurrent::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "instantaneous-power", INT16_MIN, INT16_MAX, Attributes::InstantaneousPower::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-voltage", 0, UINT16_MAX, Attributes::RmsVoltage::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-voltage-min", 0, UINT16_MAX, Attributes::RmsVoltageMin::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-voltage-max", 0, UINT16_MAX, Attributes::RmsVoltageMax::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-current", 0, UINT16_MAX, Attributes::RmsCurrent::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-current-min", 0, UINT16_MAX, Attributes::RmsCurrentMin::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-current-max", 0, UINT16_MAX, Attributes::RmsCurrentMax::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "active-power", INT16_MIN, INT16_MAX, Attributes::ActivePower::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "active-power-min", INT16_MIN, INT16_MAX, Attributes::ActivePowerMin::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "active-power-max", INT16_MIN, INT16_MAX, Attributes::ActivePowerMax::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "reactive-power", INT16_MIN, INT16_MAX, Attributes::ReactivePower::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "apparent-power", 0, UINT16_MAX, Attributes::ApparentPower::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "power-factor", INT8_MIN, INT8_MAX, Attributes::PowerFactor::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>(Id, "average-rms-voltage-measurement-period", 0, UINT16_MAX, - Attributes::AverageRmsVoltageMeasurementPeriod::Id, credsIssuerConfig), // + Attributes::AverageRmsVoltageMeasurementPeriod::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "average-rms-under-voltage-counter", 0, UINT16_MAX, - Attributes::AverageRmsUnderVoltageCounter::Id, credsIssuerConfig), // + Attributes::AverageRmsUnderVoltageCounter::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "rms-extreme-over-voltage-period", 0, UINT16_MAX, - Attributes::RmsExtremeOverVoltagePeriod::Id, credsIssuerConfig), // + Attributes::RmsExtremeOverVoltagePeriod::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "rms-extreme-under-voltage-period", 0, UINT16_MAX, - Attributes::RmsExtremeUnderVoltagePeriod::Id, credsIssuerConfig), // - make_unique>(Id, "rms-voltage-sag-period", 0, UINT16_MAX, Attributes::RmsVoltageSagPeriod::Id, + Attributes::RmsExtremeUnderVoltagePeriod::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "rms-voltage-sag-period", 0, UINT16_MAX, Attributes::RmsVoltageSagPeriod::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "rms-voltage-swell-period", 0, UINT16_MAX, Attributes::RmsVoltageSwellPeriod::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "ac-voltage-multiplier", 0, UINT16_MAX, Attributes::AcVoltageMultiplier::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "ac-voltage-divisor", 0, UINT16_MAX, Attributes::AcVoltageDivisor::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "ac-current-multiplier", 0, UINT16_MAX, Attributes::AcCurrentMultiplier::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "ac-current-divisor", 0, UINT16_MAX, Attributes::AcCurrentDivisor::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "ac-power-multiplier", 0, UINT16_MAX, Attributes::AcPowerMultiplier::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "ac-power-divisor", 0, UINT16_MAX, Attributes::AcPowerDivisor::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>(Id, "overload-alarms-mask", 0, UINT8_MAX, Attributes::OverloadAlarmsMask::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "voltage-overload", INT16_MIN, INT16_MAX, Attributes::VoltageOverload::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "current-overload", INT16_MIN, INT16_MAX, Attributes::CurrentOverload::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique>(Id, "ac-overload-alarms-mask", 0, UINT16_MAX, Attributes::AcOverloadAlarmsMask::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "ac-voltage-overload", INT16_MIN, INT16_MAX, Attributes::AcVoltageOverload::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "ac-current-overload", INT16_MIN, INT16_MAX, Attributes::AcCurrentOverload::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "ac-active-power-overload", INT16_MIN, INT16_MAX, + Attributes::AcActivePowerOverload::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "ac-reactive-power-overload", INT16_MIN, INT16_MAX, + Attributes::AcReactivePowerOverload::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "average-rms-over-voltage", INT16_MIN, INT16_MAX, + Attributes::AverageRmsOverVoltage::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "average-rms-under-voltage", INT16_MIN, INT16_MAX, + Attributes::AverageRmsUnderVoltage::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rms-extreme-over-voltage", INT16_MIN, INT16_MAX, + Attributes::RmsExtremeOverVoltage::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rms-extreme-under-voltage", INT16_MIN, INT16_MAX, + Attributes::RmsExtremeUnderVoltage::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rms-voltage-sag", INT16_MIN, INT16_MAX, Attributes::RmsVoltageSag::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-voltage-swell", INT16_MIN, INT16_MAX, Attributes::RmsVoltageSwell::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "line-current-phase-b", 0, UINT16_MAX, Attributes::LineCurrentPhaseB::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "active-current-phase-b", INT16_MIN, INT16_MAX, + Attributes::ActiveCurrentPhaseB::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "reactive-current-phase-b", INT16_MIN, INT16_MAX, + Attributes::ReactiveCurrentPhaseB::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rms-voltage-phase-b", 0, UINT16_MAX, Attributes::RmsVoltagePhaseB::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-voltage-min-phase-b", 0, UINT16_MAX, Attributes::RmsVoltageMinPhaseB::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-voltage-max-phase-b", 0, UINT16_MAX, Attributes::RmsVoltageMaxPhaseB::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-current-phase-b", 0, UINT16_MAX, Attributes::RmsCurrentPhaseB::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-current-min-phase-b", 0, UINT16_MAX, Attributes::RmsCurrentMinPhaseB::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-current-max-phase-b", 0, UINT16_MAX, Attributes::RmsCurrentMaxPhaseB::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "active-power-phase-b", INT16_MIN, INT16_MAX, Attributes::ActivePowerPhaseB::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "active-power-min-phase-b", INT16_MIN, INT16_MAX, + Attributes::ActivePowerMinPhaseB::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "active-power-max-phase-b", INT16_MIN, INT16_MAX, + Attributes::ActivePowerMaxPhaseB::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "reactive-power-phase-b", INT16_MIN, INT16_MAX, + Attributes::ReactivePowerPhaseB::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "apparent-power-phase-b", 0, UINT16_MAX, Attributes::ApparentPowerPhaseB::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "power-factor-phase-b", INT8_MIN, INT8_MAX, Attributes::PowerFactorPhaseB::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "average-rms-voltage-measurement-period-phase-b", 0, UINT16_MAX, + Attributes::AverageRmsVoltageMeasurementPeriodPhaseB::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "average-rms-over-voltage-counter-phase-b", 0, UINT16_MAX, + Attributes::AverageRmsOverVoltageCounterPhaseB::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "average-rms-under-voltage-counter-phase-b", 0, UINT16_MAX, + Attributes::AverageRmsUnderVoltageCounterPhaseB::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rms-extreme-over-voltage-period-phase-b", 0, UINT16_MAX, + Attributes::RmsExtremeOverVoltagePeriodPhaseB::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rms-extreme-under-voltage-period-phase-b", 0, UINT16_MAX, + Attributes::RmsExtremeUnderVoltagePeriodPhaseB::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rms-voltage-sag-period-phase-b", 0, UINT16_MAX, + Attributes::RmsVoltageSagPeriodPhaseB::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rms-voltage-swell-period-phase-b", 0, UINT16_MAX, + Attributes::RmsVoltageSwellPeriodPhaseB::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "line-current-phase-c", 0, UINT16_MAX, Attributes::LineCurrentPhaseC::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "active-current-phase-c", INT16_MIN, INT16_MAX, + Attributes::ActiveCurrentPhaseC::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "reactive-current-phase-c", INT16_MIN, INT16_MAX, + Attributes::ReactiveCurrentPhaseC::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rms-voltage-phase-c", 0, UINT16_MAX, Attributes::RmsVoltagePhaseC::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-voltage-min-phase-c", 0, UINT16_MAX, Attributes::RmsVoltageMinPhaseC::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-voltage-max-phase-c", 0, UINT16_MAX, Attributes::RmsVoltageMaxPhaseC::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-current-phase-c", 0, UINT16_MAX, Attributes::RmsCurrentPhaseC::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-current-min-phase-c", 0, UINT16_MAX, Attributes::RmsCurrentMinPhaseC::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "rms-current-max-phase-c", 0, UINT16_MAX, Attributes::RmsCurrentMaxPhaseC::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "active-power-phase-c", INT16_MIN, INT16_MAX, Attributes::ActivePowerPhaseC::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "active-power-min-phase-c", INT16_MIN, INT16_MAX, + Attributes::ActivePowerMinPhaseC::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "active-power-max-phase-c", INT16_MIN, INT16_MAX, + Attributes::ActivePowerMaxPhaseC::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "reactive-power-phase-c", INT16_MIN, INT16_MAX, + Attributes::ReactivePowerPhaseC::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "apparent-power-phase-c", 0, UINT16_MAX, Attributes::ApparentPowerPhaseC::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "power-factor-phase-c", INT8_MIN, INT8_MAX, Attributes::PowerFactorPhaseC::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "average-rms-voltage-measurement-period-phase-c", 0, UINT16_MAX, + Attributes::AverageRmsVoltageMeasurementPeriodPhaseC::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "average-rms-over-voltage-counter-phase-c", 0, UINT16_MAX, + Attributes::AverageRmsOverVoltageCounterPhaseC::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "average-rms-under-voltage-counter-phase-c", 0, UINT16_MAX, + Attributes::AverageRmsUnderVoltageCounterPhaseC::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rms-extreme-over-voltage-period-phase-c", 0, UINT16_MAX, + Attributes::RmsExtremeOverVoltagePeriodPhaseC::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rms-extreme-under-voltage-period-phase-c", 0, UINT16_MAX, + Attributes::RmsExtremeUnderVoltagePeriodPhaseC::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rms-voltage-sag-period-phase-c", 0, UINT16_MAX, + Attributes::RmsVoltageSagPeriodPhaseC::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>(Id, "rms-voltage-swell-period-phase-c", 0, UINT16_MAX, + Attributes::RmsVoltageSwellPeriodPhaseC::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "measurement-type", Attributes::MeasurementType::Id, credsIssuerConfig), // make_unique(Id, "dc-voltage", Attributes::DcVoltage::Id, credsIssuerConfig), // @@ -13056,17 +15186,37 @@ void registerClusterClientMonitoring(Commands & commands, CredentialIssuerComman // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "idle-mode-interval", Attributes::IdleModeInterval::Id, credsIssuerConfig), // - make_unique(Id, "active-mode-interval", Attributes::ActiveModeInterval::Id, credsIssuerConfig), // - make_unique(Id, "active-mode-threshold", Attributes::ActiveModeThreshold::Id, credsIssuerConfig), // - make_unique(Id, "expected-clients", Attributes::ExpectedClients::Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "idle-mode-interval", Attributes::IdleModeInterval::Id, credsIssuerConfig), // + make_unique(Id, "active-mode-interval", Attributes::ActiveModeInterval::Id, credsIssuerConfig), // + make_unique(Id, "active-mode-threshold", Attributes::ActiveModeThreshold::Id, credsIssuerConfig), // + make_unique(Id, "expected-clients", Attributes::ExpectedClients::Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>(Id, "idle-mode-interval", 0, UINT32_MAX, Attributes::IdleModeInterval::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "active-mode-interval", 0, UINT32_MAX, Attributes::ActiveModeInterval::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "active-mode-threshold", 0, UINT16_MAX, Attributes::ActiveModeThreshold::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "expected-clients", Attributes::ExpectedClients::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "idle-mode-interval", Attributes::IdleModeInterval::Id, credsIssuerConfig), // make_unique(Id, "active-mode-interval", Attributes::ActiveModeInterval::Id, credsIssuerConfig), // @@ -13216,158 +15366,210 @@ void registerClusterUnitTesting(Commands & commands, CredentialIssuerCommands * make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // make_unique>(Id, credsIssuerConfig), // - make_unique>(Id, "boolean", 0, 1, Attributes::Boolean::Id, credsIssuerConfig), // + make_unique>(Id, "boolean", 0, 1, Attributes::Boolean::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>>( - Id, "bitmap8", 0, UINT8_MAX, Attributes::Bitmap8::Id, credsIssuerConfig), // + Id, "bitmap8", 0, UINT8_MAX, Attributes::Bitmap8::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "bitmap16", 0, UINT16_MAX, Attributes::Bitmap16::Id, credsIssuerConfig), // + Id, "bitmap16", 0, UINT16_MAX, Attributes::Bitmap16::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "bitmap32", 0, UINT32_MAX, Attributes::Bitmap32::Id, credsIssuerConfig), // + Id, "bitmap32", 0, UINT32_MAX, Attributes::Bitmap32::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "bitmap64", 0, UINT64_MAX, Attributes::Bitmap64::Id, credsIssuerConfig), // - make_unique>(Id, "int8u", 0, UINT8_MAX, Attributes::Int8u::Id, credsIssuerConfig), // - make_unique>(Id, "int16u", 0, UINT16_MAX, Attributes::Int16u::Id, credsIssuerConfig), // - make_unique>(Id, "int24u", 0, UINT32_MAX, Attributes::Int24u::Id, credsIssuerConfig), // - make_unique>(Id, "int32u", 0, UINT32_MAX, Attributes::Int32u::Id, credsIssuerConfig), // - make_unique>(Id, "int40u", 0, UINT64_MAX, Attributes::Int40u::Id, credsIssuerConfig), // - make_unique>(Id, "int48u", 0, UINT64_MAX, Attributes::Int48u::Id, credsIssuerConfig), // - make_unique>(Id, "int56u", 0, UINT64_MAX, Attributes::Int56u::Id, credsIssuerConfig), // - make_unique>(Id, "int64u", 0, UINT64_MAX, Attributes::Int64u::Id, credsIssuerConfig), // - make_unique>(Id, "int8s", INT8_MIN, INT8_MAX, Attributes::Int8s::Id, credsIssuerConfig), // - make_unique>(Id, "int16s", INT16_MIN, INT16_MAX, Attributes::Int16s::Id, credsIssuerConfig), // - make_unique>(Id, "int24s", INT32_MIN, INT32_MAX, Attributes::Int24s::Id, credsIssuerConfig), // - make_unique>(Id, "int32s", INT32_MIN, INT32_MAX, Attributes::Int32s::Id, credsIssuerConfig), // - make_unique>(Id, "int40s", INT64_MIN, INT64_MAX, Attributes::Int40s::Id, credsIssuerConfig), // - make_unique>(Id, "int48s", INT64_MIN, INT64_MAX, Attributes::Int48s::Id, credsIssuerConfig), // - make_unique>(Id, "int56s", INT64_MIN, INT64_MAX, Attributes::Int56s::Id, credsIssuerConfig), // - make_unique>(Id, "int64s", INT64_MIN, INT64_MAX, Attributes::Int64s::Id, credsIssuerConfig), // - make_unique>(Id, "enum8", 0, UINT8_MAX, Attributes::Enum8::Id, credsIssuerConfig), // - make_unique>(Id, "enum16", 0, UINT16_MAX, Attributes::Enum16::Id, credsIssuerConfig), // + Id, "bitmap64", 0, UINT64_MAX, Attributes::Bitmap64::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "int8u", 0, UINT8_MAX, Attributes::Int8u::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "int16u", 0, UINT16_MAX, Attributes::Int16u::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "int24u", 0, UINT32_MAX, Attributes::Int24u::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "int32u", 0, UINT32_MAX, Attributes::Int32u::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "int40u", 0, UINT64_MAX, Attributes::Int40u::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "int48u", 0, UINT64_MAX, Attributes::Int48u::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "int56u", 0, UINT64_MAX, Attributes::Int56u::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "int64u", 0, UINT64_MAX, Attributes::Int64u::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "int8s", INT8_MIN, INT8_MAX, Attributes::Int8s::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "int16s", INT16_MIN, INT16_MAX, Attributes::Int16s::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "int24s", INT32_MIN, INT32_MAX, Attributes::Int24s::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "int32s", INT32_MIN, INT32_MAX, Attributes::Int32s::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "int40s", INT64_MIN, INT64_MAX, Attributes::Int40s::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "int48s", INT64_MIN, INT64_MAX, Attributes::Int48s::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "int56s", INT64_MIN, INT64_MAX, Attributes::Int56s::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "int64s", INT64_MIN, INT64_MAX, Attributes::Int64s::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "enum8", 0, UINT8_MAX, Attributes::Enum8::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "enum16", 0, UINT16_MAX, Attributes::Enum16::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>(Id, "float-single", -std::numeric_limits::infinity(), std::numeric_limits::infinity(), Attributes::FloatSingle::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "float-double", -std::numeric_limits::infinity(), std::numeric_limits::infinity(), Attributes::FloatDouble::Id, - credsIssuerConfig), // - make_unique>(Id, "octet-string", Attributes::OctetString::Id, credsIssuerConfig), // - make_unique>>(Id, "list-int8u", Attributes::ListInt8u::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "octet-string", Attributes::OctetString::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>>( + Id, "list-int8u", Attributes::ListInt8u::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "list-octet-string", Attributes::ListOctetString::Id, credsIssuerConfig), // + Id, "list-octet-string", Attributes::ListOctetString::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "list-struct-octet-string", Attributes::ListStructOctetString::Id, credsIssuerConfig), // - make_unique>(Id, "long-octet-string", Attributes::LongOctetString::Id, credsIssuerConfig), // - make_unique>(Id, "char-string", Attributes::CharString::Id, credsIssuerConfig), // - make_unique>(Id, "long-char-string", Attributes::LongCharString::Id, credsIssuerConfig), // - make_unique>(Id, "epoch-us", 0, UINT64_MAX, Attributes::EpochUs::Id, credsIssuerConfig), // - make_unique>(Id, "epoch-s", 0, UINT32_MAX, Attributes::EpochS::Id, credsIssuerConfig), // - make_unique>(Id, "vendor-id", 0, UINT16_MAX, Attributes::VendorId::Id, credsIssuerConfig), // + Id, "list-struct-octet-string", Attributes::ListStructOctetString::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "long-octet-string", Attributes::LongOctetString::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "char-string", Attributes::CharString::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "long-char-string", Attributes::LongCharString::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "epoch-us", 0, UINT64_MAX, Attributes::EpochUs::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "epoch-s", 0, UINT32_MAX, Attributes::EpochS::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>(Id, "vendor-id", 0, UINT16_MAX, Attributes::VendorId::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "list-nullables-and-optionals-struct", Attributes::ListNullablesAndOptionalsStruct::Id, credsIssuerConfig), // - make_unique>(Id, "enum-attr", 0, UINT8_MAX, - Attributes::EnumAttr::Id, credsIssuerConfig), // + Id, "list-nullables-and-optionals-struct", Attributes::ListNullablesAndOptionalsStruct::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>( + Id, "enum-attr", 0, UINT8_MAX, Attributes::EnumAttr::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>( - Id, "struct-attr", Attributes::StructAttr::Id, credsIssuerConfig), // + Id, "struct-attr", Attributes::StructAttr::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "range-restricted-int8u", 0, UINT8_MAX, Attributes::RangeRestrictedInt8u::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "range-restricted-int8s", INT8_MIN, INT8_MAX, Attributes::RangeRestrictedInt8s::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "range-restricted-int16u", 0, UINT16_MAX, Attributes::RangeRestrictedInt16u::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "range-restricted-int16s", INT16_MIN, INT16_MAX, - Attributes::RangeRestrictedInt16s::Id, credsIssuerConfig), // + Attributes::RangeRestrictedInt16s::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "list-long-octet-string", Attributes::ListLongOctetString::Id, credsIssuerConfig), // + Id, "list-long-octet-string", Attributes::ListLongOctetString::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "list-fabric-scoped", Attributes::ListFabricScoped::Id, credsIssuerConfig), // - make_unique>(Id, "timed-write-boolean", 0, 1, Attributes::TimedWriteBoolean::Id, credsIssuerConfig), // + Id, "list-fabric-scoped", Attributes::ListFabricScoped::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "timed-write-boolean", 0, 1, Attributes::TimedWriteBoolean::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "general-error-boolean", 0, 1, Attributes::GeneralErrorBoolean::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "cluster-error-boolean", 0, 1, Attributes::ClusterErrorBoolean::Id, - credsIssuerConfig), // - make_unique>(Id, "unsupported", 0, 1, Attributes::Unsupported::Id, credsIssuerConfig), // - make_unique>>(Id, "nullable-boolean", 0, 1, - Attributes::NullableBoolean::Id, credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>(Id, "unsupported", 0, 1, Attributes::Unsupported::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>>( + Id, "nullable-boolean", 0, 1, Attributes::NullableBoolean::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique< WriteAttribute>>>( - Id, "nullable-bitmap8", 0, UINT8_MAX, Attributes::NullableBitmap8::Id, credsIssuerConfig), // + Id, "nullable-bitmap8", 0, UINT8_MAX, Attributes::NullableBitmap8::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique< WriteAttribute>>>( - Id, "nullable-bitmap16", 0, UINT16_MAX, Attributes::NullableBitmap16::Id, credsIssuerConfig), // + Id, "nullable-bitmap16", 0, UINT16_MAX, Attributes::NullableBitmap16::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique< WriteAttribute>>>( - Id, "nullable-bitmap32", 0, UINT32_MAX, Attributes::NullableBitmap32::Id, credsIssuerConfig), // + Id, "nullable-bitmap32", 0, UINT32_MAX, Attributes::NullableBitmap32::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique< WriteAttribute>>>( - Id, "nullable-bitmap64", 0, UINT64_MAX, Attributes::NullableBitmap64::Id, credsIssuerConfig), // - make_unique>>(Id, "nullable-int8u", 0, UINT8_MAX, - Attributes::NullableInt8u::Id, credsIssuerConfig), // - make_unique>>(Id, "nullable-int16u", 0, UINT16_MAX, - Attributes::NullableInt16u::Id, credsIssuerConfig), // - make_unique>>(Id, "nullable-int24u", 0, UINT32_MAX, - Attributes::NullableInt24u::Id, credsIssuerConfig), // - make_unique>>(Id, "nullable-int32u", 0, UINT32_MAX, - Attributes::NullableInt32u::Id, credsIssuerConfig), // - make_unique>>(Id, "nullable-int40u", 0, UINT64_MAX, - Attributes::NullableInt40u::Id, credsIssuerConfig), // - make_unique>>(Id, "nullable-int48u", 0, UINT64_MAX, - Attributes::NullableInt48u::Id, credsIssuerConfig), // - make_unique>>(Id, "nullable-int56u", 0, UINT64_MAX, - Attributes::NullableInt56u::Id, credsIssuerConfig), // - make_unique>>(Id, "nullable-int64u", 0, UINT64_MAX, - Attributes::NullableInt64u::Id, credsIssuerConfig), // + Id, "nullable-bitmap64", 0, UINT64_MAX, Attributes::NullableBitmap64::Id, WriteCommandType::kWrite, + credsIssuerConfig), // + make_unique>>( + Id, "nullable-int8u", 0, UINT8_MAX, Attributes::NullableInt8u::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "nullable-int16u", 0, UINT16_MAX, Attributes::NullableInt16u::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "nullable-int24u", 0, UINT32_MAX, Attributes::NullableInt24u::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "nullable-int32u", 0, UINT32_MAX, Attributes::NullableInt32u::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "nullable-int40u", 0, UINT64_MAX, Attributes::NullableInt40u::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "nullable-int48u", 0, UINT64_MAX, Attributes::NullableInt48u::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "nullable-int56u", 0, UINT64_MAX, Attributes::NullableInt56u::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "nullable-int64u", 0, UINT64_MAX, Attributes::NullableInt64u::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>(Id, "nullable-int8s", INT8_MIN, INT8_MAX, - Attributes::NullableInt8s::Id, credsIssuerConfig), // + Attributes::NullableInt8s::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique>>(Id, "nullable-int16s", INT16_MIN, INT16_MAX, - Attributes::NullableInt16s::Id, credsIssuerConfig), // + Attributes::NullableInt16s::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>(Id, "nullable-int24s", INT32_MIN, INT32_MAX, - Attributes::NullableInt24s::Id, credsIssuerConfig), // + Attributes::NullableInt24s::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>(Id, "nullable-int32s", INT32_MIN, INT32_MAX, - Attributes::NullableInt32s::Id, credsIssuerConfig), // + Attributes::NullableInt32s::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>(Id, "nullable-int40s", INT64_MIN, INT64_MAX, - Attributes::NullableInt40s::Id, credsIssuerConfig), // + Attributes::NullableInt40s::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>(Id, "nullable-int48s", INT64_MIN, INT64_MAX, - Attributes::NullableInt48s::Id, credsIssuerConfig), // + Attributes::NullableInt48s::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>(Id, "nullable-int56s", INT64_MIN, INT64_MAX, - Attributes::NullableInt56s::Id, credsIssuerConfig), // + Attributes::NullableInt56s::Id, + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>(Id, "nullable-int64s", INT64_MIN, INT64_MAX, - Attributes::NullableInt64s::Id, credsIssuerConfig), // - make_unique>>(Id, "nullable-enum8", 0, UINT8_MAX, - Attributes::NullableEnum8::Id, credsIssuerConfig), // - make_unique>>(Id, "nullable-enum16", 0, UINT16_MAX, - Attributes::NullableEnum16::Id, credsIssuerConfig), // + Attributes::NullableInt64s::Id, + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "nullable-enum8", 0, UINT8_MAX, Attributes::NullableEnum8::Id, WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "nullable-enum16", 0, UINT16_MAX, Attributes::NullableEnum16::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( Id, "nullable-float-single", -std::numeric_limits::infinity(), std::numeric_limits::infinity(), - Attributes::NullableFloatSingle::Id, credsIssuerConfig), // + Attributes::NullableFloatSingle::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( Id, "nullable-float-double", -std::numeric_limits::infinity(), std::numeric_limits::infinity(), - Attributes::NullableFloatDouble::Id, credsIssuerConfig), // + Attributes::NullableFloatDouble::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "nullable-octet-string", Attributes::NullableOctetString::Id, credsIssuerConfig), // + Id, "nullable-octet-string", Attributes::NullableOctetString::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "nullable-char-string", Attributes::NullableCharString::Id, credsIssuerConfig), // + Id, "nullable-char-string", Attributes::NullableCharString::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( - Id, "nullable-enum-attr", 0, UINT8_MAX, Attributes::NullableEnumAttr::Id, credsIssuerConfig), // + Id, "nullable-enum-attr", 0, UINT8_MAX, Attributes::NullableEnumAttr::Id, WriteCommandType::kWrite, + credsIssuerConfig), // make_unique< WriteAttributeAsComplex>>( - Id, "nullable-struct", Attributes::NullableStruct::Id, credsIssuerConfig), // + Id, "nullable-struct", Attributes::NullableStruct::Id, WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>(Id, "nullable-range-restricted-int8u", 0, UINT8_MAX, Attributes::NullableRangeRestrictedInt8u::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>(Id, "nullable-range-restricted-int8s", INT8_MIN, INT8_MAX, Attributes::NullableRangeRestrictedInt8s::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>(Id, "nullable-range-restricted-int16u", 0, UINT16_MAX, Attributes::NullableRangeRestrictedInt16u::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>>( Id, "nullable-range-restricted-int16s", INT16_MIN, INT16_MAX, Attributes::NullableRangeRestrictedInt16s::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // make_unique>(Id, "write-only-int8u", 0, UINT8_MAX, Attributes::WriteOnlyInt8u::Id, - credsIssuerConfig), // + WriteCommandType::kWrite, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "boolean", Attributes::Boolean::Id, credsIssuerConfig), // make_unique(Id, "bitmap8", Attributes::Bitmap8::Id, credsIssuerConfig), // @@ -13491,13 +15693,24 @@ void registerClusterFaultInjection(Commands & commands, CredentialIssuerCommands // // Attributes // - make_unique(Id, credsIssuerConfig), // - make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // - make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // - make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // - make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // - make_unique>(Id, credsIssuerConfig), // + make_unique(Id, credsIssuerConfig), // + make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // + make_unique(Id, "attribute-list", Attributes::AttributeList::Id, credsIssuerConfig), // + make_unique(Id, "feature-map", Attributes::FeatureMap::Id, credsIssuerConfig), // + make_unique(Id, "cluster-revision", Attributes::ClusterRevision::Id, credsIssuerConfig), // + make_unique>(Id, credsIssuerConfig), // + make_unique>>( + Id, "generated-command-list", Attributes::GeneratedCommandList::Id, WriteCommandType::kForceWrite, + credsIssuerConfig), // + make_unique>>( + Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>>( + Id, "attribute-list", Attributes::AttributeList::Id, WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "feature-map", 0, UINT32_MAX, Attributes::FeatureMap::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // + make_unique>(Id, "cluster-revision", 0, UINT16_MAX, Attributes::ClusterRevision::Id, + WriteCommandType::kForceWrite, credsIssuerConfig), // make_unique(Id, credsIssuerConfig), // make_unique(Id, "generated-command-list", Attributes::GeneratedCommandList::Id, credsIssuerConfig), // make_unique(Id, "accepted-command-list", Attributes::AcceptedCommandList::Id, credsIssuerConfig), // From e7fd34d4f74e43f646a9ec7aec996f9f3ae9be1a Mon Sep 17 00:00:00 2001 From: Terence Hampson Date: Thu, 2 Feb 2023 15:23:07 -0500 Subject: [PATCH 19/25] Follow up typo fix (#24828) --- scripts/py_matter_yamltests/matter_yamltests/parser.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/py_matter_yamltests/matter_yamltests/parser.py b/scripts/py_matter_yamltests/matter_yamltests/parser.py index 9c5b6247380d5f..e60e0acd44bcaf 100644 --- a/scripts/py_matter_yamltests/matter_yamltests/parser.py +++ b/scripts/py_matter_yamltests/matter_yamltests/parser.py @@ -700,7 +700,7 @@ def _response_constraints_validation(self, response, result): response_type_name = self._test.response_mapping.get( expected_name) else: - # We don't have a mapping for this type. This happens for pseduo clusters. + # We don't have a mapping for this type. This happens for pseudo clusters. # If there is a constraint check for the type it is likely an incorrect # constraint check by the test writter. response_type_name = None From 0ef99b4f5648c34916721dcf151c6ad5f7fee0a6 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 2 Feb 2023 16:33:03 -0500 Subject: [PATCH 20/25] Make sure we don't double-close exchanges in OTA if an exchange times out. (#24818) Fixes https://github.com/project-chip/connectedhomeip/issues/24329 --- src/app/clusters/ota-requestor/DefaultOTARequestor.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/app/clusters/ota-requestor/DefaultOTARequestor.h b/src/app/clusters/ota-requestor/DefaultOTARequestor.h index 6cbe1629b96d24..e0e45c2709af2e 100644 --- a/src/app/clusters/ota-requestor/DefaultOTARequestor.h +++ b/src/app/clusters/ota-requestor/DefaultOTARequestor.h @@ -173,6 +173,12 @@ class DefaultOTARequestor : public OTARequestorInterface, public BDXDownloader:: void OnResponseTimeout(chip::Messaging::ExchangeContext * ec) override { ChipLogError(BDX, "exchange timed out"); + // Null out mExchangeCtx before calling OnDownloadTimeout, in case + // the downloader decides to call Reset() on us. If we don't, we + // will end up closing the exchange from Reset and then the caller + // will close it _again_ (see API documentation for + // OnResponseTimeout), which will lead to refcount underflow. + mExchangeCtx = nullptr; if (mDownloader != nullptr) { mDownloader->OnDownloadTimeout(); From db8a2716dc2ae7b01a319fac4d32ac55d76ad9b7 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 2 Feb 2023 17:43:25 -0500 Subject: [PATCH 21/25] Move shared callback bridge functionality to MTRCallbackBridgeBase. (#24738) Also eliminates the last direct (and hence not interceptible by API consumers) NSLog calls in the Darwin framework and adds a lint for those. Fixes https://github.com/project-chip/connectedhomeip/issues/23597 --- .github/workflows/lint.yml | 7 + .../Framework/CHIP/MTRCallbackBridgeBase.h | 180 ++++++++++-------- 2 files changed, 105 insertions(+), 82 deletions(-) diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index b0fcb996ff0e6d..1e0ae2f0e508c3 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -181,3 +181,10 @@ jobs: if: always() run: | git grep -n '0x%[0-9-]*" *PRI[^xX]' -- './*' ':(exclude).github/workflows/lint.yml' && exit 1 || exit 0 + + # git grep exits with 0 if it finds a match, but we want + # to fail (exit nonzero) on match. + - name: Check for use of NSLog instead of Matter logging in Matter framework + if: always() + run: | + git grep -n 'NSLog(' -- src/darwin/Framework/CHIP && exit 1 || exit 0 diff --git a/src/darwin/Framework/CHIP/MTRCallbackBridgeBase.h b/src/darwin/Framework/CHIP/MTRCallbackBridgeBase.h index 4304f15cd52a34..6faa134a1e92a4 100644 --- a/src/darwin/Framework/CHIP/MTRCallbackBridgeBase.h +++ b/src/darwin/Framework/CHIP/MTRCallbackBridgeBase.h @@ -35,6 +35,92 @@ NS_ASSUME_NONNULL_BEGIN * know. */ class MTRCallbackBridgeBase { +public: + /** + * Run the given MTRActionBlock on the Matter thread, after getting a CASE + * session (possibly pre-existing) to the given node ID on the fabric + * represented by the given MTRDeviceController. On success, convert the + * success value to whatever type it needs to be to call the callback type + * we're templated over. Once this function has been called, on a callback + * bridge allocated with `new`, the bridge object must not be accessed by + * the caller. The action block will handle deleting the bridge. + */ + void DispatchAction(chip::NodeId nodeID, MTRDeviceController * controller) && { ActionWithNodeID(nodeID, controller); } + + /** + * Run the given MTRActionBlock on the Matter thread after getting a secure + * session corresponding to the given MTRBaseDevice. On success, convert + * the success value to whatever type it needs to be to call the callback + * type we're templated over. Once this function has been called, on a callback + * bridge allocated with `new`, the bridge object must not be accessed by + * the caller. The action block will handle deleting the bridge. + */ + void DispatchAction(MTRBaseDevice * device) && + { + if (device.isPASEDevice) { + ActionWithPASEDevice(device); + } else { + ActionWithNodeID(device.nodeID, device.deviceController); + } + } + +protected: + MTRCallbackBridgeBase(dispatch_queue_t queue) + : mQueue(queue) + { + } + + virtual ~MTRCallbackBridgeBase() {}; + + virtual void MaybeDoAction(chip::Messaging::ExchangeManager * _Nullable exchangeManager, + const chip::Optional & session, NSError * _Nullable error) + = 0; + virtual void LogRequestStart() = 0; + + void ActionWithPASEDevice(MTRBaseDevice * device) + { + LogRequestStart(); + + [device.deviceController getSessionForCommissioneeDevice:device.nodeID + completion:^(chip::Messaging::ExchangeManager * exchangeManager, + const chip::Optional & session, NSError * error) { + MaybeDoAction(exchangeManager, session, error); + }]; + } + + void ActionWithNodeID(chip::NodeId nodeID, MTRDeviceController * controller) + { + LogRequestStart(); + + [controller getSessionForNode:nodeID + completion:^(chip::Messaging::ExchangeManager * exchangeManager, + const chip::Optional & session, NSError * error) { + MaybeDoAction(exchangeManager, session, error); + }]; + } + + // OnDone and KeepAliveOnCallback really only make sense for subscription + // bridges, but we put them here to avoid many copies of this code in + // generated bits. + void OnDone() + { + if (!mQueue) { + delete this; + return; + } + + // Delete ourselves async, so that any error/data reports we + // queued up before getting OnDone have a chance to run. + auto * self = this; + dispatch_async(mQueue, ^{ + delete self; + }); + } + + void KeepAliveOnCallback() { mKeepAlive = true; } + + dispatch_queue_t mQueue; + bool mKeepAlive = false; }; typedef void (^MTRResponseHandler)(id _Nullable value, NSError * _Nullable error); @@ -72,7 +158,7 @@ template class MTRCallbackBridge : public MTRCallbackBridgeBase { * on it. */ MTRCallbackBridge(dispatch_queue_t queue, MTRResponseHandler handler, T OnSuccessFn) - : mQueue(queue) + : MTRCallbackBridgeBase(queue) , mHandler(handler) , mSuccess(OnSuccessFn) , mFailure(OnFailureFn) @@ -84,7 +170,7 @@ template class MTRCallbackBridge : public MTRCallbackBridgeBase { * on it. */ MTRCallbackBridge(dispatch_queue_t queue, MTRResponseHandler handler, MTRActionBlock _Nonnull action, T OnSuccessFn) - : mQueue(queue) + : MTRCallbackBridgeBase(queue) , mHandler(handler) , mAction(action) , mSuccess(OnSuccessFn) @@ -92,34 +178,6 @@ template class MTRCallbackBridge : public MTRCallbackBridgeBase { { } - /** - * Run the given MTRActionBlock on the Matter thread, after getting a CASE - * session (possibly pre-existing) to the given node ID on the fabric - * represented by the given MTRDeviceController. On success, convert the - * success value to whatever type it needs to be to call the callback type - * we're templated over. Once this function has been called, on a callback - * bridge allocated with `new`, the bridge object must not be accessed by - * the caller. The action block will handle deleting the bridge. - */ - void DispatchAction(chip::NodeId nodeID, MTRDeviceController * controller) && { ActionWithNodeID(nodeID, controller); } - - /** - * Run the given MTRActionBlock on the Matter thread after getting a secure - * session corresponding to the given MTRBaseDevice. On success, convert - * the success value to whatever type it needs to be to call the callback - * type we're templated over. Once this function has been called, on a callback - * bridge allocated with `new`, the bridge object must not be accessed by - * the caller. The action block will handle deleting the bridge. - */ - void DispatchAction(MTRBaseDevice * device) && - { - if (device.isPASEDevice) { - ActionWithPASEDevice(device); - } else { - ActionWithNodeID(device.nodeID, device.deviceController); - } - } - /** * Try to run the given MTRLocalActionBlock on the Matter thread, if we have * a device and it's attached to a running controller, then handle @@ -142,8 +200,8 @@ template class MTRCallbackBridge : public MTRCallbackBridgeBase { asyncDispatchToMatterQueue:^() { CHIP_ERROR err = action(mSuccess, mFailure); if (err != CHIP_NO_ERROR) { - NSLog(@"Failure performing action. C++-mangled success callback type: '%s', error: %s", typeid(T).name(), - chip::ErrorStr(err)); + ChipLogError(Controller, "Failure performing action. C++-mangled success callback type: '%s', error: %s", + typeid(T).name(), chip::ErrorStr(err)); // Take the normal async error-reporting codepath. This will also // handle cleaning us up properly. @@ -155,29 +213,7 @@ template class MTRCallbackBridge : public MTRCallbackBridgeBase { }]; } - void ActionWithPASEDevice(MTRBaseDevice * device) - { - LogRequestStart(); - - [device.deviceController getSessionForCommissioneeDevice:device.nodeID - completion:^(chip::Messaging::ExchangeManager * exchangeManager, - const chip::Optional & session, NSError * error) { - MaybeDoAction(exchangeManager, session, error); - }]; - } - - void ActionWithNodeID(chip::NodeId nodeID, MTRDeviceController * controller) - { - LogRequestStart(); - - [controller getSessionForNode:nodeID - completion:^(chip::Messaging::ExchangeManager * exchangeManager, - const chip::Optional & session, NSError * error) { - MaybeDoAction(exchangeManager, session, error); - }]; - } - - void LogRequestStart() + void LogRequestStart() override { mRequestTime = [NSDate date]; // Generate a unique cookie to track this operation @@ -186,7 +222,7 @@ template class MTRCallbackBridge : public MTRCallbackBridgeBase { } void MaybeDoAction(chip::Messaging::ExchangeManager * _Nullable exchangeManager, - const chip::Optional & session, NSError * _Nullable error) + const chip::Optional & session, NSError * _Nullable error) override { // Make sure we don't hold on to our action longer than we have to. auto action = mAction; @@ -198,8 +234,8 @@ template class MTRCallbackBridge : public MTRCallbackBridgeBase { CHIP_ERROR err = action(*exchangeManager, session.Value(), mSuccess, mFailure, this); if (err != CHIP_NO_ERROR) { - NSLog(@"Failure performing action. C++-mangled success callback type: '%s', error: %s", typeid(T).name(), - chip::ErrorStr(err)); + ChipLogError(Controller, "Failure performing action. C++-mangled success callback type: '%s', error: %s", + typeid(T).name(), chip::ErrorStr(err)); // Take the normal async error-reporting codepath. This will also // handle cleaning us up properly. @@ -209,35 +245,13 @@ template class MTRCallbackBridge : public MTRCallbackBridgeBase { virtual ~MTRCallbackBridge() {}; +protected: static void OnFailureFn(void * context, CHIP_ERROR error) { DispatchFailure(context, [MTRError errorForCHIPErrorCode:error]); } static void DispatchSuccess(void * context, id _Nullable value) { DispatchCallbackResult(context, nil, value); } static void DispatchFailure(void * context, NSError * error) { DispatchCallbackResult(context, error, nil); } -protected: - // OnDone and KeepAliveOnCallback really only make sense for subscription - // bridges, but we put them here to avoid many copies of this code in - // generated bits. - void OnDone() - { - if (!mQueue) { - delete this; - return; - } - - // Delete ourselves async, so that any error/data reports we - // queued up before getting OnDone have a chance to run. - auto * self = this; - dispatch_async(mQueue, ^{ - delete self; - }); - } - - void KeepAliveOnCallback() { mKeepAlive = true; } - - dispatch_queue_t mQueue; - private: static void DispatchCallbackResult(void * context, NSError * _Nullable error, id _Nullable value) { @@ -266,7 +280,9 @@ template class MTRCallbackBridge : public MTRCallbackBridgeBase { MTRResponseHandler mHandler; MTRActionBlock _Nullable mAction; - bool mKeepAlive = false; + // Keep our subclasses from accessing mKeepAlive directly, by putting this + // "using" in our private section. + using MTRCallbackBridgeBase::mKeepAlive; T mSuccess; MTRErrorCallback mFailure; From 09c9034f03fd899ee69760294a3ad4d4837e2236 Mon Sep 17 00:00:00 2001 From: Sharad Binjola <31142146+sharadb-amazon@users.noreply.github.com> Date: Thu, 2 Feb 2023 17:30:52 -0800 Subject: [PATCH 22/25] tv-casting-app: Fixing issues passing uniqueIDs and Video player caching (#24745) * tv-casting-app/android: Updates to how the rotatingDeviceIdUniqueId is passed * tv-casting-app: Fixing persistence logic --- .../jni/com/chip/casting/AppParameters.java | 18 ++++++++-- .../app/src/main/jni/cpp/ConversionUtils.cpp | 23 ++++++++++--- .../include/CHIPProjectAppConfig.h | 2 +- .../src/PersistenceManager.cpp | 33 ++++++++++++------- 4 files changed, 57 insertions(+), 19 deletions(-) diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/AppParameters.java b/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/AppParameters.java index 78cbad859fc961..cf4d626bac248c 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/AppParameters.java +++ b/examples/tv-casting-app/android/App/app/src/main/jni/com/chip/casting/AppParameters.java @@ -17,7 +17,12 @@ */ package com.chip.casting; +import android.util.Log; +import java.math.BigInteger; +import java.util.Arrays; + public class AppParameters { + private static final String TAG = AppParameters.class.getSimpleName(); public static final int MIN_ROTATING_DEVICE_ID_UNIQUE_ID_LENGTH = 16; private static final int TEST_SETUP_PASSCODE = 20202021; private static final int TEST_DISCRIMINATOR = 0xF00; @@ -32,11 +37,20 @@ public class AppParameters { private int discriminator = TEST_DISCRIMINATOR; public void setRotatingDeviceIdUniqueId(byte[] rotatingDeviceIdUniqueId) { - this.rotatingDeviceIdUniqueId = rotatingDeviceIdUniqueId; + Log.d( + TAG, + "AppParameters.setRotatingDeviceIdUniqueId called with " + + new BigInteger(1, rotatingDeviceIdUniqueId).toString(16)); + this.rotatingDeviceIdUniqueId = + Arrays.copyOf(rotatingDeviceIdUniqueId, rotatingDeviceIdUniqueId.length); } public byte[] getRotatingDeviceIdUniqueId() { - return rotatingDeviceIdUniqueId; + Log.d( + TAG, + "AppParameters.getRotatingDeviceIdUniqueId returning copyOf " + + new BigInteger(1, rotatingDeviceIdUniqueId).toString(16)); + return Arrays.copyOf(rotatingDeviceIdUniqueId, rotatingDeviceIdUniqueId.length); } public DACProvider getDacProvider() { diff --git a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/ConversionUtils.cpp b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/ConversionUtils.cpp index 8112c6b2acfb90..cff8ddd8ba9677 100644 --- a/examples/tv-casting-app/android/App/app/src/main/jni/cpp/ConversionUtils.cpp +++ b/examples/tv-casting-app/android/App/app/src/main/jni/cpp/ConversionUtils.cpp @@ -32,12 +32,27 @@ CHIP_ERROR convertJAppParametersToCppAppParams(jobject appParameters, AppParams ReturnErrorOnFailure( chip::JniReferences::GetInstance().GetClassRef(env, "com/chip/casting/AppParameters", jAppParametersClass)); - jfieldID jRotatingDeviceIdUniqueIdField = env->GetFieldID(jAppParametersClass, "rotatingDeviceIdUniqueId", "[B"); - jobject jRotatingDeviceIdUniqueId = env->GetObjectField(appParameters, jRotatingDeviceIdUniqueIdField); + jmethodID getRotatingDeviceIdUniqueIdMethod = env->GetMethodID(jAppParametersClass, "getRotatingDeviceIdUniqueId", "()[B"); + if (getRotatingDeviceIdUniqueIdMethod == nullptr) + { + ChipLogError(Zcl, "Failed to access AppParameters 'getRotatingDeviceIdUniqueId' method"); + env->ExceptionClear(); + } + + jobject jRotatingDeviceIdUniqueId = (jobject) env->CallObjectMethod(appParameters, getRotatingDeviceIdUniqueIdMethod); + if (env->ExceptionCheck()) + { + ChipLogError(Zcl, "Java exception in AppParameters::getRotatingDeviceIdUniqueId"); + env->ExceptionDescribe(); + env->ExceptionClear(); + return CHIP_ERROR_INCORRECT_STATE; + } + if (jRotatingDeviceIdUniqueId != nullptr) { - chip::JniByteArray jniRotatingDeviceIdUniqueIdByteArray(env, static_cast(jRotatingDeviceIdUniqueId)); - outAppParams.SetRotatingDeviceIdUniqueId(MakeOptional(jniRotatingDeviceIdUniqueIdByteArray.byteSpan())); + chip::JniByteArray * jniRotatingDeviceIdUniqueIdByteArray = + new chip::JniByteArray(env, static_cast(jRotatingDeviceIdUniqueId)); + outAppParams.SetRotatingDeviceIdUniqueId(MakeOptional(jniRotatingDeviceIdUniqueIdByteArray->byteSpan())); } return CHIP_NO_ERROR; diff --git a/examples/tv-casting-app/tv-casting-common/include/CHIPProjectAppConfig.h b/examples/tv-casting-app/tv-casting-common/include/CHIPProjectAppConfig.h index e11b96824bcd5a..641cf0d120be0c 100644 --- a/examples/tv-casting-app/tv-casting-common/include/CHIPProjectAppConfig.h +++ b/examples/tv-casting-app/tv-casting-common/include/CHIPProjectAppConfig.h @@ -60,4 +60,4 @@ #define CHIP_ENABLE_ROTATING_DEVICE_ID 1 -#define CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID_LENGTH 64 +#define CHIP_DEVICE_CONFIG_ROTATING_DEVICE_ID_UNIQUE_ID_LENGTH 128 diff --git a/examples/tv-casting-app/tv-casting-common/src/PersistenceManager.cpp b/examples/tv-casting-app/tv-casting-common/src/PersistenceManager.cpp index 1e92e6eb4e2e13..dea0277064b30c 100644 --- a/examples/tv-casting-app/tv-casting-common/src/PersistenceManager.cpp +++ b/examples/tv-casting-app/tv-casting-common/src/PersistenceManager.cpp @@ -46,12 +46,17 @@ CHIP_ERROR PersistenceManager::AddVideoPlayer(TargetVideoPlayerInfo * targetVide // found the same video player, overwrite the data if (cachedVideoPlayers[i] == *targetVideoPlayerInfo) { + ChipLogProgress(AppServer, + "PersistenceManager::AddVideoPlayer found video player already cached. Overwriting at position: %lu", + static_cast(i)); cachedVideoPlayers[i] = *targetVideoPlayerInfo; newVideoPlayer = false; } } if (newVideoPlayer) { + ChipLogProgress(AppServer, "PersistenceManager::AddVideoPlayer writing new video player at position: %lu", + static_cast(i)); VerifyOrReturnError(i < kMaxCachedVideoPlayers, CHIP_ERROR_BUFFER_TOO_SMALL); cachedVideoPlayers[i] = *targetVideoPlayerInfo; } @@ -78,7 +83,8 @@ CHIP_ERROR PersistenceManager::WriteAllVideoPlayers(TargetVideoPlayerInfo videoP ReturnErrorOnFailure( tlvWriter.StartContainer(TLV::ContextTag(kVideoPlayersContainerTag), TLV::kTLVType_Structure, videoPlayersContainerType)); - for (size_t videoPlayerIndex = 0; videoPlayerIndex < kMaxCachedVideoPlayers && videoPlayers[videoPlayerIndex].IsInitialized(); + size_t videoPlayerIndex; + for (videoPlayerIndex = 0; videoPlayerIndex < kMaxCachedVideoPlayers && videoPlayers[videoPlayerIndex].IsInitialized(); videoPlayerIndex++) { TargetVideoPlayerInfo * videoPlayer = &videoPlayers[videoPlayerIndex]; @@ -146,19 +152,19 @@ CHIP_ERROR PersistenceManager::WriteAllVideoPlayers(TargetVideoPlayerInfo videoP // Content app endpoints container ends ReturnErrorOnFailure(tlvWriter.EndContainer(contentAppEndpointsContainerType)); } - // Video Players container ends - ReturnErrorOnFailure(tlvWriter.EndContainer(videoPlayersContainerType)); - ReturnErrorOnFailure(tlvWriter.EndContainer(outerContainerType)); - - ReturnErrorOnFailure(tlvWriter.Finalize()); - ChipLogProgress(AppServer, - "PersistenceManager::WriteAllVideoPlayers TLV(CastingData).LengthWritten: %d bytes and version: %d", - tlvWriter.GetLengthWritten(), kCurrentCastingDataVersion); - return chip::DeviceLayer::PersistedStorage::KeyValueStoreMgr().Put(kCastingDataKey, castingData, - tlvWriter.GetLengthWritten()); } } - return CHIP_NO_ERROR; + + // Video Players container ends + ReturnErrorOnFailure(tlvWriter.EndContainer(videoPlayersContainerType)); + ReturnErrorOnFailure(tlvWriter.EndContainer(outerContainerType)); + + ReturnErrorOnFailure(tlvWriter.Finalize()); + ChipLogProgress(AppServer, + "PersistenceManager::WriteAllVideoPlayers TLV(CastingData).LengthWritten: %d bytes, video player count: %lu " + "and version: %d", + tlvWriter.GetLengthWritten(), static_cast(videoPlayerIndex), kCurrentCastingDataVersion); + return chip::DeviceLayer::PersistedStorage::KeyValueStoreMgr().Put(kCastingDataKey, castingData, tlvWriter.GetLengthWritten()); } CHIP_ERROR PersistenceManager::ReadAllVideoPlayers(TargetVideoPlayerInfo outVideoPlayers[]) @@ -379,6 +385,9 @@ CHIP_ERROR PersistenceManager::ReadAllVideoPlayers(TargetVideoPlayerInfo outVide VerifyOrReturnError(err == CHIP_END_OF_TLV, err); ReturnErrorOnFailure(reader.ExitContainer(videoPlayersContainerType)); ReturnErrorOnFailure(reader.ExitContainer(outerContainerType)); + + ChipLogProgress(AppServer, "PersistenceManager::ReadAllVideoPlayers Video player read count: %lu", + static_cast(videoPlayerIndex)); return CHIP_NO_ERROR; } From bdfee0e5818d250589bc4f7176e7f3da0bd860a7 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 2 Feb 2023 20:36:44 -0500 Subject: [PATCH 23/25] Improve error reporting in chip-tool when the wrong quotes are used. (#24821) * Improve error reporting in chip-tool when the wrong quotes are used. In interactive mode, arguments are delimited by single quotes. If our argument init fails, and we have arguments that include mismatched double quotes, there's a good chance the wrong quotes were used in the command, and we should log that. * Address review comment. --- .../chip-tool/commands/common/Commands.cpp | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/examples/chip-tool/commands/common/Commands.cpp b/examples/chip-tool/commands/common/Commands.cpp index adab8a12be75f5..749cbdcc739250 100644 --- a/examples/chip-tool/commands/common/Commands.cpp +++ b/examples/chip-tool/commands/common/Commands.cpp @@ -72,6 +72,35 @@ std::vector GetArgumentsFromJson(Command * command, Json::Value & v return args; }; +// Check for arguments with a starting '"' but no ending '"': those +// would indicate that people are using double-quoting, not single +// quoting, on arguments with spaces. +static void DetectAndLogMismatchedDoubleQuotes(int argc, char ** argv) +{ + for (int curArg = 0; curArg < argc; ++curArg) + { + char * arg = argv[curArg]; + if (!arg) + { + continue; + } + + auto len = strlen(arg); + if (len == 0) + { + continue; + } + + if (arg[0] == '"' && arg[len - 1] != '"') + { + ChipLogError(chipTool, + "Mismatched '\"' detected in argument: '%s'. Use single quotes to delimit arguments with spaces " + "in them: 'x y', not \"x y\".", + arg); + } + } +} + } // namespace void Commands::Register(const char * clusterName, commands_list commandsList) @@ -217,6 +246,10 @@ CHIP_ERROR Commands::RunCommand(int argc, char ** argv, bool interactive) int argumentsPosition = isGlobalCommand ? 4 : 3; if (!command->InitArguments(argc - argumentsPosition, &argv[argumentsPosition])) { + if (interactive) + { + DetectAndLogMismatchedDoubleQuotes(argc - argumentsPosition, &argv[argumentsPosition]); + } ShowCommand(argv[0], argv[1], command); return CHIP_ERROR_INVALID_ARGUMENT; } From 1deb607ad5c0b1391b001f41adb695452b2d32a0 Mon Sep 17 00:00:00 2001 From: Terence Hampson Date: Thu, 2 Feb 2023 20:37:00 -0500 Subject: [PATCH 24/25] Fix minor issue with PICS test step check, and enable tests (#24832) --- scripts/tests/chiptest/__init__.py | 59 +++++-------------- .../yamltest_with_chip_repl_tester.py | 4 +- 2 files changed, 17 insertions(+), 46 deletions(-) diff --git a/scripts/tests/chiptest/__init__.py b/scripts/tests/chiptest/__init__.py index 08153207f1420e..aecdf0cf0336f2 100644 --- a/scripts/tests/chiptest/__init__.py +++ b/scripts/tests/chiptest/__init__.py @@ -59,50 +59,21 @@ def _GetManualTests() -> Set[ManualTest]: # for this reason are marked as manual". # # We are working to get this list down to 0. - manualtests.add(ManualTest(yaml="OTA_SuccessfulTransfer.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_ACE_1_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_ACE_1_5.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_ACL_2_10.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_ACL_2_7.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_ACL_2_8.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_ACL_2_9.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_APBSC_9_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_BINFO_2_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_CC_6_2.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_CC_6_3.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_CC_8_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_CGEN_2_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_CHANNEL_5_3.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_DGETH_2_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_DGETH_2_2.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_DGGEN_2_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_DGWIFI_2_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_DRLK_2_2.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_DRLK_2_3.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_DRLK_2_5.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_DRLK_2_7.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_LOWPOWER_2_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_LUNIT_3_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_MEDIAINPUT_3_12.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_MEDIAPLAYBACK_6_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_MEDIAPLAYBACK_6_2.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_MEDIAPLAYBACK_6_3.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_MEDIAPLAYBACK_6_4.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_PCC_2_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_PS_2_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_SC_5_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_SC_5_2.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_TSTAT_2_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_TSTAT_2_2.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_TSUIC_2_2.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_WAKEONLAN_4_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_WNCV_2_1.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="Test_TC_WNCV_2_5.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="TestClusterMultiFabric.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="TestCommissionerNodeId.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="TestEvents.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="TestGroupMessaging.yaml", reason="TODO")) - manualtests.add(ManualTest(yaml="TestMultiAdmin.yaml", reason="TODO")) + manualtests.add(ManualTest(yaml="Test_TC_ACL_2_10.yaml", reason="TODO Event Not Supported Yet")) + manualtests.add(ManualTest(yaml="Test_TC_ACL_2_7.yaml", reason="TODO Event Not Supported Yet")) + manualtests.add(ManualTest(yaml="Test_TC_ACL_2_8.yaml", reason="TODO Event Not Supported Yet")) + manualtests.add(ManualTest(yaml="Test_TC_ACL_2_9.yaml", reason="TODO Event Not Supported Yet")) + manualtests.add(ManualTest(yaml="TestEvents.yaml", reason="TODO Event Not Supported Yet")) + + manualtests.add(ManualTest(yaml="Test_TC_ACE_1_1.yaml", reason="TODO GetCommissionerNodeId Not Supported Yet")) + manualtests.add(ManualTest(yaml="Test_TC_ACE_1_5.yaml", reason="TODO GetCommissionerNodeId Not Supported Yet")) + manualtests.add(ManualTest(yaml="Test_TC_SC_5_1.yaml", reason="TODO GetCommissionerNodeId Not Supported Yet")) + manualtests.add(ManualTest(yaml="Test_TC_SC_5_2.yaml", reason="TODO GetCommissionerNodeId Not Supported Yet")) + manualtests.add(ManualTest(yaml="TestCommissionerNodeId.yaml", reason="TODO GetCommissionerNodeId Not Supported Yet")) + + manualtests.add(ManualTest(yaml="TestClusterMultiFabric.yaml", reason="TODO Enum Mismatch")) + manualtests.add(ManualTest(yaml="TestGroupMessaging.yaml", reason="TODO Group Message Not Supported in chip-repl yet")) + manualtests.add(ManualTest(yaml="TestMultiAdmin.yaml", reason="TODO chip-repl hangs on command expected to fail")) # Failing, unclear why. Likely repl specific, used to pass however first # failure point seems unrelated. Historically this seems (very?) flaky diff --git a/scripts/tests/chiptest/yamltest_with_chip_repl_tester.py b/scripts/tests/chiptest/yamltest_with_chip_repl_tester.py index f1d5583feb865c..fada763dc15466 100644 --- a/scripts/tests/chiptest/yamltest_with_chip_repl_tester.py +++ b/scripts/tests/chiptest/yamltest_with_chip_repl_tester.py @@ -106,13 +106,13 @@ def _StackShutDown(): # Executing and validating test for test_step in yaml.tests: + if not test_step.is_pics_enabled: + continue test_action = runner.encode(test_step) # TODO if test_action is None we should see if it is a pseudo cluster. if test_action is None: raise Exception( f'Failed to encode test step {test_step.label}') - if not test_action.pics_enabled: - continue response = runner.execute(test_action) decoded_response = runner.decode(response) From 17d7f00549b6aedb856ed520501156002903a32d Mon Sep 17 00:00:00 2001 From: Jerry Johns Date: Thu, 2 Feb 2023 20:01:03 -0800 Subject: [PATCH 25/25] Fix up the Matter REPL Deepnote links (#24839) --- docs/guides/matter-repl.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/guides/matter-repl.md b/docs/guides/matter-repl.md index 5b15ef583299c8..5577881bca8f00 100644 --- a/docs/guides/matter-repl.md +++ b/docs/guides/matter-repl.md @@ -183,13 +183,13 @@ launched into the playground: ## Guides -[REPL Basics](https://deepnote.com/viewer/github/project-chip/connectedhomeip/blob/master/docs/guides/repl/Matter%20-%20REPL%20Intro.ipynb) +[REPL Basics](https://deepnote.com/viewer/github/project-chip/connectedhomeip/blob/master/docs/guides/repl/Matter_REPL_Intro.ipynb) -[Using the IM](https://deepnote.com/viewer/github/project-chip/connectedhomeip/blob/master/docs/guides/repl/Matter%20-%20Basic%20Interactions.ipynb) +[Using the IM](https://deepnote.com/viewer/github/project-chip/connectedhomeip/blob/master/docs/guides/repl/Matter_Basic_Interactions.ipynb) -[Multi Fabric Commissioning](https://deepnote.com/viewer/github/project-chip/connectedhomeip/blob/master/docs/guides/repl/Matter%20-%20Multi%20Fabric%20Commissioning.ipynb) +[Multi Fabric Commissioning](https://deepnote.com/viewer/github/project-chip/connectedhomeip/blob/master/docs/guides/repl/Matter_Multi_Fabric_Commissioning.ipynb) -[Access Control](https://deepnote.com/viewer/github/project-chip/connectedhomeip/blob/master/docs/guides/repl/Matter%20-%20Access%20Control.ipynb) +[Access Control](https://deepnote.com/viewer/github/project-chip/connectedhomeip/blob/master/docs/guides/repl/Matter_Access_Control.ipynb) ## Testing