Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -227,4 +227,198 @@ test.register_coroutine_test(
end
)

test.register_coroutine_test(
"AQI moderate (51-100) emits moderate airQualityHealthConcern",
function()
local attr_report_data = {
{ 0x0000, data_types.Uint16.ID, 75 }
}
test.socket.zigbee:__queue_receive({
mock_device.id,
zigbee_test_utils.build_attribute_report(mock_device, 0xFCC5, attr_report_data, MFG_CODE)
})
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.airQualityHealthConcern.airQualityHealthConcern({value = "moderate"})))
end
)

test.register_coroutine_test(
"AQI slightlyUnhealthy (101-150) emits slightlyUnhealthy airQualityHealthConcern",
function()
local attr_report_data = {
{ 0x0000, data_types.Uint16.ID, 125 }
}
test.socket.zigbee:__queue_receive({
mock_device.id,
zigbee_test_utils.build_attribute_report(mock_device, 0xFCC5, attr_report_data, MFG_CODE)
})
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.airQualityHealthConcern.airQualityHealthConcern({value = "slightlyUnhealthy"})))
end
)

test.register_coroutine_test(
"AQI unhealthy (151-200) emits unhealthy airQualityHealthConcern",
function()
local attr_report_data = {
{ 0x0000, data_types.Uint16.ID, 175 }
}
test.socket.zigbee:__queue_receive({
mock_device.id,
zigbee_test_utils.build_attribute_report(mock_device, 0xFCC5, attr_report_data, MFG_CODE)
})
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.airQualityHealthConcern.airQualityHealthConcern({value = "unhealthy"})))
end
)

test.register_coroutine_test(
"AQI veryUnhealthy (201-300) emits veryUnhealthy airQualityHealthConcern",
function()
local attr_report_data = {
{ 0x0000, data_types.Uint16.ID, 250 }
}
test.socket.zigbee:__queue_receive({
mock_device.id,
zigbee_test_utils.build_attribute_report(mock_device, 0xFCC5, attr_report_data, MFG_CODE)
})
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.airQualityHealthConcern.airQualityHealthConcern({value = "veryUnhealthy"})))
end
)

test.register_coroutine_test(
"AQI hazardous (>=301) emits hazardous airQualityHealthConcern",
function()
local attr_report_data = {
{ 0x0000, data_types.Uint16.ID, 350 }
}
test.socket.zigbee:__queue_receive({
mock_device.id,
zigbee_test_utils.build_attribute_report(mock_device, 0xFCC5, attr_report_data, MFG_CODE)
})
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.airQualityHealthConcern.airQualityHealthConcern({value = "hazardous"})))
end
)

test.register_coroutine_test(
"carbonDioxide moderate (1501-2500) emits moderate carbonDioxideHealthConcern",
function()
local attr_report_data = {
{ 0x0000, data_types.Uint16.ID, 2000 }
}
test.socket.zigbee:__queue_receive({
mock_device.id,
zigbee_test_utils.build_attribute_report(mock_device, 0xFCC3, attr_report_data, MFG_CODE)
})
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.carbonDioxideMeasurement.carbonDioxide({value = 2000, unit = "ppm"})))
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.carbonDioxideHealthConcern.carbonDioxideHealthConcern({value = "moderate"})))
end
)

test.register_coroutine_test(
"carbonDioxide unhealthy (>2500) emits unhealthy carbonDioxideHealthConcern",
function()
local attr_report_data = {
{ 0x0000, data_types.Uint16.ID, 3000 }
}
test.socket.zigbee:__queue_receive({
mock_device.id,
zigbee_test_utils.build_attribute_report(mock_device, 0xFCC3, attr_report_data, MFG_CODE)
})
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.carbonDioxideMeasurement.carbonDioxide({value = 3000, unit = "ppm"})))
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.carbonDioxideHealthConcern.carbonDioxideHealthConcern({value = "unhealthy"})))
end
)

test.register_coroutine_test(
"pm2.5 moderate emits moderate fineDustHealthConcern",
function()
local attr_report_data = {
{ 0x0000, data_types.Uint16.ID, 90 }
}
test.socket.zigbee:__queue_receive({
mock_device.id,
zigbee_test_utils.build_attribute_report(mock_device, 0xFCC1, attr_report_data, MFG_CODE)
})
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.fineDustSensor.fineDustLevel({value = 90})))
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.fineDustHealthConcern.fineDustHealthConcern({value = "moderate"})))
end
)

