From 4d8ead1d0815700ef59943c8e5b9a6d059c8ac64 Mon Sep 17 00:00:00 2001 From: greens Date: Fri, 27 Oct 2023 12:16:47 -0700 Subject: [PATCH] BUG-8648: PGC sensors have different open/closed handling on garages --- .../src/smartsense-multi/init.lua | 22 ++- .../src/test/test_smartsense_multi.lua | 148 +++++++++++------- 2 files changed, 115 insertions(+), 55 deletions(-) diff --git a/drivers/SmartThings/zigbee-contact/src/smartsense-multi/init.lua b/drivers/SmartThings/zigbee-contact/src/smartsense-multi/init.lua index b0d0623674..4384c5a4d6 100644 --- a/drivers/SmartThings/zigbee-contact/src/smartsense-multi/init.lua +++ b/drivers/SmartThings/zigbee-contact/src/smartsense-multi/init.lua @@ -132,6 +132,26 @@ local function status_report_handler(driver, device, zb_rx) temperature_handler(device, temperature) end +local handle_garage_event = function(device, value) + local event + if value > 825 then + event = capabilities.contactSensor.contact.open() + elseif value < 100 then + event = capabilities.contactSensor.contact.closed() + end + if event ~= nil then + device:emit_event(event) + end +end + +local handle_three_axis_report = function(device, x, y, z) + if x ~= nil and y ~= nil and z ~= nil then + device:emit_event(capabilities.threeAxis.threeAxis({value = {x, y, z}})) + end + if z ~= nil and device.preferences["certifiedpreferences.garageSensor"] then + handle_garage_event(device, math.abs(z)) + end +end local function xyz_handler(driver, device, zb_rx) -- This is a custom cluster command for the kickstarter multi. @@ -139,7 +159,7 @@ local function xyz_handler(driver, device, zb_rx) local x = multi_utils.convert_to_signedInt16(zb_rx.body.zcl_body.body_bytes:byte(1), zb_rx.body.zcl_body.body_bytes:byte(2)) local y = multi_utils.convert_to_signedInt16(zb_rx.body.zcl_body.body_bytes:byte(3), zb_rx.body.zcl_body.body_bytes:byte(4)) local z = multi_utils.convert_to_signedInt16(zb_rx.body.zcl_body.body_bytes:byte(5), zb_rx.body.zcl_body.body_bytes:byte(6)) - multi_utils.handle_three_axis_report(device, x, y, z) + handle_three_axis_report(device, x, y, z) end local smartsense_multi = { diff --git a/drivers/SmartThings/zigbee-contact/src/test/test_smartsense_multi.lua b/drivers/SmartThings/zigbee-contact/src/test/test_smartsense_multi.lua index 83638b5d07..d2221372eb 100644 --- a/drivers/SmartThings/zigbee-contact/src/test/test_smartsense_multi.lua +++ b/drivers/SmartThings/zigbee-contact/src/test/test_smartsense_multi.lua @@ -246,72 +246,112 @@ test.register_coroutine_test( ) test.register_coroutine_test( - "KK - Report from cluster 0xFC03, command 0x09 should be handled as: Temperature (25.5 C), Acceleration - active, Contact - closed, battery(97%)", - function() - test.socket.zigbee:__queue_receive({ - mock_device.id, - build_multi_status_report_message(mock_device, "\x88\x00\x00\x74") - }) - test.socket.capability:__set_channel_ordering("relaxed") - test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.temperatureMeasurement.temperature({ value = 13.60, unit = "C" }))) - test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.accelerationSensor.acceleration.inactive())) - test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.contactSensor.contact.closed())) - test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.battery.battery(97))) - end + "KK - Report from cluster 0xFC03, command 0x09 should be handled as: Temperature (25.5 C), Acceleration - active, Contact - closed, battery(97%)", + function() + test.socket.zigbee:__queue_receive({ + mock_device.id, + build_multi_status_report_message(mock_device, "\x88\x00\x00\x74") + }) + test.socket.capability:__set_channel_ordering("relaxed") + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.temperatureMeasurement.temperature({ value = 13.60, unit = "C" }))) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.accelerationSensor.acceleration.inactive())) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.contactSensor.contact.closed())) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.battery.battery(97))) + end ) test.register_coroutine_test( - "Report from cluster 0xFC03, command 0x09 should be handled as: Temperature (25.5 C), Acceleration - active, Contact - closed, battery(60%)", - function() - test.socket.zigbee:__queue_receive({ - mock_device.id, - build_multi_status_report_message(mock_device, "\xFF\x00\x00\x48") - }) - test.socket.capability:__set_channel_ordering("relaxed") - test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.temperatureMeasurement.temperature({ value = 25.5, unit = "C" }))) - test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.accelerationSensor.acceleration.inactive())) - test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.contactSensor.contact.closed())) - test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.battery.battery(60))) - end + "Report from cluster 0xFC03, command 0x09 should be handled as: Temperature (25.5 C), Acceleration - active, Contact - closed, battery(60%)", + function() + test.socket.zigbee:__queue_receive({ + mock_device.id, + build_multi_status_report_message(mock_device, "\xFF\x00\x00\x48") + }) + test.socket.capability:__set_channel_ordering("relaxed") + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.temperatureMeasurement.temperature({ value = 25.5, unit = "C" }))) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.accelerationSensor.acceleration.inactive())) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.contactSensor.contact.closed())) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.battery.battery(60))) + end ) test.register_coroutine_test( - "Report from cluster 0xFC03, command 0x09 should be handled as: Temperature (26.0 C), Acceleration - active, Contact - closed, battery(60%)", - function() - test.socket.zigbee:__queue_receive({ - mock_device.id, - build_multi_status_report_message(mock_device, "\x04\x01\x00\x48") - }) - test.socket.capability:__set_channel_ordering("relaxed") - test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.temperatureMeasurement.temperature({ value = 26.0, unit = "C" }))) - test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.accelerationSensor.acceleration.inactive())) - test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.contactSensor.contact.closed())) - test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.battery.battery(60))) - end + "Report from cluster 0xFC03, command 0x09 should be handled as: Temperature (26.0 C), Acceleration - active, Contact - closed, battery(60%)", + function() + test.socket.zigbee:__queue_receive({ + mock_device.id, + build_multi_status_report_message(mock_device, "\x04\x01\x00\x48") + }) + test.socket.capability:__set_channel_ordering("relaxed") + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.temperatureMeasurement.temperature({ value = 26.0, unit = "C" }))) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.accelerationSensor.acceleration.inactive())) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.contactSensor.contact.closed())) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.battery.battery(60))) + end ) test.register_coroutine_test( - "Report from cluster 0xFC03, command 0x05 should be handled as: threeAxis(1050, -3, 9)", - function() - test.socket.zigbee:__queue_receive({ - mock_device.id, - build_three_axis_report_message(mock_device, "\x1A\x04\xFD\xFF\x09\x00") - }) - test.socket.capability:__set_channel_ordering("relaxed") - test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.threeAxis.threeAxis({1050, -3, 9})) ) - end + "Report from cluster 0xFC03, command 0x05 should be handled as: threeAxis(1050, -3, 9)", + function() + test.socket.zigbee:__queue_receive({ + mock_device.id, + build_three_axis_report_message(mock_device, "\x1A\x04\xFD\xFF\x09\x00") + }) + test.socket.capability:__set_channel_ordering("relaxed") + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.threeAxis.threeAxis({1050, -3, 9})) ) + end ) test.register_coroutine_test( - "Report from cluster 0xFC03, command 0x05 should be handled as: threeAxis(1123,-130,-24)", - function() - test.socket.zigbee:__queue_receive({ - mock_device.id, - build_three_axis_report_message(mock_device, "\x63\x04\x7E\xFF\xE8\xFF") - }) - test.socket.capability:__set_channel_ordering("relaxed") - test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.threeAxis.threeAxis({1123, -130, -24})) ) - end + "Report from cluster 0xFC03, command 0x05 should be handled as: threeAxis(1123,-130,-24)", + function() + test.socket.zigbee:__queue_receive({ + mock_device.id, + build_three_axis_report_message(mock_device, "\x63\x04\x7E\xFF\xE8\xFF") + }) + test.socket.capability:__set_channel_ordering("relaxed") + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.threeAxis.threeAxis({1123, -130, -24})) ) + end +) + +test.register_coroutine_test( + "Report from cluster 0xFC03, command 0x05 should be handled as: threeAxis(1123,-130,-24) and closed", + function() + test.socket.device_lifecycle():__queue_receive(mock_device:generate_info_changed( + { + preferences = { + ["certifiedpreferences.garageSensor"] = true + } + } + )) + test.wait_for_events() + test.socket.zigbee:__queue_receive({ + mock_device.id, + build_three_axis_report_message(mock_device, "\x63\x04\x7E\xFF\xE8\xFF") + }) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.threeAxis.threeAxis({1123, -130, -24})) ) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.contactSensor.contact.closed())) + end +) + +test.register_coroutine_test( + "Report from cluster 0xFC03, command 0x05 should be handled as: threeAxis(-130,-24,1123) and open", + function() + test.socket.device_lifecycle():__queue_receive(mock_device:generate_info_changed( + { + preferences = { + ["certifiedpreferences.garageSensor"] = true + } + } + )) + test.wait_for_events() + test.socket.zigbee:__queue_receive({ + mock_device.id, + build_three_axis_report_message(mock_device, "\x7E\xFF\xE8\xFF\x63\x04") + }) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.threeAxis.threeAxis({-130, -24, 1123})) ) + test.socket.capability:__expect_send(mock_device:generate_test_message("main", capabilities.contactSensor.contact.open())) + end ) test.run_registered_tests() \ No newline at end of file