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