test_orion_smartlock.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  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. },
  51. {
  52. "dps": BATTERY_DP,
  53. "name": "sensor_battery",
  54. "device_class": SensorDeviceClass.BATTERY,
  55. "unit": PERCENTAGE,
  56. },
  57. ]
  58. )
  59. self.mark_secondary(["sensor_alert"])
  60. def test_is_locked(self):
  61. # Default is all 0
  62. self.assertTrue(self.subject.is_locked)
  63. self.dps[ULFP_DP] = 1
  64. self.assertFalse(self.subject.is_locked)
  65. self.dps[ULFP_DP] = 0
  66. self.dps[ULPWD_DP] = 2
  67. self.assertFalse(self.subject.is_locked)
  68. self.dps[ULPWD_DP] = 0
  69. self.dps[ULTMP_DP] = 3
  70. self.assertFalse(self.subject.is_locked)
  71. self.dps[ULTMP_DP] = 0
  72. self.dps[ULDYN_DP] = 4
  73. self.assertFalse(self.subject.is_locked)
  74. self.dps[ULDYN_DP] = 0
  75. self.dps[ULCARD_DP] = 5
  76. self.assertFalse(self.subject.is_locked)
  77. self.dps[ULCARD_DP] = 0
  78. self.dps[ULAPP_DP] = 6
  79. self.assertFalse(self.subject.is_locked)
  80. def test_is_jammed(self):
  81. self.assertFalse(self.subject.is_jammed)
  82. self.dps[ERROR_DP] = 1
  83. self.assertFalse(self.subject.is_jammed)
  84. self.dps[ERROR_DP] = 16
  85. self.assertTrue(self.subject.is_jammed)
  86. self.dps[ERROR_DP] = 128
  87. self.assertTrue(self.subject.is_jammed)
  88. self.dps[ERROR_DP] = 17
  89. self.assertTrue(self.subject.is_jammed)
  90. self.dps[ERROR_DP] = 144
  91. self.assertTrue(self.subject.is_jammed)
  92. def test_changed_by(self):
  93. self.dps[ULFP_DP] = 1
  94. self.assertEqual(self.subject.changed_by, "Finger #1")
  95. self.dps[ULFP_DP] = 0
  96. self.dps[ULPWD_DP] = 2
  97. self.assertEqual(self.subject.changed_by, "Password #2")
  98. self.dps[ULPWD_DP] = 0
  99. self.dps[ULTMP_DP] = 3
  100. self.assertEqual(self.subject.changed_by, "Temporary Password #3")
  101. self.dps[ULTMP_DP] = 0
  102. self.dps[ULDYN_DP] = 4
  103. self.assertEqual(self.subject.changed_by, "Dynamic Password #4")
  104. self.dps[ULDYN_DP] = 0
  105. self.dps[ULCARD_DP] = 5
  106. self.assertEqual(self.subject.changed_by, "Card #5")
  107. self.dps[ULCARD_DP] = 0
  108. self.dps[ULAPP_DP] = 6
  109. self.assertEqual(self.subject.changed_by, "App #6")
  110. def test_extra_state_attributes(self):
  111. self.assertEqual(self.subject.extra_state_attributes, {})
  112. async def test_unlock(self):
  113. self.dps[REQUEST_DP] = 30
  114. async with assert_device_properties_set(
  115. self.subject._device, {APPROVE_DP: True}
  116. ):
  117. await self.subject.async_unlock()
  118. async def test_unlock_fails_when_not_requested(self):
  119. self.dps[REQUEST_DP] = 0
  120. with self.assertRaises(TimeoutError):
  121. await self.subject.async_unlock()