Skip to content

Commit dfa92fb

Browse files
authored
include supported modes support for healthconcern capabilities (#2160)
1 parent 49cf444 commit dfa92fb

File tree

2 files changed

+135
-38
lines changed

2 files changed

+135
-38
lines changed

drivers/SmartThings/matter-sensor/src/air-quality-sensor/init.lua

Lines changed: 84 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -165,44 +165,97 @@ local supported_profiles =
165165
"aqs-temp-humidity-tvoc-meas",
166166
}
167167

168-
local AIR_QUALITY_MAP = {
169-
{capabilities.carbonMonoxideMeasurement.ID, "-co", clusters.CarbonMonoxideConcentrationMeasurement},
170-
{capabilities.carbonMonoxideHealthConcern.ID, "-co", clusters.CarbonMonoxideConcentrationMeasurement},
171-
{capabilities.carbonDioxideMeasurement.ID, "-co2", clusters.CarbonDioxideConcentrationMeasurement},
172-
{capabilities.carbonDioxideHealthConcern.ID, "-co2", clusters.CarbonDioxideConcentrationMeasurement},
173-
{capabilities.nitrogenDioxideHealthConcern.ID, "-no2", clusters.NitrogenDioxideConcentrationMeasurement},
174-
{capabilities.nitrogenDioxideMeasurement.ID, "-no2", clusters.NitrogenDioxideConcentrationMeasurement},
175-
{capabilities.ozoneHealthConcern.ID, "-ozone", clusters.OzoneConcentrationMeasurement},
176-
{capabilities.ozoneMeasurement.ID, "-ozone", clusters.OzoneConcentrationMeasurement},
177-
{capabilities.formaldehydeMeasurement.ID, "-ch2o", clusters.FormaldehydeConcentrationMeasurement},
178-
{capabilities.formaldehydeHealthConcern.ID, "-ch2o", clusters.FormaldehydeConcentrationMeasurement},
179-
{capabilities.veryFineDustHealthConcern.ID, "-pm1", clusters.Pm1ConcentrationMeasurement},
180-
{capabilities.veryFineDustSensor.ID, "-pm1", clusters.Pm1ConcentrationMeasurement},
181-
{capabilities.fineDustSensor.ID, "-pm25", clusters.Pm25ConcentrationMeasurement},
182-
{capabilities.fineDustHealthConcern.ID, "-pm25", clusters.Pm25ConcentrationMeasurement},
183-
{capabilities.dustSensor.ID, "-pm10", clusters.Pm10ConcentrationMeasurement},
184-
{capabilities.dustHealthConcern.ID, "-pm10", clusters.Pm10ConcentrationMeasurement},
185-
{capabilities.radonHealthConcern.ID, "-radon", clusters.RadonConcentrationMeasurement},
186-
{capabilities.radonMeasurement.ID, "-radon", clusters.RadonConcentrationMeasurement},
187-
{capabilities.tvocHealthConcern.ID, "-tvoc", clusters.TotalVolatileOrganicCompoundsConcentrationMeasurement},
188-
{capabilities.tvocMeasurement.ID, "-tvoc", clusters.TotalVolatileOrganicCompoundsConcentrationMeasurement},
168+
local CONCENTRATION_MEASUREMENT_MAP = {
169+
[capabilities.carbonMonoxideMeasurement] = {"-co", clusters.CarbonMonoxideConcentrationMeasurement, "N/A"},
170+
[capabilities.carbonMonoxideHealthConcern] = {"-co", clusters.CarbonMonoxideConcentrationMeasurement, capabilities.carbonMonoxideHealthConcern.supportedCarbonMonoxideValues},
171+
[capabilities.carbonDioxideMeasurement] = {"-co2", clusters.CarbonDioxideConcentrationMeasurement, "N/A"},
172+
[capabilities.carbonDioxideHealthConcern] = {"-co2", clusters.CarbonDioxideConcentrationMeasurement, capabilities.carbonDioxideHealthConcern.supportedCarbonDioxideValues},
173+
[capabilities.nitrogenDioxideMeasurement] = {"-no2", clusters.NitrogenDioxideConcentrationMeasurement, "N/A"},
174+
[capabilities.nitrogenDioxideHealthConcern] = {"-no2", clusters.NitrogenDioxideConcentrationMeasurement, capabilities.nitrogenDioxideHealthConcern.supportedNitrogenDioxideValues},
175+
[capabilities.ozoneMeasurement] = {"-ozone", clusters.OzoneConcentrationMeasurement, "N/A"},
176+
[capabilities.ozoneHealthConcern] = {"-ozone", clusters.OzoneConcentrationMeasurement, capabilities.ozoneHealthConcern.supportedOzoneValues},
177+
[capabilities.formaldehydeMeasurement] = {"-ch2o", clusters.FormaldehydeConcentrationMeasurement, "N/A"},
178+
[capabilities.formaldehydeHealthConcern] = {"-ch2o", clusters.FormaldehydeConcentrationMeasurement, capabilities.formaldehydeHealthConcern.supportedFormaldehydeValues},
179+
[capabilities.veryFineDustSensor] = {"-pm1", clusters.Pm1ConcentrationMeasurement, "N/A"},
180+
[capabilities.veryFineDustHealthConcern] = {"-pm1", clusters.Pm1ConcentrationMeasurement, capabilities.veryFineDustHealthConcern.supportedVeryFineDustValues},
181+
[capabilities.fineDustSensor] = {"-pm25", clusters.Pm25ConcentrationMeasurement, "N/A"},
182+
[capabilities.fineDustHealthConcern] = {"-pm25", clusters.Pm25ConcentrationMeasurement, capabilities.fineDustHealthConcern.supportedFineDustValues},
183+
[capabilities.dustSensor] = {"-pm10", clusters.Pm10ConcentrationMeasurement, "N/A"},
184+
[capabilities.dustHealthConcern] = {"-pm10", clusters.Pm10ConcentrationMeasurement, capabilities.dustHealthConcern.supportedDustValues},
185+
[capabilities.radonMeasurement] = {"-radon", clusters.RadonConcentrationMeasurement, "N/A"},
186+
[capabilities.radonHealthConcern] = {"-radon", clusters.RadonConcentrationMeasurement, capabilities.radonHealthConcern.supportedRadonValues},
187+
[capabilities.tvocMeasurement] = {"-tvoc", clusters.TotalVolatileOrganicCompoundsConcentrationMeasurement, "N/A"},
188+
[capabilities.tvocHealthConcern] = {"-tvoc", clusters.TotalVolatileOrganicCompoundsConcentrationMeasurement, capabilities.tvocHealthConcern.supportedTvocValues},
189189
}
190190

191+
192+
local CONCENTRATION_MEASUREMENT_PROFILE_ORDERING = {
193+
capabilities.carbonMonoxideMeasurement,
194+
capabilities.carbonMonoxideHealthConcern,
195+
capabilities.carbonDioxideMeasurement,
196+
capabilities.carbonDioxideHealthConcern,
197+
capabilities.nitrogenDioxideMeasurement,
198+
capabilities.nitrogenDioxideHealthConcern,
199+
capabilities.ozoneMeasurement,
200+
capabilities.ozoneHealthConcern,
201+
capabilities.formaldehydeMeasurement,
202+
capabilities.formaldehydeHealthConcern,
203+
capabilities.veryFineDustSensor,
204+
capabilities.veryFineDustHealthConcern,
205+
capabilities.fineDustSensor,
206+
capabilities.fineDustHealthConcern,
207+
capabilities.dustSensor,
208+
capabilities.dustHealthConcern,
209+
capabilities.radonMeasurement,
210+
capabilities.radonHealthConcern,
211+
capabilities.tvocMeasurement,
212+
capabilities.tvocHealthConcern,
213+
}
214+
215+
local function set_supported_health_concern_values(device, setter_function, cluster, cluster_ep)
216+
-- read_datatype_value works since all the healthConcern capabilities' datatypes are equivalent to the one in airQualityHealthConcern
217+
local read_datatype_value = capabilities.airQualityHealthConcern.airQualityHealthConcern
218+
local supported_values = {read_datatype_value.unknown.NAME, read_datatype_value.good.NAME, read_datatype_value.unhealthy.NAME}
219+
if cluster == clusters.AirQuality then
220+
if #embedded_cluster_utils.get_endpoints(device, cluster.ID, { feature_bitmap = cluster.types.Feature.FAIR }) > 0 then
221+
table.insert(supported_values, 3, read_datatype_value.moderate.NAME)
222+
end
223+
if #embedded_cluster_utils.get_endpoints(device, cluster.ID, { feature_bitmap = cluster.types.Feature.MODERATE }) > 0 then
224+
table.insert(supported_values, 4, read_datatype_value.slightlyUnhealthy.NAME)
225+
end
226+
if #embedded_cluster_utils.get_endpoints(device, cluster.ID, { feature_bitmap = cluster.types.Feature.VERY_POOR }) > 0 then
227+
table.insert(supported_values, read_datatype_value.veryUnhealthy.NAME)
228+
end
229+
if #embedded_cluster_utils.get_endpoints(device, cluster.ID, { feature_bitmap = cluster.types.Feature.EXTREMELY_POOR }) > 0 then
230+
table.insert(supported_values, read_datatype_value.hazardous.NAME)
231+
end
232+
else -- ConcentrationMeasurement clusters
233+
if #embedded_cluster_utils.get_endpoints(device, cluster.ID, { feature_bitmap = cluster.types.Feature.MEDIUM_LEVEL }) > 0 then
234+
table.insert(supported_values, 3, read_datatype_value.moderate.NAME)
235+
end
236+
if #embedded_cluster_utils.get_endpoints(device, cluster.ID, { feature_bitmap = cluster.types.Feature.CRITICAL_LEVEL }) > 0 then
237+
table.insert(supported_values, read_datatype_value.hazardous.NAME)
238+
end
239+
end
240+
device:emit_event_for_endpoint(cluster_ep, setter_function(supported_values, { visibility = { displayed = false }}))
241+
end
242+
191243
local function create_level_measurement_profile(device)
192244
local meas_name, level_name = "", ""
193-
for _, details in ipairs(AIR_QUALITY_MAP) do
194-
local cap_id = details[1]
195-
local cluster = details[3]
245+
for _, cap in ipairs(CONCENTRATION_MEASUREMENT_PROFILE_ORDERING) do
246+
local cap_id = cap.ID
247+
local cluster = CONCENTRATION_MEASUREMENT_MAP[cap][2]
196248
-- capability describes either a HealthConcern or Measurement/Sensor
197249
if (cap_id:match("HealthConcern$")) then
198250
local attr_eps = embedded_cluster_utils.get_endpoints(device, cluster.ID, { feature_bitmap = cluster.types.Feature.LEVEL_INDICATION })
199251
if #attr_eps > 0 then
200-
level_name = level_name .. details[2]
252+
level_name = level_name .. CONCENTRATION_MEASUREMENT_MAP[cap][1]
253+
set_supported_health_concern_values(device, CONCENTRATION_MEASUREMENT_MAP[cap][3], cluster, attr_eps[1])
201254
end
202255
elseif (cap_id:match("Measurement$") or cap_id:match("Sensor$")) then
203256
local attr_eps = embedded_cluster_utils.get_endpoints(device, cluster.ID, { feature_bitmap = cluster.types.Feature.NUMERIC_MEASUREMENT })
204257
if #attr_eps > 0 then
205-
meas_name = meas_name .. details[2]
258+
meas_name = meas_name .. CONCENTRATION_MEASUREMENT_MAP[cap][1]
206259
end
207260
end
208261
end
@@ -211,9 +264,9 @@ end
211264

212265
local function supported_level_measurements(device)
213266
local measurement_caps, level_caps = {}, {}
214-
for _, details in ipairs(AIR_QUALITY_MAP) do
215-
local cap_id = details[1]
216-
local cluster = details[3]
267+
for _, cap in ipairs(CONCENTRATION_MEASUREMENT_PROFILE_ORDERING) do
268+
local cap_id = cap.ID
269+
local cluster = CONCENTRATION_MEASUREMENT_MAP[cap][2]
217270
-- capability describes either a HealthConcern or Measurement/Sensor
218271
if (cap_id:match("HealthConcern$")) then
219272
local attr_eps = embedded_cluster_utils.get_endpoints(device, cluster.ID, { feature_bitmap = cluster.types.Feature.LEVEL_INDICATION })
@@ -235,6 +288,8 @@ local function match_profile_switch(driver, device)
235288
local humidity_eps = embedded_cluster_utils.get_endpoints(device, clusters.RelativeHumidityMeasurement.ID)
236289

237290
local profile_name = "aqs"
291+
local aq_eps = embedded_cluster_utils.get_endpoints(device, clusters.AirQuality.ID)
292+
set_supported_health_concern_values(device, capabilities.airQualityHealthConcern.supportedAirQualityValues, clusters.AirQuality, aq_eps[1])
238293

239294
if #temp_eps > 0 then
240295
profile_name = profile_name .. "-temp"

0 commit comments

Comments
 (0)