Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Matter Water Sensor Device Integration #1533

Merged
merged 17 commits into from
Aug 9, 2024
Merged
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,18 @@
name: Custom Rain Sensor
id: smilevirtual57983.customRainSensor
hcarter-775 marked this conversation as resolved.
Show resolved Hide resolved
version: 1
status: proposed
attributes:
rain:
schema:
type: object
properties:
value:
type: string
enum:
- detected
- undetected
additionalProperies: false
required:
- value
commands: {}
14 changes: 14 additions & 0 deletions drivers/SmartThings/matter-sensor/profiles/freeze-fault.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
name: freeze-fault
components:
- id: main
capabilities:
- id: temperatureAlarm
version: 1
- id: hardwareFault
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: ContactSensor
16 changes: 16 additions & 0 deletions drivers/SmartThings/matter-sensor/profiles/freeze-leak-fault.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
name: freeze-leak-fault
components:
- id: main
capabilities:
- id: temperatureAlarm
version: 1
- id: waterSensor
version: 1
- id: hardwareFault
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: ContactSensor
14 changes: 14 additions & 0 deletions drivers/SmartThings/matter-sensor/profiles/freeze-leak.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
name: freeze-leak
components:
- id: main
capabilities:
- id: temperatureAlarm
version: 1
- id: waterSensor
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: ContactSensor
12 changes: 12 additions & 0 deletions drivers/SmartThings/matter-sensor/profiles/freeze.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
name: freeze
components:
- id: main
capabilities:
- id: temperatureAlert
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: ContactSensor
14 changes: 14 additions & 0 deletions drivers/SmartThings/matter-sensor/profiles/leak-fault.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
name: leak-fault
components:
- id: main
capabilities:
- id: waterSensor
version: 1
- id: hardwareFault
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: ContactSensor
12 changes: 12 additions & 0 deletions drivers/SmartThings/matter-sensor/profiles/leak.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
name: leak
components:
- id: main
capabilities:
- id: waterSensor
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: ContactSensor
14 changes: 14 additions & 0 deletions drivers/SmartThings/matter-sensor/profiles/rain-fault.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
name: rain-fault
components:
- id: main
capabilities:
- id: rainSensor
version: 1
- id: hardwareFault
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: ContactSensor
12 changes: 12 additions & 0 deletions drivers/SmartThings/matter-sensor/profiles/rain.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
name: rain
components:
- id: main
capabilities:
- id: rainSensor
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: ContactSensor
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
local cluster_base = require "st.matter.cluster_base"
local BooleanStateConfigurationServerAttributes = require "BooleanStateConfiguration.server.attributes"
local BooleanStateConfigurationTypes = require "BooleanStateConfiguration.types"

local BooleanStateConfiguration = {}

BooleanStateConfiguration.ID = 0x0080
BooleanStateConfiguration.NAME = "BooleanStateConfiguration"
BooleanStateConfiguration.server = {}
BooleanStateConfiguration.client = {}
BooleanStateConfiguration.server.attributes = BooleanStateConfigurationServerAttributes:set_parent_cluster(BooleanStateConfiguration)
BooleanStateConfiguration.types = BooleanStateConfigurationTypes

function BooleanStateConfiguration:get_attribute_by_id(attr_id)
local attr_id_map = {
[0x0000] = "CurrentSensitivityLevel",
[0x0001] = "SupportedSensitivityLevels",
[0x0002] = "DefaultSensitivityLevel",
[0x0003] = "AlarmsActive",
[0x0004] = "AlarmsSuppressed",
[0x0005] = "AlarmsEnabled",
[0x0006] = "AlarmsSupported",
[0x0007] = "SensorFault",
[0xFFF9] = "AcceptedCommandList",
[0xFFFA] = "EventList",
[0xFFFB] = "AttributeList",
}
local attr_name = attr_id_map[attr_id]
if attr_name ~= nil then
return self.attributes[attr_name]
end
return nil
end

BooleanStateConfiguration.attribute_direction_map = {
["CurrentSensitivityLevel"] = "server",
["SupportedSensitivityLevels"] = "server",
["DefaultSensitivityLevel"] = "server",
["AlarmsActive"] = "server",
["AlarmsSuppressed"] = "server",
["AlarmsEnabled"] = "server",
["AlarmsSupported"] = "server",
["SensorFault"] = "server",
["AcceptedCommandList"] = "server",
["EventList"] = "server",
["AttributeList"] = "server",
}

do
local has_aliases, aliases = pcall(require, "BooleanStateConfiguration.server.attributes")
if has_aliases then
for alias, _ in pairs(aliases) do
BooleanStateConfiguration.attribute_direction_map[alias] = "server"
end
end
end

BooleanStateConfiguration.FeatureMap = BooleanStateConfiguration.types.Feature

function BooleanStateConfiguration.are_features_supported(feature, feature_map)
if (BooleanStateConfiguration.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 = BooleanStateConfiguration.attribute_direction_map[key]
if direction == nil then
error(string.format("Referenced unknown attribute %s on cluster %s", key, BooleanStateConfiguration.NAME))
end
return BooleanStateConfiguration[direction].attributes[key]
end
BooleanStateConfiguration.attributes = {}
setmetatable(BooleanStateConfiguration.attributes, attribute_helper_mt)

local command_helper_mt = {}
command_helper_mt.__index = function(self, key)
local direction = BooleanStateConfiguration.command_direction_map[key]
if direction == nil then
error(string.format("Referenced unknown command %s on cluster %s", key, BooleanStateConfiguration.NAME))
end
return BooleanStateConfiguration[direction].commands[key]
end
BooleanStateConfiguration.commands = {}
setmetatable(BooleanStateConfiguration.commands, command_helper_mt)

local event_helper_mt = {}
event_helper_mt.__index = function(self, key)
return BooleanStateConfiguration.server.events[key]
end
BooleanStateConfiguration.events = {}
setmetatable(BooleanStateConfiguration.events, event_helper_mt)

setmetatable(BooleanStateConfiguration, {__index = cluster_base})

return BooleanStateConfiguration

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 SensorFault = {
ID = 0x0007,
NAME = "SensorFault",
base_type = require "BooleanStateConfiguration.types.SensorFaultBitmap",
}

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

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

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

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

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

setmetatable(SensorFault, {__call = SensorFault.new_value, __index = SensorFault.base_type})
return SensorFault
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
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("BooleanStateConfiguration.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 BooleanStateConfigurationServerAttributes = {}

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

setmetatable(BooleanStateConfigurationServerAttributes, attr_mt)

local has_aliases, aliases = pcall(require, "st.matter.clusters.aliases.BooleanStateConfiguration.server.attributes")
if has_aliases then
aliases:add_to_class(BooleanStateConfigurationServerAttributes)
end

return BooleanStateConfigurationServerAttributes


Loading
Loading