Skip to main content

docs/advanced-matter-ids.md

# Advanced Matter IDs

MatterEx exposes named DSL helpers for common clusters, attributes, commands,
device types, vendors, and development products. Prefer those names for app code:

```elixir
defmodule MyApp.Light do
  use MatterEx.Device,
    vendor: :test,
    product: :smart_light

  endpoint :light, :dimmable_light
end
```

Use raw Matter IDs when you are implementing a custom cluster, a vendor-specific
extension, or a specification item that MatterEx does not know yet.

## Device Metadata

```elixir
defmodule MyApp.CustomDevice do
  use MatterEx.Device,
    vendor_name: "Acme",
    product_name: "Custom Sensor",
    vendor_id: 0xFFF1,
    product_id: 0x8001

  endpoint 1, device_type: 0x0302 do
    cluster MatterEx.Cluster.TemperatureMeasurement
  end
end
```

Named endpoint definitions auto-compose required clusters. Numeric endpoint
definitions preserve the old explicit behavior:

```elixir
endpoint :temperature, :temperature_sensor

endpoint 1, device_type: 0x0302 do
  cluster MatterEx.Cluster.Identify
  cluster MatterEx.Cluster.TemperatureMeasurement
end
```

## Clusters

```elixir
defmodule MyApp.Cluster.VendorSpecific do
  use MatterEx.Cluster, id: 0xFC00, name: :vendor_specific

  attribute 0x0000, :enabled, :boolean, default: false, writable: true

  command 0x00, :reset, []
end
```

For built-in clusters, the ID can be resolved from the name:

```elixir
defmodule MyApp.Cluster.OnOff do
  use MatterEx.Cluster, :on_off
end
```

Built-in cluster names infer `cluster_revision` automatically. For custom
clusters, MatterEx defaults it to `1`; use `revision 2` only when your custom
cluster needs a different value.

Built-in cluster names infer their standard attributes. Use `attribute` only
when adding custom attributes or overriding a known attribute's metadata.

Declare commands that your custom cluster module implements. Built-in command
names resolve their Matter IDs automatically, for example `command :on` in an
`:on_off` cluster. Use raw command IDs only for custom or vendor-specific
commands.

Look up known names from IEx:

```elixir
MatterEx.Cluster.known_clusters()
MatterEx.DeviceTypes.known_device_types()
MatterEx.Device.known_vendors()
MatterEx.Device.known_products()
```