Skip to content

Commit

Permalink
Merge branch 'main' into matter-thermostat-profile-testing
Browse files Browse the repository at this point in the history
  • Loading branch information
ctowns committed Jun 18, 2024
2 parents 91cc45c + d8fb2e1 commit d562f52
Show file tree
Hide file tree
Showing 42 changed files with 522 additions and 81 deletions.
22 changes: 22 additions & 0 deletions drivers/Aqara/aqara-lock/capabilities/antiLockStatus.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
id: stse.antiLockStatus
version: 1
status: proposed
name: Anti lock status
ephemeral: false
attributes:
antiLockStatus:
schema:
type: object
properties:
value:
title: Anti-Lock status
type: string
enum:
- "enabled"
- "disabled"
- "unknown"
additionalProperties: false
required:
- value
enumCommands: []
commands: {}
27 changes: 27 additions & 0 deletions drivers/Aqara/aqara-lock/capabilities/lockAlarm.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
id: lockAlarm
version: 1
status: proposed
name: Lock Alarm
ephemeral: false
attributes:
alarm:
schema:
type: object
properties:
value:
type: string
enum:
- clear
- lockFactoryReset
- damaged
- forcedOpeningAttempt
- unableToLockTheDoor
- notClosedForALongTime
- highTemperature
- attemptsExceeded
- physicalImpact
additionalProperties: false
required:
- value
enumCommands: []
commands: {}
4 changes: 3 additions & 1 deletion drivers/Aqara/aqara-lock/profiles/aqara-lock-battery.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,16 @@ components:
version: 1
- id: battery
version: 1
- id: tamperAlert
- id: lockAlarm
version: 1
- id: remoteControlStatus
version: 1
- id: firmwareUpdate
version: 1
- id: stse.lockCredentialInfo
version: 1
- id: stse.antiLockStatus
version: 1
categories:
- name: SmartLock
metadata:
Expand Down
53 changes: 38 additions & 15 deletions drivers/Aqara/aqara-lock/src/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,10 @@ local utils = require "st.utils"

local remoteControlStatus = capabilities.remoteControlStatus
local lockCredentialInfo = capabilities["stse.lockCredentialInfo"]
local antiLockStatus = capabilities["stse.antiLockStatus"]
local Battery = capabilities.battery
local Lock = capabilities.lock
local TamperAlert = capabilities.tamperAlert
local LockAlarm = capabilities.lockAlarm

local PRI_CLU = 0xFCC0
local PRI_ATTR = 0xFFF3
Expand Down Expand Up @@ -53,7 +54,8 @@ end
local function device_added(self, device)
remoteControlShow(device)
device:emit_event(Battery.battery(100))
device:emit_event(TamperAlert.tamper.clear({ visibility = { displayed = false } }))
device:emit_event(LockAlarm.alarm.clear({ visibility = { displayed = false } }))
device:emit_event(antiLockStatus.antiLockStatus("unknown", { visibility = {displayed = false}}))
device:emit_event(Lock.lock.locked())
credential_utils.save_data(self)
end
Expand All @@ -67,41 +69,60 @@ local function toHex(value, length)
end

local function event_lock_handler(driver, device, evt_name, evt_value)
if evt_value == 1 then
if evt_value == 0x1 then
device:emit_event(Lock.lock(evt_name))
device:emit_event(TamperAlert.tamper.clear())
device:emit_event(LockAlarm.alarm.clear({ visibility = { displayed = false }}))
remoteControlShow(device)
end
end

local function event_unlock_handler(driver, device, evt_name, evt_value)
local id, label
if 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 } }))
device:emit_event(remoteControlStatus.remoteControlEnabled('false', { visibility = { displayed = false } }))
device:emit_event(TamperAlert.tamper.clear())
device:emit_event(LockAlarm.alarm.clear({ visibility = { displayed = false }}))
end

local function event_door_handler(driver, device, evt_name, evt_value)
if evt_value == 2 then
device:emit_event(Lock.lock(evt_name))
device:emit_event(TamperAlert.tamper.clear())
elseif evt_value == 4 then
device:emit_event(TamperAlert.tamper.detected())
if evt_value == 0x2 then
device:emit_event(LockAlarm.alarm.notClosedForALongTime())
elseif evt_value == 0x4 then
device:emit_event(LockAlarm.alarm.forcedOpeningAttempt())
end
end

local function event_battery_handler(driver, device, evt_name, evt_value)
device:emit_event(Battery.battery(evt_value))
end

local function event_tamper_alert_handler(driver, device, evt_name, evt_value)
device:emit_event(TamperAlert.tamper.detected())
local function event_abnormal_status_handler(driver, device, evt_name, evt_value)
if evt_value == 0xC0DE1006 then
device:emit_event(LockAlarm.alarm.highTemperature())
elseif evt_value == 0xC0DE000A then
device:emit_event(LockAlarm.alarm.attemptsExceeded({state_change = true}))
end
end

