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
5 changes: 5 additions & 0 deletions drivers/SmartThings/matter-sensor/fingerprints.yml
Original file line number Diff line number Diff line change
Expand Up @@ -350,3 +350,8 @@ matterGeneric:
deviceTypes:
- id: 0x0306 # Flow Sensor
deviceProfileName: flow-battery
- id: "matter/soil/sensor"
deviceLabel: Matter Soil Sensor
deviceTypes:
- id: 0x0045 # Soil Sensor
deviceProfileName: soil-sensor-battery
17 changes: 17 additions & 0 deletions drivers/SmartThings/matter-sensor/profiles/soil-sensor-battery.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name: soil-sensor-battery
components:
- id: main
capabilities:
- id: relativeHumidityMeasurement
version: 1
- id: battery
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: HumiditySensor
preferences:
- preferenceId: humidityOffset
explicit: true
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
name: soil-sensor-batteryLevel
components:
- id: main
capabilities:
- id: relativeHumidityMeasurement
version: 1
- id: batteryLevel
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: HumiditySensor
preferences:
- preferenceId: humidityOffset
explicit: true
15 changes: 15 additions & 0 deletions drivers/SmartThings/matter-sensor/profiles/soil-sensor.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
name: soil-sensor
components:
- id: main
capabilities:
- id: relativeHumidityMeasurement
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: HumiditySensor
preferences:
- preferenceId: humidityOffset
explicit: true
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: temperature-soil-sensor-battery
components:
- id: main
capabilities:
- id: relativeHumidityMeasurement
version: 1
- id: temperatureMeasurement
version: 1
- id: battery
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: HumiditySensor
preferences:
- preferenceId: tempOffset
explicit: true
- preferenceId: humidityOffset
explicit: true
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: temperature-soil-sensor-batteryLevel
components:
- id: main
capabilities:
- id: relativeHumidityMeasurement
version: 1
- id: temperatureMeasurement
version: 1
- id: batteryLevel
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: HumiditySensor
preferences:
- preferenceId: tempOffset
explicit: true
- preferenceId: humidityOffset
explicit: true
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
name: temperature-soil-sensor
components:
- id: main
capabilities:
- id: relativeHumidityMeasurement
version: 1
- id: temperatureMeasurement
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: HumiditySensor
preferences:
- preferenceId: tempOffset
explicit: true
- preferenceId: humidityOffset
explicit: true
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
local GlobalTypes = require "embedded_clusters.Global.types"

local Global = {}
Global.types = GlobalTypes
return Global
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
local UintABC = require "st.matter.data_types.base_defs.UintABC"

local LevelValueEnum = {}
local new_mt = UintABC.new_mt({NAME = "Uint8", ID = data_types.name_to_id_map["Uint8"]}, 1)
new_mt.__index.pretty_print = function(self)
local name_lookup = {
[self.UNKNOWN] = "UNKNOWN",
[self.LOW] = "LOW",
[self.MEDIUM] = "MEDIUM",
[self.HIGH] = "HIGH",
[self.CRITICAL] = "CRITICAL",
}
return string.format("%s: %s", self.field_name or self.NAME, name_lookup[self.value] or string.format("%d", self.value))
end
new_mt.__tostring = new_mt.__index.pretty_print

new_mt.__index.UNKNOWN = 0x00
new_mt.__index.LOW = 0x01
new_mt.__index.MEDIUM = 0x02
new_mt.__index.HIGH = 0x03
new_mt.__index.CRITICAL = 0x04

LevelValueEnum.UNKNOWN = 0x00
LevelValueEnum.LOW = 0x01
LevelValueEnum.MEDIUM = 0x02
LevelValueEnum.HIGH = 0x03
LevelValueEnum.CRITICAL = 0x04

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

setmetatable(LevelValueEnum, new_mt)

return LevelValueEnum
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
local data_types = require "st.matter.data_types"
local StructureABC = require "st.matter.data_types.base_defs.StructureABC"

local MeasurementAccuracyRangeStruct = {}
local new_mt = StructureABC.new_mt({NAME = "MeasurementAccuracyRangeStruct", ID = data_types.name_to_id_map["Structure"]})

MeasurementAccuracyRangeStruct.field_defs = {
{
name = "range_min",
field_id = 0,
is_nullable = false,
is_optional = false,
data_type = require "st.matter.data_types.Int64",
},
{
name = "range_max",
field_id = 1,
is_nullable = false,
is_optional = false,
data_type = require "st.matter.data_types.Int64",
},
{
name = "percent_max",
field_id = 2,
is_nullable = false,
is_optional = true,
data_type = require "st.matter.data_types.Uint16",
},
{
name = "percent_min",
field_id = 3,
is_nullable = false,
is_optional = true,
data_type = require "st.matter.data_types.Uint16",
},
{
name = "percent_typical",
field_id = 4,
is_nullable = false,
is_optional = true,
data_type = require "st.matter.data_types.Uint16",
},
{
name = "fixed_max",
field_id = 5,
is_nullable = false,
is_optional = true,
data_type = require "st.matter.data_types.Uint64",
},
{
name = "fixed_min",
field_id = 6,
is_nullable = false,
is_optional = true,
data_type = require "st.matter.data_types.Uint64",
},
{
name = "fixed_typical",
field_id = 7,
is_nullable = false,
is_optional = true,
data_type = require "st.matter.data_types.Uint64",
},
}