test.register_coroutine_test(
"pm2.5 unhealthy (>=115) emits unhealthy fineDustHealthConcern",
function()
local attr_report_data = {
{ 0x0000, data_types.Uint16.ID, 120 }
}
test.socket.zigbee:__queue_receive({
mock_device.id,
zigbee_test_utils.build_attribute_report(mock_device, 0xFCC1, attr_report_data, MFG_CODE)
})
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.fineDustSensor.fineDustLevel({value = 120})))
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.fineDustHealthConcern.fineDustHealthConcern({value = "unhealthy"})))
end
)

test.register_coroutine_test(
"pm1.0 unhealthy (>100) emits unhealthy veryFineDustHealthConcern",
function()
local attr_report_data = {
{ 0x0001, data_types.Uint16.ID, 150 }
}
test.socket.zigbee:__queue_receive({
mock_device.id,
zigbee_test_utils.build_attribute_report(mock_device, 0xFCC1, attr_report_data, MFG_CODE)
})
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.veryFineDustSensor.veryFineDustLevel({value = 150})))
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.veryFineDustHealthConcern.veryFineDustHealthConcern({value = "unhealthy"})))
end
)

test.register_coroutine_test(
"pm10 unhealthy (>150) emits unhealthy dustHealthConcern",
function()
local attr_report_data = {
{ 0x0002, data_types.Uint16.ID, 200 }
}
test.socket.zigbee:__queue_receive({
mock_device.id,
zigbee_test_utils.build_attribute_report(mock_device, 0xFCC1, attr_report_data, MFG_CODE)
})
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.dustSensor.dustLevel({value = 200})))
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.dustHealthConcern.dustHealthConcern({value = "unhealthy"})))
end
)

test.register_coroutine_test(
"tvoc good (<600) emits good tvocHealthConcern",
function()
local attr_report_data = {
{ 0x0001, data_types.SinglePrecisionFloat.ID, SinglePrecisionFloat(0, 8, 0.953125) }
}
test.socket.zigbee:__queue_receive({
mock_device.id,
zigbee_test_utils.build_attribute_report(mock_device, 0xFCC2, attr_report_data, MFG_CODE)
})
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.tvocMeasurement.tvocLevel({value = 500.0, unit = "ug/m3"})))
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
capabilities.tvocHealthConcern.tvocHealthConcern({value = "good"})))
end
)

test.run_registered_tests()
37 changes: 37 additions & 0 deletions drivers/SmartThings/zigbee-bed/src/test/test_shus_mattress.lua
Original file line number Diff line number Diff line change
Expand Up @@ -398,6 +398,21 @@ test.register_coroutine_test(
end
)

test.register_coroutine_test(
"Device reported yoga 3 and driver emit custom_capabilities.yoga.state.both()",
function()
local attr_report_data = {
{ 0x0008, data_types.Uint8.ID, 3 }
}
test.socket.zigbee:__queue_receive({
mock_device.id,
zigbee_test_utils.build_attribute_report(mock_device, PRIVATE_CLUSTER_ID, attr_report_data, MFG_CODE)
})
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
custom_capabilities.yoga.state.both()))
end
)

test.register_coroutine_test(
"Device reported yoga 2 and driver emit custom_capabilities.yoga.state.right()",
function()
Expand Down Expand Up @@ -910,4 +925,26 @@ test.register_coroutine_test(
end
)

test.register_coroutine_test(
"capability left_control backControl soft emits idle event after delay",
function()
test.timer.__create_and_queue_test_time_advance_timer(1, "oneshot")
test.socket.capability:__queue_receive({
mock_device.id,
{ capability = custom_capabilities.left_control.ID, component = "main", command ="backControl" , args = {"soft"}}
})
test.socket.zigbee:__expect_send({ mock_device.id,
cluster_base.write_manufacturer_specific_attribute(mock_device, PRIVATE_CLUSTER_ID,
0x0000, MFG_CODE, data_types.Uint8, 0)
})
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
custom_capabilities.left_control.leftback.soft()))
test.wait_for_events()

test.mock_time.advance_time(1)
test.socket.capability:__expect_send(mock_device:generate_test_message("main",
custom_capabilities.left_control.leftback("idle", { visibility = { displayed = false }})))
end
)

test.run_registered_tests()
1 change: 1 addition & 0 deletions drivers/SmartThings/zigbee-button/src/aqara/init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ local function battery_level_handler(driver, device, value, zb_rx)
batteryLevel = "warning"
end

