@@ -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+
191243local 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
211264
212265local 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