From 0adb6de0920dfa871b8ef5fc5e737cf49e1029b0 Mon Sep 17 00:00:00 2001 From: Cooper Towns Date: Wed, 25 Mar 2026 15:58:26 -0500 Subject: [PATCH 1/3] Print api/rpc version and remove from camera can_handle check --- drivers/SmartThings/matter-switch/src/init.lua | 10 ++++++++++ .../camera/camera_handlers/attribute_handlers.lua | 1 + .../src/sub_drivers/camera/can_handle.lua | 6 +----- .../matter-switch/src/sub_drivers/camera/init.lua | 12 +++++++++++- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/drivers/SmartThings/matter-switch/src/init.lua b/drivers/SmartThings/matter-switch/src/init.lua index b1c6a8df8b..9919eae590 100644 --- a/drivers/SmartThings/matter-switch/src/init.lua +++ b/drivers/SmartThings/matter-switch/src/init.lua @@ -32,6 +32,8 @@ end local SwitchLifecycleHandlers = {} function SwitchLifecycleHandlers.device_added(driver, device) + device.log.info_with({ hub_logs = true }, string.format("parent driver - added handler")) + -- refresh child devices to get an initial attribute state for OnOff in case child device -- was created after the initial subscription report if device.network_type == device_lib.NETWORK_TYPE_CHILD then @@ -43,6 +45,8 @@ function SwitchLifecycleHandlers.device_added(driver, device) end function SwitchLifecycleHandlers.do_configure(driver, device) + device.log.info_with({ hub_logs = true }, string.format("parent driver - do_configure handler")) + if device.network_type == device_lib.NETWORK_TYPE_MATTER and not switch_utils.detect_bridge(device) then switch_cfg.set_device_control_options(device) device_cfg.match_profile(driver, device) @@ -60,6 +64,8 @@ function SwitchLifecycleHandlers.driver_switched(driver, device) end function SwitchLifecycleHandlers.info_changed(driver, device, event, args) + device.log.info_with({ hub_logs = true }, string.format("parent driver - info_changed handler")) + if not switch_utils.deep_equals(device.profile, args.old_st_store.profile, { ignore_functions = true }) then if device.network_type == device_lib.NETWORK_TYPE_MATTER then device:subscribe() @@ -91,6 +97,10 @@ function SwitchLifecycleHandlers.info_changed(driver, device, event, args) end function SwitchLifecycleHandlers.device_init(driver, device) + device.log.info_with({ hub_logs = true }, string.format("parent driver - device_init handler")) + local version = require "version" + device.log.info_with({ hub_logs = true }, string.format("parent driver - device_init: rpc: %d, api version: %d, # camera endpoints: %d", version.rpc, version.api, #switch_utils.get_endpoints_by_device_type(device, fields.DEVICE_TYPE_ID.CAMERA))) + if device.network_type == device_lib.NETWORK_TYPE_MATTER then switch_utils.check_field_name_updates(device) device:set_component_to_endpoint_fn(switch_utils.component_to_endpoint) diff --git a/drivers/SmartThings/matter-switch/src/sub_drivers/camera/camera_handlers/attribute_handlers.lua b/drivers/SmartThings/matter-switch/src/sub_drivers/camera/camera_handlers/attribute_handlers.lua index 140ba6d313..473c65db10 100644 --- a/drivers/SmartThings/matter-switch/src/sub_drivers/camera/camera_handlers/attribute_handlers.lua +++ b/drivers/SmartThings/matter-switch/src/sub_drivers/camera/camera_handlers/attribute_handlers.lua @@ -181,6 +181,7 @@ function CameraAttributeHandlers.min_viewport_handler(driver, device, ib, respon end function CameraAttributeHandlers.allocated_video_streams_handler(driver, device, ib, response) + device.log.info_with({ hub_logs = true }, string.format("camera driver - allocated video streams handler")) if not ib.data.elements then return end local dptz_viewports = device:get_field(camera_fields.DPTZ_VIEWPORTS) or {} diff --git a/drivers/SmartThings/matter-switch/src/sub_drivers/camera/can_handle.lua b/drivers/SmartThings/matter-switch/src/sub_drivers/camera/can_handle.lua index 25a441d641..2323ab3525 100644 --- a/drivers/SmartThings/matter-switch/src/sub_drivers/camera/can_handle.lua +++ b/drivers/SmartThings/matter-switch/src/sub_drivers/camera/can_handle.lua @@ -6,11 +6,7 @@ return function(opts, driver, device, ...) local fields = require "switch_utils.fields" local switch_utils = require "switch_utils.utils" if device.network_type == device_lib.NETWORK_TYPE_MATTER then - local version = require "version" - if version.rpc >= 10 and version.api >= 16 and - #switch_utils.get_endpoints_by_device_type(device, fields.DEVICE_TYPE_ID.CAMERA) > 0 then - return true, require("sub_drivers.camera") - end + return true, require("sub_drivers.camera") end return false end diff --git a/drivers/SmartThings/matter-switch/src/sub_drivers/camera/init.lua b/drivers/SmartThings/matter-switch/src/sub_drivers/camera/init.lua index 24ca154950..56061e4276 100644 --- a/drivers/SmartThings/matter-switch/src/sub_drivers/camera/init.lua +++ b/drivers/SmartThings/matter-switch/src/sub_drivers/camera/init.lua @@ -20,6 +20,11 @@ local switch_utils = require "switch_utils.utils" local CameraLifecycleHandlers = {} function CameraLifecycleHandlers.device_init(driver, device) + device.log.info_with({ hub_logs = true }, string.format("camera driver - camera device_init handler")) + local version = require "version" + device.log.info_with({ hub_logs = true }, string.format("camera driver - device_init: rpc: %d, api version: %d, # camera endpoints: %d", version.rpc, version.api, #switch_utils.get_endpoints_by_device_type(device, fields.DEVICE_TYPE_ID.CAMERA))) + + device:set_component_to_endpoint_fn(camera_utils.component_to_endpoint) device:set_endpoint_to_component_fn(switch_utils.endpoint_to_component) device:extend_device("emit_event_for_endpoint", switch_utils.emit_event_for_endpoint) @@ -31,6 +36,7 @@ function CameraLifecycleHandlers.device_init(driver, device) end function CameraLifecycleHandlers.do_configure(driver, device) + device.log.info_with({ hub_logs = true }, string.format("camera driver - camera do_configure handler")) camera_utils.update_camera_component_map(device) if #device:get_endpoints(clusters.CameraAvStreamManagement.ID) == 0 then camera_cfg.match_profile(device, false, false) @@ -47,6 +53,8 @@ function CameraLifecycleHandlers.driver_switched(driver, device) end function CameraLifecycleHandlers.info_changed(driver, device, event, args) + device.log.info_with({ hub_logs = true }, string.format("camera driver - camera info_changed handler")) + if not switch_utils.deep_equals(device.profile, args.old_st_store.profile, { ignore_functions = true }) then camera_cfg.initialize_camera_capabilities(device) device:subscribe() @@ -56,7 +64,9 @@ function CameraLifecycleHandlers.info_changed(driver, device, event, args) end end -function CameraLifecycleHandlers.added() end +function CameraLifecycleHandlers.added(driver, device) + device.log.info_with({ hub_logs = true }, string.format("camera driver - camera added handler")) +end local camera_handler = { NAME = "Camera Handler", From 1f83530056e91f1086064cd8a148d46b49f26625 Mon Sep 17 00:00:00 2001 From: Cooper Towns Date: Wed, 25 Mar 2026 22:55:01 -0500 Subject: [PATCH 2/3] Return true for can_handle, print device info on init --- drivers/SmartThings/matter-switch/src/init.lua | 3 +++ .../matter-switch/src/sub_drivers/camera/can_handle.lua | 6 ++---- .../matter-switch/src/sub_drivers/camera/init.lua | 2 ++ 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/drivers/SmartThings/matter-switch/src/init.lua b/drivers/SmartThings/matter-switch/src/init.lua index 9919eae590..ebfca91c24 100644 --- a/drivers/SmartThings/matter-switch/src/init.lua +++ b/drivers/SmartThings/matter-switch/src/init.lua @@ -16,6 +16,7 @@ local switch_utils = require "switch_utils.utils" local attribute_handlers = require "switch_handlers.attribute_handlers" local event_handlers = require "switch_handlers.event_handlers" local capability_handlers = require "switch_handlers.capability_handlers" +local utils = require "st.utils" -- Include driver-side definitions when lua libs api version is < 11 if version.api < 11 then @@ -100,6 +101,8 @@ function SwitchLifecycleHandlers.device_init(driver, device) device.log.info_with({ hub_logs = true }, string.format("parent driver - device_init handler")) local version = require "version" device.log.info_with({ hub_logs = true }, string.format("parent driver - device_init: rpc: %d, api version: %d, # camera endpoints: %d", version.rpc, version.api, #switch_utils.get_endpoints_by_device_type(device, fields.DEVICE_TYPE_ID.CAMERA))) + device.log.info_with({ hub_logs = true }, string.format("parent driver - device: %s", utils.stringify_table(device))) + if device.network_type == device_lib.NETWORK_TYPE_MATTER then switch_utils.check_field_name_updates(device) diff --git a/drivers/SmartThings/matter-switch/src/sub_drivers/camera/can_handle.lua b/drivers/SmartThings/matter-switch/src/sub_drivers/camera/can_handle.lua index 2323ab3525..ec70b2e37a 100644 --- a/drivers/SmartThings/matter-switch/src/sub_drivers/camera/can_handle.lua +++ b/drivers/SmartThings/matter-switch/src/sub_drivers/camera/can_handle.lua @@ -2,11 +2,9 @@ -- Licensed under the Apache License, Version 2.0 return function(opts, driver, device, ...) + device.log.info_with({ hub_logs = true }, string.format("camera driver - calling can_handle, network type: %s", device.network_type)) local device_lib = require "st.device" local fields = require "switch_utils.fields" local switch_utils = require "switch_utils.utils" - if device.network_type == device_lib.NETWORK_TYPE_MATTER then - return true, require("sub_drivers.camera") - end - return false + return true, require("sub_drivers.camera") end diff --git a/drivers/SmartThings/matter-switch/src/sub_drivers/camera/init.lua b/drivers/SmartThings/matter-switch/src/sub_drivers/camera/init.lua index 56061e4276..4cebb96d04 100644 --- a/drivers/SmartThings/matter-switch/src/sub_drivers/camera/init.lua +++ b/drivers/SmartThings/matter-switch/src/sub_drivers/camera/init.lua @@ -16,6 +16,7 @@ local clusters = require "st.matter.clusters" local event_handlers = require "sub_drivers.camera.camera_handlers.event_handlers" local fields = require "switch_utils.fields" local switch_utils = require "switch_utils.utils" +local utils = require "st.utils" local CameraLifecycleHandlers = {} @@ -23,6 +24,7 @@ function CameraLifecycleHandlers.device_init(driver, device) device.log.info_with({ hub_logs = true }, string.format("camera driver - camera device_init handler")) local version = require "version" device.log.info_with({ hub_logs = true }, string.format("camera driver - device_init: rpc: %d, api version: %d, # camera endpoints: %d", version.rpc, version.api, #switch_utils.get_endpoints_by_device_type(device, fields.DEVICE_TYPE_ID.CAMERA))) + device.log.info_with({ hub_logs = true }, string.format("camera driver - device: %s", utils.stringify_table(device))) device:set_component_to_endpoint_fn(camera_utils.component_to_endpoint) From de578736d83d95be7b18f0106f94dd760c3d6964 Mon Sep 17 00:00:00 2001 From: Cooper Towns Date: Thu, 26 Mar 2026 16:29:48 -0500 Subject: [PATCH 3/3] Remove lazy loading for camera sub driver --- drivers/SmartThings/matter-switch/src/init.lua | 2 +- .../matter-switch/src/sub_drivers/camera/can_handle.lua | 1 + .../matter-switch/src/sub_drivers/camera/init.lua | 7 ++++++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/SmartThings/matter-switch/src/init.lua b/drivers/SmartThings/matter-switch/src/init.lua index ebfca91c24..e258af356a 100644 --- a/drivers/SmartThings/matter-switch/src/init.lua +++ b/drivers/SmartThings/matter-switch/src/init.lua @@ -354,7 +354,7 @@ local matter_driver_template = { }, sub_drivers = { switch_utils.lazy_load_if_possible("sub_drivers.aqara_cube"), - switch_utils.lazy_load("sub_drivers.camera"), + require("sub_drivers.camera"), switch_utils.lazy_load_if_possible("sub_drivers.eve_energy"), switch_utils.lazy_load_if_possible("sub_drivers.ikea_scroll"), switch_utils.lazy_load_if_possible("sub_drivers.third_reality_mk1") diff --git a/drivers/SmartThings/matter-switch/src/sub_drivers/camera/can_handle.lua b/drivers/SmartThings/matter-switch/src/sub_drivers/camera/can_handle.lua index ec70b2e37a..4e6df65393 100644 --- a/drivers/SmartThings/matter-switch/src/sub_drivers/camera/can_handle.lua +++ b/drivers/SmartThings/matter-switch/src/sub_drivers/camera/can_handle.lua @@ -8,3 +8,4 @@ return function(opts, driver, device, ...) local switch_utils = require "switch_utils.utils" return true, require("sub_drivers.camera") end + \ No newline at end of file diff --git a/drivers/SmartThings/matter-switch/src/sub_drivers/camera/init.lua b/drivers/SmartThings/matter-switch/src/sub_drivers/camera/init.lua index 4cebb96d04..7941fe6107 100644 --- a/drivers/SmartThings/matter-switch/src/sub_drivers/camera/init.lua +++ b/drivers/SmartThings/matter-switch/src/sub_drivers/camera/init.lua @@ -70,6 +70,11 @@ function CameraLifecycleHandlers.added(driver, device) device.log.info_with({ hub_logs = true }, string.format("camera driver - camera added handler")) end +function can_handle_matter_camera(opts, driver, device, ...) + device.log.info_with({ hub_logs = true }, string.format("camera driver - calling can_handle, network type: %s", device.network_type)) + return true +end + local camera_handler = { NAME = "Camera Handler", lifecycle_handlers = { @@ -214,7 +219,7 @@ local camera_handler = { [capabilities.localMediaStorage.commands.setLocalVideoRecording.NAME] = capability_handlers.set_enabled_factory(clusters.CameraAvStreamManagement.attributes.LocalVideoRecordingEnabled) } }, - can_handle = require("sub_drivers.camera.can_handle") + can_handle = can_handle_matter_camera, } return camera_handler