diff --git a/drivers/Aqara/aqara-lock/src/credential_utils.lua b/drivers/Aqara/aqara-lock/src/credential_utils.lua index 5725d5f55a..7f3e07df18 100644 --- a/drivers/Aqara/aqara-lock/src/credential_utils.lua +++ b/drivers/Aqara/aqara-lock/src/credential_utils.lua @@ -6,6 +6,29 @@ local lockCredentialInfo = capabilities["stse.lockCredentialInfo"] local credential_utils = {} local HOST_COUNT = "__host_count" +local PERSIST_DATA = "__persist_area" + +credential_utils.attrCopy = function(table) + local copy = {} + for key, value in pairs(table) do + copy[key] = utils.deep_copy(value) + end + return copy +end + +credential_utils.backup_data = function(device)-- Back up data the persistent + local credentialInfoTable = utils.deep_copy(device:get_latest_state("main", lockCredentialInfo.ID, + lockCredentialInfo.credentialInfo.NAME, {})) + local backupData = credential_utils.attrCopy(credentialInfoTable) + device:set_field(PERSIST_DATA, backupData, { persist = true }) +end + +credential_utils.sync = function(driver, device) + local credentialInfoTable = device:get_field(PERSIST_DATA) + if credentialInfoTable ~= nil then + device:emit_event(lockCredentialInfo.credentialInfo(credentialInfoTable, { visibility = { displayed = false } })) + end +end credential_utils.save_data = function(driver) driver.datastore:save() @@ -29,6 +52,7 @@ credential_utils.update_remote_control_status = function(driver, device, added) device:set_field(HOST_COUNT, host_cnt, { persist = true }) credential_utils.save_data(driver) + credential_utils.backup_data(device) end credential_utils.sync_all_credential_info = function(driver, device, command) @@ -39,6 +63,7 @@ credential_utils.sync_all_credential_info = function(driver, device, command) end device:emit_event(lockCredentialInfo.credentialInfo(command.args.credentialInfo, { visibility = { displayed = false } })) credential_utils.save_data(driver) + credential_utils.backup_data(device) end credential_utils.upsert_credential_info = function(driver, device, command) @@ -71,9 +96,10 @@ credential_utils.upsert_credential_info = function(driver, device, command) if credential_utils.is_exist_host(device) == false then credential_utils.update_remote_control_status(driver, device, true) end - + device:emit_event(lockCredentialInfo.credentialInfo(credentialInfoTable, { visibility = { displayed = false } })) credential_utils.save_data(driver) + credential_utils.backup_data(device) end credential_utils.delete_user = function(driver, device, command) @@ -96,6 +122,7 @@ credential_utils.delete_user = function(driver, device, command) device:emit_event(lockCredentialInfo.credentialInfo(credentialInfoTable, { visibility = { displayed = false } })) credential_utils.save_data(driver) + credential_utils.backup_data(device) end credential_utils.delete_credential = function(driver, device, command) @@ -117,6 +144,7 @@ credential_utils.delete_credential = function(driver, device, command) device:emit_event(lockCredentialInfo.credentialInfo(credentialInfoTable, { visibility = { displayed = false } })) credential_utils.save_data(driver) + credential_utils.backup_data(device) end credential_utils.find_userLabel = function(driver, device, value) diff --git a/drivers/Aqara/aqara-lock/src/init.lua b/drivers/Aqara/aqara-lock/src/init.lua index e9eb32c9b4..9afe6bb77e 100644 --- a/drivers/Aqara/aqara-lock/src/init.lua +++ b/drivers/Aqara/aqara-lock/src/init.lua @@ -86,6 +86,7 @@ local function device_init(self, device) end device:emit_event(capabilities.battery.quantity(battery_quantity)) device:emit_event(capabilities.batteryLevel.quantity(battery_quantity)) + credential_utils.sync(self, device) end local function device_added(self, device)