Skip to content

Commit 03c818e

Browse files
authored
Merge branch 'main' into revert/pr-1850
2 parents 032c670 + 754f2a7 commit 03c818e

File tree

650 files changed

+37552
-8107
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

650 files changed

+37552
-8107
lines changed

Jenkinsfile

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,14 @@ pipeline {
2828
agent {
2929
docker {
3030
image 'python:3.10'
31-
label 'production'
31+
label "${params.NODE_LABEL ?: 'production'}"
3232
args '--entrypoint= -u 0:0'
3333
}
3434
}
3535
environment {
3636
BRANCH = getEnvName()
3737
CHANGED_DRIVERS = getChangedDrivers()
38+
ENVIRONMENT = "${env.NODE_LABEL.toUpperCase()}"
3839
}
3940
stages {
4041
stage('requirements') {
@@ -51,22 +52,13 @@ pipeline {
5152
}
5253
}
5354
stage('update') {
54-
matrix {
55-
axes {
56-
axis {
57-
name 'ENVIRONMENT'
58-
values 'DEV', 'STAGING', 'ACCEPTANCE', 'PRODUCTION'
59-
}
60-
}
61-
stages {
62-
stage('environment_update') {
63-
steps {
64-
sh 'python3 tools/deploy.py'
65-
}
55+
stages {
56+
stage('environment_update') {
57+
steps {
58+
sh 'python3 tools/deploy.py'
6659
}
6760
}
6861
}
6962
}
7063
}
7164
}
72-

drivers/Aqara/aqara-cube/src/init.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ local aqara_cube_t1_pro_handler = {
125125
lifecycle_handlers = {
126126
init = device_init,
127127
added = device_added
128-
}
128+
},
129+
health_check = false,
129130
}
130131

131132
local aqara_cube_t1_pro_driver = ZigbeeDriver("aqara_cube_t1_pro", aqara_cube_t1_pro_handler)

drivers/Aqara/aqara-feeder/src/init.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,7 @@ local aqara_pet_feeder_handler = {
184184
infoChanged = device_info_changed,
185185
doConfigure = device_configure
186186
},
187+
health_check = false,
187188
can_handle = function(opts, driver, device, ...)
188189
return device:get_model() == "aqara.feeder.acn001"
189190
end

drivers/Aqara/aqara-lock/fingerprints.yml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,13 @@ zigbeeManufacturer:
44
manufacturer: Lumi
55
model: aqara.lock.akr011
66
deviceProfileName: aqara-lock-battery
7+
- id: "lumi/aqara.lock.akr001"
8+
deviceLabel: "Aqara Doorlock L100"
9+
manufacturer: lumi
10+
model: aqara.lock.akr001
11+
deviceProfileName: aqara-lock-battery
12+
- id: "Lumi/aqara.lock.akr001"
13+
deviceLabel: "Aqara Doorlock L100"
14+
manufacturer: Lumi
15+
model: aqara.lock.akr001
16+
deviceProfileName: aqara-lock-battery

drivers/Aqara/aqara-lock/profiles/aqara-lock-battery.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ components:
66
version: 1
77
- id: battery
88
version: 1
9+
- id: batteryLevel
10+
version: 1
911
- id: lockAlarm
1012
version: 1
1113
- id: remoteControlStatus

drivers/Aqara/aqara-lock/src/init.lua

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ local SUPPORTED_ALARM_VALUES = { "damaged", "forcedOpeningAttempt", "unableToLoc
2525
local SERIAL_NUM_TX = "serial_num_tx"
2626
local SERIAL_NUM_RX = "serial_num_rx"
2727
local SEQ_NUM = "seq_num"
28+
local THRESHOLD_BATTERY = {
29+
["aqara.lock.akr011"] = { low = 47, dryout = 28 }, -- K100
30+
["aqara.lock.akr001"] = { low = 47, dryout = 31 } -- L100
31+
}
2832

2933
local function my_secret_data_handler(driver, device, secret_info)
3034
if secret_info.secret_kind ~= "aqara" then return end
@@ -75,12 +79,19 @@ local function device_init(self, device)
7579
device:emit_event(capabilities.lock.supportedUnlockDirections({ "fromInside", "fromOutside" },
7680
{ visibility = { displayed = false } }))
7781
device:emit_event(capabilities.battery.type("AA"))
78-
device:emit_event(capabilities.battery.quantity(8))
82+
device:emit_event(capabilities.batteryLevel.type("AA"))
83+
local battery_quantity = 8
84+
if device:get_model() == "aqara.lock.akr001" then
85+
battery_quantity = 6
86+
end
87+
device:emit_event(capabilities.battery.quantity(battery_quantity))
88+
device:emit_event(capabilities.batteryLevel.quantity(battery_quantity))
7989
end
8090

8191
local function device_added(self, device)
8292
remoteControlShow(device)
8393
device:emit_event(Battery.battery(100))
94+
device:emit_event(capabilities.batteryLevel.battery("normal"))
8495
device:emit_event(LockAlarm.alarm.clear({ visibility = { displayed = false } }))
8596
device:emit_event(antiLockStatus.antiLockStatus("unknown", { visibility = { displayed = false } }))
8697
device:emit_event(Lock.lock.locked())
@@ -154,8 +165,18 @@ local function event_door_handler(driver, device, evt_name, evt_value)
154165
end
155166
end
156167

168+
local function calc_battery_level(model, level)
169+
local batteryLevel = "normal"
170+
if level < THRESHOLD_BATTERY[model].dryout then
171+
batteryLevel = "critical"
172+
elseif level < THRESHOLD_BATTERY[model].low then
173+
batteryLevel = "warning"
174+
end
175+
return batteryLevel
176+
end
157177
local function event_battery_handler(driver, device, evt_name, evt_value)
158178
device:emit_event(Battery.battery(evt_value))
179+
device:emit_event(capabilities.batteryLevel.battery(calc_battery_level(device:get_model(), evt_value)))
159180
end
160181

161182
local function event_abnormal_status_handler(driver, device, evt_name, evt_value)
@@ -321,7 +342,8 @@ local aqara_locks_handler = {
321342
},
322343
secret_data_handlers = {
323344
[security.SECRET_KIND_AQARA] = my_secret_data_handler
324-
}
345+
},
346+
health_check = false,
325347
}
326348

327349
local aqara_locks_driver = ZigbeeDriver("aqara_locks_k100", aqara_locks_handler)

drivers/Aqara/aqara-lock/src/test/test_aqara_lock.lua

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ test.add_package_capability("lockCredentialInfo.yaml")
1313
local lockAlarm = capabilities["lockAlarm"]
1414
test.add_package_capability("lockAlarm.yaml")
1515
local Battery = capabilities.battery
16+
local BatteryLevel = capabilities.batteryLevel
1617
local Lock = capabilities.lock
1718

1819
local PRI_CLU = 0xFCC0
@@ -45,7 +46,9 @@ local function test_init()
4546
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
4647
Lock.supportedUnlockDirections({"fromInside", "fromOutside"}, { visibility = { displayed = false } })))
4748
test.socket.capability:__expect_send(mock_device:generate_test_message("main", Battery.type("AA")))
49+
test.socket.capability:__expect_send(mock_device:generate_test_message("main", BatteryLevel.type("AA")))
4850
test.socket.capability:__expect_send(mock_device:generate_test_message("main", Battery.quantity(8)))
51+
test.socket.capability:__expect_send(mock_device:generate_test_message("main", BatteryLevel.quantity(8)))
4952
test.mock_device.add_test_device(mock_device)
5053
end
5154
test.set_test_init_function(test_init)
@@ -59,6 +62,7 @@ test.register_coroutine_test(
5962
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
6063
remoteControlStatus.remoteControlEnabled('false', { visibility = { displayed = false } })))
6164
test.socket.capability:__expect_send(mock_device:generate_test_message("main", Battery.battery(100)))
65+
test.socket.capability:__expect_send(mock_device:generate_test_message("main", BatteryLevel.battery("normal")))
6266
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
6367
lockAlarm.alarm.clear({ visibility = { displayed = false } })))
6468
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
@@ -76,6 +80,7 @@ test.register_coroutine_test(
7680
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
7781
remoteControlStatus.remoteControlEnabled('true', { visibility = { displayed = false } })))
7882
test.socket.capability:__expect_send(mock_device:generate_test_message("main", Battery.battery(100)))
83+
test.socket.capability:__expect_send(mock_device:generate_test_message("main", BatteryLevel.battery("normal")))
7984
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
8085
lockAlarm.alarm.clear({ visibility = { displayed = false } })))
8186
test.socket.capability:__expect_send(mock_device:generate_test_message("main",

drivers/Aqara/aqara-presence-sensor/src/discovery.lua

Lines changed: 34 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
local log = require "log"
2-
local discovery = {}
32
local fields = require "fields"
43
local discovery_mdns = require "discovery_mdns"
54
local socket = require "cosock.socket"
65

7-
local processing_devices = {}
6+
local discovery = {
7+
last_try_time = {}
8+
}
89

910
function discovery.set_device_field(driver, device)
1011
local device_cache_value = driver.datastore.discovery_cache[device.device_network_id]
@@ -22,8 +23,7 @@ function discovery.set_device_field(driver, device)
2223
driver.datastore.discovery_cache[device.device_network_id] = nil
2324
end
2425

25-
local function update_device_discovery_cache(driver, dni, ip)
26-
local device_info = driver.discovery_helper.get_device_info(driver, dni, ip)
26+
local function update_device_discovery_cache(driver, dni, ip, device_info)
2727
if driver.datastore.discovery_cache[dni] == nil then
2828
driver.datastore.discovery_cache[dni] = {}
2929
end
@@ -33,9 +33,14 @@ end
3333

3434
local function try_add_device(driver, device_dni, device_ip)
3535
log.trace(string.format("try_add_device : dni= %s, ip= %s", device_dni, device_ip))
36+
local device_info = driver.discovery_helper.get_device_info(driver, device_dni, device_ip)
3637

37-
update_device_discovery_cache(driver, device_dni, device_ip)
38-
local create_device_msg = driver.discovery_helper.get_device_create_msg(driver, device_dni, device_ip)
38+
update_device_discovery_cache(driver, device_dni, device_ip, device_info)
39+
local create_device_msg = driver.discovery_helper.get_device_create_msg(driver, device_dni, device_ip, device_info)
40+
if not create_device_msg then
41+
log.error_with({ hub_logs = true }, string.format("Failed to get device info. dni= %s, ip= %s", device_dni, device_ip))
42+
return "device info not found"
43+
end
3944

4045
local credential = driver.discovery_helper.get_credential(driver, device_dni, device_ip)
4146

@@ -52,15 +57,20 @@ local function try_add_device(driver, device_dni, device_ip)
5257
end
5358

5459
log.info_with({ hub_logs = true }, string.format("try_create_device. dni= %s, ip= %s", device_dni, device_ip))
55-
processing_devices[device_dni] = true
56-
driver:try_create_device(create_device_msg)
60+
61+
local success, ret = pcall(driver.try_create_device, driver, create_device_msg)
62+
if success then
63+
discovery.last_try_time[device_dni] = os.time()
64+
else
65+
log.error_with({ hub_logs = true }, string.format("Failed to try_create_device. dni= %s, %s", device_dni, ret))
66+
end
5767
return nil
5868
end
5969

6070
function discovery.device_added(driver, device)
6171
log.info_with({ hub_logs = true }, string.format("device_added. dni= %s", device.device_network_id))
6272
discovery.set_device_field(driver, device)
63-
processing_devices[device.device_network_id] = nil
73+
discovery.last_try_time[device.device_network_id] = nil
6474
driver.lifecycle_handlers.init(driver, device)
6575
end
6676

@@ -93,14 +103,27 @@ local function discovery_device(driver)
93103

94104
for dni, ip in pairs(unknown_discovered_devices) do
95105
log.trace(string.format("unknown dni= %s, ip= %s", dni, ip))
96-
if not processing_devices[dni] then
97-
try_add_device(driver, dni, ip)
106+
local is_already_added = false
107+
for _, device in pairs(driver:get_devices()) do
108+
if device.device_network_id == dni then
109+
is_already_added = true
110+
break
111+
end
112+
end
113+
if not is_already_added then
114+
local time_since_last_try = os.time() - (discovery.last_try_time[dni] or 0)
115+
if (not discovery.last_try_time[dni]) or (time_since_last_try > 10) then
116+
try_add_device(driver, dni, ip)
117+
else
118+
log.trace(string.format("skip adding device because it was tried recently. dni= %s, ip= %s, since %s sec", dni, ip, time_since_last_try))
119+
end
98120
end
99121
end
100122
end
101123

102124
function discovery.do_network_discovery(driver, _, should_continue)
103125
log.info_with({ hub_logs = true }, string.format("discovery start for Aqara FP2"))
126+
discovery.last_try_time = {}
104127
while should_continue() do
105128
discovery_device(driver)
106129
socket.sleep(1)

drivers/Aqara/aqara-presence-sensor/src/fields.lua

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ local fields = {
1010
EVENT_SOURCE = "eventsource",
1111
MONITORING_TIMER = "monitoring_timer",
1212
CREDENTIAL = "credential",
13-
_INIT = "init"
13+
_INIT = "init",
14+
LAST_DISCONNECTED_TIME = "last_disconnected_time"
1415
}
1516

1617
return fields

drivers/Aqara/aqara-presence-sensor/src/fp2/discovery_helper.lua

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,14 @@ function discovery_helper.get_service_type_and_domain()
2525
return SERVICE_TYPE, DOMAIN
2626
end
2727

28-
function discovery_helper.get_device_create_msg(driver, device_dni, device_ip)
29-
local device_info = fp2_api.get_info(device_ip, fp2_api.labeled_socket_builder(device_dni))
30-
28+
function discovery_helper.get_device_create_msg(driver, device_dni, device_ip, device_info)
3129
if not device_info then
32-
log.warn("failed to create device create msg. device_info is nil.")
33-
return nil
30+
device_info = fp2_api.get_info(device_ip, fp2_api.labeled_socket_builder(device_dni))
31+
32+
if not device_info then
33+
log.warn("failed to create device create msg. device_info is nil.")
34+
return nil
35+
end
3436
end
3537

3638
local device_label = device_info.label or "Aqara-FP2"

0 commit comments

Comments
 (0)