Skip to content

Commit 6c955bb

Browse files
committed
move sensor handlers into switch subdriver
1 parent 99aa8e9 commit 6c955bb

20 files changed

Lines changed: 413 additions & 395 deletions

drivers/SmartThings/matter-switch/src/init.lua

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,6 @@ function SwitchLifecycleHandlers.info_changed(driver, device, event, args)
8282
end
8383
end
8484

85-
-- instant update of values after offset preference change
8685
for name, info in pairs(device.preferences or {}) do
8786
if (device.preferences[name] ~= nil and args.old_st_store.preferences[name] ~= nil and args.old_st_store.preferences[name] ~= device.preferences[name]) then
8887
if name == "tempOffset" then
@@ -92,7 +91,6 @@ function SwitchLifecycleHandlers.info_changed(driver, device, event, args)
9291
end
9392
end
9493
end
95-
9694
end
9795

9896
function SwitchLifecycleHandlers.device_init(driver, device)
@@ -159,17 +157,11 @@ local matter_driver_template = {
159157
[clusters.FanControl.attributes.FanModeSequence.ID] = attribute_handlers.fan_mode_sequence_handler,
160158
[clusters.FanControl.attributes.PercentCurrent.ID] = attribute_handlers.percent_current_handler
161159
},
162-
[clusters.IlluminanceMeasurement.ID] = {
163-
[clusters.IlluminanceMeasurement.attributes.MeasuredValue.ID] = attribute_handlers.illuminance_measured_value_handler
164-
},
165160
[clusters.LevelControl.ID] = {
166161
[clusters.LevelControl.attributes.CurrentLevel.ID] = attribute_handlers.level_control_current_level_handler,
167162
[clusters.LevelControl.attributes.MaxLevel.ID] = attribute_handlers.level_bounds_handler_factory(fields.LEVEL_MAX),
168163
[clusters.LevelControl.attributes.MinLevel.ID] = attribute_handlers.level_bounds_handler_factory(fields.LEVEL_MIN),
169164
},
170-
[clusters.OccupancySensing.ID] = {
171-
[clusters.OccupancySensing.attributes.Occupancy.ID] = attribute_handlers.occupancy_handler,
172-
},
173165
[clusters.OnOff.ID] = {
174166
[clusters.OnOff.attributes.OnOff.ID] = attribute_handlers.on_off_attr_handler,
175167
},
@@ -181,17 +173,9 @@ local matter_driver_template = {
181173
[clusters.PowerTopology.ID] = {
182174
[clusters.PowerTopology.attributes.AvailableEndpoints.ID] = attribute_handlers.available_endpoints_handler,
183175
},
184-
[clusters.RelativeHumidityMeasurement.ID] = {
185-
[clusters.RelativeHumidityMeasurement.attributes.MeasuredValue.ID] = attribute_handlers.relative_humidity_measured_value_handler
186-
},
187176
[clusters.Switch.ID] = {
188177
[clusters.Switch.attributes.MultiPressMax.ID] = attribute_handlers.multi_press_max_handler
189178
},
190-
[clusters.TemperatureMeasurement.ID] = {
191-
[clusters.TemperatureMeasurement.attributes.MaxMeasuredValue.ID] = attribute_handlers.temperature_measured_value_bounds_factory(fields.TEMP_MAX),
192-
[clusters.TemperatureMeasurement.attributes.MeasuredValue.ID] = attribute_handlers.temperature_measured_value_handler,
193-
[clusters.TemperatureMeasurement.attributes.MinMeasuredValue.ID] = attribute_handlers.temperature_measured_value_bounds_factory(fields.TEMP_MIN),
194-
},
195179
[clusters.ValveConfigurationAndControl.ID] = {
196180
[clusters.ValveConfigurationAndControl.attributes.CurrentLevel.ID] = attribute_handlers.valve_configuration_current_level_handler,
197181
[clusters.ValveConfigurationAndControl.attributes.CurrentState.ID] = attribute_handlers.valve_configuration_current_state_handler,
@@ -237,12 +221,6 @@ local matter_driver_template = {
237221
[capabilities.fanSpeedPercent.ID] = {
238222
clusters.FanControl.attributes.PercentCurrent
239223
},
240-
[capabilities.illuminanceMeasurement.ID] = {
241-
clusters.IlluminanceMeasurement.attributes.MeasuredValue
242-
},
243-
[capabilities.motionSensor.ID] = {
244-
clusters.OccupancySensing.attributes.Occupancy
245-
},
246224
[capabilities.level.ID] = {
247225
clusters.ValveConfigurationAndControl.attributes.CurrentLevel
248226
},
@@ -252,19 +230,11 @@ local matter_driver_template = {
252230
[capabilities.powerMeter.ID] = {
253231
clusters.ElectricalPowerMeasurement.attributes.ActivePower
254232
},
255-
[capabilities.relativeHumidityMeasurement.ID] = {
256-
clusters.RelativeHumidityMeasurement.attributes.MeasuredValue
257-
},
258233
[capabilities.switchLevel.ID] = {
259234
clusters.LevelControl.attributes.CurrentLevel,
260235
clusters.LevelControl.attributes.MaxLevel,
261236
clusters.LevelControl.attributes.MinLevel,
262237
},
263-
[capabilities.temperatureMeasurement.ID] = {
264-
clusters.TemperatureMeasurement.attributes.MeasuredValue,
265-
clusters.TemperatureMeasurement.attributes.MinMeasuredValue,
266-
clusters.TemperatureMeasurement.attributes.MaxMeasuredValue
267-
},
268238
[capabilities.valve.ID] = {
269239
clusters.ValveConfigurationAndControl.attributes.CurrentState
270240
},
@@ -349,7 +319,8 @@ local matter_driver_template = {
349319
switch_utils.lazy_load("sub_drivers.camera"),
350320
switch_utils.lazy_load_if_possible("sub_drivers.eve_energy"),
351321
switch_utils.lazy_load_if_possible("sub_drivers.ikea_scroll"),
352-
switch_utils.lazy_load_if_possible("sub_drivers.third_reality_mk1")
322+
switch_utils.lazy_load_if_possible("sub_drivers.third_reality_mk1"),
323+
switch_utils.lazy_load_if_possible("sub_drivers.sensor"),
353324
}
354325
}
355326

drivers/SmartThings/matter-switch/src/sub_drivers/camera/can_handle.lua

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33

44
return function(opts, driver, device, ...)
55
local device_lib = require "st.device"
6-
local fields = require "switch_utils.fields"
7-
local switch_utils = require "switch_utils.utils"
86
if device.network_type == device_lib.NETWORK_TYPE_MATTER then
97
local version = require "version"
10-
if version.rpc >= 10 and version.api >= 16 and
11-
#switch_utils.get_endpoints_by_device_type(device, fields.DEVICE_TYPE_ID.CAMERA) > 0 then
12-
return true, require("sub_drivers.camera")
8+
if version.rpc >= 10 and version.api >= 16 then
9+
local fields = require "switch_utils.fields"
10+
local switch_utils = require "switch_utils.utils"
11+
if #switch_utils.get_endpoints_by_device_type(device, fields.DEVICE_TYPE_ID.CAMERA) > 0 then
12+
return true, require("sub_drivers.camera")
13+
end
1314
end
1415
end
1516
return false

drivers/SmartThings/matter-switch/src/sub_drivers/camera/camera_handlers/attribute_handlers.lua renamed to drivers/SmartThings/matter-switch/src/sub_drivers/camera/handlers/attribute_handlers.lua

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
-- Copyright © 2025 SmartThings, Inc.
22
-- Licensed under the Apache License, Version 2.0
33

4-
local camera_fields = require "sub_drivers.camera.camera_utils.fields"
5-
local camera_utils = require "sub_drivers.camera.camera_utils.utils"
4+
local camera_fields = require "sub_drivers.camera.utils.fields"
5+
local camera_utils = require "sub_drivers.camera.utils.utils"
66
local capabilities = require "st.capabilities"
77
local clusters = require "st.matter.clusters"
8-
local camera_cfg = require "sub_drivers.camera.camera_utils.device_configuration"
8+
local camera_cfg = require "sub_drivers.camera.utils.device_configuration"
99
local fields = require "switch_utils.fields"
1010
local utils = require "st.utils"
1111

drivers/SmartThings/matter-switch/src/sub_drivers/camera/camera_handlers/capability_handlers.lua renamed to drivers/SmartThings/matter-switch/src/sub_drivers/camera/handlers/capability_handlers.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
-- Copyright © 2025 SmartThings, Inc.
22
-- Licensed under the Apache License, Version 2.0
33

4-
local camera_fields = require "sub_drivers.camera.camera_utils.fields"
5-
local camera_utils = require "sub_drivers.camera.camera_utils.utils"
4+
local camera_fields = require "sub_drivers.camera.utils.fields"
5+
local camera_utils = require "sub_drivers.camera.utils.utils"
66
local capabilities = require "st.capabilities"
77
local clusters = require "st.matter.clusters"
88
local utils = require "st.utils"

drivers/SmartThings/matter-switch/src/sub_drivers/camera/camera_handlers/event_handlers.lua renamed to drivers/SmartThings/matter-switch/src/sub_drivers/camera/handlers/event_handlers.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
-- Copyright © 2025 SmartThings, Inc.
22
-- Licensed under the Apache License, Version 2.0
33

4-
local camera_fields = require "sub_drivers.camera.camera_utils.fields"
4+
local camera_fields = require "sub_drivers.camera.utils.fields"
55
local capabilities = require "st.capabilities"
66
local switch_utils = require "switch_utils.utils"
77

drivers/SmartThings/matter-switch/src/sub_drivers/camera/init.lua

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
-- Matter Camera Sub Driver
66
-------------------------------------------------------------------------------------
77

8-
local attribute_handlers = require "sub_drivers.camera.camera_handlers.attribute_handlers"
8+
local attribute_handlers = require "sub_drivers.camera.handlers.attribute_handlers"
99
local button_cfg = require("switch_utils.device_configuration").ButtonCfg
10-
local camera_cfg = require "sub_drivers.camera.camera_utils.device_configuration"
11-
local camera_fields = require "sub_drivers.camera.camera_utils.fields"
12-
local camera_utils = require "sub_drivers.camera.camera_utils.utils"
10+
local camera_cfg = require "sub_drivers.camera.utils.device_configuration"
11+
local camera_fields = require "sub_drivers.camera.utils.fields"
12+
local camera_utils = require "sub_drivers.camera.utils.utils"
1313
local capabilities = require "st.capabilities"
14-
local capability_handlers = require "sub_drivers.camera.camera_handlers.capability_handlers"
14+
local capability_handlers = require "sub_drivers.camera.handlers.capability_handlers"
1515
local clusters = require "st.matter.clusters"
16-
local event_handlers = require "sub_drivers.camera.camera_handlers.event_handlers"
16+
local event_handlers = require "sub_drivers.camera.handlers.event_handlers"
1717
local fields = require "switch_utils.fields"
1818
local switch_utils = require "switch_utils.utils"
1919

@@ -26,7 +26,10 @@ function CameraLifecycleHandlers.device_init(driver, device)
2626
if device:get_field(fields.IS_PARENT_CHILD_DEVICE) then
2727
device:set_find_child(switch_utils.find_child)
2828
end
29-
device:extend_device("subscribe", camera_utils.subscribe)
29+
if #device:get_endpoints(clusters.PowerSource.ID, {feature_bitmap = clusters.PowerSource.types.PowerSourceFeature.BATTERY}) == 0 then
30+
device:set_field(fields.profiling_data.BATTERY_SUPPORT, fields.battery_support.NO_BATTERY, {persist = true})
31+
end
32+
device:extend_device("subscribe", switch_utils.subscribe)
3033
device:subscribe()
3134
end
3235

drivers/SmartThings/matter-switch/src/sub_drivers/camera/camera_utils/device_configuration.lua renamed to drivers/SmartThings/matter-switch/src/sub_drivers/camera/utils/device_configuration.lua

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
-- Licensed under the Apache License, Version 2.0
33

44
local button_cfg = require("switch_utils.device_configuration").ButtonCfg
5-
local camera_fields = require "sub_drivers.camera.camera_utils.fields"
6-
local camera_utils = require "sub_drivers.camera.camera_utils.utils"
5+
local camera_fields = require "sub_drivers.camera.utils.fields"
6+
local camera_utils = require "sub_drivers.camera.utils.utils"
77
local capabilities = require "st.capabilities"
88
local clusters = require "st.matter.clusters"
99
local device_cfg = require "switch_utils.device_configuration"

drivers/SmartThings/matter-switch/src/sub_drivers/camera/camera_utils/fields.lua renamed to drivers/SmartThings/matter-switch/src/sub_drivers/camera/utils/fields.lua

File renamed without changes.
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
-- Copyright © 2026 SmartThings, Inc.
2+
-- Licensed under the Apache License, Version 2.0
3+
4+
local capabilities = require "st.capabilities"
5+
local clusters = require "st.matter.clusters"
6+
7+
local SubscriptionMap = {
8+
subscribed_attributes = {
9+
[capabilities.audioMute.ID] = {
10+
clusters.CameraAvStreamManagement.attributes.SpeakerMuted,
11+
clusters.CameraAvStreamManagement.attributes.MicrophoneMuted
12+
},
13+
[capabilities.audioVolume.ID] = {
14+
clusters.CameraAvStreamManagement.attributes.SpeakerVolumeLevel,
15+
clusters.CameraAvStreamManagement.attributes.SpeakerMaxLevel,
16+
clusters.CameraAvStreamManagement.attributes.SpeakerMinLevel,
17+
clusters.CameraAvStreamManagement.attributes.MicrophoneVolumeLevel,
18+
clusters.CameraAvStreamManagement.attributes.MicrophoneMaxLevel,
19+
clusters.CameraAvStreamManagement.attributes.MicrophoneMinLevel
20+
},
21+
[capabilities.cameraPrivacyMode.ID] = {
22+
clusters.CameraAvStreamManagement.attributes.SoftRecordingPrivacyModeEnabled,
23+
clusters.CameraAvStreamManagement.attributes.SoftLivestreamPrivacyModeEnabled,
24+
clusters.CameraAvStreamManagement.attributes.HardPrivacyModeOn
25+
},
26+
[capabilities.cameraViewportSettings.ID] = {
27+
clusters.CameraAvStreamManagement.attributes.MinViewportResolution,
28+
clusters.CameraAvStreamManagement.attributes.VideoSensorParams,
29+
clusters.CameraAvStreamManagement.attributes.Viewport
30+
},
31+
[capabilities.hdr.ID] = {
32+
clusters.CameraAvStreamManagement.attributes.HDRModeEnabled,
33+
clusters.CameraAvStreamManagement.attributes.ImageRotation
34+
},
35+
[capabilities.imageControl.ID] = {
36+
clusters.CameraAvStreamManagement.attributes.ImageFlipHorizontal,
37+
clusters.CameraAvStreamManagement.attributes.ImageFlipVertical
38+
},
39+
[capabilities.localMediaStorage.ID] = {
40+
clusters.CameraAvStreamManagement.attributes.LocalSnapshotRecordingEnabled,
41+
clusters.CameraAvStreamManagement.attributes.LocalVideoRecordingEnabled
42+
},
43+
[capabilities.mechanicalPanTiltZoom.ID] = {
44+
clusters.CameraAvSettingsUserLevelManagement.attributes.MPTZPosition,
45+
clusters.CameraAvSettingsUserLevelManagement.attributes.MPTZPresets,
46+
clusters.CameraAvSettingsUserLevelManagement.attributes.MaxPresets,
47+
clusters.CameraAvSettingsUserLevelManagement.attributes.ZoomMax,
48+
clusters.CameraAvSettingsUserLevelManagement.attributes.PanMax,
49+
clusters.CameraAvSettingsUserLevelManagement.attributes.PanMin,
50+
clusters.CameraAvSettingsUserLevelManagement.attributes.TiltMax,
51+
clusters.CameraAvSettingsUserLevelManagement.attributes.TiltMin
52+
},
53+
[capabilities.mode.ID] = {
54+
clusters.CameraAvStreamManagement.attributes.StatusLightBrightness
55+
},
56+
[capabilities.nightVision.ID] = {
57+
clusters.CameraAvStreamManagement.attributes.NightVision,
58+
clusters.CameraAvStreamManagement.attributes.NightVisionIllum
59+
},
60+
[capabilities.sounds.ID] = {
61+
clusters.Chime.attributes.InstalledChimeSounds,
62+
clusters.Chime.attributes.SelectedChime
63+
},
64+
[capabilities.switch.ID] = {
65+
clusters.CameraAvStreamManagement.attributes.StatusLightEnabled
66+
},
67+
[capabilities.videoStreamSettings.ID] = {
68+
clusters.CameraAvStreamManagement.attributes.RateDistortionTradeOffPoints,
69+
clusters.CameraAvStreamManagement.attributes.MaxEncodedPixelRate,
70+
clusters.CameraAvStreamManagement.attributes.VideoSensorParams,
71+
clusters.CameraAvStreamManagement.attributes.AllocatedVideoStreams
72+
},
73+
[capabilities.webrtc.ID] = {
74+
clusters.CameraAvStreamManagement.attributes.TwoWayTalkSupport
75+
},
76+
[capabilities.zoneManagement.ID] = {
77+
clusters.ZoneManagement.attributes.MaxZones,
78+
clusters.ZoneManagement.attributes.Zones,
79+
clusters.ZoneManagement.attributes.Triggers,
80+
clusters.ZoneManagement.attributes.SensitivityMax,
81+
clusters.ZoneManagement.attributes.Sensitivity
82+
},
83+
},
84+
subscribed_events = {
85+
[capabilities.zoneManagement.ID] = {
86+
clusters.ZoneManagement.events.ZoneTriggered,
87+
clusters.ZoneManagement.events.ZoneStopped
88+
}
89+
},
90+
conditional_subscriptions = {
91+
[function(device)
92+
local fields = require "switch_utils.fields"
93+
local switch_utils = require "switch_utils.utils"
94+
return #switch_utils.get_endpoints_by_device_type(device, fields.DEVICE_TYPE_ID.CAMERA) > 0
95+
end] = { clusters.CameraAvStreamManagement.attributes.AttributeList }
96+
}
97+
}
98+
99+
return SubscriptionMap

0 commit comments

Comments
 (0)