diff --git a/drivers/Aqara/aqara-lock/src/init.lua b/drivers/Aqara/aqara-lock/src/init.lua index 43d09967c4..af3b18a266 100644 --- a/drivers/Aqara/aqara-lock/src/init.lua +++ b/drivers/Aqara/aqara-lock/src/init.lua @@ -68,6 +68,9 @@ local function device_init(self, device) LockAlarm.supportedAlarmValues(SUPPORTED_ALARM_VALUES, { visibility = { displayed = false } }) ) end + device:emit_event(capabilities.lock.supportedUnlockDirections({"fromInside", "fromOutside"}, {visibility = {displayed = false}})) + device:emit_event(capabilities.battery.type("AA")) + device:emit_event(capabilities.battery.quantity(8)) end local function device_added(self, device) @@ -107,23 +110,33 @@ local function event_lock_handler(driver, device, evt_name, evt_value) end end -local function event_unlock_handler(driver, device, evt_name, evt_value) - local id, label - if evt_name == METHOD.RF447 then - evt_name = nil - id = nil - label = nil - elseif evt_name == METHOD.BLUETOOTH and evt_value == 2 then - evt_name = nil - id = nil - label = nil - elseif evt_value == 0x80020000 then -- one-time password - id = "OTP_STANDALONE" - label = nil - else - id, label = credential_utils.find_userLabel(driver, device, evt_value) - end - device:emit_event(Lock.lock.unlocked({ data = { method = evt_name, codeId = id, codeName = label } })) +local function event_unlock_indoor_handler(driver, device, evt_name, evt_value) + device:emit_event(Lock.lock.unlocked({ data = { method = evt_name, codeId = nil, codeName = nil, unlockDirection = "fromInside" } })) + device:emit_event(remoteControlStatus.remoteControlEnabled('false', { visibility = { displayed = false } })) + device:emit_event(LockAlarm.alarm.clear({ visibility = { displayed = false }})) +end + +local function event_unlock_outdoor_handler(driver, device, evt_name, evt_value) + local id, label = credential_utils.find_userLabel(driver, device, evt_value) + device:emit_event(Lock.lock.unlocked({ data = { method = evt_name, codeId = id, codeName = label, unlockDirection = "fromOutside" } })) + device:emit_event(remoteControlStatus.remoteControlEnabled('false', { visibility = { displayed = false } })) + device:emit_event(LockAlarm.alarm.clear({ visibility = { displayed = false }})) +end + +local function event_unlock_rf447_handler(driver, device, evt_name, evt_value) + device:emit_event(Lock.lock.unlocked({ data = { method = evt_name, codeId = nil, codeName = nil, unlockDirection = nil } })) + device:emit_event(remoteControlStatus.remoteControlEnabled('false', { visibility = { displayed = false } })) + device:emit_event(LockAlarm.alarm.clear({ visibility = { displayed = false }})) +end + +local function event_unlock_remote_handler(driver, device, evt_name, evt_value) + device:emit_event(Lock.lock.unlocked({ data = { method = evt_name, codeId = nil, codeName = nil, unlockDirection = nil } })) + device:emit_event(remoteControlStatus.remoteControlEnabled('false', { visibility = { displayed = false } })) + device:emit_event(LockAlarm.alarm.clear({ visibility = { displayed = false }})) +end + +local function event_unlock_otp_handler(driver, device, evt_name, evt_value) + device:emit_event(Lock.lock.unlocked({ data = { method = evt_name, codeId = "OTP_STANDALONE", codeName = nil, unlockDirection = "fromOutside" } })) device:emit_event(remoteControlStatus.remoteControlEnabled('false', { visibility = { displayed = false } })) device:emit_event(LockAlarm.alarm.clear({ visibility = { displayed = false }})) end @@ -163,16 +176,16 @@ end local resource_id = { ["13.31.85"] = { event_name = METHOD.LOCKED, event_handler = event_lock_handler }, + ["13.48.85"] = { event_name = METHOD.MANUAL, event_handler = event_unlock_indoor_handler }, + ["13.51.85"] = { event_name = METHOD.MANUAL, event_handler = event_unlock_indoor_handler }, + ["13.42.85"] = { event_name = METHOD.FINGERPRINT, event_handler = event_unlock_outdoor_handler }, + ["13.43.85"] = { event_name = METHOD.KEYPAD, event_handler = event_unlock_outdoor_handler }, + ["13.44.85"] = { event_name = METHOD.RFID, event_handler = event_unlock_outdoor_handler }, + ["13.151.85"] = { event_name = METHOD.RF447, event_handler = event_unlock_rf447_handler }, + ["13.45.85"] = { event_name = METHOD.BLUETOOTH, event_handler = event_unlock_remote_handler }, + ["13.90.85"] = { event_name = METHOD.COMMAND, event_handler = event_unlock_remote_handler }, + ["13.46.85"] = { event_name = METHOD.KEYPAD, event_handler = event_unlock_otp_handler }, ["13.17.85"] = { event_name = METHOD.NO_USE, event_handler = event_door_handler }, - ["13.48.85"] = { event_name = METHOD.MANUAL, event_handler = event_unlock_handler }, - ["13.51.85"] = { event_name = METHOD.MANUAL, event_handler = event_unlock_handler }, - ["13.42.85"] = { event_name = METHOD.FINGERPRINT, event_handler = event_unlock_handler }, - ["13.43.85"] = { event_name = METHOD.KEYPAD, event_handler = event_unlock_handler }, - ["13.44.85"] = { event_name = METHOD.RFID, event_handler = event_unlock_handler }, - ["13.151.85"] = { event_name = METHOD.RF447, event_handler = event_unlock_handler }, - ["13.45.85"] = { event_name = METHOD.BLUETOOTH, event_handler = event_unlock_handler }, - ["13.90.85"] = { event_name = METHOD.COMMAND, event_handler = event_unlock_handler }, - ["13.46.85"] = { event_name = METHOD.KEYPAD, event_handler = event_unlock_handler }, ["13.56.85"] = { event_name = METHOD.NO_USE, event_handler = event_battery_handler }, ["13.32.85"] = { event_name = METHOD.NO_USE, event_handler = event_abnormal_status_handler }, ["13.33.85"] = { event_name = METHOD.NO_USE, event_handler = event_anti_lock_handler }, diff --git a/drivers/Aqara/aqara-lock/src/test/test_aqara_lock.lua b/drivers/Aqara/aqara-lock/src/test/test_aqara_lock.lua index d53dcc1759..f127a16d0c 100644 --- a/drivers/Aqara/aqara-lock/src/test/test_aqara_lock.lua +++ b/drivers/Aqara/aqara-lock/src/test/test_aqara_lock.lua @@ -42,6 +42,10 @@ local function test_init() "highTemperature", "attemptsExceeded" } test.socket.capability:__expect_send(mock_device:generate_test_message("main", lockAlarm.supportedAlarmValues(SUPPORTED_ALARM_VALUES, { visibility = { displayed = false } }))) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", + Lock.supportedUnlockDirections({"fromInside", "fromOutside"}, { visibility = { displayed = false } }))) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", Battery.type("AA"))) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", Battery.quantity(8))) test.mock_device.add_test_device(mock_device) end test.set_test_init_function(test_init)