@@ -165,44 +165,97 @@ local supported_profiles =
165
165
" aqs-temp-humidity-tvoc-meas" ,
166
166
}
167
167
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 },
189
189
}
190
190
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
+
191
243
local function create_level_measurement_profile (device )
192
244
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 ]
196
248
-- capability describes either a HealthConcern or Measurement/Sensor
197
249
if (cap_id :match (" HealthConcern$" )) then
198
250
local attr_eps = embedded_cluster_utils .get_endpoints (device , cluster .ID , { feature_bitmap = cluster .types .Feature .LEVEL_INDICATION })
199
251
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 ])
201
254
end
202
255
elseif (cap_id :match (" Measurement$" ) or cap_id :match (" Sensor$" )) then
203
256
local attr_eps = embedded_cluster_utils .get_endpoints (device , cluster .ID , { feature_bitmap = cluster .types .Feature .NUMERIC_MEASUREMENT })
204
257
if # attr_eps > 0 then
205
- meas_name = meas_name .. details [ 2 ]
258
+ meas_name = meas_name .. CONCENTRATION_MEASUREMENT_MAP [ cap ][ 1 ]
206
259
end
207
260
end
208
261
end
211
264
212
265
local function supported_level_measurements (device )
213
266
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 ]
217
270
-- capability describes either a HealthConcern or Measurement/Sensor
218
271
if (cap_id :match (" HealthConcern$" )) then
219
272
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)
235
288
local humidity_eps = embedded_cluster_utils .get_endpoints (device , clusters .RelativeHumidityMeasurement .ID )
236
289
237
290
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 ])
238
293
239
294
if # temp_eps > 0 then
240
295
profile_name = profile_name .. " -temp"
0 commit comments