From 973308e456f9cf595c085ab35beabd4a3d96edc8 Mon Sep 17 00:00:00 2001 From: hdlee27 <54927573+hdlee27@users.noreply.github.com> Date: Mon, 2 Dec 2024 22:58:57 +0900 Subject: [PATCH 01/13] Fp2:Stabilization of connection and addition of convenience functions (#1764) * fp2: add get_credential failure handling Signed-off-by: hdlee27 <54927573+hdlee27@users.noreply.github.com> * fp2: add nil check in eventsource Signed-off-by: hdlee27 <54927573+hdlee27@users.noreply.github.com> * fp2: Label change for easy distinction Signed-off-by: hdlee27 <54927573+hdlee27@users.noreply.github.com> * Offline event after reconnection attempt to prevent fake offline * fp2: remove socket connection for fp2 resource Signed-off-by: hdlee27 <54927573+hdlee27@users.noreply.github.com> * fp2: update status when sse reconnect Signed-off-by: hdlee27 <54927573+hdlee27@users.noreply.github.com> * fp2: remove unused function Signed-off-by: hdlee27 <54927573+hdlee27@users.noreply.github.com> * fp2: manage online/offline by using SSE Signed-off-by: hdlee27 <54927573+hdlee27@users.noreply.github.com> * fp2: Change function order for fast response speed Signed-off-by: hdlee27 <54927573+hdlee27@users.noreply.github.com> * fp2: add error handling for status_update Signed-off-by: hdlee27 <54927573+hdlee27@users.noreply.github.com> * fp2: check sse connection before rest api check Signed-off-by: hdlee27 <54927573+hdlee27@users.noreply.github.com> --------- Signed-off-by: hdlee27 <54927573+hdlee27@users.noreply.github.com> --- .../aqara-presence-sensor/src/discovery.lua | 9 +++- .../aqara-presence-sensor/src/fp2/api.lua | 12 +---- .../src/fp2/device_manager.lua | 1 + .../src/fp2/discovery_helper.lua | 9 +++- .../Aqara/aqara-presence-sensor/src/init.lua | 51 ++++++++++--------- .../src/lunchbox/rest.lua | 1 + .../src/lunchbox/sse/eventsource.lua | 18 ++++--- 7 files changed, 58 insertions(+), 43 deletions(-) diff --git a/drivers/Aqara/aqara-presence-sensor/src/discovery.lua b/drivers/Aqara/aqara-presence-sensor/src/discovery.lua index 88779fe6e5..fd68872679 100644 --- a/drivers/Aqara/aqara-presence-sensor/src/discovery.lua +++ b/drivers/Aqara/aqara-presence-sensor/src/discovery.lua @@ -11,9 +11,12 @@ function discovery.set_device_field(driver, device) -- persistent fields if device_cache_value ~= nil then + log.info_with({ hub_logs = true }, string.format("device found in cache. dni= %s", device.device_network_id)) device:set_field(fields.CREDENTIAL, device_cache_value.credential, { persist = true }) device:set_field(fields.DEVICE_IPV4, device_cache_value.ip, { persist = true }) device:set_field(fields.DEVICE_INFO, device_cache_value.device_info, { persist = true }) + else + log.error_with({ hub_logs = true }, string.format("device not found in cache. dni= %s", device.device_network_id)) end driver.datastore.discovery_cache[device.device_network_id] = nil @@ -40,7 +43,7 @@ local function try_add_device(driver, device_dni, device_ip) if driver.datastore.discovery_cache[device_dni] and driver.datastore.discovery_cache[device_dni].credential then log.info(string.format("use stored credential. This may have expired. dni= %s, ip= %s", device_dni, device_ip)) else - log.error(string.format("Failed to get credential. dni= %s, ip= %s", device_dni, device_ip)) + log.error_with({ hub_logs = true }, string.format("Failed to get credential. The device appears to have already generated a credential. In that case, a device reset is needed to generate a new credential. dni= %s, ip= %s", device_dni, device_ip)) return "credential not found" end else @@ -48,13 +51,14 @@ local function try_add_device(driver, device_dni, device_ip) driver.datastore.discovery_cache[device_dni].credential = credential end - log.info(string.format("try_create_device. dni= %s, ip= %s", device_dni, device_ip)) + log.info_with({ hub_logs = true }, string.format("try_create_device. dni= %s, ip= %s", device_dni, device_ip)) processing_devices[device_dni] = true driver:try_create_device(create_device_msg) return nil end function discovery.device_added(driver, device) + log.info_with({ hub_logs = true }, string.format("device_added. dni= %s", device.device_network_id)) discovery.set_device_field(driver, device) processing_devices[device.device_network_id] = nil driver.lifecycle_handlers.init(driver, device) @@ -96,6 +100,7 @@ local function discovery_device(driver) end function discovery.do_network_discovery(driver, _, should_continue) + log.info_with({ hub_logs = true }, string.format("discovery start for Aqara FP2")) while should_continue() do discovery_device(driver) socket.sleep(1) diff --git a/drivers/Aqara/aqara-presence-sensor/src/fp2/api.lua b/drivers/Aqara/aqara-presence-sensor/src/fp2/api.lua index 1c0a2ebb2b..4f27a277a3 100644 --- a/drivers/Aqara/aqara-presence-sensor/src/fp2/api.lua +++ b/drivers/Aqara/aqara-presence-sensor/src/fp2/api.lua @@ -39,16 +39,8 @@ local function process_rest_response(response, err, partial) end end -local function retry_fn(retry_attempts) - local count = 0 - return function() - count = count + 1 - return count < retry_attempts - end -end - local function do_get(api_instance, path) - return process_rest_response(api_instance.client:get(path, api_instance.headers, retry_fn(5))) + return process_rest_response(RestClient.one_shot_get(api_instance.base_url .. path, api_instance.headers, api_instance.socket_builder)) end function fp2_api.new_device_manager(device_ip, bridge_info, socket_builder) @@ -57,7 +49,7 @@ function fp2_api.new_device_manager(device_ip, bridge_info, socket_builder) return setmetatable( { headers = ADDITIONAL_HEADERS, - client = RestClient.new(base_url, socket_builder), + socket_builder = socket_builder, base_url = base_url, }, fp2_api ) diff --git a/drivers/Aqara/aqara-presence-sensor/src/fp2/device_manager.lua b/drivers/Aqara/aqara-presence-sensor/src/fp2/device_manager.lua index 1e678d80c9..66d4e8ac6c 100644 --- a/drivers/Aqara/aqara-presence-sensor/src/fp2/device_manager.lua +++ b/drivers/Aqara/aqara-presence-sensor/src/fp2/device_manager.lua @@ -256,6 +256,7 @@ function device_manager.is_valid_connection(driver, device, conn_info) device.device_network_id)) return false end + local _, err, status = conn_info:get_attr() if err or status ~= 200 then log.warn(string.format( diff --git a/drivers/Aqara/aqara-presence-sensor/src/fp2/discovery_helper.lua b/drivers/Aqara/aqara-presence-sensor/src/fp2/discovery_helper.lua index 7a0e28917a..dcc24b61dd 100644 --- a/drivers/Aqara/aqara-presence-sensor/src/fp2/discovery_helper.lua +++ b/drivers/Aqara/aqara-presence-sensor/src/fp2/discovery_helper.lua @@ -33,10 +33,17 @@ function discovery_helper.get_device_create_msg(driver, device_dni, device_ip) return nil end + local device_label = device_info.label or "Aqara-FP2" + if device_dni then + -- To make it easier to distinguish devices, add the last four letters of dni to the label + -- for example, if device_info.label is "Aqara-FP2" and device_dni is "00:11:22:33:44:55", then device_label will be "Aqara-FP2 (4455)" + device_label = string.format("%s (%s)", device_label, string.sub(string.gsub(tostring(device_dni), ":", ""), -4)) + end + local create_device_msg = { type = "LAN", device_network_id = device_dni, - label = device_info.label, + label = device_label, profile = "aqara-fp2-zoneDetection", manufacturer = device_info.manufacturerName, model = device_info.modelName, diff --git a/drivers/Aqara/aqara-presence-sensor/src/init.lua b/drivers/Aqara/aqara-presence-sensor/src/init.lua index 4080650618..c0d0e953b9 100644 --- a/drivers/Aqara/aqara-presence-sensor/src/init.lua +++ b/drivers/Aqara/aqara-presence-sensor/src/init.lua @@ -20,32 +20,27 @@ local function status_update(driver, device) local conn_info = device:get_field(fields.CONN_INFO) if not conn_info then log.warn(string.format("refresh : failed to find conn_info, dni = %s", device.device_network_id)) + return false, "failed to find conn_info" else local resp, err, status = conn_info:get_attr() if err or status ~= 200 then log.error(string.format("refresh : failed to get attr, dni= %s, err= %s, status= %s", device.device_network_id, err, status)) - if status == 404 then - device:offline() - end + return false, "failed to get attr" else driver.device_manager.handle_status(driver, device, resp) end end + return true end local function create_sse(driver, device, credential) local conn_info = device:get_field(fields.CONN_INFO) - if not driver.device_manager.is_valid_connection(driver, device, conn_info) then - log.warn("create_sse : invalid connection") - return - end - local sse_url = driver.device_manager.get_sse_url(driver, device, conn_info) if not sse_url then - log.error("failed to get sse_url") + log.error_with({ hub_logs = true }, "failed to get sse_url") else log.trace(string.format("Creating SSE EventSource for %s, sse_url= %s", device.device_network_id, sse_url)) local label = string.format("%s-SSE", device.device_network_id) @@ -64,7 +59,16 @@ local function create_sse(driver, device, credential) end eventsource.onopen = function() + log.info_with({ hub_logs = true }, string.format("Eventsource open: dni= %s", device.device_network_id)) device:online() + local success, err = status_update(driver, device) + if not success then + log.warn(string.format("Failed to status_update during eventsource.onopen, err = %s dni= %s", err, device.device_network_id)) + success, err = status_update(driver, device) + if not success then + log.error_with({ hub_logs = true }, string.format("Failed to status_update during eventsource.onopen again, err = %s dni= %s", err, device.device_network_id)) + end + end end local old_eventsource = device:get_field(fields.EVENT_SOURCE) @@ -104,14 +108,11 @@ end local function check_and_update_connection(driver, device) local conn_info = device:get_field(fields.CONN_INFO) - if not driver.device_manager.is_valid_connection(driver, device, conn_info) then - device:offline() + local eventsource = device:get_field(fields.EVENT_SOURCE) + if eventsource and eventsource.ready_state == eventsource.ReadyStates.OPEN then + log.info(string.format("SSE connection is being maintained well, dni = %s", device.device_network_id)) + elseif not driver.device_manager.is_valid_connection(driver, device, conn_info) then find_new_connection(driver, device) - conn_info = device:get_field(fields.CONN_INFO) - end - - if driver.device_manager.is_valid_connection(driver, device, conn_info) then - device:online() end end @@ -132,8 +133,11 @@ end local function do_refresh(driver, device, cmd) - check_and_update_connection(driver, device) - status_update(driver, device) + local success, err = status_update(driver, device) + if not success then + log.info(string.format("Failed to status_update during do_refresh, err = %s dni= %s", err, device.device_network_id)) + check_and_update_connection(driver, device) + end driver.device_manager.init_presence(driver, device) driver.device_manager.init_movement(driver, device) driver.device_manager.init_activity(driver, device) @@ -163,6 +167,7 @@ local function device_init(driver, device) if device:get_field(fields._INIT) then return end + device:set_field(fields._INIT, true, { persist = false }) local device_dni = device.device_network_id driver.controlled_devices[device_dni] = device @@ -177,19 +182,19 @@ local function device_init(driver, device) local credential = device:get_field(fields.CREDENTIAL) if not credential then - log.error("failed to find credential.") + log.error_with({ hub_logs = true }, "failed to find credential.") device:offline() return end + driver.device_manager.set_zone_info_to_latest_state(driver, device) + log.trace(string.format("Creating device monitoring for %s", device.device_network_id)) create_monitoring_thread(driver, device, device_info) - update_connection(driver, device, device_ip, device_info) - driver.device_manager.set_zone_info_to_latest_state(driver, device) + update_connection(driver, device, device_ip, device_info) do_refresh(driver, device, nil) - device:set_field(fields._INIT, true, { persist = false }) end local function device_info_changed(driver, device, event, args) @@ -210,8 +215,6 @@ local lan_driver = Driver("aqara-fp2", [capabilities.refresh.commands.refresh.NAME] = do_refresh, }, [multipleZonePresence.id] = { - [multipleZonePresence.commands.createZone.name] = multipleZonePresence.commands.createZone.handler, - [multipleZonePresence.commands.deleteZone.name] = multipleZonePresence.commands.deleteZone.handler, [multipleZonePresence.commands.updateZoneName.name] = multipleZonePresence.commands.updateZoneName.handler, } }, diff --git a/drivers/Aqara/aqara-presence-sensor/src/lunchbox/rest.lua b/drivers/Aqara/aqara-presence-sensor/src/lunchbox/rest.lua index e79507ef73..dec3a28a37 100644 --- a/drivers/Aqara/aqara-presence-sensor/src/lunchbox/rest.lua +++ b/drivers/Aqara/aqara-presence-sensor/src/lunchbox/rest.lua @@ -182,6 +182,7 @@ local function handle_response(sock) if api_version >= 9 then local response, err = Response.tcp_source(sock) if err or (not response) then return response, (err or "unknown error") end + if response.status == 403 then return response, "403 Forbidden" end return response, response:fill_body() end -- called select right before passing in so we receive immediately diff --git a/drivers/Aqara/aqara-presence-sensor/src/lunchbox/sse/eventsource.lua b/drivers/Aqara/aqara-presence-sensor/src/lunchbox/sse/eventsource.lua index 0b5244bcd1..5afc79fc98 100644 --- a/drivers/Aqara/aqara-presence-sensor/src/lunchbox/sse/eventsource.lua +++ b/drivers/Aqara/aqara-presence-sensor/src/lunchbox/sse/eventsource.lua @@ -343,8 +343,10 @@ local function open_action(source) return else --- real error, close the connection. - source._sock:close() - source._sock = nil + if source._sock ~= nil then + source._sock:close() + source._sock = nil + end source.ready_state = EventSource.ReadyStates.CLOSED return nil, err, partial end @@ -360,8 +362,10 @@ local function open_action(source) return else --- real error, close the connection. - source._sock:close() - source._sock = nil + if source._sock ~= nil then + source._sock:close() + source._sock = nil + end source.ready_state = EventSource.ReadyStates.CLOSED return nil, err, partial end @@ -373,8 +377,10 @@ local function open_action(source) return else --- real error, close the connection. - source._sock:close() - source._sock = nil + if source._sock ~= nil then + source._sock:close() + source._sock = nil + end source.ready_state = EventSource.ReadyStates.CLOSED return nil, err, partial end From 714c1ed23cda2c323a198625bcf97ce0c98abf67 Mon Sep 17 00:00:00 2001 From: iris-wy Date: Mon, 2 Dec 2024 22:11:42 +0800 Subject: [PATCH 02/13] Add Zemismart ZM25C multiple language support (#1765) --- tools/localizations/cn.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/localizations/cn.csv b/tools/localizations/cn.csv index 87378d7013..2f51db2f6e 100644 --- a/tools/localizations/cn.csv +++ b/tools/localizations/cn.csv @@ -79,3 +79,4 @@ Aqara Wireless Mini Switch T1,Aqara 无线开关 T1 "WallHero Switch (8 Way)",八位智能开关/场景面板 "WallHero Outlet",智能墙面五孔插座 "WallHero Remote Control (4-Inch)",语音场景(4寸)面板 +"Zemismart ZM25C Smart Curtain",Zemismart ZM25C 智能窗帘 From f1502823a959d9a6ba406d4b5966b755eaae730f Mon Sep 17 00:00:00 2001 From: iris-wy Date: Mon, 2 Dec 2024 22:12:22 +0800 Subject: [PATCH 03/13] Add Zemismart ZM25C Curtain Motor (#1750) Signed-off-by: ying21-wang --- drivers/SmartThings/matter-window-covering/fingerprints.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/SmartThings/matter-window-covering/fingerprints.yml b/drivers/SmartThings/matter-window-covering/fingerprints.yml index 94b51d1c76..59aa93e896 100644 --- a/drivers/SmartThings/matter-window-covering/fingerprints.yml +++ b/drivers/SmartThings/matter-window-covering/fingerprints.yml @@ -26,6 +26,11 @@ matterManufacturer: vendorId: 0x139C productId: 0xFF15 deviceProfileName: window-covering + - id: "5020/64017" + deviceLabel: Zemismart ZM25C Smart Curtain + vendorId: 0x139C + productId: 0xFA11 + deviceProfileName: window-covering matterGeneric: - id: "windowcovering" deviceLabel: Matter Window Covering From deb0ebe80952d96cd18d327d692f8c3ca9a02017 Mon Sep 17 00:00:00 2001 From: SiHAS <71238736+shinasys@users.noreply.github.com> Date: Tue, 3 Dec 2024 12:43:36 +0900 Subject: [PATCH 04/13] Add shinasystem's full buttons switch for wwst (#1748) - SQM300Z4, SQM300Z6 --- drivers/SmartThings/zigbee-switch/fingerprints.yml | 10 ++++++++++ .../zigbee-switch/src/multi-switch-no-master/init.lua | 2 ++ 2 files changed, 12 insertions(+) diff --git a/drivers/SmartThings/zigbee-switch/fingerprints.yml b/drivers/SmartThings/zigbee-switch/fingerprints.yml index ffd5c26971..bedbc33b91 100644 --- a/drivers/SmartThings/zigbee-switch/fingerprints.yml +++ b/drivers/SmartThings/zigbee-switch/fingerprints.yml @@ -1120,6 +1120,16 @@ zigbeeManufacturer: manufacturer: ShinaSystem model: SQM300Z3 deviceProfileName: basic-switch + - id: ShinaSystem/SQM300Z4 + deviceLabel: SiHAS Switch 1 + manufacturer: ShinaSystem + model: SQM300Z4 + deviceProfileName: basic-switch + - id: ShinaSystem/SQM300Z6 + deviceLabel: SiHAS Switch 1 + manufacturer: ShinaSystem + model: SQM300Z6 + deviceProfileName: basic-switch - id: Samsung/SAMSUNG-ITM-Z-002 deviceLabel: Samsung Light manufacturer: Samsung Electronics diff --git a/drivers/SmartThings/zigbee-switch/src/multi-switch-no-master/init.lua b/drivers/SmartThings/zigbee-switch/src/multi-switch-no-master/init.lua index 98317c0e73..e39be7593f 100644 --- a/drivers/SmartThings/zigbee-switch/src/multi-switch-no-master/init.lua +++ b/drivers/SmartThings/zigbee-switch/src/multi-switch-no-master/init.lua @@ -48,6 +48,8 @@ local MULTI_SWITCH_NO_MASTER_FINGERPRINTS = { { mfr = "ShinaSystem", model = "SBM300Z6", children = 5 }, { mfr = "ShinaSystem", model = "SQM300Z2", children = 1 }, { mfr = "ShinaSystem", model = "SQM300Z3", children = 2 }, + { mfr = "ShinaSystem", model = "SQM300Z4", children = 3 }, + { mfr = "ShinaSystem", model = "SQM300Z6", children = 5 }, { model = "E220-KR2N0Z0-HA", children = 1 }, { model = "E220-KR3N0Z0-HA", children = 2 }, { model = "E220-KR4N0Z0-HA", children = 3 }, From 24b56fc8f0de4cecf1467f94ab7c453190e904dd Mon Sep 17 00:00:00 2001 From: Alissa Dornbos <79465613+lelandblue@users.noreply.github.com> Date: Tue, 3 Dec 2024 11:00:49 -0500 Subject: [PATCH 05/13] New Device (Matter Switch) Cync Reveal Full Color A21 (#1788) * new-device-cync-A21 * Update device label to A21 * Update decimal number for "id:" --- drivers/SmartThings/matter-switch/fingerprints.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/SmartThings/matter-switch/fingerprints.yml b/drivers/SmartThings/matter-switch/fingerprints.yml index 9128f5c002..505315350a 100644 --- a/drivers/SmartThings/matter-switch/fingerprints.yml +++ b/drivers/SmartThings/matter-switch/fingerprints.yml @@ -165,6 +165,11 @@ matterManufacturer: vendorId: 0x1339 productId: 0x007B deviceProfileName: light-color-level-2000K-7000K + - id: "4921/109" + deviceLabel: Cync Reveal Full Color A21 + vendorId: 0x1339 + productId: 0x006D + deviceProfileName: light-color-level-2000K-7000K - id: "4921/111" deviceLabel: Cync Outdoor Plug vendorId: 0x1339 From deffe7be55f7cbfd66bca8803d76a13ec8c41e8d Mon Sep 17 00:00:00 2001 From: FrankSpringfield Date: Wed, 4 Dec 2024 23:12:39 +0800 Subject: [PATCH 06/13] Add fingerprints for TOTEM S50V/S93/W31V and sort fingerprints for TOTEM alphabetically (#1775) * Add fingerprints for TOTEM S50V/S93/W31V Signed-off-by: frank-huang * Sort fingerprints for TOTEM alphabetically Signed-off-by: frank-huang --------- Signed-off-by: frank-huang --- .../SmartThings/zigbee-lock/fingerprints.yml | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/drivers/SmartThings/zigbee-lock/fingerprints.yml b/drivers/SmartThings/zigbee-lock/fingerprints.yml index aa93618497..00e8dd0f51 100644 --- a/drivers/SmartThings/zigbee-lock/fingerprints.yml +++ b/drivers/SmartThings/zigbee-lock/fingerprints.yml @@ -145,6 +145,16 @@ zigbeeManufacturer: manufacturer: TOTEM model: P30 deviceProfileName: lock-battery + - id: TOTEM/P70 + deviceLabel: TOTEM Door Lock + manufacturer: TOTEM + model: P70 + deviceProfileName: lock-battery + - id: TOTEM/P90 + deviceLabel: TOTEM Door Lock + manufacturer: TOTEM + model: P90 + deviceProfileName: lock-battery - id: TOTEM/Q30 deviceLabel: TOTEM Door Lock manufacturer: TOTEM @@ -165,15 +175,20 @@ zigbeeManufacturer: manufacturer: TOTEM model: R71 deviceProfileName: lock-battery - - id: TOTEM/P70 + - id: TOTEM/S50V deviceLabel: TOTEM Door Lock manufacturer: TOTEM - model: P70 + model: S50V deviceProfileName: lock-battery - - id: TOTEM/P90 + - id: TOTEM/S93 deviceLabel: TOTEM Door Lock manufacturer: TOTEM - model: P90 + model: S93 + deviceProfileName: lock-battery + - id: TOTEM/W31V + deviceLabel: TOTEM Door Lock + manufacturer: TOTEM + model: W31V deviceProfileName: lock-battery zigbeeGeneric: - id: "genericLock" From 4e70ee68050173f7c42d23c2eee033b3c5036a60 Mon Sep 17 00:00:00 2001 From: Alissa Dornbos <79465613+lelandblue@users.noreply.github.com> Date: Wed, 4 Dec 2024 16:23:18 -0500 Subject: [PATCH 07/13] New Devices (Matter Switch + Matter Sensor) 1 Heiman Co Sensor and 2 Zemismart Devices (#1794) * new-devices-Zemismart-Heiman * Adding fingerprint --- drivers/SmartThings/matter-sensor/fingerprints.yml | 5 +++++ drivers/SmartThings/matter-switch/fingerprints.yml | 10 ++++++++++ 2 files changed, 15 insertions(+) diff --git a/drivers/SmartThings/matter-sensor/fingerprints.yml b/drivers/SmartThings/matter-sensor/fingerprints.yml index b270332b6d..7e4a3ae4b6 100644 --- a/drivers/SmartThings/matter-sensor/fingerprints.yml +++ b/drivers/SmartThings/matter-sensor/fingerprints.yml @@ -58,6 +58,11 @@ matterManufacturer: vendorId: 0x120B productId: 0x1003 deviceProfileName: smoke + - id: "4619/4103" + deviceLabel: Smart co sensor + vendorId: 0x120B + productId: 0x1007 + deviceProfileName: co # Legrand - id: "Legrand/Netatmo/Smart-2-in-1-Sensor" deviceLabel: Netatmo Smart 2-in-1 Sensor diff --git a/drivers/SmartThings/matter-switch/fingerprints.yml b/drivers/SmartThings/matter-switch/fingerprints.yml index 505315350a..6d0e8a3f62 100644 --- a/drivers/SmartThings/matter-switch/fingerprints.yml +++ b/drivers/SmartThings/matter-switch/fingerprints.yml @@ -2384,6 +2384,11 @@ matterManufacturer: vendorId: 0x139C productId: 0xD003 deviceProfileName: light-color-level + - id: "5020/43784" + deviceLabel: Zemismart WiFi Smart Switch + vendorId: 0x139C + productId: 0xAB08 + deviceProfileName: switch-binary - id: "5020/43825" deviceLabel: Zemismart WiFi Smart Switch vendorId: 0x139C @@ -2399,6 +2404,11 @@ matterManufacturer: vendorId: 0x139C productId: 0xAB01 deviceProfileName: switch-binary + - id: "5020/43843" + deviceLabel: Zemismart WiFi Smart Switch + vendorId: 0x139C + productId: 0xAB43 + deviceProfileName: switch-binary #TUO - id: "5150/1" deviceLabel: "TUO Smart Button" From 7e5692e8c8d7a25fd106922c081718873bcdb459 Mon Sep 17 00:00:00 2001 From: hdlee27 <54927573+hdlee27@users.noreply.github.com> Date: Thu, 5 Dec 2024 23:04:25 +0900 Subject: [PATCH 08/13] fp2: copy additional header (#1793) Signed-off-by: hdlee27 <54927573+hdlee27@users.noreply.github.com> --- drivers/Aqara/aqara-presence-sensor/src/fp2/api.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/Aqara/aqara-presence-sensor/src/fp2/api.lua b/drivers/Aqara/aqara-presence-sensor/src/fp2/api.lua index 4f27a277a3..e6c620be3f 100644 --- a/drivers/Aqara/aqara-presence-sensor/src/fp2/api.lua +++ b/drivers/Aqara/aqara-presence-sensor/src/fp2/api.lua @@ -2,6 +2,7 @@ local log = require "log" local json = require "st.json" local RestClient = require "lunchbox.rest" local utils = require "utils" +local st_utils = require "st.utils" local fp2_api = {} fp2_api.__index = fp2_api @@ -48,7 +49,7 @@ function fp2_api.new_device_manager(device_ip, bridge_info, socket_builder) return setmetatable( { - headers = ADDITIONAL_HEADERS, + headers = st_utils.deep_copy(ADDITIONAL_HEADERS), socket_builder = socket_builder, base_url = base_url, }, fp2_api From 85eb756feab58a77af3c0a7a6bb4a68048e7c998 Mon Sep 17 00:00:00 2001 From: iris-wy Date: Thu, 5 Dec 2024 22:55:25 +0800 Subject: [PATCH 09/13] Add Zemismart ZM02 multiple language support (#1785) Co-authored-by: Alissa Dornbos <79465613+lelandblue@users.noreply.github.com> --- tools/localizations/cn.csv | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/localizations/cn.csv b/tools/localizations/cn.csv index 2f51db2f6e..fe9cf9d27e 100644 --- a/tools/localizations/cn.csv +++ b/tools/localizations/cn.csv @@ -79,4 +79,6 @@ Aqara Wireless Mini Switch T1,Aqara 无线开关 T1 "WallHero Switch (8 Way)",八位智能开关/场景面板 "WallHero Outlet",智能墙面五孔插座 "WallHero Remote Control (4-Inch)",语音场景(4寸)面板 +"Zemismart ZM02 Smart Curtain",Zemismart ZM02 智能窗帘 "Zemismart ZM25C Smart Curtain",Zemismart ZM25C 智能窗帘 + From 25b8e0ca376b4e40e67623a0c3ba3b6c8ed7ed08 Mon Sep 17 00:00:00 2001 From: iris-wy Date: Thu, 5 Dec 2024 22:55:47 +0800 Subject: [PATCH 10/13] Add Zemismart Zm02 Curtian Motor (#1784) * Add Zemismart Zm02 Curtian Motor * Update drivers/SmartThings/matter-window-covering/fingerprints.yml Co-authored-by: Khenon Walker <71702963+wkhenon@users.noreply.github.com> --------- Co-authored-by: Alissa Dornbos <79465613+lelandblue@users.noreply.github.com> Co-authored-by: Khenon Walker <71702963+wkhenon@users.noreply.github.com> --- drivers/SmartThings/matter-window-covering/fingerprints.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/SmartThings/matter-window-covering/fingerprints.yml b/drivers/SmartThings/matter-window-covering/fingerprints.yml index 59aa93e896..016f92af31 100644 --- a/drivers/SmartThings/matter-window-covering/fingerprints.yml +++ b/drivers/SmartThings/matter-window-covering/fingerprints.yml @@ -26,6 +26,11 @@ matterManufacturer: vendorId: 0x139C productId: 0xFF15 deviceProfileName: window-covering + - id: "5020/64050" + deviceLabel: Zemismart ZM02 Smart Curtain + vendorId: 0x139C + productId: 0xFA32 + deviceProfileName: window-covering - id: "5020/64017" deviceLabel: Zemismart ZM25C Smart Curtain vendorId: 0x139C From 4c8d92ebfad560a03cb1d4ab937ba1676313518a Mon Sep 17 00:00:00 2001 From: Alissa Dornbos <79465613+lelandblue@users.noreply.github.com> Date: Thu, 5 Dec 2024 11:35:19 -0500 Subject: [PATCH 11/13] new-devices-Aqara-T2-bulbs (#1781) --- drivers/SmartThings/matter-switch/fingerprints.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/SmartThings/matter-switch/fingerprints.yml b/drivers/SmartThings/matter-switch/fingerprints.yml index 6d0e8a3f62..a622bcc142 100644 --- a/drivers/SmartThings/matter-switch/fingerprints.yml +++ b/drivers/SmartThings/matter-switch/fingerprints.yml @@ -1,4 +1,15 @@ matterManufacturer: +#Aqara + - id: "4447/6145" + deviceLabel: Aqara LED Bulb T2 RGB CCT + vendorId: 0x115F + productId: 0x1801 + deviceProfileName: light-color-level + - id: "4447/6146" + deviceLabel: Aqara LED Bulb T2 CCT + vendorId: 0x115F + productId: 0x1802 + deviceProfileName: light-level-colorTemperature-2700K-6500K #Chengdu - id: "5218/8197" deviceLabel: Magic Cube DS001 From 0e5ee42b8e3dc4696ad7f3c4b25c0d88e46f1a32 Mon Sep 17 00:00:00 2001 From: nickolas-deboom <158304111+nickolas-deboom@users.noreply.github.com> Date: Mon, 9 Dec 2024 12:58:10 -0600 Subject: [PATCH 12/13] Adding profile for plug/button device (#1806) --- .../matter-switch/profiles/plug-button.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 drivers/SmartThings/matter-switch/profiles/plug-button.yml diff --git a/drivers/SmartThings/matter-switch/profiles/plug-button.yml b/drivers/SmartThings/matter-switch/profiles/plug-button.yml new file mode 100644 index 0000000000..0f9e8b1b56 --- /dev/null +++ b/drivers/SmartThings/matter-switch/profiles/plug-button.yml @@ -0,0 +1,18 @@ +name: plug-button +components: + - id: main + capabilities: + - id: switch + version: 1 + - id: firmwareUpdate + version: 1 + - id: refresh + version: 1 + categories: + - name: SmartPlug + - id: button + capabilities: + - id: button + version: 1 + categories: + - name: RemoteController From 326a4e093b3e0cd4f8815f9c0c26b9e814791b76 Mon Sep 17 00:00:00 2001 From: Steven Green Date: Mon, 9 Dec 2024 11:19:33 -0800 Subject: [PATCH 13/13] Translation: make translation deploy tolerant of extra newlines --- tools/deploy.py | 13 +++++++------ tools/localizations/cn.csv | 3 +-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/tools/deploy.py b/tools/deploy.py index 6e980a23de..5cc47a9c0b 100644 --- a/tools/deploy.py +++ b/tools/deploy.py @@ -49,12 +49,13 @@ with open(localization_file) as csvfile: reader = csv.reader(csvfile) for row in reader: - print("en: "+row[0]+" "+LOCALE+": "+row[1]) - subprocess.run( - "find . -name 'fingerprints.yml' | xargs sed -i -E 's/deviceLabel ?: \"?"+row[0].translate(slash_escape)+"\"?/deviceLabel: "+row[1].translate(slash_escape)+"/g'", - shell=True, - cwd=os.path.dirname(current_path) - ) + if len(row) > 1: + print("en: "+row[0]+" "+LOCALE+": "+row[1]) + subprocess.run( + "find . -name 'fingerprints.yml' | xargs sed -i -E 's/deviceLabel ?: \"?"+row[0].translate(slash_escape)+"\"?/deviceLabel: "+row[1].translate(slash_escape)+"/g'", + shell=True, + cwd=os.path.dirname(current_path) + ) subprocess.run("git status", shell=True) diff --git a/tools/localizations/cn.csv b/tools/localizations/cn.csv index fe9cf9d27e..59c6705447 100644 --- a/tools/localizations/cn.csv +++ b/tools/localizations/cn.csv @@ -80,5 +80,4 @@ Aqara Wireless Mini Switch T1,Aqara 无线开关 T1 "WallHero Outlet",智能墙面五孔插座 "WallHero Remote Control (4-Inch)",语音场景(4寸)面板 "Zemismart ZM02 Smart Curtain",Zemismart ZM02 智能窗帘 -"Zemismart ZM25C Smart Curtain",Zemismart ZM25C 智能窗帘 - +"Zemismart ZM25C Smart Curtain",Zemismart ZM25C 智能窗帘 \ No newline at end of file