Skip to content

Commit 2d9e38d

Browse files
Support Soil Sensor device type
1 parent 7f042d1 commit 2d9e38d

24 files changed

Lines changed: 993 additions & 49 deletions

drivers/SmartThings/matter-sensor/fingerprints.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -350,3 +350,8 @@ matterGeneric:
350350
deviceTypes:
351351
- id: 0x0306 # Flow Sensor
352352
deviceProfileName: flow-battery
353+
- id: "matter/soil/sensor"
354+
deviceLabel: Matter Soil Sensor
355+
deviceTypes:
356+
- id: 0x0045 # Soil Sensor
357+
deviceProfileName: soil-sensor-battery
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
name: soil-sensor-battery
2+
components:
3+
- id: main
4+
capabilities:
5+
- id: relativeHumidityMeasurement
6+
version: 1
7+
- id: battery
8+
version: 1
9+
- id: firmwareUpdate
10+
version: 1
11+
- id: refresh
12+
version: 1
13+
categories:
14+
- name: HumiditySensor
15+
preferences:
16+
- preferenceId: humidityOffset
17+
explicit: true
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
name: soil-sensor-batteryLevel
2+
components:
3+
- id: main
4+
capabilities:
5+
- id: relativeHumidityMeasurement
6+
version: 1
7+
- id: batteryLevel
8+
version: 1
9+
- id: firmwareUpdate
10+
version: 1
11+
- id: refresh
12+
version: 1
13+
categories:
14+
- name: HumiditySensor
15+
preferences:
16+
- preferenceId: humidityOffset
17+
explicit: true
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
name: soil-sensor
2+
components:
3+
- id: main
4+
capabilities:
5+
- id: relativeHumidityMeasurement
6+
version: 1
7+
- id: firmwareUpdate
8+
version: 1
9+
- id: refresh
10+
version: 1
11+
categories:
12+
- name: HumiditySensor
13+
preferences:
14+
- preferenceId: humidityOffset
15+
explicit: true
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
name: temperature-soil-sensor-battery
2+
components:
3+
- id: main
4+
capabilities:
5+
- id: relativeHumidityMeasurement
6+
version: 1
7+
- id: temperatureMeasurement
8+
version: 1
9+
- id: battery
10+
version: 1
11+
- id: firmwareUpdate
12+
version: 1
13+
- id: refresh
14+
version: 1
15+
categories:
16+
- name: HumiditySensor
17+
preferences:
18+
- preferenceId: tempOffset
19+
explicit: true
20+
- preferenceId: humidityOffset
21+
explicit: true
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
name: temperature-soil-sensor-batteryLevel
2+
components:
3+
- id: main
4+
capabilities:
5+
- id: relativeHumidityMeasurement
6+
version: 1
7+
- id: temperatureMeasurement
8+
version: 1
9+
- id: batteryLevel
10+
version: 1
11+
- id: firmwareUpdate
12+
version: 1
13+
- id: refresh
14+
version: 1
15+
categories:
16+
- name: HumiditySensor
17+
preferences:
18+
- preferenceId: tempOffset
19+
explicit: true
20+
- preferenceId: humidityOffset
21+
explicit: true
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
name: temperature-soil-sensor
2+
components:
3+
- id: main
4+
capabilities:
5+
- id: relativeHumidityMeasurement
6+
version: 1
7+
- id: temperatureMeasurement
8+
version: 1
9+
- id: firmwareUpdate
10+
version: 1
11+
- id: refresh
12+
version: 1
13+
categories:
14+
- name: HumiditySensor
15+
preferences:
16+
- preferenceId: tempOffset
17+
explicit: true
18+
- preferenceId: humidityOffset
19+
explicit: true
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
local GlobalTypes = require "embedded_clusters.Global.types"
2+
3+
local Global = {}
4+
Global.types = GlobalTypes
5+
return Global
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
local data_types = require "st.matter.data_types"
2+
local UintABC = require "st.matter.data_types.base_defs.UintABC"
3+
4+
local LevelValueEnum = {}
5+
local new_mt = UintABC.new_mt({NAME = "Uint8", ID = data_types.name_to_id_map["Uint8"]}, 1)
6+
new_mt.__index.pretty_print = function(self)
7+
local name_lookup = {
8+
[self.UNKNOWN] = "UNKNOWN",
9+
[self.LOW] = "LOW",
10+
[self.MEDIUM] = "MEDIUM",
11+
[self.HIGH] = "HIGH",
12+
[self.CRITICAL] = "CRITICAL",
13+
}
14+
return string.format("%s: %s", self.field_name or self.NAME, name_lookup[self.value] or string.format("%d", self.value))
15+
end
16+
new_mt.__tostring = new_mt.__index.pretty_print
17+
18+
new_mt.__index.UNKNOWN = 0x00
19+
new_mt.__index.LOW = 0x01
20+
new_mt.__index.MEDIUM = 0x02
21+
new_mt.__index.HIGH = 0x03
22+
new_mt.__index.CRITICAL = 0x04
23+
24+
LevelValueEnum.UNKNOWN = 0x00
25+
LevelValueEnum.LOW = 0x01
26+
LevelValueEnum.MEDIUM = 0x02
27+
LevelValueEnum.HIGH = 0x03
28+
LevelValueEnum.CRITICAL = 0x04
29+
30+
LevelValueEnum.augment_type = function(cls, val)
31+
setmetatable(val, new_mt)
32+
end
33+
34+
setmetatable(LevelValueEnum, new_mt)
35+
36+
return LevelValueEnum
Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
local data_types = require "st.matter.data_types"
2+
local StructureABC = require "st.matter.data_types.base_defs.StructureABC"
3+
4+
local MeasurementAccuracyRangeStruct = {}
5+
local new_mt = StructureABC.new_mt({NAME = "MeasurementAccuracyRangeStruct", ID = data_types.name_to_id_map["Structure"]})
6+
7+
MeasurementAccuracyRangeStruct.field_defs = {
8+
{
9+
name = "range_min",
10+
field_id = 0,
11+
is_nullable = false,
12+
is_optional = false,
13+
data_type = require "st.matter.data_types.Int64",
14+
},
15+
{
16+
name = "range_max",
17+
field_id = 1,
18+
is_nullable = false,
19+
is_optional = false,
20+
data_type = require "st.matter.data_types.Int64",
21+
},
22+
{
23+
name = "percent_max",
24+
field_id = 2,
25+
is_nullable = false,
26+
is_optional = true,
27+
data_type = require "st.matter.data_types.Uint16",
28+
},
29+
{
30+
name = "percent_min",
31+
field_id = 3,
32+
is_nullable = false,
33+
is_optional = true,
34+
data_type = require "st.matter.data_types.Uint16",
35+
},
36+
{
37+
name = "percent_typical",
38+
field_id = 4,
39+
is_nullable = false,
40+
is_optional = true,
41+
data_type = require "st.matter.data_types.Uint16",
42+
},
43+
{
44+
name = "fixed_max",
45+
field_id = 5,
46+
is_nullable = false,
47+
is_optional = true,
48+
data_type = require "st.matter.data_types.Uint64",
49+
},
50+
{
51+
name = "fixed_min",
52+
field_id = 6,
53+
is_nullable = false,
54+
is_optional = true,
55+
data_type = require "st.matter.data_types.Uint64",
56+
},
57+
{
58+
name = "fixed_typical",
59+
field_id = 7,
60+
is_nullable = false,
61+
is_optional = true,
62+
data_type = require "st.matter.data_types.Uint64",
63+
},
64+
}
65+
66+
MeasurementAccuracyRangeStruct.init = function(cls, tbl)
67+
local o = {}
68+
o.elements = {}
69+
o.num_elements = 0
70+
setmetatable(o, new_mt)
71+
for _idx, field_def in ipairs(cls.field_defs) do
72+
if (not field_def.is_optional and not field_def.is_nullable) and not tbl[field_def.name] then
73+
error("Missing non optional or non_nullable field: " .. field_def.name)
74+
elseif not (field_def.is_optional and tbl[field_def.name] == nil) then
75+
o.elements[field_def.name] = data_types.validate_or_build_type(tbl[field_def.name], field_def.data_type, field_def.name)
76+
o.elements[field_def.name].field_id = field_def.field_id
77+
o.num_elements = o.num_elements + 1
78+
end
79+
end
80+
return o
81+
end
82+
83+
MeasurementAccuracyRangeStruct.serialize = function(self, buf, include_control, tag)
84+
return data_types['Structure'].serialize(self.elements, buf, include_control, tag)
85+
end
86+
87+
new_mt.__call = MeasurementAccuracyRangeStruct.init
88+
new_mt.__index.serialize = MeasurementAccuracyRangeStruct.serialize
89+
90+
MeasurementAccuracyRangeStruct.augment_type = function(self, val)
91+
local elems = {}
92+
local num_elements = 0
93+
for _, v in pairs(val.elements) do
94+
for _, field_def in ipairs(self.field_defs) do
95+
if field_def.field_id == v.field_id and
96+
field_def.is_nullable and
97+
(v.value == nil and v.elements == nil) then
98+
elems[field_def.name] = data_types.validate_or_build_type(v, data_types.Null, field_def.field_name)
99+
num_elements = num_elements + 1
100+
elseif field_def.field_id == v.field_id and not
101+
(field_def.is_optional and v.value == nil and v.elements == nil) then
102+
elems[field_def.name] = data_types.validate_or_build_type(v, field_def.data_type, field_def.field_name)
103+
num_elements = num_elements + 1
104+
if field_def.element_type ~= nil then
105+
for i, e in ipairs(elems[field_def.name].elements) do
106+
elems[field_def.name].elements[i] = data_types.validate_or_build_type(e, field_def.element_type)
107+
end
108+
end
109+
end
110+
end
111+
end
112+
val.elements = elems
113+
val.num_elements = num_elements
114+
setmetatable(val, new_mt)
115+
end
116+
117+
setmetatable(MeasurementAccuracyRangeStruct, new_mt)
118+
119+
return MeasurementAccuracyRangeStruct

0 commit comments

Comments
 (0)