From ea8cbe05db0f03099fb29b6a4d9fb1285b76ee0b Mon Sep 17 00:00:00 2001 From: Alec Lorimer Date: Mon, 17 Nov 2025 15:25:03 -0600 Subject: [PATCH] zigbee-power-meter:[automated] lazy loading changes --- .../src/ezex/can_handle.lua | 15 +++++++++ .../src/ezex/fingerprints.lua | 8 +++++ .../zigbee-power-meter/src/ezex/init.lua | 30 +++-------------- .../src/frient/can_handle.lua | 15 +++++++++ .../src/frient/fingerprints.lua | 9 ++++++ .../zigbee-power-meter/src/frient/init.lua | 31 +++--------------- .../zigbee-power-meter/src/init.lua | 22 +++---------- .../src/lazy_load_subdriver.lua | 15 +++++++++ .../src/shinasystems/can_handle.lua | 15 +++++++++ .../src/shinasystems/fingerprints.lua | 10 ++++++ .../src/shinasystems/init.lua | 32 +++---------------- .../zigbee-power-meter/src/sub_drivers.lua | 10 ++++++ 12 files changed, 113 insertions(+), 99 deletions(-) create mode 100644 drivers/SmartThings/zigbee-power-meter/src/ezex/can_handle.lua create mode 100644 drivers/SmartThings/zigbee-power-meter/src/ezex/fingerprints.lua create mode 100644 drivers/SmartThings/zigbee-power-meter/src/frient/can_handle.lua create mode 100644 drivers/SmartThings/zigbee-power-meter/src/frient/fingerprints.lua create mode 100644 drivers/SmartThings/zigbee-power-meter/src/lazy_load_subdriver.lua create mode 100644 drivers/SmartThings/zigbee-power-meter/src/shinasystems/can_handle.lua create mode 100644 drivers/SmartThings/zigbee-power-meter/src/shinasystems/fingerprints.lua create mode 100644 drivers/SmartThings/zigbee-power-meter/src/sub_drivers.lua diff --git a/drivers/SmartThings/zigbee-power-meter/src/ezex/can_handle.lua b/drivers/SmartThings/zigbee-power-meter/src/ezex/can_handle.lua new file mode 100644 index 0000000000..91569fd4b4 --- /dev/null +++ b/drivers/SmartThings/zigbee-power-meter/src/ezex/can_handle.lua @@ -0,0 +1,15 @@ +-- Copyright 2025 SmartThings, Inc. +-- Licensed under the Apache License, Version 2.0 + +local is_ezex_power_meter = function(opts, driver, device) + local FINGERPRINTS = require("ezex.fingerprints") + for _, fingerprint in ipairs(FINGERPRINTS) do + if device:get_model() == fingerprint.model then + return true, require("ezex") + end + end + + return false +end + +return is_ezex_power_meter diff --git a/drivers/SmartThings/zigbee-power-meter/src/ezex/fingerprints.lua b/drivers/SmartThings/zigbee-power-meter/src/ezex/fingerprints.lua new file mode 100644 index 0000000000..1495f82c56 --- /dev/null +++ b/drivers/SmartThings/zigbee-power-meter/src/ezex/fingerprints.lua @@ -0,0 +1,8 @@ +-- Copyright 2025 SmartThings, Inc. +-- Licensed under the Apache License, Version 2.0 + +local ZIGBEE_POWER_METER_FINGERPRINTS = { + { model = "E240-KR080Z0-HA" } +} + +return ZIGBEE_POWER_METER_FINGERPRINTS diff --git a/drivers/SmartThings/zigbee-power-meter/src/ezex/init.lua b/drivers/SmartThings/zigbee-power-meter/src/ezex/init.lua index 9e4c6d6eea..15ca345f31 100644 --- a/drivers/SmartThings/zigbee-power-meter/src/ezex/init.lua +++ b/drivers/SmartThings/zigbee-power-meter/src/ezex/init.lua @@ -1,16 +1,6 @@ --- Copyright 2022 SmartThings --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. +-- Copyright 2025 SmartThings, Inc. +-- Licensed under the Apache License, Version 2.0 + local capabilities = require "st.capabilities" local constants = require "st.zigbee.constants" @@ -20,19 +10,7 @@ local ElectricalMeasurement = clusters.ElectricalMeasurement local energy_meter_defaults = require "st.zigbee.defaults.energyMeter_defaults" local configurations = require "configurations" -local ZIGBEE_POWER_METER_FINGERPRINTS = { - { model = "E240-KR080Z0-HA" } -} -local is_ezex_power_meter = function(opts, driver, device) - for _, fingerprint in ipairs(ZIGBEE_POWER_METER_FINGERPRINTS) do - if device:get_model() == fingerprint.model then - return true - end - end - - return false -end local instantaneous_demand_configuration = { cluster = SimpleMetering.ID, @@ -88,7 +66,7 @@ local ezex_power_meter_handler = { init = configurations.power_reconfig_wrapper(device_init), doConfigure = do_configure, }, - can_handle = is_ezex_power_meter + can_handle = require("ezex.can_handle"), } return ezex_power_meter_handler diff --git a/drivers/SmartThings/zigbee-power-meter/src/frient/can_handle.lua b/drivers/SmartThings/zigbee-power-meter/src/frient/can_handle.lua new file mode 100644 index 0000000000..3cf7077ddd --- /dev/null +++ b/drivers/SmartThings/zigbee-power-meter/src/frient/can_handle.lua @@ -0,0 +1,15 @@ +-- Copyright 2025 SmartThings, Inc. +-- Licensed under the Apache License, Version 2.0 + +local is_frient_power_meter = function(opts, driver, device) + local FINGERPRINTS = require("frient.fingerprints") + for _, fingerprint in ipairs(FINGERPRINTS) do + if device:get_model() == fingerprint.model then + return true, require("frient") + end + end + + return false +end + +return is_frient_power_meter diff --git a/drivers/SmartThings/zigbee-power-meter/src/frient/fingerprints.lua b/drivers/SmartThings/zigbee-power-meter/src/frient/fingerprints.lua new file mode 100644 index 0000000000..5bc09f600d --- /dev/null +++ b/drivers/SmartThings/zigbee-power-meter/src/frient/fingerprints.lua @@ -0,0 +1,9 @@ +-- Copyright 2025 SmartThings, Inc. +-- Licensed under the Apache License, Version 2.0 + +local ZIGBEE_POWER_METER_FINGERPRINTS = { + { model = "ZHEMI101" }, + { model = "EMIZB-132" }, +} + +return ZIGBEE_POWER_METER_FINGERPRINTS diff --git a/drivers/SmartThings/zigbee-power-meter/src/frient/init.lua b/drivers/SmartThings/zigbee-power-meter/src/frient/init.lua index 9d3f6f83b0..5933faf5cb 100644 --- a/drivers/SmartThings/zigbee-power-meter/src/frient/init.lua +++ b/drivers/SmartThings/zigbee-power-meter/src/frient/init.lua @@ -1,34 +1,11 @@ --- Copyright 2022 SmartThings --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. +-- Copyright 2025 SmartThings, Inc. +-- Licensed under the Apache License, Version 2.0 + local constants = require "st.zigbee.constants" local configurations = require "configurations" -local ZIGBEE_POWER_METER_FINGERPRINTS = { - { model = "ZHEMI101" }, - { model = "EMIZB-132" }, -} - -local is_frient_power_meter = function(opts, driver, device) - for _, fingerprint in ipairs(ZIGBEE_POWER_METER_FINGERPRINTS) do - if device:get_model() == fingerprint.model then - return true - end - end - return false -end local do_configure = function(self, device) device:refresh() @@ -46,7 +23,7 @@ local frient_power_meter_handler = { init = configurations.power_reconfig_wrapper(device_init), doConfigure = do_configure, }, - can_handle = is_frient_power_meter + can_handle = require("frient.can_handle"), } return frient_power_meter_handler \ No newline at end of file diff --git a/drivers/SmartThings/zigbee-power-meter/src/init.lua b/drivers/SmartThings/zigbee-power-meter/src/init.lua index ae98baca8b..f15fae7905 100644 --- a/drivers/SmartThings/zigbee-power-meter/src/init.lua +++ b/drivers/SmartThings/zigbee-power-meter/src/init.lua @@ -1,16 +1,6 @@ --- Copyright 2022 SmartThings --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. +-- Copyright 2025 SmartThings, Inc. +-- Licensed under the Apache License, Version 2.0 + local capabilities = require "st.capabilities" local ZigbeeDriver = require "st.zigbee" @@ -63,11 +53,7 @@ local zigbee_power_meter_driver_template = { } }, current_config_version = 1, - sub_drivers = { - require("ezex"), - require("frient"), - require("shinasystems"), - }, + sub_drivers = require("sub_drivers"), lifecycle_handlers = { init = configurations.power_reconfig_wrapper(device_init), doConfigure = do_configure, diff --git a/drivers/SmartThings/zigbee-power-meter/src/lazy_load_subdriver.lua b/drivers/SmartThings/zigbee-power-meter/src/lazy_load_subdriver.lua new file mode 100644 index 0000000000..0bee6d2a75 --- /dev/null +++ b/drivers/SmartThings/zigbee-power-meter/src/lazy_load_subdriver.lua @@ -0,0 +1,15 @@ +-- Copyright 2025 SmartThings, Inc. +-- Licensed under the Apache License, Version 2.0 + +return function(sub_driver_name) + -- gets the current lua libs api version + local version = require "version" + local ZigbeeDriver = require "st.zigbee" + if version.api >= 16 then + return ZigbeeDriver.lazy_load_sub_driver_v2(sub_driver_name) + elseif version.api >= 9 then + return ZigbeeDriver.lazy_load_sub_driver(require(sub_driver_name)) + else + return require(sub_driver_name) + end +end diff --git a/drivers/SmartThings/zigbee-power-meter/src/shinasystems/can_handle.lua b/drivers/SmartThings/zigbee-power-meter/src/shinasystems/can_handle.lua new file mode 100644 index 0000000000..94808a8486 --- /dev/null +++ b/drivers/SmartThings/zigbee-power-meter/src/shinasystems/can_handle.lua @@ -0,0 +1,15 @@ +-- Copyright 2025 SmartThings, Inc. +-- Licensed under the Apache License, Version 2.0 + +local is_shinasystems_power_meter = function(opts, driver, device) + local FINGERPRINTS = require("shinasystems.fingerprints") + for _, fingerprint in ipairs(FINGERPRINTS) do + if device:get_model() == fingerprint.model then + return true, require("shinasystems") + end + end + + return false +end + +return is_shinasystems_power_meter diff --git a/drivers/SmartThings/zigbee-power-meter/src/shinasystems/fingerprints.lua b/drivers/SmartThings/zigbee-power-meter/src/shinasystems/fingerprints.lua new file mode 100644 index 0000000000..5364835514 --- /dev/null +++ b/drivers/SmartThings/zigbee-power-meter/src/shinasystems/fingerprints.lua @@ -0,0 +1,10 @@ +-- Copyright 2025 SmartThings, Inc. +-- Licensed under the Apache License, Version 2.0 + +local ZIGBEE_POWER_METER_FINGERPRINTS = { + { model = "PMM-300Z1" }, + { model = "PMM-300Z2" }, + { model = "PMM-300Z3" } +} + +return ZIGBEE_POWER_METER_FINGERPRINTS diff --git a/drivers/SmartThings/zigbee-power-meter/src/shinasystems/init.lua b/drivers/SmartThings/zigbee-power-meter/src/shinasystems/init.lua index 64713547a8..54866e2f82 100644 --- a/drivers/SmartThings/zigbee-power-meter/src/shinasystems/init.lua +++ b/drivers/SmartThings/zigbee-power-meter/src/shinasystems/init.lua @@ -1,16 +1,6 @@ --- Copyright 2022 SmartThings --- --- Licensed under the Apache License, Version 2.0 (the "License"); --- you may not use this file except in compliance with the License. --- You may obtain a copy of the License at --- --- http://www.apache.org/licenses/LICENSE-2.0 --- --- Unless required by applicable law or agreed to in writing, software --- distributed under the License is distributed on an "AS IS" BASIS, --- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. --- See the License for the specific language governing permissions and --- limitations under the License. +-- Copyright 2025 SmartThings, Inc. +-- Licensed under the Apache License, Version 2.0 + local capabilities = require "st.capabilities" local constants = require "st.zigbee.constants" @@ -19,11 +9,6 @@ local SimpleMetering = clusters.SimpleMetering local ElectricalMeasurement = clusters.ElectricalMeasurement local configurations = require "configurations" -local ZIGBEE_POWER_METER_FINGERPRINTS = { - { model = "PMM-300Z1" }, - { model = "PMM-300Z2" }, - { model = "PMM-300Z3" } -} local POWERMETER_CONFIGURATION_V2 = { { @@ -52,15 +37,6 @@ local POWERMETER_CONFIGURATION_V2 = { } } -local is_shinasystems_power_meter = function(opts, driver, device) - for _, fingerprint in ipairs(ZIGBEE_POWER_METER_FINGERPRINTS) do - if device:get_model() == fingerprint.model then - return true - end - end - - return false -end local function energy_meter_handler(driver, device, value, zb_rx) local multiplier = device:get_field(constants.SIMPLE_METERING_MULTIPLIER_KEY) or 1 @@ -128,7 +104,7 @@ local shinasystems_power_meter_handler = { init = configurations.power_reconfig_wrapper(device_init), doConfigure = do_configure, }, - can_handle = is_shinasystems_power_meter + can_handle = require("shinasystems.can_handle"), } return shinasystems_power_meter_handler diff --git a/drivers/SmartThings/zigbee-power-meter/src/sub_drivers.lua b/drivers/SmartThings/zigbee-power-meter/src/sub_drivers.lua new file mode 100644 index 0000000000..58ff064c9f --- /dev/null +++ b/drivers/SmartThings/zigbee-power-meter/src/sub_drivers.lua @@ -0,0 +1,10 @@ +-- Copyright 2025 SmartThings, Inc. +-- Licensed under the Apache License, Version 2.0 + +local lazy_load_if_possible = require "lazy_load_subdriver" +local sub_drivers = { + lazy_load_if_possible("ezex"), + lazy_load_if_possible("frient"), + lazy_load_if_possible("shinasystems"), +} +return sub_drivers