-- Note that all aqara buttons use batteryLevel and not battery capability.
if device:supports_capability_by_id(capabilities.battery.ID) then
device:emit_event(capabilities.battery.battery(calc_battery_percentage(voltage)))
elseif device:supports_capability_by_id(capabilities.batteryLevel.ID) then
Expand Down
35 changes: 35 additions & 0 deletions drivers/SmartThings/zigbee-button/src/test/test_aqara_button.lua
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,21 @@ local PRIVATE_ATTRIBUTE_ID_ALIVE = 0x00F7
local MODE_CHANGE = "stse.allowOperationModeChange"

local COMP_LIST = { "button1", "button2", "all" }

local mock_device_h1_single = test.mock_device.build_test_zigbee_device(
{
profile = t_utils.get_profile_definition("aqara-single-button-mode.yml"),
zigbee_endpoints = {
[1] = {
id = 1,
manufacturer = "LUMI",
model = "lumi.remote.b18ac1",
server_clusters = { 0x0001, 0x0012 }
}
}
}
)

local mock_device_e1 = test.mock_device.build_test_zigbee_device(
{
profile = t_utils.get_profile_definition("one-button-batteryLevel.yml"),
Expand Down Expand Up @@ -51,6 +66,7 @@ local mock_device_h1_double_rocker = test.mock_device.build_test_zigbee_device(

zigbee_test_utils.prepare_zigbee_env_info()
local function test_init()
test.mock_device.add_test_device(mock_device_h1_single)
test.mock_device.add_test_device(mock_device_e1)
test.mock_device.add_test_device(mock_device_h1_double_rocker)
end
Expand Down Expand Up @@ -286,4 +302,23 @@ test.register_coroutine_test(
end
)

test.register_coroutine_test(
"Handle added lifecycle - H1 single rocker (sets mode=1)",
function()
test.socket.device_lifecycle:__queue_receive({ mock_device_h1_single.id, "added" })
test.socket.capability:__expect_send(mock_device_h1_single:generate_test_message("main",
capabilities.button.supportedButtonValues({ "pushed" }, { visibility = { displayed = false } })))
test.socket.capability:__expect_send(mock_device_h1_single:generate_test_message("main",
capabilities.button.numberOfButtons({ value = 1 })))
test.socket.capability:__expect_send(mock_device_h1_single:generate_test_message("main",
capabilities.button.button.pushed({ state_change = false })))
test.socket.capability:__expect_send(mock_device_h1_single:generate_test_message("main",
capabilities.batteryLevel.battery.normal()))
test.socket.capability:__expect_send(mock_device_h1_single:generate_test_message("main",
capabilities.batteryLevel.type("CR2450")))
test.socket.capability:__expect_send(mock_device_h1_single:generate_test_message("main",
capabilities.batteryLevel.quantity(1)))
end
)

test.run_registered_tests()
Original file line number Diff line number Diff line change
Expand Up @@ -165,36 +165,6 @@ test.register_message_test(
}
)

-- test.register_coroutine_test(
-- "Health check should check all relevant attributes",
-- function()
-- test.wait_for_events()

-- test.mock_time.advance_time(50000) -- battery is 21600 for max reporting interval
-- test.socket.zigbee:__set_channel_ordering("relaxed")

-- test.socket.zigbee:__expect_send(
-- {
-- mock_device.id,
-- PowerConfiguration.attributes.BatteryVoltage:read(mock_device)
-- }
-- )

-- test.socket.zigbee:__expect_send(
-- {
-- mock_device.id,
-- IASZone.attributes.ZoneStatus:read(mock_device)
-- }
-- )
-- end,
-- {
-- test_init = function()
-- test.mock_device.add_test_device(mock_device)
-- test.timer.__create_and_queue_test_time_advance_timer(30, "interval", "health_check")
-- end
-- }
-- )

test.register_message_test(
"Refresh should read all necessary attributes",
{
Expand Down Expand Up @@ -260,4 +230,36 @@ test.register_message_test(
}
)

test.register_message_test(
"ZoneStatusChangeNotification should be handled: contact/open",
{
{
channel = "zigbee",
direction = "receive",
message = { mock_device.id, IASZone.client.commands.ZoneStatusChangeNotification.build_test_rx(mock_device, 0x0001, 0x00) }
},
{
channel = "capability",
direction = "send",
message = mock_device:generate_test_message("main", capabilities.contactSensor.contact.open())
}
}
)

test.register_message_test(
"ZoneStatusChangeNotification should be handled: contact/closed",
{
{
channel = "zigbee",
direction = "receive",
message = { mock_device.id, IASZone.client.commands.ZoneStatusChangeNotification.build_test_rx(mock_device, 0x0000, 0x00) }
},
{
channel = "capability",
direction = "send",
message = mock_device:generate_test_message("main", capabilities.contactSensor.contact.closed())
}
}
)

test.run_registered_tests()
Loading
Loading