Matter
Reference for the Matter driver: the Wi-Fi and Thread networks devices join, Bluetooth commissioning into the local Fabric, the Pair device flow, node identity, the tags that come from the device and what writing each one does.
The Matter driver reads Matter equipment: smart sensors, plugs, lights and similar devices certified for the Matter standard, whether they join the network by Wi-Fi or by Thread. It is one driver for both. The network is only the way in: once a device is on it, Ganter Lab reads it the same way, over the local network.
Ganter Lab acts as a Matter controller with its own local Fabric: it commissions each device once over Bluetooth Low Energy on this computer, hands it the credentials of a network registered on the driver's Networks card, and from then on talks to it over the local network: through your router for a Wi-Fi device, through your Thread Border Router for a Thread device.
You never tell Ganter Lab whether a device is Wi-Fi or Thread: the device says so itself. Once the Bluetooth session is open, Ganter Lab reads from the device which kind of network it joins, before it writes anything to it, and stops with a message of its own when the network chosen is of the other kind.
That reverses the usual setup order. A Matter Device does not start from a host and port: it starts from a pairing ceremony, and only the commissioned node's stable identity is stored afterwards.
What you need before pairing:
- A Bluetooth Low Energy adapter on this computer, turned on, with Windows allowing Ganter Lab to use it.
- The network the device will join, registered on the Networks card: for a Wi-Fi device, the Wi-Fi name and its password; for a Thread device, an existing Thread network with a Border Router, and its complete Active Operational Dataset. Ganter Lab joins devices to your network; it cannot invent credentials for it.
- The device's setup code, printed on the device or its packaging, and the device in pairing mode.
Networks
The Matter driver's panel carries a card titled Networks: the Wi-Fi and Thread networks devices are joined to, one row each. A network is registered once, before the first device, and serves every device paired into it, so pairing a second lamp on the same Wi-Fi asks for nothing again. The card is drawn only for a role that may configure the Connector, because it holds the networks' secrets and serves nothing but pairing.
The card's head carries its commands, in this order:
| Command | What it does | What it does not do |
|---|---|---|
| Add Wi-Fi network | Adds a Wi-Fi network and selects it. When this computer is connected to a Wi-Fi whose name is not registered yet, the new network is named after it; otherwise it starts without a name, for you to write. Windows hands over the name only, and only when it lets apps know this computer's location (Windows 11 asks for that permission); the password is always yours to type. | It does not read the password from Windows, and it does not check that the network exists. |
| Add Thread network | Adds a Thread network and selects it, under a provisional name (numbered when it is taken) until you give it yours, and waiting for its dataset. | It does not talk to the Border Router: Ganter Lab only uses the dataset of the network the Border Router created. |
| Remove network | Removes the selected network, after a confirmation that names it and says that devices already paired are not affected. With no network selected, it stays drawn and greyed, and its tooltip says so. | It does not touch the devices already paired into that network: they keep working and keep its name in their Network field. |
The table lists each network's Name, its Network type (Wi-Fi network or Thread network) and its State: Ready for pairing, or what the network still lacks. A network whose name is not written yet reads Unnamed network.
The selected network's fields are edited inline under the table and save themselves. A value the rules below refuse is not written, and the field says why.
| Kind | Field | What it is | Format |
|---|---|---|---|
| Wi-Fi | Wi-Fi name | The name (SSID) handed to the device, exactly as the router broadcasts it: capitals count. Each Wi-Fi name is registered once. | 1 to 32 bytes of text (UTF-8). |
| Wi-Fi | Password | The Wi-Fi password handed to the device. | Empty for an open network; otherwise 8 to 63 printable ASCII characters (a WPA passphrase), or exactly 64 hexadecimal digits (the raw key). |
| Thread | Name | Your name for the network, to recognise it when pairing and on each device. Each Thread name is registered once. | Free text. |
| Thread | Thread Operational Dataset | The complete active dataset of your Thread network, from the network's administrator or its Border Router. Home Assistant shows it; Alexa and Apple do not. | Hexadecimal text (whitespace and a hex: prefix are tolerated), at most 254 bytes once decoded. It must be the complete dataset: Active Timestamp, Channel, Channel Mask, Extended PAN ID, Mesh-Local Prefix, Network Key, Network Name, PAN ID, PSKc and Security Policy must all be present, and a partial or malformed dataset is refused with the missing element named. |
Two things decide whether a Wi-Fi device can be paired at all, and the card says both beside the fields:
- Most devices join only 2.4 GHz networks. A router that broadcasts one name on 2.4 GHz and 5 GHz serves them; a network that exists only on 5 GHz does not.
- This computer and the devices must be on the same local network. A guest network, or client isolation turned on in the router, keeps the computer from finding the devices once they have joined.
A network serves pairing only while its secret passes those rules: a Wi-Fi network with a valid name and a valid password (empty included), a Thread network with a valid dataset.
Editing a network changes what the next pairing hands over, never what a device already received. A device that has to move to another network, or whose router got a new password, is reset and paired again.
The Pair device flow
On the Matter driver, the toolbar offers Pair device where other drivers offer Add device, and so does the Matter entry of the column's New… menu. While no network is usable for pairing it stays drawn and greyed, with the tooltip "Add the network the device will join first." Otherwise it opens a form:
| Field | What it is | Format | Default |
|---|---|---|---|
| Device name | The editable name the Device will carry in Connector. | Free text | Matter device |
| Matter setup code | The official manual pairing code, or the complete QR payload. Entered masked, with a reveal control. | An 11- or 21-digit manual code (dashes and spaces are ignored; the check digit is verified), or the full QR payload beginning with MT:. A QR payload that does not advertise Bluetooth commissioning is refused, as are reserved or out-of-range passcodes. |
empty |
| Network | The registered network the device will join. With one usable network, the form says in a line which network it is and its kind, with nothing to choose; with more, it is a picker. | One of the usable networks on the Networks card | the only one, when there is one |
| Destination folder | Only when a folder's New device opened the form: the folder the paired device is filed in. Opened by Pair device, there is no such line and the device lands at the driver's own level. | Read only | the folder that opened the form |
A folder of the Matter driver offers New device (on its Devices table, on its right-click menu and under New… > Matter > <Folder>). It opens this same form, greyed the same way while no network is usable, and the paired device is filed in that folder.
Pair device in the form stays disabled until the name and the setup code are filled and a network is usable. While pairing runs the form reports its stage: Validate (checking the code and the network's secret), Find (searching for the device over Bluetooth), Pair (authenticating with the setup code and reading which kind of network the device joins), Join the network (sending the network to the device, then asking the local network for it until it answers; the status line says whether that network is Wi-Fi or Thread), Save (opening the secure session with the device on the local network, completing its commissioning and recording the node in the local Fabric).
Cancel is available while the physical device has not been changed yet; once commissioning has altered the device, the button reads that Ganter Lab is finishing safely and the flow completes the record instead of abandoning a half-commissioned node. One pairing runs at a time; a second attempt while one is under way is refused.
The new Device records the name of the network it joined, shown in its Network field. Pairing the next device on the same network asks only for its name and its setup code.
When pairing fails
If pairing fails, the message states the cause and what to do:
| Cause | What it means | The equipment | What to do |
|---|---|---|---|
| Invalid setup code | The code is not an official 11- or 21-digit manual code, nor a complete MT: QR payload. |
Untouched | Reread the printed code. |
| Invalid Thread dataset | The chosen Thread network's dataset is not complete and well formed. | Untouched | Copy the complete active dataset again into that network on the Networks card. |
| Invalid Wi-Fi name or password | The chosen Wi-Fi network's name or password breaks the rules of the Networks card. | Untouched | Correct it on the card. |
| Bluetooth missing, turned off or denied | This computer has no usable Bluetooth Low Energy adapter, Bluetooth is off, or Windows denied Ganter Lab access to it. | Untouched | Turn Bluetooth on, or allow Ganter Lab to use it in Windows, then try again. |
| No matching device found | No device in pairing mode answered for this setup code. | Untouched | Put the device in pairing mode, keep it near this computer and try again. |
| Setup code rejected | The device refused the code. | Untouched | Reread the printed code and return the device to pairing mode. |
| The device joins by Wi-Fi | The chosen network is Thread. | Untouched: it was read, and nothing was written to it | Register the Wi-Fi network the device will join and pair again, choosing it. |
| The device joins by Thread | The chosen network is Wi-Fi. | Untouched: it was read, and nothing was written to it | Register the Thread network and pair again, choosing it. |
| The device is wired (Ethernet) | Pairing over Bluetooth does not serve a wired device. | Untouched: it was read, and nothing was written to it | Ganter Lab cannot pair this device. |
| The device does not say its network | The device reports neither Wi-Fi, Thread nor Ethernet. | Untouched: it was read, and nothing was written to it | Ganter Lab cannot pair this device. |
| Wi-Fi network not found | The device answered that it found no Wi-Fi with that name: a spelling or capitals slip, a network only on 5 GHz, or a device out of range. | Not kept: it discards what it received and is back in pairing mode. No Node ID. | Correct the name on the Networks card, check that the router broadcasts it on 2.4 GHz, and pair again. |
| Wi-Fi password refused | The device answered that the Wi-Fi refused the password. | Not kept: it discards what it received and is back in pairing mode. No Node ID. | Correct the password on the Networks card and pair again. |
| The device could not join the network | The device answered that it could not join the network, for a reason other than the two above (on Thread, every refusal, a network it did not find included). | Not kept: it discards what it received and is back in pairing mode. No Node ID. | Check the network on the Networks card (for Thread, copy the current active dataset again, and check that the Border Router is on) and pair again. |
| The device did not appear on the network | The device gave no answer about the network, or never appeared on the local network afterwards. Some devices leave Bluetooth to join and cannot answer at all. | Commissioned: the message shows the Node ID | For Wi-Fi, check that this computer and the device are on the same local network, with no guest network or client isolation between them; for Thread, that the Border Router is on and reachable. Then recover the node with Discover. |
| The secure session did not open | The device joined the network and was found there, but the secure session with it, or the completion of the pairing over that session, failed. The journal names the step and what the device answered. | Commissioned: the message shows the Node ID | Recover the node with Discover. If Discover finds it with no values while the device is on, put the device back in pairing mode and pair it again. |
| Another pairing under way | One pairing runs at a time. | Untouched | Wait for it to finish and try again. |
| The local Fabric could not be saved | Ganter Lab could not store the Fabric safely. | Untouched when it happens before pairing starts; commissioned, with the Node ID, when it happens after | Resolve the storage problem before resetting anything. |
Whenever a failure arrives after the equipment was already commissioned, the message says so and shows the Node ID: the node remains in the Fabric and can be added later with Discover once it reaches the network. Do not reset the device in that case; only a message that says nothing was saved means the equipment was left untouched.
A device that answers that it could not join the network is the exception: it holds nothing worth keeping. Ganter Lab ends the pairing on the device, which discards what it received and returns to pairing mode at once, and removes its node from the Fabric, so the message carries no Node ID and Discover never lists a node that cannot answer. Correct the network and pair again. Only a device that gave no answer at all keeps its node, because whether it joined is not known until it appears on the local network.
What is stored
| What | Where it is kept | How |
|---|---|---|
| A network's name and kind | The station's configuration | As written. |
| The Wi-Fi password and the Thread Operational Dataset | The station's configuration | Protected for the Windows user who entered them, like device passwords: under another Windows account they read as empty and must be entered again. A backup leaves them behind; the export for another machine carries them, sealed with its own password. |
| The setup code | Nowhere | It exists only in the form while pairing runs, and is cleared when pairing finishes, fails or is canceled. |
| The network a device joined | The device's configuration | Its name, shown in the device's Network field. |
| The device's identity | The device's configuration and the local Fabric | The Node ID. |
The Wi-Fi password and the dataset never appear in the journal, in a device's address or in its Thing Description. Networks and pairing are not offered to agents through the MCP server: pairing needs someone at the device, and the networks hold secrets.
Node identity
A paired Device is bound to the equipment's stable 64-bit Node ID, shown read-only in its Connection card as 16 hexadecimal digits, beside the device state. The editable display name is yours to change; the Node ID is not. A Device whose stored identity can no longer be read shows Needs re-pairing in its place.
The Device's panel also shows a read-only Network field: the name of the network the device joined when it was paired. A device paired by a version that did not record it says that nothing was recorded. The field is a record, not a setting: editing or removing that network on the Networks card changes nothing on the device.
Because identity is the Node ID, Matter Devices keep independent connection state: disabling, deleting or losing one node does not make another unavailable, and deleting a Device releases only its use of the secure session; it does not remove the equipment from the local Fabric.
Discovery
Discover on the Matter driver lists the nodes already commissioned into this application's local Fabric and reads, from each one, the values it publishes. To read them it opens a secure session with every node, so a node that is off the network is still listed, with no values, once its session has failed to open. Discovery candidates carry the node identity and no setup secret. The general discovery flow is described on Discovery.
| The node | Its card | Its verbs |
|---|---|---|
| Has no device here: its device was deleted, or its pairing finished without one | The values it publishes, each ticked | Add device creates the device with the ticked values as its tags, without a new ceremony. |
| Is a configured device, with values it has no tag for yet | Marked as already configured, with how many values it publishes that are not tags yet, and those values ticked | Add tags adds the ticked values to that device; Open opens it. |
| Is a configured device with a tag for every value | "Already configured, with a tag for every value the device publishes." | Open opens it. |
| Is a configured device that reported no values | "Already configured. The device reported no values: run Discover again once it is online." | Open opens it. |
A configured device's values are compared with its tags by output, cluster and attribute, never by name: a tag you renamed still counts, and a value is never added twice.
The device's own page offers the same without leaving it: Discover tags, on the head of its Tags card, reads that node alone and lists the values it has no tag for yet, ticked, with Add tags (see Discovering a device's tags).
Tags
The tags of a Matter device come from the device itself: nobody types a cluster or an attribute number for them. A pairing that ends well goes straight on to them. The feed reads "Paired Matter device 'Kitchen light'.", the page opens on the Matter driver with the new device marked in its Devices table, and a scan of that one device runs at once. The device the pairing created appears in Discovered devices with the values it publishes, all ticked, and the scan closes with "Tick the values of 'Kitchen light' to create as tags, then Add tags." Untick what you do not want and press Add tags; the feed then reads "Added 5 tags to 'Kitchen light'." A device that has not answered yet reports nothing: "'Kitchen light' reported no values yet. Run Discover again once it is online." The same card comes back on every later Discover, with whatever values the device still has no tag for.
Add tags is drawn only for a role with Configure connector. It stays greyed, with its reason as the tooltip, while a scan or a pairing runs, while the station refuses changes, and while nothing is ticked ("Tick at least one value to add."). A value whose output, cluster and attribute the device already reads is never added again; when every ticked value is already there, nothing is saved: "'Kitchen light' already has a tag for every value you ticked, so nothing was added." A name another tag of the device already carries gets a number after it, as in Brightness (2).
The scan reads what the device publishes, as the Matter specification lays it out:
| What | Where the device says it |
|---|---|
| Its outputs (endpoints) | The Descriptor cluster (0x001D) on endpoint 0, attribute PartsList |
| The clusters of each output | The Descriptor on that output, attribute ServerList |
| The values of each cluster | Its attribute AttributeList (0xFFFB) |
| The commands each cluster accepts | Its attribute AcceptedCommandList (0xFFF9) |
| The optional features each cluster implements | Its attribute FeatureMap (0xFFFC) |
| The current reading of each value | The value itself, read once |
What the scan offers, and under which name:
| A value | Offered as |
|---|---|
| One the driver knows (the next section) | Its clear name in the station's language and the type the specification gives it; writable only when the device accepts the way the specification changes it, otherwise read-only |
| One the driver knows, of a feature the cluster does not implement: hue and saturation without the Hue and Saturation feature, color temperature without the Color Temperature feature | Not offered |
| One the driver does not know | Read-only, under its name in the Matter specification (Level Control OnLevel), or under the cluster and the attribute number when the driver does not know the attribute (On/Off attribute 0x131B0001); its type is the type of the reading the device returned |
| The same value on more than one output | Its name says which output, as in Brightness (output 2) |
| A global attribute (0xFFF8 to 0xFFFD), or a value of the node itself (endpoint 0) | Not offered |
| A list or a structure, a value of a type the driver does not carry, a value the device returned no reading for | Left out, and counted in the scan's closing line |
A tag offered as writable arrives with the access Read and write; every other one arrives Read only.
The values the driver knows
The driver carries one table, taken from the Matter specification, of the values it knows by name and how each one changes. A value changes in one of three ways: a command the driver sends, which the device must list among the commands it accepts; a write of the attribute itself, where the specification makes it writable and the device lists it; or not at all, for a value the device only reports.
| Value | Cluster and attribute | Type | What writing it does on the device | Range the specification defines |
|---|---|---|---|---|
| Switched on | On/Off (0x0006), OnOff (0x0000) |
Boolean | true sends the command On (0x01), false sends Off (0x00); writable only when the device accepts both |
true or false |
| Brightness | Level Control (0x0008), CurrentLevel (0x0000) |
UInt32 | Sends MoveToLevelWithOnOff (0x04) with the level, a transition time of 0 and no option overrides: the output turns on with the level and off at the minimum |
0 to 254 |
| Hue | Color Control (0x0300), CurrentHue (0x0000) |
UInt32 | Sends MoveToHue (0x00) by the shortest direction, with a transition time of 0; only with the Hue and Saturation feature |
0 to 254 |
| Saturation | Color Control (0x0300), CurrentSaturation (0x0001) |
UInt32 | Sends MoveToSaturation (0x03) with a transition time of 0; only with the Hue and Saturation feature |
0 to 254 |
| Color temperature | Color Control (0x0300), ColorTemperatureMireds (0x0007) |
UInt32 | Sends MoveToColorTemperature (0x0A) with a transition time of 0; only with the Color Temperature feature. The device holds the value within its own limits |
0 to 65279, in mireds |
| Blind position | Window Covering (0x0102), CurrentPositionLiftPercent100ths (0x000E) |
UInt32 | Sends GoToLiftPercentage (0x05) |
0 (open) to 10000 (closed), in hundredths of a percent |
| Room temperature | Thermostat (0x0201), LocalTemperature (0x0000) |
Float, in °C | Nothing: read-only | -27315 to 32767, in hundredths of a degree Celsius; it reads -273.15 to 327.67 °C |
| Cooling setpoint | Thermostat (0x0201), OccupiedCoolingSetpoint (0x0011) |
Float, in °C | Writes the attribute. The device refuses a setpoint outside its own limits | -27315 to 32767, in hundredths of a degree Celsius; it reads -273.15 to 327.67 °C |
| Heating setpoint | Thermostat (0x0201), OccupiedHeatingSetpoint (0x0012) |
Float, in °C | Writes the attribute. The device refuses a setpoint outside its own limits | -27315 to 32767, in hundredths of a degree Celsius; it reads -273.15 to 327.67 °C |
| Fan mode | Fan Control (0x0202), FanMode (0x0000) |
UInt32 | Writes the attribute | 0 off, 1 low, 2 medium, 3 high, 4 on, 5 auto, 6 smart |
| Fan speed setting | Fan Control (0x0202), PercentSetting (0x0002) |
UInt32 | Writes the attribute | 0 to 100 percent |
| Fan speed | Fan Control (0x0202), PercentCurrent (0x0003) |
UInt32 | Nothing: read-only | 0 to 100 percent |
| Temperature | Temperature Measurement (0x0402), MeasuredValue (0x0000) |
Float, in °C | Nothing: read-only | -27315 to 32767, in hundredths of a degree Celsius; it reads -273.15 to 327.67 °C |
| Humidity | Relative Humidity Measurement (0x0405), MeasuredValue (0x0000) |
Float, in % | Nothing: read-only | 0 to 10000, in hundredths of a percent; it reads 0 to 100 % |
| Illuminance | Illuminance Measurement (0x0400), MeasuredValue (0x0000) |
UInt32 | Nothing: read-only | 0 to 65534, which is 10000 × log10(lux) + 1 |
| Pressure | Pressure Measurement (0x0403), MeasuredValue (0x0000) |
Float, in kPa | Nothing: read-only | -32767 to 32767, in tenths of a kilopascal; it reads -3276.7 to 3276.7 kPa |
| Occupancy | Occupancy Sensing (0x0406), Occupancy (0x0000) |
Boolean | Nothing: read-only | true when someone is there |
| State | Boolean State (0x0045), StateValue (0x0000) |
Boolean | Nothing: read-only | true or false |
The specification sends temperatures, humidity and pressure in fixed units: hundredths of a degree Celsius, hundredths of a percent and tenths of a kilopascal. The scan offers those values already in °C, % and kPa: the tag arrives with the factor in its Scale stage (0.01 for a temperature and a humidity, 0.1 for a pressure) and the unit, so a device that sends 2150 reads 21.5 °C. A write reverses that stage before the value leaves, so a setpoint written as 21.5 reaches the device as 2150. Illuminance is logarithmic (10000 × log10(lux) + 1), so no factor converts it: it reads the number the device sends. Every other value reads as the device sends it too.
Door locks, color by X and Y coordinates, scenes, groups and the Toggle command are not in the
table. A Matter device has no commands of its own either: every change is a write to one of its
tags.
Writing a value
A Matter tag whose access is Read and write changes the device when it is written: from its Live value card, a dashboard control, the Logic or an agent. The write joins the device's queue like every driver's, in turn with the device's reads, and its answer is the device's own. The driver chooses the Matter command or the attribute write from the table; nobody picks a command. Only the device's SUCCESS counts as written. Everything else is refused, with a reason:
| What happens | Settled | The reason given |
|---|---|---|
| The point is not a value of the driver's table | Before anything is sent | The driver does not know how the device changes that value, so the tag only reads it. |
| The point is a value the table marks read-only | Before anything is sent | The device reports that value and nothing from outside sets it. |
| The value written is not true or false (for a Boolean value), or not a whole number | Before anything is sent | What the value takes, and what was written. |
| The value is outside the range the specification defines | Before anything is sent | The range, as the table above gives it. |
| The tag names no cluster | Before anything is sent | That a Matter value is found by its output, its cluster and its attribute. |
| The device answers with any status other than SUCCESS | By the device | The status as the device gave it: its name in the specification and its number, for example CONSTRAINT_ERROR, 0x87 (the value is outside what the device accepts) or UNSUPPORTED_COMMAND, 0x81 (the device does not accept the command that changes this value). A status the cluster adds follows it (FAILURE, 0x01, cluster 0x02), and a status the specification does not name reads as its number alone. |
| The device does not answer in time | By the device | No response. |
A refused write is never reported as written, nor as a device out of reach. On the tag's page the
status line reads "Write refused by the equipment: CONSTRAINT_ERROR, 0x87." when the device
refused it, with the reason in place of the status for a refusal settled before anything was
sent, and "Write not confirmed: the equipment did not answer in time." when no answer came; "Write
failed: the equipment could not be reached." is kept for a device that is not connected. The
reason also travels with the write: the journal line of the write names it, with what the status
means, and an agent's tag_write returns it.
A tag made by hand
For the rare value the device does not publish in a form the scan offers, Add tag on a Matter
device creates a tag to fill in by hand. Its Source card shows three fields on one row, and the
address preview under them assembles them as <endpoint>/<cluster>/<attribute>, in decimal
(1/8/0 is the brightness of the first output). Until a cluster is chosen the tag is not saved,
and the panel says: "Choose the cluster this tag reads. Without one, the device is never asked for
anything."
| Field | What it does | Values | Default |
|---|---|---|---|
| Output (endpoint) | Which output of the device the tag reads. | 0 to 65535; 1 is the first controllable output, 0 the node itself | 1 |
| Matter cluster | Which cluster of that output the tag reads. | The clusters of the Matter catalog by their name in the specification with their number, as in Level Control (0x0008); a cluster the catalog does not name, found by a scan, is listed first by its number |
none |
| Attribute | Which attribute of the cluster the tag reads. | 0 and up; 0 is the cluster's own value | 0 |
The tag name is free: it names the tag and selects nothing on the device. The data type is chosen among Boolean, Int32, UInt32, Float, Double and String; a reading the declared type cannot represent reads as an error rather than a stand-in number. The value arrives as the device sends it: a temperature, a humidity or a pressure made by hand reads in hundredths or tenths until you give it the factor and the unit of the table above in its Scale stage.
The access field offers writing only where the driver's table changes the value, and otherwise offers Read only and says why under it:
| The point | The access field offers | What it says |
|---|---|---|
| A value of the table that a command or an attribute write changes | Read only, Write only and Read and write | Nothing |
| No cluster chosen yet | Read only | "Read only until the tag points at a value of the device: choose its cluster." |
| A value the table does not know | Read only | "Read only: the driver does not know how the device changes this value." |
| A value the table marks read-only | Read only | "Read only: the device reports this value, and nothing from outside sets it." |
When an edit of the output, the cluster or the attribute points the tag at a value the driver cannot write, its access returns to Read only. A tag the scan offered keeps the access the scan gave it, because only the scan asks the device which commands it accepts: a value the device did not list stays Read only, and the field still offers writing.
Tags saved by earlier versions
An earlier version named a Matter tag's cluster only through the tag's name, with an address of
<endpoint>/<attribute>. When this version first starts, every tag of a Matter device whose name
is a cluster of the Matter catalog (the part after the last colon, without the spaces around it,
capitals ignored) takes that cluster, so it goes on reading exactly the value it read. Its name
stays as it was, and its address preview then reads <endpoint>/<cluster>/<attribute>. A tag
whose name matched no cluster never read anything: it stays without a cluster, its reads are
refused with a reason that says so, and its page asks for the cluster. A converted tag keeps the
access it had, Read only, the only one those versions offered; to write it, set Read and write,
which works for the values of the table above.