Skip to content

Commit 9b2d2bf

Browse files
authored
Matter Sensor: Improve error handling for unit conversion (#2602)
1 parent 4f1be7e commit 9b2d2bf

File tree

2 files changed

+12
-29
lines changed

2 files changed

+12
-29
lines changed

drivers/SmartThings/matter-sensor/src/sub_drivers/air_quality_sensor/air_quality_sensor_handlers/attribute_handlers.lua

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
local st_utils = require "st.utils"
55
local capabilities = require "st.capabilities"
6-
local aqs_utils = require "sub_drivers.air_quality_sensor.air_quality_sensor_utils.utils"
76
local aqs_fields = require "sub_drivers.air_quality_sensor.air_quality_sensor_utils.fields"
87

98
local AirQualitySensorAttributeHandlers = {}
@@ -25,20 +24,18 @@ end
2524

2625
function AirQualitySensorAttributeHandlers.measured_value_factory(capability_name, attribute, target_unit)
2726
return function(driver, device, ib, response)
28-
local reporting_unit = device:get_field(capability_name.."_unit")
29-
30-
if reporting_unit == nil then
31-
reporting_unit = aqs_fields.unit_default[capability_name]
32-
device:set_field(capability_name.."_unit", reporting_unit, {persist = true})
33-
end
34-
35-
if reporting_unit then
36-
local value = aqs_utils.unit_conversion(device, ib.data.value, reporting_unit, target_unit)
37-
device:emit_event_for_endpoint(ib.endpoint_id, attribute({value = value, unit = aqs_fields.unit_strings[target_unit]}))
38-
39-
-- handle case where device profile supports both fineDustLevel and dustLevel
40-
if capability_name == capabilities.fineDustSensor.NAME and device:supports_capability(capabilities.dustSensor) then
41-
device:emit_event_for_endpoint(ib.endpoint_id, capabilities.dustSensor.fineDustLevel({value = value, unit = aqs_fields.unit_strings[target_unit]}))
27+
if ib.data.value then
28+
local reporting_unit = device:get_field(capability_name.."_unit") or aqs_fields.unit_default[capability_name]
29+
local conversion_function = aqs_fields.conversion_tables[reporting_unit][target_unit]
30+
if conversion_function then
31+
local converted_value = conversion_function(ib.data.value)
32+
device:emit_event_for_endpoint(ib.endpoint_id, attribute({value = converted_value, unit = aqs_fields.unit_strings[target_unit]}))
33+
-- handle case where device profile supports both fineDustLevel and dustLevel
34+
if capability_name == capabilities.fineDustSensor.NAME and device:supports_capability(capabilities.dustSensor) then
35+
device:emit_event_for_endpoint(ib.endpoint_id, capabilities.dustSensor.fineDustLevel({value = converted_value, unit = aqs_fields.unit_strings[target_unit]}))
36+
end
37+
else
38+
device.log.info_with({hub_logs=true}, string.format("Unsupported unit conversion from %s to %s", aqs_fields.unit_strings[reporting_unit], aqs_fields.unit_strings[target_unit]))
4239
end
4340
end
4441
end

drivers/SmartThings/matter-sensor/src/sub_drivers/air_quality_sensor/air_quality_sensor_utils/utils.lua

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,20 +40,6 @@ function AirQualitySensorUtils.supports_capability_by_id_modular(device, capabil
4040
return false
4141
end
4242

43-
function AirQualitySensorUtils.unit_conversion(device, value, from_unit, to_unit)
44-
local conversion_function = fields.conversion_tables[from_unit][to_unit]
45-
if conversion_function == nil then
46-
device.log.info_with( {hub_logs = true} , string.format("Unsupported unit conversion from %s to %s", fields.unit_strings[from_unit], fields.unit_strings[to_unit]))
47-
return 1
48-
end
49-
50-
if value == nil then
51-
device.log.info_with( {hub_logs = true} , "unit conversion value is nil")
52-
return 1
53-
end
54-
return conversion_function(value)
55-
end
56-
5743
local function get_supported_health_concern_values_for_air_quality(device)
5844
local health_concern_datatype = capabilities.airQualityHealthConcern.airQualityHealthConcern
5945
local supported_values = {health_concern_datatype.unknown.NAME, health_concern_datatype.good.NAME, health_concern_datatype.unhealthy.NAME}

0 commit comments

Comments
 (0)