Skip to content

Commit

Permalink
Matter 1.4 Driver Release (#1968)
Browse files Browse the repository at this point in the history
Add support for the device types introduced by the Matter 1.4 Spec.

Co-authored-by: Nick DeBoom <nick.deboom@smartthings.com>
Co-authored-by: Hunsup Jung <hunsup.jung@samsung.com>
  • Loading branch information
3 people authored Mar 3, 2025
1 parent e85428d commit 9d3589f
Show file tree
Hide file tree
Showing 167 changed files with 4,946 additions and 1,024 deletions.
6 changes: 6 additions & 0 deletions drivers/SmartThings/matter-energy/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
name: 'Matter Energy'
packageKey: 'matter-energy'
permissions:
matter: {}
description: "SmartThings driver for Matter Energy devices"
vendorSupportInformation: "https://support.smartthings.com"
17 changes: 17 additions & 0 deletions drivers/SmartThings/matter-energy/fingerprints.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
matterGeneric:
- id: "matter/evse"
deviceLabel: Matter EVSE
deviceTypes:
- id: 0x0510
- id: 0x050C
deviceProfileName: evse
- id: "matter/solar-power"
deviceLabel: Matter Solar Power
deviceTypes:
- id: 0x0017 #Solar Power
deviceProfileName: solar-power
- id: "matter/battery-storage"
deviceLabel: Matter Battery Storage
deviceTypes:
- id: 0x0018 #Battery Storage
deviceProfileName: battery-storage
30 changes: 30 additions & 0 deletions drivers/SmartThings/matter-energy/profiles/battery-storage.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: battery-storage
components:
- id: main
capabilities:
- id: battery
version: 1
- id: chargingState
version: 1
- id: powerMeter
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: Battery
- id: importedEnergy
label: Imported Energy
capabilities:
- id: energyMeter
version: 1
- id: powerConsumptionReport
version: 1
- id: exportedEnergy
label: Exported Energy
capabilities:
- id: energyMeter
version: 1
- id: powerConsumptionReport
version: 1
18 changes: 18 additions & 0 deletions drivers/SmartThings/matter-energy/profiles/solar-power.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
name: solar-power
components:
- id: main
capabilities:
- id: energyMeter
version: 1
- id: powerMeter
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: SolarPanel
- id: exportedEnergy
capabilities:
- id: powerConsumptionReport
version: 1
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ local cluster_base = require "st.matter.cluster_base"
local data_types = require "st.matter.data_types"
local TLVParser = require "st.matter.TLV.TLVParser"


local AcceptedCommandList = {
ID = 0xFFF9,
NAME = "AcceptedCommandList",
Expand Down Expand Up @@ -77,4 +78,3 @@ end

setmetatable(AcceptedCommandList, {__call = AcceptedCommandList.new_value})
return AcceptedCommandList

Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,3 @@ end
setmetatable(DeviceEnergyManagementModeServerAttributes, attr_mt)

return DeviceEnergyManagementModeServerAttributes

Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,3 @@ end
setmetatable(DeviceEnergyManagementModeServerCommands, command_mt)

return DeviceEnergyManagementModeServerCommands

Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,3 @@ local DeviceEnergyManagementModeTypes = {}
setmetatable(DeviceEnergyManagementModeTypes, types_mt)

return DeviceEnergyManagementModeTypes

Original file line number Diff line number Diff line change
@@ -1,28 +1,25 @@
local cluster_base = require "st.matter.cluster_base"
local ElectricalEnergyMeasurementServerAttributes = require "ElectricalEnergyMeasurement.server.attributes"
local ElectricalEnergyMeasurementTypes = require "ElectricalEnergyMeasurement.types"

local ElectricalEnergyMeasurement = {}

ElectricalEnergyMeasurement.ID = 0x0091
ElectricalEnergyMeasurement.NAME = "ElectricalEnergyMeasurement"
ElectricalEnergyMeasurement.server = {}
ElectricalEnergyMeasurement.client = {}
ElectricalEnergyMeasurement.server.attributes = ElectricalEnergyMeasurementServerAttributes:set_parent_cluster(ElectricalEnergyMeasurement)
ElectricalEnergyMeasurement.types = ElectricalEnergyMeasurementTypes
ElectricalEnergyMeasurement.FeatureMap = ElectricalEnergyMeasurement.types.Feature

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

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]
Expand All @@ -32,18 +29,27 @@ function ElectricalEnergyMeasurement:get_attribute_by_id(attr_id)
return nil
end

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

-- Command Mapping
ElectricalEnergyMeasurement.command_direction_map = {}
ElectricalEnergyMeasurement.FeatureMap = ElectricalEnergyMeasurement.types.Feature

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

-- Cluster Completion
local attribute_helper_mt = {}
attribute_helper_mt.__index = function(self, key)
local direction = ElectricalEnergyMeasurement.attribute_direction_map[key]
Expand All @@ -57,4 +63,4 @@ setmetatable(ElectricalEnergyMeasurement.attributes, attribute_helper_mt)

setmetatable(ElectricalEnergyMeasurement, {__index = cluster_base})

return ElectricalEnergyMeasurement
return ElectricalEnergyMeasurement
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
local cluster_base = require "st.matter.cluster_base"
local data_types = require "st.matter.data_types"
local TLVParser = require "st.matter.TLV.TLVParser"

local CumulativeEnergyExported = {
ID = 0x0002,
NAME = "CumulativeEnergyExported",
base_type = require "ElectricalEnergyMeasurement.types.EnergyMeasurementStruct",
}

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

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

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

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

function CumulativeEnergyExported: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 CumulativeEnergyExported:deserialize(tlv_buf)
local data = TLVParser.decode_tlv(tlv_buf)
self:augment_type(data)
return data
end

setmetatable(CumulativeEnergyExported, {__call = CumulativeEnergyExported.new_value, __index = CumulativeEnergyExported.base_type})
return CumulativeEnergyExported
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
local cluster_base = require "st.matter.cluster_base"
local data_types = require "st.matter.data_types"
local TLVParser = require "st.matter.TLV.TLVParser"

local CumulativeEnergyImported = {
ID = 0x0001,
NAME = "CumulativeEnergyImported",
base_type = require "ElectricalEnergyMeasurement.types.EnergyMeasurementStruct",
}

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

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

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

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

function CumulativeEnergyImported: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 CumulativeEnergyImported:deserialize(tlv_buf)
local data = TLVParser.decode_tlv(tlv_buf)
self:augment_type(data)
return data
end

setmetatable(CumulativeEnergyImported, {__call = CumulativeEnergyImported.new_value, __index = CumulativeEnergyImported.base_type})
return CumulativeEnergyImported
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
local cluster_base = require "st.matter.cluster_base"
local data_types = require "st.matter.data_types"
local TLVParser = require "st.matter.TLV.TLVParser"

local PeriodicEnergyExported = {
ID = 0x0004,
NAME = "PeriodicEnergyExported",
base_type = require "ElectricalEnergyMeasurement.types.EnergyMeasurementStruct",
}

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

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

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

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

function PeriodicEnergyExported: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 PeriodicEnergyExported:deserialize(tlv_buf)
local data = TLVParser.decode_tlv(tlv_buf)
self:augment_type(data)
return data
end

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

0 comments on commit 9d3589f

Please sign in to comment.