Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 2 additions & 31 deletions drivers/SmartThings/matter-switch/src/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ function SwitchLifecycleHandlers.info_changed(driver, device, event, args)
end
end

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

end

function SwitchLifecycleHandlers.device_init(driver, device)
Expand Down Expand Up @@ -159,17 +157,11 @@ local matter_driver_template = {
[clusters.FanControl.attributes.FanModeSequence.ID] = attribute_handlers.fan_mode_sequence_handler,
[clusters.FanControl.attributes.PercentCurrent.ID] = attribute_handlers.percent_current_handler
},
[clusters.IlluminanceMeasurement.ID] = {
[clusters.IlluminanceMeasurement.attributes.MeasuredValue.ID] = attribute_handlers.illuminance_measured_value_handler
},
[clusters.LevelControl.ID] = {
[clusters.LevelControl.attributes.CurrentLevel.ID] = attribute_handlers.level_control_current_level_handler,
[clusters.LevelControl.attributes.MaxLevel.ID] = attribute_handlers.level_bounds_handler_factory(fields.LEVEL_MAX),
[clusters.LevelControl.attributes.MinLevel.ID] = attribute_handlers.level_bounds_handler_factory(fields.LEVEL_MIN),
},
[clusters.OccupancySensing.ID] = {
[clusters.OccupancySensing.attributes.Occupancy.ID] = attribute_handlers.occupancy_handler,
},
[clusters.OnOff.ID] = {
[clusters.OnOff.attributes.OnOff.ID] = attribute_handlers.on_off_attr_handler,
},
Expand All @@ -181,17 +173,9 @@ local matter_driver_template = {
[clusters.PowerTopology.ID] = {
[clusters.PowerTopology.attributes.AvailableEndpoints.ID] = attribute_handlers.available_endpoints_handler,
},
[clusters.RelativeHumidityMeasurement.ID] = {
[clusters.RelativeHumidityMeasurement.attributes.MeasuredValue.ID] = attribute_handlers.relative_humidity_measured_value_handler
},
[clusters.Switch.ID] = {
[clusters.Switch.attributes.MultiPressMax.ID] = attribute_handlers.multi_press_max_handler
},
[clusters.TemperatureMeasurement.ID] = {
[clusters.TemperatureMeasurement.attributes.MaxMeasuredValue.ID] = attribute_handlers.temperature_measured_value_bounds_factory(fields.TEMP_MAX),
[clusters.TemperatureMeasurement.attributes.MeasuredValue.ID] = attribute_handlers.temperature_measured_value_handler,
[clusters.TemperatureMeasurement.attributes.MinMeasuredValue.ID] = attribute_handlers.temperature_measured_value_bounds_factory(fields.TEMP_MIN),
},
[clusters.ValveConfigurationAndControl.ID] = {
[clusters.ValveConfigurationAndControl.attributes.CurrentLevel.ID] = attribute_handlers.valve_configuration_current_level_handler,
[clusters.ValveConfigurationAndControl.attributes.CurrentState.ID] = attribute_handlers.valve_configuration_current_state_handler,
Expand Down Expand Up @@ -237,12 +221,6 @@ local matter_driver_template = {
[capabilities.fanSpeedPercent.ID] = {
clusters.FanControl.attributes.PercentCurrent
},
[capabilities.illuminanceMeasurement.ID] = {
clusters.IlluminanceMeasurement.attributes.MeasuredValue
},
[capabilities.motionSensor.ID] = {
clusters.OccupancySensing.attributes.Occupancy
},
[capabilities.level.ID] = {
clusters.ValveConfigurationAndControl.attributes.CurrentLevel
},
Expand All @@ -252,19 +230,11 @@ local matter_driver_template = {
[capabilities.powerMeter.ID] = {
clusters.ElectricalPowerMeasurement.attributes.ActivePower
},
[capabilities.relativeHumidityMeasurement.ID] = {
clusters.RelativeHumidityMeasurement.attributes.MeasuredValue
},
[capabilities.switchLevel.ID] = {
clusters.LevelControl.attributes.CurrentLevel,
clusters.LevelControl.attributes.MaxLevel,
clusters.LevelControl.attributes.MinLevel,
},
[capabilities.temperatureMeasurement.ID] = {
clusters.TemperatureMeasurement.attributes.MeasuredValue,
clusters.TemperatureMeasurement.attributes.MinMeasuredValue,
clusters.TemperatureMeasurement.attributes.MaxMeasuredValue
},
[capabilities.valve.ID] = {
clusters.ValveConfigurationAndControl.attributes.CurrentState
},
Expand Down Expand Up @@ -349,7 +319,8 @@ local matter_driver_template = {
switch_utils.lazy_load("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")
switch_utils.lazy_load_if_possible("sub_drivers.third_reality_mk1"),
switch_utils.lazy_load_if_possible("sub_drivers.sensor"),
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,14 @@

return function(opts, driver, device, ...)
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
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")
if version.rpc >= 10 and version.api >= 16 then
local fields = require "switch_utils.fields"
local switch_utils = require "switch_utils.utils"
if #switch_utils.get_endpoints_by_device_type(device, fields.DEVICE_TYPE_ID.CAMERA) > 0 then
return true, require("sub_drivers.camera")
end
end
end
return false
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
-- Copyright © 2025 SmartThings, Inc.
-- Licensed under the Apache License, Version 2.0

local camera_fields = require "sub_drivers.camera.camera_utils.fields"
local camera_utils = require "sub_drivers.camera.camera_utils.utils"
local camera_fields = require "sub_drivers.camera.utils.fields"
local camera_utils = require "sub_drivers.camera.utils.utils"
local capabilities = require "st.capabilities"
local clusters = require "st.matter.clusters"
local camera_cfg = require "sub_drivers.camera.camera_utils.device_configuration"
local camera_cfg = require "sub_drivers.camera.utils.device_configuration"
local fields = require "switch_utils.fields"
local utils = require "st.utils"

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
-- Copyright © 2025 SmartThings, Inc.
-- Licensed under the Apache License, Version 2.0

local camera_fields = require "sub_drivers.camera.camera_utils.fields"
local camera_utils = require "sub_drivers.camera.camera_utils.utils"
local camera_fields = require "sub_drivers.camera.utils.fields"
local camera_utils = require "sub_drivers.camera.utils.utils"
local capabilities = require "st.capabilities"
local clusters = require "st.matter.clusters"
local utils = require "st.utils"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
-- Copyright © 2025 SmartThings, Inc.
-- Licensed under the Apache License, Version 2.0

local camera_fields = require "sub_drivers.camera.camera_utils.fields"
local camera_fields = require "sub_drivers.camera.utils.fields"
local capabilities = require "st.capabilities"
local switch_utils = require "switch_utils.utils"

Expand Down
17 changes: 10 additions & 7 deletions drivers/SmartThings/matter-switch/src/sub_drivers/camera/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@
-- Matter Camera Sub Driver
-------------------------------------------------------------------------------------

local attribute_handlers = require "sub_drivers.camera.camera_handlers.attribute_handlers"
local attribute_handlers = require "sub_drivers.camera.handlers.attribute_handlers"
local button_cfg = require("switch_utils.device_configuration").ButtonCfg
local camera_cfg = require "sub_drivers.camera.camera_utils.device_configuration"
local camera_fields = require "sub_drivers.camera.camera_utils.fields"
local camera_utils = require "sub_drivers.camera.camera_utils.utils"
local camera_cfg = require "sub_drivers.camera.utils.device_configuration"
local camera_fields = require "sub_drivers.camera.utils.fields"
local camera_utils = require "sub_drivers.camera.utils.utils"
local capabilities = require "st.capabilities"
local capability_handlers = require "sub_drivers.camera.camera_handlers.capability_handlers"
local capability_handlers = require "sub_drivers.camera.handlers.capability_handlers"
local clusters = require "st.matter.clusters"
local event_handlers = require "sub_drivers.camera.camera_handlers.event_handlers"
local event_handlers = require "sub_drivers.camera.handlers.event_handlers"
local fields = require "switch_utils.fields"
local switch_utils = require "switch_utils.utils"

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

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
-- Licensed under the Apache License, Version 2.0

local button_cfg = require("switch_utils.device_configuration").ButtonCfg
local camera_fields = require "sub_drivers.camera.camera_utils.fields"
local camera_utils = require "sub_drivers.camera.camera_utils.utils"
local camera_fields = require "sub_drivers.camera.utils.fields"
local camera_utils = require "sub_drivers.camera.utils.utils"
local capabilities = require "st.capabilities"
local clusters = require "st.matter.clusters"
local device_cfg = require "switch_utils.device_configuration"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
-- Copyright © 2026 SmartThings, Inc.
-- Licensed under the Apache License, Version 2.0

local capabilities = require "st.capabilities"
local clusters = require "st.matter.clusters"

local SubscriptionMap = {
subscribed_attributes = {
[capabilities.audioMute.ID] = {
clusters.CameraAvStreamManagement.attributes.SpeakerMuted,
clusters.CameraAvStreamManagement.attributes.MicrophoneMuted
},
[capabilities.audioVolume.ID] = {
clusters.CameraAvStreamManagement.attributes.SpeakerVolumeLevel,
clusters.CameraAvStreamManagement.attributes.SpeakerMaxLevel,
clusters.CameraAvStreamManagement.attributes.SpeakerMinLevel,
clusters.CameraAvStreamManagement.attributes.MicrophoneVolumeLevel,
clusters.CameraAvStreamManagement.attributes.MicrophoneMaxLevel,
clusters.CameraAvStreamManagement.attributes.MicrophoneMinLevel
},
[capabilities.cameraPrivacyMode.ID] = {
clusters.CameraAvStreamManagement.attributes.SoftRecordingPrivacyModeEnabled,
clusters.CameraAvStreamManagement.attributes.SoftLivestreamPrivacyModeEnabled,
clusters.CameraAvStreamManagement.attributes.HardPrivacyModeOn
},
[capabilities.cameraViewportSettings.ID] = {
clusters.CameraAvStreamManagement.attributes.MinViewportResolution,
clusters.CameraAvStreamManagement.attributes.VideoSensorParams,
clusters.CameraAvStreamManagement.attributes.Viewport
},
[capabilities.hdr.ID] = {
clusters.CameraAvStreamManagement.attributes.HDRModeEnabled,
clusters.CameraAvStreamManagement.attributes.ImageRotation
},
[capabilities.imageControl.ID] = {
clusters.CameraAvStreamManagement.attributes.ImageFlipHorizontal,
clusters.CameraAvStreamManagement.attributes.ImageFlipVertical
},
[capabilities.localMediaStorage.ID] = {
clusters.CameraAvStreamManagement.attributes.LocalSnapshotRecordingEnabled,
clusters.CameraAvStreamManagement.attributes.LocalVideoRecordingEnabled
},
[capabilities.mechanicalPanTiltZoom.ID] = {
clusters.CameraAvSettingsUserLevelManagement.attributes.MPTZPosition,
clusters.CameraAvSettingsUserLevelManagement.attributes.MPTZPresets,
clusters.CameraAvSettingsUserLevelManagement.attributes.MaxPresets,
clusters.CameraAvSettingsUserLevelManagement.attributes.ZoomMax,
clusters.CameraAvSettingsUserLevelManagement.attributes.PanMax,
clusters.CameraAvSettingsUserLevelManagement.attributes.PanMin,
clusters.CameraAvSettingsUserLevelManagement.attributes.TiltMax,
clusters.CameraAvSettingsUserLevelManagement.attributes.TiltMin
},
[capabilities.mode.ID] = {
clusters.CameraAvStreamManagement.attributes.StatusLightBrightness
},
[capabilities.nightVision.ID] = {
clusters.CameraAvStreamManagement.attributes.NightVision,
clusters.CameraAvStreamManagement.attributes.NightVisionIllum
},
[capabilities.sounds.ID] = {
clusters.Chime.attributes.InstalledChimeSounds,
clusters.Chime.attributes.SelectedChime
},
[capabilities.switch.ID] = {
clusters.CameraAvStreamManagement.attributes.StatusLightEnabled
},
[capabilities.videoStreamSettings.ID] = {
clusters.CameraAvStreamManagement.attributes.RateDistortionTradeOffPoints,
clusters.CameraAvStreamManagement.attributes.MaxEncodedPixelRate,
clusters.CameraAvStreamManagement.attributes.VideoSensorParams,
clusters.CameraAvStreamManagement.attributes.AllocatedVideoStreams
},
[capabilities.webrtc.ID] = {
clusters.CameraAvStreamManagement.attributes.TwoWayTalkSupport
},
[capabilities.zoneManagement.ID] = {
clusters.ZoneManagement.attributes.MaxZones,
clusters.ZoneManagement.attributes.Zones,
clusters.ZoneManagement.attributes.Triggers,
clusters.ZoneManagement.attributes.SensitivityMax,
clusters.ZoneManagement.attributes.Sensitivity
},
},
subscribed_events = {
[capabilities.zoneManagement.ID] = {
clusters.ZoneManagement.events.ZoneTriggered,
clusters.ZoneManagement.events.ZoneStopped
}
},
conditional_subscriptions = {
[function(device)
local fields = require "switch_utils.fields"
local switch_utils = require "switch_utils.utils"
return #switch_utils.get_endpoints_by_device_type(device, fields.DEVICE_TYPE_ID.CAMERA) > 0
end] = { clusters.CameraAvStreamManagement.attributes.AttributeList }
}
}

return SubscriptionMap
Loading
Loading