test_orion_smartlock.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. from homeassistant.components.binary_sensor import BinarySensorDeviceClass
  2. from homeassistant.components.sensor import SensorDeviceClass
  3. from homeassistant.const import PERCENTAGE
  4. from ..const import ORION_SMARTLOCK_PAYLOAD
  5. from ..helpers import assert_device_properties_set
  6. from ..mixins.binary_sensor import MultiBinarySensorTests
  7. from ..mixins.sensor import MultiSensorTests
  8. from .base_device_tests import TuyaDeviceTestCase
  9. ULFP_DP = "1"
  10. ULPWD_DP = "2"
  11. ULTMP_DP = "3"
  12. ULDYN_DP = "4"
  13. ULCARD_DP = "5"
  14. ERROR_DP = "8"
  15. REQUEST_DP = "9"
  16. APPROVE_DP = "10"
  17. BATTERY_DP = "12"
  18. ULAPP_DP = "15"
  19. DURESS_DP = "16"
  20. class TestOrionSmartLock(
  21. MultiBinarySensorTests,
  22. MultiSensorTests,
  23. TuyaDeviceTestCase,
  24. ):
  25. def setUp(self):
  26. self.setUpForConfig("orion_smart_lock.yaml", ORION_SMARTLOCK_PAYLOAD)
  27. self.subject = self.entities.get("lock")
  28. self.setUpMultiBinarySensors(
  29. [
  30. {
  31. "dps": ERROR_DP,
  32. "name": "binary_sensor_tampered",
  33. "device_class": BinarySensorDeviceClass.TAMPER,
  34. "testdata": (33, 0),
  35. },
  36. {
  37. "dps": DURESS_DP,
  38. "name": "binary_sensor_duress",
  39. "device_class": BinarySensorDeviceClass.SAFETY,
  40. },
  41. ]
  42. )
  43. self.setUpMultiSensors(
  44. [
  45. {
  46. "dps": ERROR_DP,
  47. "name": "sensor_alert",
  48. "testdata": (512, "key_left_in"),
  49. "device_class": SensorDeviceClass.ENUM,
  50. "options": [
  51. "wrong_finger",
  52. "wrong_password",
  53. "wrong_card",
  54. "wrong_face",
  55. "lock_jammed_closed",
  56. "high_temperature",
  57. "open_too_long",
  58. "lock_jammed_open",
  59. "lock_forced",
  60. "key_left_in",
  61. "battery_dead",
  62. "battery_low",
  63. "shock",
  64. ],
  65. },
  66. {
  67. "dps": BATTERY_DP,
  68. "name": "sensor_battery",
  69. "device_class": SensorDeviceClass.BATTERY,
  70. "unit": PERCENTAGE,
  71. },
  72. ]
  73. )
  74. self.mark_secondary(["sensor_alert"])
  75. def test_is_locked(self):
  76. # Default is all 0
  77. self.assertTrue(self.subject.is_locked)
  78. self.dps[ULFP_DP] = 1
  79. self.assertFalse(self.subject.is_locked)
  80. self.dps[ULFP_DP] = 0
  81. self.dps[ULPWD_DP] = 2
  82. self.assertFalse(self.subject.is_locked)
  83. self.dps[ULPWD_DP] = 0
  84. self.dps[ULTMP_DP] = 3
  85. self.assertFalse(self.subject.is_locked)
  86. self.dps[ULTMP_DP] = 0
  87. self.dps[ULDYN_DP] = 4
  88. self.assertFalse(self.subject.is_locked)
  89. self.dps[ULDYN_DP] = 0
  90. self.dps[ULCARD_DP] = 5
  91. self.assertFalse(self.subject.is_locked)
  92. self.dps[ULCARD_DP] = 0
  93. self.dps[ULAPP_DP] = 6
  94. self.assertFalse(self.subject.is_locked)
  95. def test_is_jammed(self):
  96. self.assertFalse(self.subject.is_jammed)
  97. self.dps[ERROR_DP] = 1
  98. self.assertFalse(self.subject.is_jammed)
  99. self.dps[ERROR_DP] = 16
  100. self.assertTrue(self.subject.is_jammed)
  101. self.dps[ERROR_DP] = 128
  102. self.assertTrue(self.subject.is_jammed)
  103. self.dps[ERROR_DP] = 17
  104. self.assertTrue(self.subject.is_jammed)
  105. self.dps[ERROR_DP] = 144
  106. self.assertTrue(self.subject.is_jammed)
  107. def test_changed_by(self):
  108. self.dps[ULFP_DP] = 1
  109. self.assertEqual(self.subject.changed_by, "Finger #1")
  110. self.dps[ULFP_DP] = 0
  111. self.dps[ULPWD_DP] = 2
  112. self.assertEqual(self.subject.changed_by, "Password #2")
  113. self.dps[ULPWD_DP] = 0
  114. self.dps[ULTMP_DP] = 3
  115. self.assertEqual(self.subject.changed_by, "Temporary Password #3")
  116. self.dps[ULTMP_DP] = 0
  117. self.dps[ULDYN_DP] = 4
  118. self.assertEqual(self.subject.changed_by, "Dynamic Password #4")
  119. self.dps[ULDYN_DP] = 0
  120. self.dps[ULCARD_DP] = 5
  121. self.assertEqual(self.subject.changed_by, "Card #5")
  122. self.dps[ULCARD_DP] = 0
  123. self.dps[ULAPP_DP] = 6
  124. self.assertEqual(self.subject.changed_by, "App #6")
  125. def test_extra_state_attributes(self):
  126. self.assertEqual(self.subject.extra_state_attributes, {})
  127. async def test_unlock(self):
  128. self.dps[REQUEST_DP] = 30
  129. async with assert_device_properties_set(
  130. self.subject._device, {APPROVE_DP: True}
  131. ):
  132. await self.subject.async_unlock()
  133. async def test_unlock_fails_when_not_requested(self):
  134. self.dps[REQUEST_DP] = 0
  135. with self.assertRaises(TimeoutError):
  136. await self.subject.async_unlock()