Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ MoveTo.field_defs = {
field_id = 2,
is_nullable = false,
is_optional = true,
data_type = require "st.matter.generated.zap_clusters.Global.types.ThreeLevelAutoEnum",
data_type = require "embedded_clusters.Global.types.ThreeLevelAutoEnum",
},
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ OverallCurrentStateStruct.field_defs = {
field_id = 2,
is_nullable = false,
is_optional = true,
data_type = require "st.matter.generated.zap_clusters.Global.types.ThreeLevelAutoEnum",
data_type = require "embedded_clusters.Global.types.ThreeLevelAutoEnum",
},
{
name = "secure_state",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ OverallTargetStateStruct.field_defs = {
field_id = 2,
is_nullable = false,
is_optional = true,
data_type = require "st.matter.generated.zap_clusters.Global.types.ThreeLevelAutoEnum",
data_type = require "embedded_clusters.Global.types.ThreeLevelAutoEnum",
},
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ SetTarget.field_defs = {
field_id = 2,
is_nullable = false,
is_optional = true,
data_type = require "st.matter.generated.zap_clusters.Global.types.ThreeLevelAutoEnum",
data_type = require "embedded_clusters.Global.types.ThreeLevelAutoEnum",
},
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ Step.field_defs = {
field_id = 2,
is_nullable = false,
is_optional = true,
data_type = require "st.matter.generated.zap_clusters.Global.types.ThreeLevelAutoEnum",
data_type = require "embedded_clusters.Global.types.ThreeLevelAutoEnum",
},
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ DimensionStateStruct.field_defs = {
field_id = 2,
is_nullable = false,
is_optional = true,
data_type = require "st.matter.generated.zap_clusters.Global.types.ThreeLevelAutoEnum",
data_type = require "embedded_clusters.Global.types.ThreeLevelAutoEnum",
},
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
-- Copyright © 2025 SmartThings, Inc.
-- Licensed under the Apache License, Version 2.0

local cluster_base = require "st.matter.cluster_base"
local DescriptorServerAttributes = require "embedded_clusters.Descriptor.server.attributes"

local Descriptor = {}

Descriptor.ID = 0x001D
Descriptor.NAME = "Descriptor"
Descriptor.server = {}
Descriptor.client = {}
Descriptor.server.attributes = DescriptorServerAttributes:set_parent_cluster(Descriptor)

function Descriptor:get_attribute_by_id(attr_id)
local attr_id_map = {
[0x0003] = "PartsList",
[0x0004] = "TagList",
}
local attr_name = attr_id_map[attr_id]
if attr_name ~= nil then
return self.attributes[attr_name]
end
return nil
end

function Descriptor:get_server_command_by_id(command_id)
local server_id_map = {
}
if server_id_map[command_id] ~= nil then
return self.server.commands[server_id_map[command_id]]
end
return nil
end

Descriptor.attribute_direction_map = {
["PartsList"] = "server",
["TagList"] = "server",
}

local attribute_helper_mt = {}
attribute_helper_mt.__index = function(self, key)
local direction = Descriptor.attribute_direction_map[key]
if direction == nil then
error(string.format("Referenced unknown attribute %s on cluster %s", key, Descriptor.NAME))
end
return Descriptor[direction].attributes[key]
end
Descriptor.attributes = {}
setmetatable(Descriptor.attributes, attribute_helper_mt)

setmetatable(Descriptor, {__index = cluster_base})

return Descriptor

Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
-- Copyright © 2025 SmartThings, Inc.
-- Licensed under the Apache License, Version 2.0

local cluster_base = require "st.matter.cluster_base"
local data_types = require "st.matter.data_types"
local TLVParser = require "st.matter.TLV.TLVParser"

local PartsList = {
ID = 0x0003,
NAME = "PartsList",
base_type = require "st.matter.data_types.Array",
element_type = require "st.matter.data_types.Uint16",
}

function PartsList:augment_type(data_type_obj)
for i, v in ipairs(data_type_obj.elements) do
data_type_obj.elements[i] = data_types.validate_or_build_type(v, PartsList.element_type)
end
end

function PartsList:new_value(...)
local o = self.base_type(table.unpack({...}))

return o
end

function PartsList:read(device, endpoint_id)
return cluster_base.read(
device,
endpoint_id,
self._cluster.ID,
self.ID,
nil
)
end

function PartsList:subscribe(device, endpoint_id)
return cluster_base.subscribe(
device,
endpoint_id,
self._cluster.ID,
self.ID,
nil
)
end

function PartsList:set_parent_cluster(cluster)
self._cluster = cluster
return self
end

function PartsList:build_test_report_data(
device,
endpoint_id,
value,
status
)
local data = data_types.validate_or_build_type(value, self.base_type)

return cluster_base.build_test_report_data(
device,
endpoint_id,
self._cluster.ID,
self.ID,
data,
status
)
end

function PartsList:deserialize(tlv_buf)
local data = TLVParser.decode_tlv(tlv_buf)

return data
end

setmetatable(PartsList, {__call = PartsList.new_value, __index = PartsList.base_type})
return PartsList

Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
-- Copyright © 2026 SmartThings, Inc.
-- Licensed under the Apache License, Version 2.0

local cluster_base = require "st.matter.cluster_base"
local data_types = require "st.matter.data_types"
local TLVParser = require "st.matter.TLV.TLVParser"

local TagList = {
ID = 0x0004,
NAME = "TagList",
_cluster = require "embedded_clusters.Descriptor",
base_type = require "st.matter.data_types.Array",
element_type = require "embedded_clusters.Global.types.SemanticTagStruct",
}

function TagList:augment_type(data_type_obj)
for i, v in ipairs(data_type_obj.elements) do
data_type_obj.elements[i] = data_types.validate_or_build_type(v, TagList.element_type)
end
end

function TagList:new_value(...)
local o = self.base_type(table.unpack({...}))
self:augment_type(o)
return o
end

function TagList:read(device, endpoint_id)
return cluster_base.read(
device,
endpoint_id,
self._cluster.ID,
self.ID,
nil
)
end


function TagList:subscribe(device, endpoint_id)
return cluster_base.subscribe(
device,
endpoint_id,
self._cluster.ID,
self.ID,
nil
)
end

function TagList:set_parent_cluster(cluster)
self._cluster = cluster
return self
end

function TagList:build_test_report_data(
device,
endpoint_id,
value,
status
)
local data = data_types.validate_or_build_type(value, self.base_type)
self:augment_type(data)
return cluster_base.build_test_report_data(
device,
endpoint_id,
self._cluster.ID,
self.ID,
data,
status
)
end

function TagList:deserialize(tlv_buf)
local data = TLVParser.decode_tlv(tlv_buf)
self:augment_type(data)
return data
end

setmetatable(TagList, {__call = TagList.new_value, __index = TagList.base_type})
return TagList

Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
-- Copyright © 2025 SmartThings, Inc.
-- Licensed under the Apache License, Version 2.0

local attr_mt = {}
attr_mt.__attr_cache = {}
attr_mt.__index = function(self, key)
if attr_mt.__attr_cache[key] == nil then
local req_loc = string.format("embedded_clusters.Descriptor.server.attributes.%s", key)
local raw_def = require(req_loc)
local cluster = rawget(self, "_cluster")
raw_def:set_parent_cluster(cluster)
attr_mt.__attr_cache[key] = raw_def
end
return attr_mt.__attr_cache[key]
end

local DescriptorServerAttributes = {}

function DescriptorServerAttributes:set_parent_cluster(cluster)
self._cluster = cluster
return self
end

setmetatable(DescriptorServerAttributes, attr_mt)

return DescriptorServerAttributes

Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
-- Copyright © 2026 SmartThings, Inc.
-- Licensed under the Apache License, Version 2.0

local data_types = require "st.matter.data_types"
local UintABC = require "st.matter.data_types.base_defs.UintABC"

local Feature = {}
local new_mt = UintABC.new_mt({NAME = "Feature", ID = data_types.name_to_id_map["Uint32"]}, 4)

Feature.BASE_MASK = 0xFFFF
Feature.TAG_LIST = 0x0001

Feature.mask_fields = {
BASE_MASK = 0xFFFF,
TAG_LIST = 0x0001,
}

Feature.is_tag_list_set = function(self)
return (self.value & self.TAG_LIST) ~= 0
end

Feature.set_tag_list = function(self)
if self.value ~= nil then
self.value = self.value | self.TAG_LIST
else
self.value = self.TAG_LIST
end
end

Feature.unset_tag_list = function(self)
self.value = self.value & (~self.TAG_LIST & self.BASE_MASK)
end

function Feature.bits_are_valid(feature)
local max =
Feature.TAG_LIST
if (feature <= max) and (feature >= 1) then
return true
else
return false
end
end

Feature.mask_methods = {
is_tag_list_set = Feature.is_tag_list_set,
set_tag_list = Feature.set_tag_list,
unset_tag_list = Feature.unset_tag_list,
}

Feature.augment_type = function(_cls, val)
setmetatable(val, new_mt)
end

setmetatable(Feature, new_mt)

return Feature
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
-- Copyright © 2026 SmartThings, Inc.
-- Licensed under the Apache License, Version 2.0

local lazy_loader = require "st.utils.lazy_loader"

local DescriptorTypes = lazy_loader:new { prefix = "embedded_clusters.Descriptor.types." }

return DescriptorTypes

Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
-- Copyright © 2026 SmartThings, Inc.
-- Licensed under the Apache License, Version 2.0

local GlobalTypes = require "embedded_clusters.Global.types"

local Global = {}
Global.types = GlobalTypes
return Global
Loading
Loading