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
@@ -0,0 +1,50 @@
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",
}
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",
}

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,75 @@
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,24 @@
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
Expand Up @@ -12,15 +12,8 @@ ElectricalEnergyMeasurement.types = ElectricalEnergyMeasurementTypes

function ElectricalEnergyMeasurement:get_attribute_by_id(attr_id)
local attr_id_map = {
[0x0000] = "Accuracy",
[0x0001] = "CumulativeEnergyImported",
[0x0002] = "CumulativeEnergyExported",
[0x0003] = "PeriodicEnergyImported",
[0x0004] = "PeriodicEnergyExported",
[0x0005] = "CumulativeEnergyReset",
[0xFFF9] = "AcceptedCommandList",
[0xFFFA] = "EventList",
[0xFFFB] = "AttributeList",
}
local attr_name = attr_id_map[attr_id]
if attr_name ~= nil then
Expand All @@ -30,15 +23,8 @@ function ElectricalEnergyMeasurement:get_attribute_by_id(attr_id)
end

ElectricalEnergyMeasurement.attribute_direction_map = {
["Accuracy"] = "server",
["CumulativeEnergyImported"] = "server",
["CumulativeEnergyExported"] = "server",
["PeriodicEnergyImported"] = "server",
["PeriodicEnergyExported"] = "server",
["CumulativeEnergyReset"] = "server",
["AcceptedCommandList"] = "server",
["EventList"] = "server",
["AttributeList"] = "server",
}

ElectricalEnergyMeasurement.FeatureMap = ElectricalEnergyMeasurement.types.Feature
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,75 +9,6 @@ Feature.EXPORTED_ENERGY = 0x0002
Feature.CUMULATIVE_ENERGY = 0x0004
Feature.PERIODIC_ENERGY = 0x0008

Feature.mask_fields = {
BASE_MASK = 0xFFFF,
IMPORTED_ENERGY = 0x0001,
EXPORTED_ENERGY = 0x0002,
CUMULATIVE_ENERGY = 0x0004,
PERIODIC_ENERGY = 0x0008,
}

Feature.is_imported_energy_set = function(self)
return (self.value & self.IMPORTED_ENERGY) ~= 0
end

Feature.set_imported_energy = function(self)
if self.value ~= nil then
self.value = self.value | self.IMPORTED_ENERGY
else
self.value = self.IMPORTED_ENERGY
end
end

Feature.unset_imported_energy = function(self)
self.value = self.value & (~self.IMPORTED_ENERGY & self.BASE_MASK)
end
Feature.is_exported_energy_set = function(self)
return (self.value & self.EXPORTED_ENERGY) ~= 0
end

Feature.set_exported_energy = function(self)
if self.value ~= nil then
self.value = self.value | self.EXPORTED_ENERGY
else
self.value = self.EXPORTED_ENERGY
end
end

Feature.unset_exported_energy = function(self)
self.value = self.value & (~self.EXPORTED_ENERGY & self.BASE_MASK)
end
Feature.is_cumulative_energy_set = function(self)
return (self.value & self.CUMULATIVE_ENERGY) ~= 0
end

Feature.set_cumulative_energy = function(self)
if self.value ~= nil then
self.value = self.value | self.CUMULATIVE_ENERGY
else
self.value = self.CUMULATIVE_ENERGY
end
end

Feature.unset_cumulative_energy = function(self)
self.value = self.value & (~self.CUMULATIVE_ENERGY & self.BASE_MASK)
end
Feature.is_periodic_energy_set = function(self)
return (self.value & self.PERIODIC_ENERGY) ~= 0
end

Feature.set_periodic_energy = function(self)
if self.value ~= nil then
self.value = self.value | self.PERIODIC_ENERGY
else
self.value = self.PERIODIC_ENERGY
end
end

Feature.unset_periodic_energy = function(self)
self.value = self.value & (~self.PERIODIC_ENERGY & self.BASE_MASK)
end

function Feature.bits_are_valid(feature)
local max =
Feature.IMPORTED_ENERGY |
Expand All @@ -91,25 +22,6 @@ function Feature.bits_are_valid(feature)
end
end