MeasurementAccuracyRangeStruct.init = function(cls, tbl)
local o = {}
o.elements = {}
o.num_elements = 0
setmetatable(o, new_mt)
for _idx, field_def in ipairs(cls.field_defs) do
if (not field_def.is_optional and not field_def.is_nullable) and not tbl[field_def.name] then
error("Missing non optional or non_nullable field: " .. field_def.name)
elseif not (field_def.is_optional and tbl[field_def.name] == nil) then
o.elements[field_def.name] = data_types.validate_or_build_type(tbl[field_def.name], field_def.data_type, field_def.name)
o.elements[field_def.name].field_id = field_def.field_id
o.num_elements = o.num_elements + 1
end
end
return o
end

MeasurementAccuracyRangeStruct.serialize = function(self, buf, include_control, tag)
return data_types['Structure'].serialize(self.elements, buf, include_control, tag)
end

new_mt.__call = MeasurementAccuracyRangeStruct.init
new_mt.__index.serialize = MeasurementAccuracyRangeStruct.serialize

MeasurementAccuracyRangeStruct.augment_type = function(self, val)
local elems = {}
local num_elements = 0
for _, v in pairs(val.elements) do
for _, field_def in ipairs(self.field_defs) do
if field_def.field_id == v.field_id and
field_def.is_nullable and
(v.value == nil and v.elements == nil) then
elems[field_def.name] = data_types.validate_or_build_type(v, data_types.Null, field_def.field_name)
num_elements = num_elements + 1
elseif field_def.field_id == v.field_id and not
(field_def.is_optional and v.value == nil and v.elements == nil) then
elems[field_def.name] = data_types.validate_or_build_type(v, field_def.data_type, field_def.field_name)
num_elements = num_elements + 1
if field_def.element_type ~= nil then
for i, e in ipairs(elems[field_def.name].elements) do
elems[field_def.name].elements[i] = data_types.validate_or_build_type(e, field_def.element_type)
end
end
end
end
end
val.elements = elems
val.num_elements = num_elements
setmetatable(val, new_mt)
end

setmetatable(MeasurementAccuracyRangeStruct, new_mt)

return MeasurementAccuracyRangeStruct
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
local data_types = require "st.matter.data_types"
local StructureABC = require "st.matter.data_types.base_defs.StructureABC"

local MeasurementAccuracyStruct = {}
local new_mt = StructureABC.new_mt({NAME = "MeasurementAccuracyStruct", ID = data_types.name_to_id_map["Structure"]})

MeasurementAccuracyStruct.field_defs = {
{
name = "measurement_type",
field_id = 0,
is_nullable = false,
is_optional = false,
data_type = require "embedded_clusters.Global.types.MeasurementTypeEnum",
},
{
name = "measured",
field_id = 1,
is_nullable = false,
is_optional = false,
data_type = require "st.matter.data_types.Boolean",
},
{
name = "min_measured_value",
field_id = 2,
is_nullable = false,
is_optional = false,
data_type = require "st.matter.data_types.Int64",
},
{
name = "max_measured_value",
field_id = 3,
is_nullable = false,
is_optional = false,
data_type = require "st.matter.data_types.Int64",
},
{
name = "accuracy_ranges",
field_id = 4,
is_nullable = false,
is_optional = false,
data_type = require "st.matter.data_types.Array",
element_type = require "embedded_clusters.Global.types.MeasurementAccuracyRangeStruct",
},
}

MeasurementAccuracyStruct.init = function(cls, tbl)
local o = {}
o.elements = {}
o.num_elements = 0
setmetatable(o, new_mt)
for _idx, field_def in ipairs(cls.field_defs) do
if (not field_def.is_optional and not field_def.is_nullable) and not tbl[field_def.name] then
error("Missing non optional or non_nullable field: " .. field_def.name)
elseif not (field_def.is_optional and tbl[field_def.name] == nil) then
o.elements[field_def.name] = data_types.validate_or_build_type(tbl[field_def.name], field_def.data_type, field_def.name)
o.elements[field_def.name].field_id = field_def.field_id
o.num_elements = o.num_elements + 1
end
end
return o
end

MeasurementAccuracyStruct.serialize = function(self, buf, include_control, tag)
return data_types['Structure'].serialize(self.elements, buf, include_control, tag)
end

new_mt.__call = MeasurementAccuracyStruct.init
new_mt.__index.serialize = MeasurementAccuracyStruct.serialize

MeasurementAccuracyStruct.augment_type = function(self, val)
local elems = {}
local num_elements = 0
for _, v in pairs(val.elements) do
for _, field_def in ipairs(self.field_defs) do
if field_def.field_id == v.field_id and
field_def.is_nullable and
(v.value == nil and v.elements == nil) then
elems[field_def.name] = data_types.validate_or_build_type(v, data_types.Null, field_def.field_name)
num_elements = num_elements + 1
elseif field_def.field_id == v.field_id and not
(field_def.is_optional and v.value == nil and v.elements == nil) then
elems[field_def.name] = data_types.validate_or_build_type(v, field_def.data_type, field_def.field_name)
num_elements = num_elements + 1
if field_def.element_type ~= nil then
for i, e in ipairs(elems[field_def.name].elements) do
elems[field_def.name].elements[i] = data_types.validate_or_build_type(e, field_def.element_type)
end
end
end
end
end
val.elements = elems
val.num_elements = num_elements
setmetatable(val, new_mt)
end

setmetatable(MeasurementAccuracyStruct, new_mt)

return MeasurementAccuracyStruct
Loading
Loading