@@ -28,7 +28,6 @@ local MAX_ENCODED_PIXEL_RATE = "__max_encoded_pixel_rate"
2828local MAX_FRAMES_PER_SECOND = " __max_frames_per_second"
2929local MAX_VOLUME_LEVEL = " __max_volume_level"
3030local MIN_VOLUME_LEVEL = " __min_volume_level"
31- local OPTIONAL_SUPPORTED_COMPONENT_CAPABILITIES = " __optional_supported_component_capabilities"
3231local SUPPORTED_RESOLUTIONS = " __supported_resolutions"
3332local TRIGGERED_ZONES = " __triggered_zones"
3433local VIEWPORT = " __viewport"
@@ -258,21 +257,29 @@ local function compare_components(synced_components, prev_components)
258257 return true
259258end
260259
261- local function compare_optional_capabilities (optional_capabilities , prev_optional_capabilities )
260+ local function optional_capabilities_list_changed (optional_capabilities , prev_component_list )
261+ local prev_optional_capabilities = {}
262+ for idx , comp in pairs (prev_component_list or {}) do
263+ local cap_list = {}
264+ for _ , capability in pairs (comp .capabilities ) do
265+ table.insert (cap_list , capability .id )
266+ end
267+ table.insert (prev_optional_capabilities , {idx , cap_list })
268+ end
262269 if # optional_capabilities ~= # prev_optional_capabilities then
263- return false
270+ return true
264271 end
265272 for _ , capability in pairs (optional_capabilities ) do
266273 if not switch_utils .tbl_contains (prev_optional_capabilities , capability ) then
267- return false
274+ return true
268275 end
269276 end
270277 for _ , capability in pairs (prev_optional_capabilities ) do
271278 if not switch_utils .tbl_contains (optional_capabilities , capability ) then
272- return false
279+ return true
273280 end
274281 end
275- return true
282+ return false
276283end
277284
278285local function add_camera_subscribed_attributes (device )
@@ -566,11 +573,9 @@ local function match_profile(device, status_light_enabled_present, status_light_
566573 table.insert (optional_supported_component_capabilities , {component_map .doorbell , doorbell_component_capabilities })
567574 end
568575
569- if not device :get_field (CAMERA_INITIALIZED ) or
570- not compare_optional_capabilities (optional_supported_component_capabilities , device :get_field (OPTIONAL_SUPPORTED_COMPONENT_CAPABILITIES ) or {}) then
576+ if not device :get_field (CAMERA_INITIALIZED ) or optional_capabilities_list_changed (optional_supported_component_capabilities , device .profile .components ) then
571577 device :try_update_metadata ({profile = " matter-camera" , optional_component_capabilities = optional_supported_component_capabilities })
572578 device :set_field (CAMERA_INITIALIZED , true , {persist = true })
573- device :set_field (OPTIONAL_SUPPORTED_COMPONENT_CAPABILITIES , optional_supported_component_capabilities , {persist = true })
574579 end
575580end
576581
0 commit comments