@@ -1016,6 +1016,58 @@ local function match_modular_profile_thermostat(driver, device)
1016
1016
device :set_field (SUPPORTED_COMPONENT_CAPABILITIES , total_supported_capabilities , { persist = true })
1017
1017
end
1018
1018
1019
+ local function match_modular_profile_room_ac (driver , device )
1020
+ local running_state_supported = device :get_field (profiling_data .THERMOSTAT_RUNNING_STATE_SUPPORT )
1021
+ local humidity_eps = device :get_endpoints (clusters .RelativeHumidityMeasurement .ID )
1022
+ local optional_supported_component_capabilities = {}
1023
+ local main_component_capabilities = {}
1024
+ local profile_name = " room-air-conditioner-modular"
1025
+
1026
+ if # humidity_eps > 0 then
1027
+ table.insert (main_component_capabilities , capabilities .relativeHumidityMeasurement .ID )
1028
+ end
1029
+
1030
+ -- determine fan capabilities
1031
+ local fan_eps = device :get_endpoints (clusters .FanControl .ID )
1032
+ local wind_eps = device :get_endpoints (clusters .FanControl .ID , {feature_bitmap = clusters .FanControl .types .FanControlFeature .WIND })
1033
+ -- Note: Room AC does not support the rocking feature of FanControl.
1034
+
1035
+ if # fan_eps > 0 then
1036
+ table.insert (main_component_capabilities , capabilities .airConditionerFanMode .ID )
1037
+ table.insert (main_component_capabilities , capabilities .fanSpeedPercent .ID )
1038
+ end
1039
+ if # wind_eps > 0 then
1040
+ table.insert (main_component_capabilities , capabilities .windMode .ID )
1041
+ end
1042
+
1043
+ local heat_eps = device :get_endpoints (clusters .Thermostat .ID , {feature_bitmap = clusters .Thermostat .types .ThermostatFeature .HEATING })
1044
+ local cool_eps = device :get_endpoints (clusters .Thermostat .ID , {feature_bitmap = clusters .Thermostat .types .ThermostatFeature .COOLING })
1045
+
1046
+ if # heat_eps > 0 then
1047
+ table.insert (main_component_capabilities , capabilities .thermostatHeatingSetpoint .ID )
1048
+ end
1049
+ if # cool_eps > 0 then
1050
+ table.insert (main_component_capabilities , capabilities .thermostatCoolingSetpoint .ID )
1051
+ end
1052
+
1053
+ if running_state_supported then
1054
+ table.insert (main_component_capabilities , capabilities .thermostatOperatingState .ID )
1055
+ end
1056
+
1057
+ table.insert (optional_supported_component_capabilities , {" main" , main_component_capabilities })
1058
+ device :try_update_metadata ({profile = profile_name , optional_component_capabilities = optional_supported_component_capabilities })
1059
+
1060
+ -- add mandatory capabilities for subscription
1061
+ local total_supported_capabilities = optional_supported_component_capabilities
1062
+ table.insert (main_component_capabilities , capabilities .switch .ID )
1063
+ table.insert (main_component_capabilities , capabilities .temperatureMeasurement .ID )
1064
+ table.insert (main_component_capabilities , capabilities .thermostatMode .ID )
1065
+ table.insert (main_component_capabilities , capabilities .refresh .ID )
1066
+ table.insert (main_component_capabilities , capabilities .firmwareUpdate .ID )
1067
+
1068
+ device :set_field (SUPPORTED_COMPONENT_CAPABILITIES , total_supported_capabilities , { persist = true })
1069
+ end
1070
+
1019
1071
local function match_modular_profile (driver , device )
1020
1072
if profiling_data_still_required (device ) then return end
1021
1073
@@ -1026,6 +1078,8 @@ local function match_modular_profile(driver, device)
1026
1078
1027
1079
if device_type == AP_DEVICE_TYPE_ID then
1028
1080
match_modular_profile_air_purifer (driver , device )
1081
+ elseif device_type == RAC_DEVICE_TYPE_ID then
1082
+ match_modular_profile_room_ac (driver , device )
1029
1083
elseif # thermostat_eps > 0 then
1030
1084
match_modular_profile_thermostat (driver , device )
1031
1085
else
0 commit comments