Skip to content

Commit

Permalink
Matter 1.4 Driver Release
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: Harrison Carter  <harrison.carter@smartthings.com>
Co-authored-by: Nick DeBoom <nick.deboom@smartthings.com>
Co-authored-by: Hunsup Jung <hunsup.jung@samsung.com>
  • Loading branch information
3 people committed Feb 28, 2025
1 parent 8456daf commit 432f686
Show file tree
Hide file tree
Showing 167 changed files with 5,010 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 432f686

Please sign in to comment.