local function event_anti_lock_handler(driver, device, evt_name, evt_value)
local evt = "disabled"
if evt_value == 0x1 then evt = "enabled" end
device:emit_event(antiLockStatus.antiLockStatus(evt))
end
local function event_lock_status_handler(driver, device, evt_name, evt_value)
if evt_value == 0x1 then
device:emit_event(LockAlarm.alarm.unableToLockTheDoor())
elseif evt_value == 0xA then
device:emit_event(LockAlarm.alarm.damaged())
end
end
local METHOD = {
LOCKED = "locked",
NOT_FULLY_LOCKED = "not fully locked",
MANUAL = "manual",
FINGERPRINT = "fingerprint",
KEYPAD = "keypad",
Expand All @@ -113,7 +134,7 @@ local METHOD = {

local resource_id = {
["13.31.85"] = { event_name = METHOD.LOCKED, event_handler = event_lock_handler },
["13.17.85"] = { event_name = METHOD.NOT_FULLY_LOCKED, event_handler = event_door_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 },
Expand All @@ -123,7 +144,9 @@ local resource_id = {
["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_tamper_alert_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 },
["13.88.85"] = { event_name = METHOD.NO_USE, event_handler = event_lock_status_handler }
}

local function request_generate_shared_key(device)
Expand Down
13 changes: 10 additions & 3 deletions drivers/Aqara/aqara-lock/src/test/test_aqara_lock.lua
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,14 @@ local data_types = require "st.zigbee.data_types"
local zigbee_test_utils = require "integration_test.zigbee_test_utils"

local remoteControlStatus = capabilities.remoteControlStatus
local antiLockStatus = capabilities["stse.antiLockStatus"]
test.add_package_capability("antiLockStatus.yaml")
local lockCredentialInfo = capabilities["stse.lockCredentialInfo"]
test.add_package_capability("lockCredentialInfo.yaml")
local lockAlarm = capabilities["lockAlarm"]
test.add_package_capability("lockAlarm.yaml")
local Battery = capabilities.battery
local Lock = capabilities.lock
local TamperAlert = capabilities.tamperAlert

local PRI_CLU = 0xFCC0
local PRI_ATTR = 0xFFF3
Expand Down Expand Up @@ -49,7 +52,9 @@ test.register_coroutine_test(
remoteControlStatus.remoteControlEnabled('false', { visibility = { displayed = false } })))
test.socket.capability:__expect_send(mock_device:generate_test_message("main", Battery.battery(100)))
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
TamperAlert.tamper("clear", { visibility = { displayed = false } })))
lockAlarm.alarm.clear({ visibility = { displayed = false } })))
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
antiLockStatus.antiLockStatus('unknown', { visibility = { displayed = false } })))
test.socket.capability:__expect_send(mock_device:generate_test_message("main", Lock.lock("locked")))
end
)
Expand All @@ -64,7 +69,9 @@ test.register_coroutine_test(
remoteControlStatus.remoteControlEnabled('true', { visibility = { displayed = false } })))
test.socket.capability:__expect_send(mock_device:generate_test_message("main", Battery.battery(100)))
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
TamperAlert.tamper("clear", { visibility = { displayed = false } })))
lockAlarm.alarm.clear({ visibility = { displayed = false } })))
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
antiLockStatus.antiLockStatus('unknown', { visibility = { displayed = false } })))
test.socket.capability:__expect_send(mock_device:generate_test_message("main", Lock.lock("locked")))
end
)
Expand Down
4 changes: 2 additions & 2 deletions drivers/SmartThings/matter-appliance/src/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -247,8 +247,8 @@ local function handle_temperature_setpoint(driver, device, cmd)
return
end

local ENDPOINT = 1
device:send(clusters.TemperatureControl.commands.SetTemperature(device, ENDPOINT, utils.round(value * 100.0), nil))
local endpoint_id = device:component_to_endpoint(cmd.component)
device:send(clusters.TemperatureControl.commands.SetTemperature(device, endpoint_id, utils.round(value * 100.0), nil))
end

local matter_driver_template = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,10 +208,10 @@ local function handle_dishwasher_mode(driver, device, cmd)
device.log.info_with({ hub_logs = true },
string.format("handle_dishwasher_mode mode: %s", cmd.args.mode))

local ENDPOINT = 1
local endpoint_id = device:component_to_endpoint(cmd.component)
for i, mode in ipairs(dishwasherModeSupportedModes) do
if cmd.args.mode == mode then
device:send(clusters.DishwasherMode.commands.ChangeToMode(device, ENDPOINT, i - 1))
device:send(clusters.DishwasherMode.commands.ChangeToMode(device, endpoint_id, i - 1))
return
end
end
Expand All @@ -221,10 +221,10 @@ local function handle_temperature_level(driver, device, cmd)
device.log.info_with({ hub_logs = true },
string.format("handle_temperature_level: %s", cmd.args.temperatureLevel))

