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 Thermostat extend Air Quality Sensor #1479

Merged
merged 17 commits into from
Jul 11, 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,43 @@
name: air-purifier-hepa-ac-aqs-co2-tvoc-meas-co2-radon-level
components:
- id: main
label: Main
capabilities:
- id: airPurifierFanMode
version: 1
- id: fanSpeedPercent
version: 1
- id: airQualityHealthConcern
version: 1
- id: carbonDioxideHealthConcern
version: 1
- id: carbonDioxideMeasurement
version: 1
- id: radonHealthConcern
version: 1
- id: tvocMeasurement
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: AirPurifier
- id: hepaFilter
label: Hepa Filter
capabilities:
- id: filterState
version: 1
- id: filterStatus
version: 1
categories:
- name: AirPurifier
- id: activatedCarbonFilter
label: Activated Carbon Filter
capabilities:
- id: filterState
version: 1
- id: filterStatus
version: 1
categories:
- name: AirPurifier
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
name: air-purifier-hepa-ac-wind-thermostat-humidity-fan-heating-only-nostate-nobattery-aqs-pm10-pm25-ch2o-meas-pm10-pm25-ch2o-no2-tvoc-level
components:
- id: main
label: Main
capabilities:
- id: airPurifierFanMode
version: 1
- id: fanSpeedPercent
version: 1
- id: windMode
version: 1
- id: thermostatHeatingSetpoint
version: 1
- id: thermostatMode
version: 1
- id: temperatureMeasurement
version: 1
- id: dustSensor
version: 1
- id: formaldehydeMeasurement
version: 1
- id: relativeHumidityMeasurement
version: 1
- id: airQualityHealthConcern
version: 1
- id: dustHealthConcern
version: 1
- id: fineDustHealthConcern
version: 1
- id: formaldehydeHealthConcern
version: 1
- id: nitrogenDioxideHealthConcern
version: 1
- id: tvocHealthConcern
version: 1
- id: thermostatOperatingState
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: AirPurifier
- id: hepaFilter
label: Hepa Filter
capabilities:
- id: filterState
version: 1
- id: filterStatus
version: 1
categories:
- name: AirPurifier
- id: activatedCarbonFilter
label: Activated Carbon Filter
capabilities:
- id: filterState
version: 1
- id: filterStatus
version: 1
categories:
- name: AirPurifier
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: air-purifier-hepa-aqs
components:
- id: main
label: Main
capabilities:
- id: airQualityHealthConcern
version: 1
- id: airPurifierFanMode
version: 1
- id: fanSpeedPercent
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: AirPurifier
- id: hepaFilter
label: Hepa filter
capabilities:
- id: filterState
version: 1
- id: filterStatus
version: 1
categories:
- name: AirPurifier
59 changes: 59 additions & 0 deletions drivers/SmartThings/matter-thermostat/src/AirQuality/init.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
local cluster_base = require "st.matter.cluster_base"
local AirQualityServerAttributes = require "AirQuality.server.attributes"
local AirQualityTypes = require "AirQuality.types"

local AirQuality = {}

AirQuality.ID = 0x005B
AirQuality.NAME = "AirQuality"
AirQuality.server = {}
AirQuality.client = {}
AirQuality.server.attributes = AirQualityServerAttributes:set_parent_cluster(AirQuality)
AirQuality.types = AirQualityTypes

function AirQuality:get_attribute_by_id(attr_id)
local attr_id_map = {
[0x0000] = "AirQuality",
[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

-- Attribute Mapping
AirQuality.attribute_direction_map = {
["AirQuality"] = "server",
["AcceptedCommandList"] = "server",
["EventList"] = "server",
["AttributeList"] = "server",
}

AirQuality.FeatureMap = AirQuality.types.Feature

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

setmetatable(AirQuality, {__index = cluster_base})

return AirQuality

Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
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",
base_type = require "st.matter.data_types.Array",
element_type = require "st.matter.data_types.Uint32",
}

function AcceptedCommandList:augment_type(data_type_obj)
for i, v in ipairs(data_type_obj.elements) do
data_type_obj.elements[i] = data_types.validate_or_build_type(v, AcceptedCommandList.element_type)
end
end

function AcceptedCommandList:new_value(...)
local o = self.base_type(table.unpack({...}))

return o
end

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

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

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

function AcceptedCommandList:build_test_report_data(
device,
endpoint_id,
value,
status
)
local data = data_types.validate_or_build_type(value, self.base_type)

return cluster_base.build_test_report_data(
device,
endpoint_id,
self._cluster.ID,
self.ID,
data,
status
)
end

function AcceptedCommandList:deserialize(tlv_buf)
local data = TLVParser.decode_tlv(tlv_buf)

return data
end

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

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

local AirQuality = {
ID = 0x0000,
NAME = "AirQuality",
base_type = require "AirQuality.types.AirQualityEnum",
}

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

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

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

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

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

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

Loading
Loading