Interaction Model
The Matter spec defines the Interaction Model explain how a controller, such as the hub, should interact with various cluster elements on the device, and to provide an abstraction that is separate from other layers such as security, and message format/encoding. An Interaction between two nodes is made up one or more Transactions, which is made up of Actions. Actions are then translated into one or more messages in the layers below the Interaction Model.
The lua objects defined in the interaction_model
module break down the Interaction Model as defined in
the spec into a Request/Response model where an InteractionRequest
and InteractionResponse
are analagous
to the Actions that make up an Interaction. This was done to work with the Matter communication socket used for device
communication, which is completely asynchronous. For Read, Write, and Invoke interactions, the hub guarantees
that a response (possibly with an error status) will be received in the driver for every Read, Write, and Invoke request
that is sent.
Drivers hook into the Matter device interaction model by building InteractionRequest
s that contain one or more
InteractionInfoBlock
s; when an InteractionResponse
is received as a result of a request, the driver handles
the InteractionResponseInfoBlock
s contained within the response by dispatching the info blocks to matter handler funtions.
InteractionInfoBlock
s exist on both requests and responses. They contain the attribute/event/command paths along with any
TLV data associated with the cluster path for the request or response. The TLV data is a string of bytes that is serialized and
deserialized into the core matter data types as well as cluster library defined types and stored in the table field
InteractionInfoBlock.data
. TLV deserialization is done automatically when raw responses are received from the matter socket
and serialization occurs when sending on the matter socket. InteractionResponseInfoBlocks
contain an
InteractionInfoBlock
as well as a status associated with the response.
Subscribe Interaction
The subscription interaction is unique in the spec-defined Interaction model and as such is also unique in the
interaction model exposed by the Matter Lua standard libraries. The hub maintains a single subscription for
each device on its Matter fabric. The SUBSCRIBE InteractionRequest.RequestType
is used to update the
subscription with a list of attribute and event paths. The hub will restart subscriptions if they terminate,
update the subscription event/attribute paths with each subsequent subscribe request, and guarantees that
the most recent subscription request sent from the driver will have its attributes and events included in the
current subscription. There are no subscription InteractionResponse
s from the hub that will be received in
the driver.
- class st.matter.interaction_model.InteractionRequest.RequestType
- READ: number
0
- SUBSCRIBE: number
1
- WRITE: number
2
- INVOKE: number
3
- class st.matter.interaction_model.InteractionRequest
Interaction Request sent on a matter socket to initiate an device interaction with a matter device.
- type: number
Interaction Request type
- info_blocks: table
list<InteractionInfoBlock> info_blocks for the given Interaction Request.
- timed: boolean or nil
This is a timed interaction if true
- static from_parts(cls, type, info_blocks, timed)
Constructor for InteractionRequests
- Parameters
- Returns
constructed InteractionRequest instance
- Return type
InteractionRequest
- pretty_print()
- Return type
str
- static merge(cls, other)
Merge the info blocks of a different interaction request into
the info blocks of this request, so they can be sent on the channel together.
Note this does not take into account wildcard clusters. If one IB path contains a wildcard and therefore encompasses another IB path both paths will be merged.
- Parameters
cls (
InteractionRequest
) – request to merge intoother (
InteractionRequest
) – request getting merged
- Returns
string|nil
- Return type
err
- with_info_block(ib)
Append the InteractionInfoBlock to the request
- Parameters
ib (
InteractionInfoBlock
) – to append to the requests info_blocks field
- class st.matter.interaction_model.InteractionInfoBlock
- endpoint_id: number
device endpoint id
- cluster_id: number
cluster path
- attribute_id: number or nil
attribute path
- event_id: number or nil
event path
- command_id: number or nil
command path
- tlv: str or nil
data associated with the interaction path
- static from_parts(cls, endpoint_id, cluster_id, attribute_id, event_id, command_id, tlv)
Constructor for InteractionInfoBlock objects.
- Parameters
cls (
table
) – UNUSED InteractionInfoBlock reference from __callendpoint_id (
number
) – device endpoint idcluster_id (
number
) – cluster pathattribute_id (
number or nil
) – attribute pathevent_id (
number or nil
) – event pathcommand_id (
number or nil
) – command pathtlv (
str or nil
) – data associated with the interaction path
- Returns
constructed path
- Return type
InteractionInfoBlock
- static equals(cls, other)
Checks if two interaction info blocks are equal to each other
- Parameters
cls (
InteractionInfoBlock
) –other (
InteractionInfoBlock
) –
- Return type
boolean
- pretty_print()
- Return type
str
- serialize()
- class st.matter.interaction_model.InteractionResponse.ResponseType
- REPORT_DATA: number
0
- COMMAND_RESPONSE: number
1
- WRITE_RESPONSE: number
2
- SUBSCRIBE_RESPONSE: number
3, not used currently as the hub manages the subscription interaction completely
- class st.matter.interaction_model.InteractionResponse
Interaction Response received on a matter socket as a result of initiating a device interaction.
- type: number
Matter interaction type
- info_blocks: table
InteractionInfoBlock interaction info_blocks for the given interaction
- status: number
InteractionRequest.status enum value
- static from_parts(cls, type, info_blocks)
Constructor for InteractionResponse objects
- Parameters
cls (
table
) – InteractionResponse reference from __calltype (
number
) – Matter interaction typeinfo_blocks (
list[InteractionInfoBlock]
) – interaction info_blocks for the given interaction
- Returns
constructed interaction req instance
- Return type
InteractionResponse
- static deserialize(socket_message)
Deserialize raw matter socket message into InteractionResponse
- Parameters
socket_message (
table
) –- Return type
InteractionResponse
- pretty_print()
- Return type
str
- class st.matter.interaction_model.InteractionResponseInfoBlock
- info_block: table
data/path associated with the response block
- status: number
Interaction status associated with the path
- cluster_status: number or nil
Optional cluster status associated with the interaction path.
- static from_parts(cls, info_block, status, cluster_status, event_number)
Constructor for InteractionResponseInfoBlock objects.
- Parameters
cls (
table
) – UNUSED InteractionResponseInfoBlock reference from __callinfo_block (
InteractionInfoBlock
) – Single info block of data in the responsestatus (
str
) – Interaction status associated with the pathcluster_status (
number or nil
) – Optional cluster status associated with the interaction path.event_number (
number or nil
) – The event number if this block holds event data.
- Returns
constructed path
- Return type
InteractionResponseInfoBlock
- static deserialize(socket_response_block)
Deserialize raw matter socket response info block into InteractionResponseInfoBlock
- Parameters
socket_response_block (
table
) –- Return type
InteractionResponseInfoBlock
- pretty_print()
- Return type
str