From 9a7ed86f2b3c3362819ee8eb49f1523a7a842ee7 Mon Sep 17 00:00:00 2001 From: Ingo Fischer Date: Thu, 30 Jul 2026 20:42:25 +0200 Subject: [PATCH] fix(model): provisional conformance no longer implies mandatory An otherwise list whose terms follow a "P" describes the conformance intended once the element is no longer provisional. Applicability caps those terms at optional, matching Conformance.isMandatory and the runtime conformance compiler, which already read "P, M" this way. The variance engine agrees, so generated types declare provisional elements optional rather than always present. GroupcastServer now enables the elements it implements. Co-Authored-By: Claude Opus 5 (1M context) --- CHANGELOG.md | 11 +++ packages/model/src/aspects/Conformance.ts | 16 +++- .../cluster-variance/InferredComponents.ts | 13 ++- .../model/test/aspects/ConformanceTest.ts | 56 +++++++++++++ .../model/test/logic/ClusterVarianceTest.ts | 17 +++- .../behaviors/groupcast/GroupcastServer.ts | 21 ++++- .../GroupKeyManagementServerTest.ts | 6 ++ ...ThreadNetworkDiagnosticsProvisionalTest.ts | 37 +++++++++ .../types/src/clusters/access-control.d.ts | 4 +- .../src/clusters/ambient-context-sensing.d.ts | 30 +++---- .../src/clusters/general-commissioning.d.ts | 4 +- .../src/clusters/group-key-management.d.ts | 2 +- packages/types/src/clusters/groupcast.d.ts | 12 +-- .../src/clusters/microwave-oven-control.d.ts | 4 +- packages/types/src/clusters/thermostat.d.ts | 16 ++-- .../clusters/thread-network-diagnostics.d.ts | 80 +++++++++---------- 16 files changed, 243 insertions(+), 86 deletions(-) create mode 100644 packages/node/test/behaviors/thread-network-diagnostics/ThreadNetworkDiagnosticsProvisionalTest.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index d1eba19eab..a5448fe10e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,17 @@ The main work (all changes without a GitHub username in brackets in the below li ## __WORK IN PROGRESS__ --> +## __WORK IN PROGRESS__ + +- @matter/model + - Breaking: A provisional element is no longer mandatory; conformance following a `P` describes the conformance intended once the element leaves provisional state + +- @matter/types + - Breaking: Provisional cluster elements are now typed as optional rather than always present + +- @matter/node + - Breaking: Provisional elements are no longer implemented by default; supply a state value or use `ClusterBehavior.enable()` to implement one + ## 0.17.7 (2026-07-27) - @matter/general diff --git a/packages/model/src/aspects/Conformance.ts b/packages/model/src/aspects/Conformance.ts index 73199f260c..0d492b4717 100644 --- a/packages/model/src/aspects/Conformance.ts +++ b/packages/model/src/aspects/Conformance.ts @@ -810,7 +810,17 @@ function computeApplicability(features: Set, supportedFeatures: Set, supportedFeatures: Set, supportedFeatures: Set= vN) indicates when an element was introduced. @@ -391,7 +398,7 @@ function addElement(components: InferredComponents, element: ValueModel) { const match = text.match(matcher.pattern); if (match) { matcher.processor((optional, condition) => { - addVariance(components, element, optional, condition); + addVariance(components, element, optional || provisional, condition); }, match.slice(1)); return; } diff --git a/packages/model/test/aspects/ConformanceTest.ts b/packages/model/test/aspects/ConformanceTest.ts index eeacc1c905..68c49848a0 100644 --- a/packages/model/test/aspects/ConformanceTest.ts +++ b/packages/model/test/aspects/ConformanceTest.ts @@ -563,4 +563,60 @@ describe("Conformance", () => { expect(conformance.toString()).equal("Rev >= v3"); }); }); + + describe("applicability", () => { + const { None, Optional, Conditional, Mandatory } = Conformance.Applicability; + + function applicability(definition: string, ...supportedFeatures: string[]) { + return new Conformance(definition).applicabilityFor({ + definedFeatures: new Set(["AA", "BB"]), + supportedFeatures: new Set(supportedFeatures), + }); + } + + it("resolves plain flags", () => { + expect(applicability("M")).equal(Mandatory); + expect(applicability("O")).equal(Optional); + expect(applicability("X")).equal(None); + expect(applicability("D")).equal(None); + }); + + it("resolves features", () => { + expect(applicability("AA", "AA")).equal(Mandatory); + expect(applicability("AA")).equal(None); + expect(applicability("AA, O", "AA")).equal(Mandatory); + expect(applicability("AA, O")).equal(Optional); + }); + + it("makes a standalone provisional element optional", () => { + expect(applicability("P")).equal(Optional); + }); + + it("caps an intended mandatory conformance at optional", () => { + expect(applicability("P, M")).equal(Optional); + }); + + it("caps an intended feature conformance at optional", () => { + expect(applicability("P, AA", "AA")).equal(Optional); + expect(applicability("P, AA & BB", "AA", "BB")).equal(Optional); + }); + + it("excludes an intended feature conformance whose feature is unsupported", () => { + expect(applicability("P, AA")).equal(None); + expect(applicability("P, AA & BB", "AA")).equal(None); + }); + + it("leaves an intended optional conformance optional", () => { + expect(applicability("P, O")).equal(Optional); + expect(applicability("P, [AA & BB]", "AA", "BB")).equal(Optional); + }); + + it("leaves an intended conditional conformance conditional", () => { + expect(applicability("P, desc")).equal(Conditional); + }); + + it("does not cap a mandatory term preceding the provisional term", () => { + expect(applicability("AA, P", "AA")).equal(Mandatory); + }); + }); }); diff --git a/packages/model/test/logic/ClusterVarianceTest.ts b/packages/model/test/logic/ClusterVarianceTest.ts index 889af7b097..67ab598d1d 100644 --- a/packages/model/test/logic/ClusterVarianceTest.ts +++ b/packages/model/test/logic/ClusterVarianceTest.ts @@ -30,8 +30,12 @@ describe("ClusterVariance", () => { expectComponents(attrs({ name: "attr", conformance: "D" }), { optional: ["attr"] }); }); - it("ignores provisional", () => { - expectComponents(attrs({ name: "attr", conformance: "P, M" }), { mandatory: ["attr"] }); + it("classifies provisional as optional", () => { + expectComponents(attrs({ name: "attr", conformance: "P, M" }), { optional: ["attr"] }); + }); + + it("classifies a provisional element without intended conformance as optional", () => { + expectComponents(attrs({ name: "attr", conformance: "P" }), { optional: ["attr"] }); }); }); @@ -43,6 +47,13 @@ describe("ClusterVariance", () => { }); }); + it("classifies provisional by feature as optional", () => { + expectComponents(attrs(["FOO"], { name: "attr", conformance: "P, FOO" }), { + optional: ["attr"], + condition: { allOf: ["FOO"] }, + }); + }); + it("classifies optional by feature", () => { expectComponents(attrs(["FOO"], { name: "attr", conformance: "[FOO]" }), { optional: ["attr"], @@ -132,7 +143,7 @@ describe("ClusterVariance", () => { it("parses provisional comma otherwise-list P, FOO, BAR, BAZ", () => { expectComponents(attrs(["FOO", "BAR", "BAZ"], { name: "attr", conformance: "P, FOO, BAR, BAZ" }), { - mandatory: ["attr"], + optional: ["attr"], condition: { anyOf: ["FOO", "BAR", "BAZ"] }, }); }); diff --git a/packages/node/src/behaviors/groupcast/GroupcastServer.ts b/packages/node/src/behaviors/groupcast/GroupcastServer.ts index 1525bd14fe..5d353253df 100644 --- a/packages/node/src/behaviors/groupcast/GroupcastServer.ts +++ b/packages/node/src/behaviors/groupcast/GroupcastServer.ts @@ -30,6 +30,23 @@ const UNMAPPED_KEYSET_ID = 0xffff; /** TODO: remove once the Groupcast cluster leaves provisional state in the Matter specification. */ const GROUPCAST_IS_PROVISIONAL = true; +/** + * Every element of this provisional cluster is optional, so declare the ones this server implements. + * + * TODO: remove once the Groupcast cluster leaves provisional state in the Matter specification. Its elements become + * mandatory again at that point and matter.js implements them without this declaration. + */ +const Base = GroupcastBehavior.enable({ + attributes: { + membership: true, + maxMembershipCount: true, + maxMcastAddrCount: true, + usedMcastAddrCount: true, + fabricUnderTest: true, + }, + events: { groupcastTesting: true }, +}); + /** * This is the default server implementation of {@link GroupcastBehavior}. * @@ -44,7 +61,7 @@ const GROUPCAST_IS_PROVISIONAL = true; * - On first use by a fabric, marks the fabric as "GroupcastAdopted" in GKM, making GroupKeyMap read-only. * - Migrates legacy group data from the Groups cluster on startup. */ -export class GroupcastServer extends GroupcastBehavior { +export class GroupcastServer extends Base { declare internal: GroupcastServer.Internal; /** Timer for GroupcastTesting auto-disable. */ @@ -652,7 +669,7 @@ export namespace GroupcastServer { } /** Default state overrides for GroupcastServer. */ - export class State extends GroupcastBehavior.State { + export class State extends Base.State { /** * Implementation-defined maximum membership count (min 10 per spec). * Set to 2 * GKM.maxGroupsPerFabric (44) so per-fabric quota floor(44/2)=22 aligns exactly diff --git a/packages/node/test/behaviors/group-key-management/GroupKeyManagementServerTest.ts b/packages/node/test/behaviors/group-key-management/GroupKeyManagementServerTest.ts index 4e5d425184..cc4cbde684 100644 --- a/packages/node/test/behaviors/group-key-management/GroupKeyManagementServerTest.ts +++ b/packages/node/test/behaviors/group-key-management/GroupKeyManagementServerTest.ts @@ -15,6 +15,12 @@ describe("GroupKeyManagementServer", () => { MockTime.init(); }); + it("does not implement the provisional GroupcastAdoption attribute by default", () => { + const state = new (GroupKeyManagementServer.with("Groupcast").State)(); + + expect(state.groupcastAdoption).undefined; + }); + it("prevents too many group keys", async () => { await using site = new MockSite(); // Device is automatically configured with vendorId 0xfff1 and productId 0x8000 diff --git a/packages/node/test/behaviors/thread-network-diagnostics/ThreadNetworkDiagnosticsProvisionalTest.ts b/packages/node/test/behaviors/thread-network-diagnostics/ThreadNetworkDiagnosticsProvisionalTest.ts new file mode 100644 index 0000000000..de29ebed6a --- /dev/null +++ b/packages/node/test/behaviors/thread-network-diagnostics/ThreadNetworkDiagnosticsProvisionalTest.ts @@ -0,0 +1,37 @@ +/** + * @license + * Copyright 2022-2026 Matter.js Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +import { ThreadNetworkDiagnosticsServer } from "#behaviors/thread-network-diagnostics"; +import { AttributeId } from "@matter/types"; +import { MockServerNode } from "../../node/mock-server-node.js"; + +// ExtAddress (0x3f) and Rloc16 (0x40) are provisional ("P, M") in Matter 1.6 so they are absent until an application +// implements them +const EXT_ADDRESS_ID = AttributeId(0x3f); +const RLOC16_ID = AttributeId(0x40); + +describe("provisional ThreadNetworkDiagnostics attributes", () => { + async function attributeIdsOf(type: typeof ThreadNetworkDiagnosticsServer, state?: Record) { + await using node = await MockServerNode.create(MockServerNode.RootEndpoint.with(type), { + threadNetworkDiagnostics: state, + }); + return new Set(node.globalsOf(type).attributeList); + } + + it("are absent by default", async () => { + const ids = await attributeIdsOf(ThreadNetworkDiagnosticsServer); + + expect(ids.has(EXT_ADDRESS_ID)).false; + expect(ids.has(RLOC16_ID)).false; + }); + + it("are present once the application supplies a value", async () => { + const ids = await attributeIdsOf(ThreadNetworkDiagnosticsServer, { extAddress: null, rloc16: null }); + + expect(ids.has(EXT_ADDRESS_ID)).true; + expect(ids.has(RLOC16_ID)).true; + }); +}); diff --git a/packages/types/src/clusters/access-control.d.ts b/packages/types/src/clusters/access-control.d.ts index 0180ea6d2b..5db2a14d4a 100644 --- a/packages/types/src/clusters/access-control.d.ts +++ b/packages/types/src/clusters/access-control.d.ts @@ -207,7 +207,7 @@ export declare namespace AccessControl { * * @see {@link MatterSpecification.v16.Core} § 9.10.6.10 */ - auxiliaryAcl: AccessControlEntry[]; + auxiliaryAcl?: AccessControlEntry[]; } /** @@ -464,7 +464,7 @@ export declare namespace AccessControl { * * @see {@link MatterSpecification.v16.Core} § 9.10.9.4 */ - auxiliaryAccessUpdated: AuxiliaryAccessUpdatedEvent; + auxiliaryAccessUpdated?: AuxiliaryAccessUpdatedEvent; } /** diff --git a/packages/types/src/clusters/ambient-context-sensing.d.ts b/packages/types/src/clusters/ambient-context-sensing.d.ts index 8d0cf9d213..f23a17b8f7 100644 --- a/packages/types/src/clusters/ambient-context-sensing.d.ts +++ b/packages/types/src/clusters/ambient-context-sensing.d.ts @@ -59,7 +59,7 @@ export declare namespace AmbientContextSensing { * * @see {@link MatterSpecification.v16.Cluster} § 2.16.7.9 */ - simultaneousDetectionLimit: number; + simultaneousDetectionLimit?: number; /** * Indicates the time duration of True state, in seconds, before the sensor changes its sensing detection state @@ -72,7 +72,7 @@ export declare namespace AmbientContextSensing { * * @see {@link MatterSpecification.v16.Cluster} § 2.16.7.10 */ - holdTime: number; + holdTime?: number; /** * Indicates the server's limits, and default value, for the HoldTime attribute. This is equivalent to the @@ -81,7 +81,7 @@ export declare namespace AmbientContextSensing { * * @see {@link MatterSpecification.v16.Cluster} § 2.16.7.11 */ - holdTimeLimits: HoldTimeLimits; + holdTimeLimits?: HoldTimeLimits; } /** @@ -94,7 +94,7 @@ export declare namespace AmbientContextSensing { * * @see {@link MatterSpecification.v16.Cluster} § 2.16.7.1 */ - humanActivityDetected: boolean; + humanActivityDetected?: boolean; } /** @@ -107,7 +107,7 @@ export declare namespace AmbientContextSensing { * * @see {@link MatterSpecification.v16.Cluster} § 2.16.7.2 */ - objectIdentified: boolean; + objectIdentified?: boolean; } /** @@ -120,7 +120,7 @@ export declare namespace AmbientContextSensing { * * @see {@link MatterSpecification.v16.Cluster} § 2.16.7.3 */ - audioContextDetected: boolean; + audioContextDetected?: boolean; } /** @@ -136,7 +136,7 @@ export declare namespace AmbientContextSensing { * * @see {@link MatterSpecification.v16.Cluster} § 2.16.7.4 */ - ambientContextType: AmbientContextType[]; + ambientContextType?: AmbientContextType[]; /** * Indicates the list of ambient context detection types supported by the server. Each supported ambient context @@ -146,7 +146,7 @@ export declare namespace AmbientContextSensing { * * @see {@link MatterSpecification.v16.Cluster} § 2.16.7.5 */ - ambientContextTypeSupported: ModeSelect.SemanticTag[]; + ambientContextTypeSupported?: ModeSelect.SemanticTag[]; } /** @@ -161,7 +161,7 @@ export declare namespace AmbientContextSensing { * * @see {@link MatterSpecification.v16.Cluster} § 2.16.7.6 */ - objectCountReached: boolean; + objectCountReached?: boolean; /** * Indicates configuration parameters to support an object counting feature. The attribute specifies the object @@ -169,7 +169,7 @@ export declare namespace AmbientContextSensing { * * @see {@link MatterSpecification.v16.Cluster} § 2.16.7.7 */ - objectCountConfig: ObjectCountConfig; + objectCountConfig?: ObjectCountConfig; /** * Indicates the number of objects detected in the area covered by the sensor. ObjectCount shall be exposed only @@ -192,7 +192,7 @@ export declare namespace AmbientContextSensing { * * @see {@link MatterSpecification.v16.Cluster} § 2.16.7.12 */ - predictedActivity: PredictedActivity[]; + predictedActivity?: PredictedActivity[]; } /** @@ -326,7 +326,7 @@ export declare namespace AmbientContextSensing { * * @see {@link MatterSpecification.v16.Cluster} § 2.16.8.1 */ - ambientContextDetectStarted: AmbientContextDetectStartedEvent; + ambientContextDetectStarted?: AmbientContextDetectStartedEvent; /** * This event shall be generated when the ambient context detection that generated the @@ -337,7 +337,7 @@ export declare namespace AmbientContextSensing { * * @see {@link MatterSpecification.v16.Cluster} § 2.16.8.2 */ - ambientContextDetectEnded: AmbientContextDetectEndedEvent; + ambientContextDetectEnded?: AmbientContextDetectEndedEvent; } /** @@ -350,7 +350,7 @@ export declare namespace AmbientContextSensing { * * @see {@link MatterSpecification.v16.Cluster} § 2.16.8.1 */ - ambientContextDetectStarted: AmbientContextDetectStartedEvent; + ambientContextDetectStarted?: AmbientContextDetectStartedEvent; /** * This event shall be generated when the ambient context detection that generated the @@ -361,7 +361,7 @@ export declare namespace AmbientContextSensing { * * @see {@link MatterSpecification.v16.Cluster} § 2.16.8.2 */ - ambientContextDetectEnded: AmbientContextDetectEndedEvent; + ambientContextDetectEnded?: AmbientContextDetectEndedEvent; } /** diff --git a/packages/types/src/clusters/general-commissioning.d.ts b/packages/types/src/clusters/general-commissioning.d.ts index 09741eae72..11adfe0ff8 100644 --- a/packages/types/src/clusters/general-commissioning.d.ts +++ b/packages/types/src/clusters/general-commissioning.d.ts @@ -221,7 +221,7 @@ export declare namespace GeneralCommissioning { * * @see {@link MatterSpecification.v16.Core} § 11.10.6.11 */ - recoveryIdentifier: Bytes; + recoveryIdentifier?: Bytes; /** * This attribute shall contain the primary reason that triggered the Network Recovery flow and its associated @@ -229,7 +229,7 @@ export declare namespace GeneralCommissioning { * * @see {@link MatterSpecification.v16.Core} § 11.10.6.12 */ - networkRecoveryReason: NetworkRecoveryReason | null; + networkRecoveryReason?: NetworkRecoveryReason | null; } /** diff --git a/packages/types/src/clusters/group-key-management.d.ts b/packages/types/src/clusters/group-key-management.d.ts index 59aacf546b..3eec60ef85 100644 --- a/packages/types/src/clusters/group-key-management.d.ts +++ b/packages/types/src/clusters/group-key-management.d.ts @@ -149,7 +149,7 @@ export declare namespace GroupKeyManagement { * * @see {@link MatterSpecification.v16.Core} § 11.2.6.5 */ - groupcastAdoption: GroupcastAdoption[]; + groupcastAdoption?: GroupcastAdoption[]; } /** diff --git a/packages/types/src/clusters/groupcast.d.ts b/packages/types/src/clusters/groupcast.d.ts index 5ad9ff41f7..ae4b6f693e 100644 --- a/packages/types/src/clusters/groupcast.d.ts +++ b/packages/types/src/clusters/groupcast.d.ts @@ -105,7 +105,7 @@ export declare namespace Groupcast { * * @see {@link MatterSpecification.v16.Core} § 11.27.6.1 */ - membership: Membership[]; + membership?: Membership[]; /** * Indicates the maximum number of Groups which can be joined and appear in entries of the Membership attribute. @@ -115,7 +115,7 @@ export declare namespace Groupcast { * * @see {@link MatterSpecification.v16.Core} § 11.27.6.2 */ - maxMembershipCount: number; + maxMembershipCount?: number; /** * Indicates the maximum number of unique multicast addresses the node can support. The value of this attribute @@ -127,7 +127,7 @@ export declare namespace Groupcast { * * @see {@link MatterSpecification.v16.Core} § 11.27.6.3 */ - maxMcastAddrCount: number; + maxMcastAddrCount?: number; /** * Indicates the number of unique multicast addresses currently in use by the Groupcast cluster. This count @@ -137,7 +137,7 @@ export declare namespace Groupcast { * * @see {@link MatterSpecification.v16.Core} § 11.27.6.4 */ - usedMcastAddrCount: number; + usedMcastAddrCount?: number; /** * Indicates the FabricIndex of the fabric currently testing the Groupcast feature with the GroupcastTesting @@ -153,7 +153,7 @@ export declare namespace Groupcast { * * @see {@link MatterSpecification.v16.Core} § 11.27.6.5 */ - fabricUnderTest: FabricIndex; + fabricUnderTest?: FabricIndex; } /** @@ -339,7 +339,7 @@ export declare namespace Groupcast { * * @see {@link MatterSpecification.v16.Core} § 11.27.8.1 */ - groupcastTesting: GroupcastTestingEvent; + groupcastTesting?: GroupcastTestingEvent; } /** diff --git a/packages/types/src/clusters/microwave-oven-control.d.ts b/packages/types/src/clusters/microwave-oven-control.d.ts index 322984ba2c..329cf8ad79 100644 --- a/packages/types/src/clusters/microwave-oven-control.d.ts +++ b/packages/types/src/clusters/microwave-oven-control.d.ts @@ -146,7 +146,7 @@ export declare namespace MicrowaveOvenControl { * * @see {@link MatterSpecification.v16.Cluster} § 8.13.5.7 */ - supportedWatts: number[]; + supportedWatts?: number[]; /** * Indicates the index into the list of SupportedWatts of the currently selected power setting. @@ -155,7 +155,7 @@ export declare namespace MicrowaveOvenControl { * * @see {@link MatterSpecification.v16.Cluster} § 8.13.5.8 */ - selectedWattIndex: number; + selectedWattIndex?: number; } /** diff --git a/packages/types/src/clusters/thermostat.d.ts b/packages/types/src/clusters/thermostat.d.ts index d3cde3fd4f..0e4e0b7a8a 100644 --- a/packages/types/src/clusters/thermostat.d.ts +++ b/packages/types/src/clusters/thermostat.d.ts @@ -1960,7 +1960,7 @@ export declare namespace Thermostat { * * @see {@link MatterSpecification.v16.Cluster} § 4.3.13.5 */ - runningModeChange: RunningModeChangeEvent; + runningModeChange?: RunningModeChangeEvent; } /** @@ -1972,7 +1972,7 @@ export declare namespace Thermostat { * * @see {@link MatterSpecification.v16.Cluster} § 4.3.13.1 */ - systemModeChange: SystemModeChangeEvent; + systemModeChange?: SystemModeChangeEvent; /** * This event shall be generated when the value of any of the OccupiedHeatingSetpoint, @@ -1980,14 +1980,14 @@ export declare namespace Thermostat { * * @see {@link MatterSpecification.v16.Cluster} § 4.3.13.4 */ - setpointChange: SetpointChangeEvent; + setpointChange?: SetpointChangeEvent; /** * This event shall be generated when the ThermostatRunningState attribute changes. * * @see {@link MatterSpecification.v16.Cluster} § 4.3.13.6 */ - runningStateChange: RunningStateChangeEvent; + runningStateChange?: RunningStateChangeEvent; } /** @@ -2008,7 +2008,7 @@ export declare namespace Thermostat { * * @see {@link MatterSpecification.v16.Cluster} § 4.3.13.2 */ - localTemperatureChange: LocalTemperatureChangeEvent; + localTemperatureChange?: LocalTemperatureChangeEvent; } /** @@ -2020,7 +2020,7 @@ export declare namespace Thermostat { * * @see {@link MatterSpecification.v16.Cluster} § 4.3.13.3 */ - occupancyChange: OccupancyChangeEvent; + occupancyChange?: OccupancyChangeEvent; } /** @@ -2032,7 +2032,7 @@ export declare namespace Thermostat { * * @see {@link MatterSpecification.v16.Cluster} § 4.3.13.8 */ - activeScheduleChange: ActiveScheduleChangeEvent; + activeScheduleChange?: ActiveScheduleChangeEvent; } /** @@ -2044,7 +2044,7 @@ export declare namespace Thermostat { * * @see {@link MatterSpecification.v16.Cluster} § 4.3.13.7 */ - activePresetChange: ActivePresetChangeEvent; + activePresetChange?: ActivePresetChangeEvent; } /** diff --git a/packages/types/src/clusters/thread-network-diagnostics.d.ts b/packages/types/src/clusters/thread-network-diagnostics.d.ts index 418b20731d..4e4c9a6fd2 100644 --- a/packages/types/src/clusters/thread-network-diagnostics.d.ts +++ b/packages/types/src/clusters/thread-network-diagnostics.d.ts @@ -180,26 +180,6 @@ export declare namespace ThreadNetworkDiagnostics { */ activeNetworkFaultsList: NetworkFault[]; - /** - * Indicates the IEEE 802.15.4 extended address for the Node. A value of null shall indicate that the extended - * address is not yet known. The uint64 value is composed by taking the 8 octets of the extended address EUI-64 - * and treating them as a big-endian integer. For example, octet string (in hexadecimal, from first octet to - * last) 00112233AABBCCDD would lead to a value of 0x00112233AABBCCDD. - * - * @see {@link MatterSpecification.v16.Core} § 11.14.6.64 - */ - extAddress: number | bigint | null; - - /** - * Indicates the RLOC16 of the Node. A value of null shall indicate that the Thread interface is not currently - * configured or operational. The uint16 value is composed by taking the two RLOC16 and treating the octet - * string as if it was encoding a big-endian integer. For example, octet string (in hexadecimal, from first - * octet to last) 44AA would lead to a value of 0x44AA. - * - * @see {@link MatterSpecification.v16.Core} § 11.14.6.65 - */ - rloc16: number | null; - /** * Null when there is no dataset configured. * @@ -220,6 +200,26 @@ export declare namespace ThreadNetworkDiagnostics { * @see {@link MatterSpecification.v16.Core} § 11.14.6.59 */ delay?: number | null; + + /** + * Indicates the IEEE 802.15.4 extended address for the Node. A value of null shall indicate that the extended + * address is not yet known. The uint64 value is composed by taking the 8 octets of the extended address EUI-64 + * and treating them as a big-endian integer. For example, octet string (in hexadecimal, from first octet to + * last) 00112233AABBCCDD would lead to a value of 0x00112233AABBCCDD. + * + * @see {@link MatterSpecification.v16.Core} § 11.14.6.64 + */ + extAddress?: number | bigint | null; + + /** + * Indicates the RLOC16 of the Node. A value of null shall indicate that the Thread interface is not currently + * configured or operational. The uint16 value is composed by taking the two RLOC16 and treating the octet + * string as if it was encoding a big-endian integer. For example, octet string (in hexadecimal, from first + * octet to last) 44AA would lead to a value of 0x44AA. + * + * @see {@link MatterSpecification.v16.Core} § 11.14.6.65 + */ + rloc16?: number | null; } /** @@ -740,26 +740,6 @@ export declare namespace ThreadNetworkDiagnostics { */ activeNetworkFaultsList: NetworkFault[]; - /** - * Indicates the IEEE 802.15.4 extended address for the Node. A value of null shall indicate that the extended - * address is not yet known. The uint64 value is composed by taking the 8 octets of the extended address EUI-64 - * and treating them as a big-endian integer. For example, octet string (in hexadecimal, from first octet to - * last) 00112233AABBCCDD would lead to a value of 0x00112233AABBCCDD. - * - * @see {@link MatterSpecification.v16.Core} § 11.14.6.64 - */ - extAddress: number | bigint | null; - - /** - * Indicates the RLOC16 of the Node. A value of null shall indicate that the Thread interface is not currently - * configured or operational. The uint16 value is composed by taking the two RLOC16 and treating the octet - * string as if it was encoding a big-endian integer. For example, octet string (in hexadecimal, from first - * octet to last) 44AA would lead to a value of 0x44AA. - * - * @see {@link MatterSpecification.v16.Core} § 11.14.6.65 - */ - rloc16: number | null; - /** * Null when there is no dataset configured. * @@ -781,6 +761,26 @@ export declare namespace ThreadNetworkDiagnostics { */ delay: number | null; + /** + * Indicates the IEEE 802.15.4 extended address for the Node. A value of null shall indicate that the extended + * address is not yet known. The uint64 value is composed by taking the 8 octets of the extended address EUI-64 + * and treating them as a big-endian integer. For example, octet string (in hexadecimal, from first octet to + * last) 00112233AABBCCDD would lead to a value of 0x00112233AABBCCDD. + * + * @see {@link MatterSpecification.v16.Core} § 11.14.6.64 + */ + extAddress: number | bigint | null; + + /** + * Indicates the RLOC16 of the Node. A value of null shall indicate that the Thread interface is not currently + * configured or operational. The uint16 value is composed by taking the two RLOC16 and treating the octet + * string as if it was encoding a big-endian integer. For example, octet string (in hexadecimal, from first + * octet to last) 44AA would lead to a value of 0x44AA. + * + * @see {@link MatterSpecification.v16.Core} § 11.14.6.65 + */ + rloc16: number | null; + /** * Indicates the number of packets dropped either at ingress or egress, due to lack of buffer memory to retain * all packets on the ethernet network interface. The OverrunCount attribute shall be reset to 0 upon a reboot