local ENDPOINT = 1
local endpoint_id = device:component_to_endpoint(cmd.component)
for i, tempLevel in ipairs(supportedTemperatureLevels) do
if cmd.args.temperatureLevel == tempLevel then
device:send(clusters.TemperatureControl.commands.SetTemperature(device, ENDPOINT, nil, i - 1))
device:send(clusters.TemperatureControl.commands.SetTemperature(device, endpoint_id, nil, i - 1))
return
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -220,10 +220,10 @@ local function handle_laundry_washer_mode(driver, device, cmd)
device.log.info_with({ hub_logs = true },
string.format("handle_laundry_washer_mode[%s] mode: %s", cmd.component, cmd.args.mode))

local ENDPOINT = 1
local endpoint_id = device:component_to_endpoint(cmd.component)
for i, mode in ipairs(laundryWasherModeSupportedModes) do
if cmd.args.mode == mode then
device:send(clusters.LaundryWasherMode.commands.ChangeToMode(device, ENDPOINT, i - 1))
device:send(clusters.LaundryWasherMode.commands.ChangeToMode(device, endpoint_id, i - 1))
return
end
end
Expand All @@ -233,10 +233,10 @@ local function handle_temperature_level(driver, device, cmd)
device.log.info_with({ hub_logs = true },
string.format("handle_temperature_level: %s", cmd.args.temperatureLevel))

local ENDPOINT = 1
local endpoint_id = device:component_to_endpoint(cmd.component)
for i, tempLevel in ipairs(supportedTemperatureLevels) do
if cmd.args.temperatureLevel == tempLevel then
device:send(clusters.TemperatureControl.commands.SetTemperature(device, ENDPOINT, nil, i - 1))
device:send(clusters.TemperatureControl.commands.SetTemperature(device, endpoint_id, nil, i - 1))
return
end
end
Expand All @@ -246,10 +246,10 @@ local function handle_laundry_washer_spin_speed(driver, device, cmd)
device.log.info_with({ hub_logs = true },
string.format("handle_laundry_washer_spin_speed spinSpeed: %s", cmd.args.spinSpeed))

local ENDPOINT = 1
local endpoint_id = device:component_to_endpoint(cmd.component)
for i, spinSpeed in ipairs(laundryWasherControlsSpinSpeeds) do
if cmd.args.spinSpeed == spinSpeed then
device:send(clusters.LaundryWasherControls.attributes.SpinSpeedCurrent:write(device, ENDPOINT, i - 1))
device:send(clusters.LaundryWasherControls.attributes.SpinSpeedCurrent:write(device, endpoint_id, i - 1))
return
end
end
Expand All @@ -259,10 +259,10 @@ local function handle_laundry_washer_rinse_mode(driver, device, cmd)
device.log.info_with({ hub_logs = true },
string.format("handle_laundry_washer_rinse_mode rinseMode: %s", cmd.args.rinseMode))

local ENDPOINT = 1
local endpoint_id = device:component_to_endpoint(cmd.component)
for clusterVal, capabilityVal in pairs(LAUNDRY_WASHER_RINSE_MODE_MAP) do
if cmd.args.rinseMode == capabilityVal.NAME then
device:send(clusters.LaundryWasherControls.attributes.NumberOfRinses:write(device, ENDPOINT, clusterVal))
device:send(clusters.LaundryWasherControls.attributes.NumberOfRinses:write(device, endpoint_id, clusterVal))
break
end
end
Expand Down
27 changes: 27 additions & 0 deletions drivers/SmartThings/matter-lock/capabilities/lockAlarm.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
id: lockAlarm
version: 1
status: proposed
name: Lock Alarm
ephemeral: false
attributes:
alarm:
schema:
type: object
properties:
value:
type: string
enum:
- clear
- lockFactoryReset
- damaged
- forcedOpeningAttempt
- unableToLockTheDoor
- notClosedForALongTime
- highTemperature
- attemptsExceeded
- physicalImpact
additionalProperties: false
required:
- value
enumCommands: []
commands: {}
8 changes: 7 additions & 1 deletion drivers/SmartThings/matter-lock/fingerprints.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,15 @@ matterManufacturer:
vendorId: 0x135d
productId: 0xb0
deviceProfileName: lock-nocodes-notamper
#Aqara
- id: "4447/10242"
deviceLabel: Aqara Smart Lock U200
vendorId: 0x115F
productId: 0x2802
deviceProfileName: lock-lockalarm-nobattery
matterGeneric:
- id: "matter/door-lock"
deviceLabel: Matter Door Lock
deviceTypes:
- id: 0x000A # Door Lock
deviceProfileName: base-lock
deviceProfileName: lock-lockalarm
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
name: lock-lockalarm-nobattery
components:
- id: main
capabilities:
- id: lock
version: 1
config:
values:
- key: "lock.value"
enabledValues:
- locked
- unlocked
- unknown
- id: lockAlarm
version: 1
- id: firmwareUpdate
version: 1
- id: refresh
version: 1
categories:
- name: SmartLock
Loading

0 comments on commit d562f52

Please sign in to comment.