test_kyvol_e30_vacuum.py 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. from homeassistant.components.button import ButtonDeviceClass
  2. from homeassistant.components.sensor import STATE_CLASS_MEASUREMENT, SensorDeviceClass
  3. from homeassistant.components.vacuum import (
  4. STATE_CLEANING,
  5. STATE_ERROR,
  6. STATE_IDLE,
  7. STATE_PAUSED,
  8. STATE_RETURNING,
  9. VacuumEntityFeature,
  10. )
  11. from homeassistant.const import AREA_SQUARE_METERS, PERCENTAGE, UnitOfTime
  12. from ..const import KYVOL_E30_VACUUM_PAYLOAD
  13. from ..helpers import assert_device_properties_set
  14. from ..mixins.button import MultiButtonTests
  15. from ..mixins.sensor import MultiSensorTests
  16. from .base_device_tests import TuyaDeviceTestCase
  17. POWER_DPS = "1"
  18. SWITCH_DPS = "2"
  19. COMMAND_DPS = "3"
  20. DIRECTION_DPS = "4"
  21. STATUS_DPS = "5"
  22. BATTERY_DPS = "6"
  23. EDGE_DPS = "7"
  24. ROLL_DPS = "8"
  25. FILTER_DPS = "9"
  26. RSTEDGE_DPS = "10"
  27. RSTROLL_DPS = "11"
  28. RSTFILTER_DPS = "12"
  29. LOCATE_DPS = "13"
  30. FAN_DPS = "14"
  31. AREA_DPS = "16"
  32. TIME_DPS = "17"
  33. ERROR_DPS = "18"
  34. WATER_DPS = "101"
  35. MODEL_DPS = "102"
  36. MODE_DPS = "104"
  37. CARPET_DPS = "107"
  38. class TestKyvolE30Vacuum(MultiButtonTests, MultiSensorTests, TuyaDeviceTestCase):
  39. __test__ = True
  40. def setUp(self):
  41. self.setUpForConfig("kyvol_e30_vacuum.yaml", KYVOL_E30_VACUUM_PAYLOAD)
  42. self.subject = self.entities.get("vacuum")
  43. self.setUpMultiButtons(
  44. [
  45. {
  46. "dps": RSTEDGE_DPS,
  47. "name": "button_edge_brush_reset",
  48. "device_class": ButtonDeviceClass.RESTART,
  49. },
  50. {
  51. "dps": RSTROLL_DPS,
  52. "name": "button_roll_brush_reset",
  53. "device_class": ButtonDeviceClass.RESTART,
  54. },
  55. {
  56. "dps": RSTFILTER_DPS,
  57. "name": "button_filter_reset",
  58. },
  59. ]
  60. )
  61. self.setUpMultiSensors(
  62. [
  63. {
  64. "dps": AREA_DPS,
  65. "name": "sensor_clean_area",
  66. "unit": AREA_SQUARE_METERS,
  67. "testdata": (30, 3.0),
  68. },
  69. {
  70. "dps": TIME_DPS,
  71. "name": "sensor_clean_time",
  72. "unit": UnitOfTime.MINUTES,
  73. "device_class": SensorDeviceClass.DURATION,
  74. },
  75. {
  76. "dps": EDGE_DPS,
  77. "name": "sensor_edge_brush",
  78. "unit": PERCENTAGE,
  79. },
  80. {
  81. "dps": ROLL_DPS,
  82. "name": "sensor_roll_brush",
  83. "unit": PERCENTAGE,
  84. },
  85. {
  86. "dps": FILTER_DPS,
  87. "name": "sensor_filter",
  88. "unit": PERCENTAGE,
  89. },
  90. {
  91. "dps": STATUS_DPS,
  92. "name": "sensor_status",
  93. },
  94. {
  95. "dps": BATTERY_DPS,
  96. "name": "sensor_battery",
  97. "unit": PERCENTAGE,
  98. "device_class": SensorDeviceClass.BATTERY,
  99. "state_class": STATE_CLASS_MEASUREMENT,
  100. },
  101. ],
  102. )
  103. self.mark_secondary(
  104. [
  105. "button_edge_brush_reset",
  106. "button_roll_brush_reset",
  107. "button_filter_reset",
  108. "sensor_clean_area",
  109. "sensor_clean_time",
  110. "sensor_edge_brush",
  111. "sensor_roll_brush",
  112. "sensor_filter",
  113. "sensor_status",
  114. ]
  115. )
  116. def test_supported_features(self):
  117. self.assertEqual(
  118. self.subject.supported_features,
  119. (
  120. VacuumEntityFeature.STATE
  121. | VacuumEntityFeature.STATUS
  122. | VacuumEntityFeature.SEND_COMMAND
  123. | VacuumEntityFeature.FAN_SPEED
  124. | VacuumEntityFeature.TURN_ON
  125. | VacuumEntityFeature.TURN_OFF
  126. | VacuumEntityFeature.START
  127. | VacuumEntityFeature.PAUSE
  128. | VacuumEntityFeature.LOCATE
  129. | VacuumEntityFeature.RETURN_HOME
  130. | VacuumEntityFeature.CLEAN_SPOT
  131. ),
  132. )
  133. def test_status(self):
  134. self.dps[COMMAND_DPS] = "standby"
  135. self.assertEqual(self.subject.status, "standby")
  136. self.dps[COMMAND_DPS] = "smart"
  137. self.assertEqual(self.subject.status, "smart")
  138. self.dps[COMMAND_DPS] = "chargego"
  139. self.assertEqual(self.subject.status, "return_to_base")
  140. self.dps[COMMAND_DPS] = "random"
  141. self.assertEqual(self.subject.status, "random")
  142. self.dps[COMMAND_DPS] = "wall_follow"
  143. self.assertEqual(self.subject.status, "wall_follow")
  144. self.dps[COMMAND_DPS] = "spiral"
  145. self.assertEqual(self.subject.status, "clean_spot")
  146. def test_state(self):
  147. self.dps[POWER_DPS] = True
  148. self.dps[SWITCH_DPS] = True
  149. self.dps[ERROR_DPS] = 0
  150. self.dps[COMMAND_DPS] = "return_to_base"
  151. self.assertEqual(self.subject.state, STATE_RETURNING)
  152. self.dps[COMMAND_DPS] = "standby"
  153. self.assertEqual(self.subject.state, STATE_IDLE)
  154. self.dps[COMMAND_DPS] = "random"
  155. self.assertEqual(self.subject.state, STATE_CLEANING)
  156. self.dps[POWER_DPS] = False
  157. self.assertEqual(self.subject.state, STATE_IDLE)
  158. self.dps[POWER_DPS] = True
  159. self.dps[SWITCH_DPS] = False
  160. self.assertEqual(self.subject.state, STATE_PAUSED)
  161. self.dps[ERROR_DPS] = 1
  162. self.assertEqual(self.subject.state, STATE_ERROR)
  163. async def test_async_turn_on(self):
  164. async with assert_device_properties_set(
  165. self.subject._device,
  166. {POWER_DPS: True},
  167. ):
  168. await self.subject.async_turn_on()
  169. async def test_async_turn_off(self):
  170. async with assert_device_properties_set(
  171. self.subject._device,
  172. {POWER_DPS: False},
  173. ):
  174. await self.subject.async_turn_off()
  175. async def test_async_toggle(self):
  176. self.dps[POWER_DPS] = False
  177. async with assert_device_properties_set(
  178. self.subject._device,
  179. {POWER_DPS: True},
  180. ):
  181. await self.subject.async_toggle()
  182. async def test_async_start(self):
  183. async with assert_device_properties_set(
  184. self.subject._device,
  185. {SWITCH_DPS: True},
  186. ):
  187. await self.subject.async_start()
  188. async def test_async_pause(self):
  189. async with assert_device_properties_set(
  190. self.subject._device,
  191. {SWITCH_DPS: False},
  192. ):
  193. await self.subject.async_pause()
  194. async def test_async_return_to_base(self):
  195. async with assert_device_properties_set(
  196. self.subject._device,
  197. {COMMAND_DPS: "chargego"},
  198. ):
  199. await self.subject.async_return_to_base()
  200. async def test_async_clean_spot(self):
  201. async with assert_device_properties_set(
  202. self.subject._device,
  203. {COMMAND_DPS: "spiral"},
  204. ):
  205. await self.subject.async_clean_spot()
  206. async def test_async_locate(self):
  207. async with assert_device_properties_set(
  208. self.subject._device,
  209. {LOCATE_DPS: True},
  210. ):
  211. await self.subject.async_locate()
  212. async def test_async_send_standby_command(self):
  213. async with assert_device_properties_set(
  214. self.subject._device,
  215. {COMMAND_DPS: "standby"},
  216. ):
  217. await self.subject.async_send_command("standby")
  218. async def test_async_send_smart_command(self):
  219. async with assert_device_properties_set(
  220. self.subject._device,
  221. {COMMAND_DPS: "smart"},
  222. ):
  223. await self.subject.async_send_command("smart")
  224. async def test_async_send_random_command(self):
  225. async with assert_device_properties_set(
  226. self.subject._device,
  227. {COMMAND_DPS: "random"},
  228. ):
  229. await self.subject.async_send_command("random")
  230. async def test_async_send_wall_follow_command(self):
  231. async with assert_device_properties_set(
  232. self.subject._device,
  233. {COMMAND_DPS: "wall_follow"},
  234. ):
  235. await self.subject.async_send_command("wall_follow")
  236. async def test_async_send_reverse_command(self):
  237. async with assert_device_properties_set(
  238. self.subject._device,
  239. {DIRECTION_DPS: "backward"},
  240. ):
  241. await self.subject.async_send_command("reverse")
  242. async def test_async_send_left_command(self):
  243. async with assert_device_properties_set(
  244. self.subject._device,
  245. {DIRECTION_DPS: "turn_left"},
  246. ):
  247. await self.subject.async_send_command("left")
  248. async def test_async_send_right_command(self):
  249. async with assert_device_properties_set(
  250. self.subject._device,
  251. {DIRECTION_DPS: "turn_right"},
  252. ):
  253. await self.subject.async_send_command("right")
  254. async def test_async_send_stop_command(self):
  255. async with assert_device_properties_set(
  256. self.subject._device,
  257. {DIRECTION_DPS: "stop"},
  258. ):
  259. await self.subject.async_send_command("stop")
  260. def test_fan_speed(self):
  261. self.dps[FAN_DPS] = "2"
  262. self.assertEqual(self.subject.fan_speed, "quiet")
  263. def test_fan_speed_list(self):
  264. self.assertCountEqual(
  265. self.subject.fan_speed_list,
  266. [
  267. "strong",
  268. "normal",
  269. "quiet",
  270. "gentle",
  271. "closed",
  272. ],
  273. )
  274. async def test_async_set_fan_speed(self):
  275. async with assert_device_properties_set(self.subject._device, {FAN_DPS: "3"}):
  276. await self.subject.async_set_fan_speed(fan_speed="gentle")