4
0

test_orion_smartlock.py 4.9 KB

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