matter-clusters
Typed Matter cluster definitions: per-cluster attribute/command/struct codecs,
feature flags, enums (with Unknown(n) forward-compat) and bitmaps. The modules
under gen/ are generated from a pinned @matter/model dump by the xtask
codegen tool.
Part of matter-rust.
[]
= "0.4"
What this crate does
- Provides encode/decode functions for the attributes, commands, and structs of 47 Matter clusters (mandatory and optional attributes), as Matter TLV.
- Models cluster enums with an
Unknown(n)variant (forward-compatible decode), feature maps asbitflags, and nullable fields asNullable<T>(distinct fromOption<T>). - Generates all of the above from the spec model, gated against drift in CI.
What this crate does not do
- It is not the full Matter cluster set — only the 47 listed below. More are generated as they are needed.
- It does not provide generic or wildcard attribute access, or manufacturer-specific typed codecs. Reading arbitrary attributes a device publishes is the Interaction Model layer / high-level controller (see Reading attributes beyond these clusters).
- It is codecs only. Encoding a command is not the same as running the
protocol around it: ACL evaluation, group multicast, commissioning-window
orchestration, and OTA live in
matter-controllerand its siblings. - It performs no IO and no session/transport work — it only encodes/decodes bytes.
Status
0.4.1, published on crates.io. Stability: a 0.x crate, so a minor bump
may break API — and adding clusters is a routine minor bump.
Clusters
47 clusters are generated today, covering their mandatory and optional attributes, by area:
- Core / identity — BasicInformation, Descriptor, Identify, Groups, Binding, FixedLabel, UserLabel, PowerSource, GeneralDiagnostics.
- Lighting and actuators — OnOff, LevelControl, ColorControl, DoorLock (Aliro features excluded), WindowCovering, Thermostat, ThermostatUserInterfaceConfiguration, FanControl, PumpConfigurationAndControl.
- Sensing — OccupancySensing, TemperatureMeasurement, RelativeHumidityMeasurement, IlluminanceMeasurement, PressureMeasurement, FlowMeasurement, BooleanState, Switch, AirQuality, and the ten ConcentrationMeasurement clusters (CarbonMonoxide 0x040C, CarbonDioxide 0x040D, NitrogenDioxide 0x0413, Ozone 0x0415, Pm25 0x042A, Formaldehyde 0x042B, Pm1 0x042C, Pm10 0x042D, TotalVolatileOrganicCompounds 0x042E, Radon 0x042F).
- Energy — ElectricalPowerMeasurement, ElectricalEnergyMeasurement.
- Administration — AccessControl, GroupKeyManagement, AdministratorCommissioning, OperationalCredentials, IcdManagement, TimeSynchronization, OtaSoftwareUpdateRequestor, OtaSoftwareUpdateProvider.
Verification varies by cluster, and the level is deliberate rather than
accidental. Every cluster has decode-smoke coverage. matter.js 0.16.11
byte-parity vectors (test-vectors/clusters/) cover the core, lighting, and
sensing sets, plus one vector for each novel wire shape a later cluster
introduced: the nested MeasurementAccuracyStruct, the list-typed
AtomicRequest command, GeneralDiagnostics' struct-with-byte-fields
NetworkInterface, the recursive list-of-struct in
AccessControl.ReviewFabricRestrictions, and FLOAT32 attributes. The read/write
actuator clusters additionally carry decode(encode(x)) == x roundtrips, and
floats get both a binary32-edge roundtrip (signed zero, subnormals, infinities,
NaN — compared by bits) and a proptest roundtrip drawn uniformly from the
whole binary32 bit space. A single attribute accepts a FLOAT32 element only,
matching chip's strict TLVReader::Get(float&).
For any attribute not covered by these typed codecs — manufacturer-specific, or
a cluster not in this list — the generic Value path in matter-controller
remains the universal answer. Hand-written support lives in types
(Nullable<T>), error (ClusterError), and datatypes
(SemanticTagStruct).
Usage
use ;
// Command payload — embed in an InvokeRequest.
let _toggle = encode_toggle;
// Attribute roundtrips: encode a value, decode it back.
let tlv = encode_on_time;
assert_eq!;
let tlv = encode_node_label;
assert_eq!;
# Ok::
See crates/matter-commissioning/examples/control_onoff.rs for an end-to-end
read / toggle / write against a real device (runbook:
docs/runbooks/m7.5-control-onoff.md).
Generated code
cargo xtask codegen writes src/gen/<cluster>.rs (+ globals.rs, mod.rs)
from xtask/model/clusters.json. Do not edit the generated files by hand —
change the emitter (xtask/src/codegen/) and regenerate. cargo xtask codegen --check gates drift in CI.
Reading attributes beyond these clusters
Typed codecs cover these clusters' mandatory and optional attributes (a device
may not implement a given optional attribute — it then returns
UNSUPPORTED_ATTRIBUTE). To read attributes of other clusters, or
manufacturer-specific attributes, use the generic Interaction Model path:
matter_interaction::parse_report_data yields
(AttributePath, matter_codec::Value) for any attribute without a typed codec,
and matter-controller wraps that in a generic read/write/subscribe API with
wildcard paths.
Correctness posture
- Decode-smoke coverage for every generated cluster.
- Byte-parity against matter.js 0.16.11 TLV combinators
(
test-vectors/clusters/) for the core, lighting, and sensing sets, plus one vector per novel wire shape — see Clusters for exactly which. proptestroundtrips over attribute values.- A
cargo-fuzztarget over the generated decoders (weekly CI). cargo xtask codegen --checkfails CI if the committedsrc/gen/drifts from what the emitter +clusters.jsonproduce.
Cryptographic posture
matter-clusters performs no cryptography. It is pure data encoding.
MSRV
Rust 1.88 (workspace MSRV). See the workspace CHANGELOG.md.
License
Apache 2.0. See LICENSE at the workspace root.