Feature.mask_methods = {
is_imported_energy_set = Feature.is_imported_energy_set,
set_imported_energy = Feature.set_imported_energy,
unset_imported_energy = Feature.unset_imported_energy,
is_exported_energy_set = Feature.is_exported_energy_set,
set_exported_energy = Feature.set_exported_energy,
unset_exported_energy = Feature.unset_exported_energy,
is_cumulative_energy_set = Feature.is_cumulative_energy_set,
set_cumulative_energy = Feature.set_cumulative_energy,
unset_cumulative_energy = Feature.unset_cumulative_energy,
is_periodic_energy_set = Feature.is_periodic_energy_set,
set_periodic_energy = Feature.set_periodic_energy,
unset_periodic_energy = Feature.unset_periodic_energy,
}

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

setmetatable(Feature, new_mt)

return Feature
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
local cluster_base = require "st.matter.cluster_base"
local ElectricalPowerMeasurementServerAttributes = require "embedded_clusters.ElectricalPowerMeasurement.server.attributes"
local ElectricalPowerMeasurementTypes = require "embedded_clusters.ElectricalPowerMeasurement.types"

local ElectricalPowerMeasurement = {}

Expand All @@ -9,32 +8,10 @@ ElectricalPowerMeasurement.NAME = "ElectricalPowerMeasurement"
ElectricalPowerMeasurement.server = {}
ElectricalPowerMeasurement.client = {}
ElectricalPowerMeasurement.server.attributes = ElectricalPowerMeasurementServerAttributes:set_parent_cluster(ElectricalPowerMeasurement)
ElectricalPowerMeasurement.types = ElectricalPowerMeasurementTypes

function ElectricalPowerMeasurement:get_attribute_by_id(attr_id)
local attr_id_map = {
[0x0000] = "PowerMode",
[0x0001] = "NumberOfMeasurementTypes",
[0x0002] = "Accuracy",
[0x0003] = "Ranges",
[0x0004] = "Voltage",
[0x0005] = "ActiveCurrent",
[0x0006] = "ReactiveCurrent",
[0x0007] = "ApparentCurrent",
[0x0008] = "ActivePower",
[0x0009] = "ReactivePower",
[0x000A] = "ApparentPower",
[0x000B] = "RMSVoltage",
[0x000C] = "RMSCurrent",
[0x000D] = "RMSPower",
[0x000E] = "Frequency",
[0x000F] = "HarmonicCurrents",
[0x0010] = "HarmonicPhases",
[0x0011] = "PowerFactor",
[0x0012] = "NeutralCurrent",
[0xFFF9] = "AcceptedCommandList",
[0xFFFA] = "EventList",
[0xFFFB] = "AttributeList",
}
local attr_name = attr_id_map[attr_id]
if attr_name ~= nil then
Expand All @@ -44,39 +21,9 @@ function ElectricalPowerMeasurement:get_attribute_by_id(attr_id)
end

ElectricalPowerMeasurement.attribute_direction_map = {
["PowerMode"] = "server",
["NumberOfMeasurementTypes"] = "server",
["Accuracy"] = "server",
["Ranges"] = "server",
["Voltage"] = "server",
["ActiveCurrent"] = "server",
["ReactiveCurrent"] = "server",
["ApparentCurrent"] = "server",
["ActivePower"] = "server",
["ReactivePower"] = "server",
["ApparentPower"] = "server",
["RMSVoltage"] = "server",
["RMSCurrent"] = "server",
["RMSPower"] = "server",
["Frequency"] = "server",
["HarmonicCurrents"] = "server",
["HarmonicPhases"] = "server",
["PowerFactor"] = "server",
["NeutralCurrent"] = "server",
["AcceptedCommandList"] = "server",
["EventList"] = "server",
["AttributeList"] = "server",
}

ElectricalPowerMeasurement.FeatureMap = ElectricalPowerMeasurement.types.Feature

function ElectricalPowerMeasurement.are_features_supported(feature, feature_map)
if (ElectricalPowerMeasurement.FeatureMap.bits_are_valid(feature)) then
return (feature & feature_map) == feature
end
return false
end

local attribute_helper_mt = {}
attribute_helper_mt.__index = function(self, key)
local direction = ElectricalPowerMeasurement.attribute_direction_map[key]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,4 +65,3 @@ end

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

Loading
Loading