test_saswell_c16_thermostat.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. from homeassistant.components.climate.const import (
  2. CURRENT_HVAC_COOL,
  3. CURRENT_HVAC_HEAT,
  4. CURRENT_HVAC_IDLE,
  5. HVAC_MODE_COOL,
  6. HVAC_MODE_HEAT,
  7. PRESET_AWAY,
  8. PRESET_HOME,
  9. SUPPORT_PRESET_MODE,
  10. SUPPORT_TARGET_TEMPERATURE,
  11. )
  12. from homeassistant.const import DEVICE_CLASS_TEMPERATURE, TEMP_CELSIUS
  13. from ..const import SASWELL_C16_THERMOSTAT_PAYLOAD
  14. from ..helpers import assert_device_properties_set
  15. from ..mixins.lock import BasicLockTests
  16. from ..mixins.number import MultiNumberTests
  17. from ..mixins.select import MultiSelectTests
  18. from ..mixins.sensor import BasicSensorTests
  19. from ..mixins.switch import BasicSwitchTests
  20. from .base_device_tests import TuyaDeviceTestCase
  21. TEMPERATURE_DPS = "2"
  22. PRESET_DPS = "3"
  23. UNKNOWN4_DPS = "4"
  24. CURRENTTEMP_DPS = "5"
  25. FLOORTEMPLIMIT_DPS = "6"
  26. INSTALL_DPS = "7"
  27. FLOORTEMP_DPS = "8"
  28. HVACMODE_DPS = "9"
  29. ADAPTIVE_DPS = "10"
  30. LOCK_DPS = "11"
  31. SCHED_DPS = "12"
  32. UNKNOWN14_DPS = "14"
  33. UNKNOWN15_DPS = "15"
  34. UNKNOWN17_DPS = "17"
  35. UNKNOWN21_DPS = "21"
  36. POWERRATING_DPS = "22"
  37. UNKNOWN23_DPS = "23"
  38. HVACACTION_DPS = "24"
  39. UNKNOWN26_DPS = "26"
  40. class TestSaswellC16Thermostat(
  41. BasicLockTests,
  42. BasicSensorTests,
  43. BasicSwitchTests,
  44. MultiNumberTests,
  45. MultiSelectTests,
  46. TuyaDeviceTestCase,
  47. ):
  48. __test__ = True
  49. def setUp(self):
  50. self.setUpForConfig(
  51. "saswell_c16_thermostat.yaml", SASWELL_C16_THERMOSTAT_PAYLOAD
  52. )
  53. self.subject = self.entities.get("climate")
  54. self.setUpBasicLock(LOCK_DPS, self.entities.get("lock_child_lock"))
  55. self.setUpBasicSensor(
  56. FLOORTEMP_DPS,
  57. self.entities.get("sensor_floor_temperature"),
  58. device_class=DEVICE_CLASS_TEMPERATURE,
  59. state_class="measurement",
  60. unit=TEMP_CELSIUS,
  61. testdata=(218, 21.8),
  62. )
  63. self.setUpBasicSwitch(ADAPTIVE_DPS, self.entities.get("switch_adaptive"))
  64. self.setUpMultiNumber(
  65. [
  66. {
  67. "name": "number_floor_temperature_limit",
  68. "dps": FLOORTEMPLIMIT_DPS,
  69. "min": 20.0,
  70. "max": 50.0,
  71. "scale": 10,
  72. "step": 0.5,
  73. },
  74. {
  75. "name": "number_power_rating",
  76. "dps": POWERRATING_DPS,
  77. "max": 3500,
  78. },
  79. ]
  80. )
  81. self.setUpMultiSelect(
  82. [
  83. {
  84. "name": "select_installation",
  85. "dps": INSTALL_DPS,
  86. "options": {
  87. True: "Office",
  88. False: "Home",
  89. },
  90. },
  91. {
  92. "name": "select_schedule",
  93. "dps": SCHED_DPS,
  94. "options": {
  95. "5_1_1": "Weekdays+Sat+Sun",
  96. "7": "Daily",
  97. },
  98. },
  99. ]
  100. )
  101. def test_supported_features(self):
  102. self.assertEqual(
  103. self.subject.supported_features,
  104. SUPPORT_TARGET_TEMPERATURE | SUPPORT_PRESET_MODE,
  105. )
  106. def test_icon(self):
  107. self.dps[PRESET_DPS] = "Smart"
  108. self.assertEqual(self.subject.icon, "mdi:home-thermometer")
  109. self.dps[PRESET_DPS] = "Manual"
  110. self.assertEqual(self.subject.icon, "mdi:cursor-pointer")
  111. self.dps[PRESET_DPS] = "Anti_frozen"
  112. self.assertEqual(self.subject.icon, "mdi:snowflake")
  113. self.dps[LOCK_DPS] = True
  114. self.assertEqual(self.basicLock.icon, "mdi:hand-back-right-off")
  115. self.dps[LOCK_DPS] = False
  116. self.assertEqual(self.basicLock.icon, "mdi:hand-back-right")
  117. def test_temperature_unit(self):
  118. self.assertEqual(
  119. self.subject.temperature_unit,
  120. self.subject._device.temperature_unit,
  121. )
  122. def test_target_temperature(self):
  123. self.dps[TEMPERATURE_DPS] = 250
  124. self.assertEqual(self.subject.target_temperature, 25.0)
  125. def test_target_temperature_step(self):
  126. self.assertEqual(self.subject.target_temperature_step, 0.5)
  127. def test_minimum_target_temperature(self):
  128. self.assertEqual(self.subject.min_temp, 5.0)
  129. def test_maximum_target_temperature(self):
  130. self.assertEqual(self.subject.max_temp, 40.0)
  131. async def test_set_target_temperature(self):
  132. async with assert_device_properties_set(
  133. self.subject._device,
  134. {TEMPERATURE_DPS: 240},
  135. ):
  136. await self.subject.async_set_target_temperature(24)
  137. async def test_set_target_temperature_fails_outside_valid_range(self):
  138. with self.assertRaisesRegex(
  139. ValueError, "temperature \\(4.5\\) must be between 5.0 and 40.0"
  140. ):
  141. await self.subject.async_set_target_temperature(4.5)
  142. def test_current_temperature(self):
  143. self.dps[CURRENTTEMP_DPS] = 250
  144. self.assertEqual(self.subject.current_temperature, 25.0)
  145. def test_hvac_mode(self):
  146. self.dps[HVACMODE_DPS] = True
  147. self.assertEqual(self.subject.hvac_mode, HVAC_MODE_COOL)
  148. self.dps[HVACMODE_DPS] = False
  149. self.assertEqual(self.subject.hvac_mode, HVAC_MODE_HEAT)
  150. def test_hvac_modes(self):
  151. self.assertCountEqual(
  152. self.subject.hvac_modes,
  153. [HVAC_MODE_COOL, HVAC_MODE_HEAT],
  154. )
  155. async def test_set_hvac_mode_cool(self):
  156. with self.assertRaises(TypeError):
  157. await self.subject.async_set_hvac_mode(HVAC_MODE_COOL)
  158. async def test_set_hvac_mode_heat(self):
  159. with self.assertRaises(TypeError):
  160. await self.subject.async_set_hvac_mode(HVAC_MODE_HEAT)
  161. def test_hvac_action(self):
  162. self.dps[HVACACTION_DPS] = "Cooling"
  163. self.assertEqual(self.subject.hvac_action, CURRENT_HVAC_COOL)
  164. self.dps[HVACACTION_DPS] = "Heating"
  165. self.assertEqual(self.subject.hvac_action, CURRENT_HVAC_HEAT)
  166. self.dps[HVACACTION_DPS] = "Standby"
  167. self.assertEqual(self.subject.hvac_action, CURRENT_HVAC_IDLE)
  168. def test_preset_mode(self):
  169. self.dps[PRESET_DPS] = "Smart"
  170. self.assertEqual(self.subject.preset_mode, PRESET_HOME)
  171. self.dps[PRESET_DPS] = "Manual"
  172. self.assertEqual(self.subject.preset_mode, "manual")
  173. self.dps[PRESET_DPS] = "Anti_frozen"
  174. self.assertEqual(self.subject.preset_mode, PRESET_AWAY)
  175. def test_preset_modes(self):
  176. self.assertCountEqual(
  177. self.subject.preset_modes,
  178. [PRESET_HOME, PRESET_AWAY, "manual"],
  179. )
  180. async def test_set_preset_to_away(self):
  181. async with assert_device_properties_set(
  182. self.subject._device,
  183. {PRESET_DPS: "Anti_frozen"},
  184. ):
  185. await self.subject.async_set_preset_mode(PRESET_AWAY)
  186. async def test_set_preset_to_home(self):
  187. async with assert_device_properties_set(
  188. self.subject._device,
  189. {PRESET_DPS: "Smart"},
  190. ):
  191. await self.subject.async_set_preset_mode(PRESET_HOME)
  192. async def test_set_preset_to_manual(self):
  193. async with assert_device_properties_set(
  194. self.subject._device,
  195. {PRESET_DPS: "Manual"},
  196. ):
  197. await self.subject.async_set_preset_mode("manual")
  198. def test_device_state_attributes(self):
  199. self.dps[UNKNOWN4_DPS] = 4
  200. self.dps[FLOORTEMPLIMIT_DPS] = 355
  201. self.dps[INSTALL_DPS] = True
  202. self.dps[FLOORTEMP_DPS] = 251
  203. self.dps[ADAPTIVE_DPS] = False
  204. self.dps[SCHED_DPS] = "5_1_1"
  205. self.dps[UNKNOWN14_DPS] = 14
  206. self.dps[UNKNOWN15_DPS] = 15
  207. self.dps[UNKNOWN17_DPS] = 17
  208. self.dps[UNKNOWN21_DPS] = True
  209. self.dps[POWERRATING_DPS] = 2000
  210. self.dps[UNKNOWN23_DPS] = 23
  211. self.dps[UNKNOWN26_DPS] = 26
  212. self.assertDictEqual(
  213. self.subject.device_state_attributes,
  214. {
  215. "unknown_4": 4,
  216. "floor_temp_limit": 35.5,
  217. "installation": "Office",
  218. "floor_temperature": 25.1,
  219. "adaptive": False,
  220. "schedule": "5_1_1",
  221. "unknown_14": 14,
  222. "unknown_15": 15,
  223. "unknown_17": 17,
  224. "unknown_21": True,
  225. "power_rating": 2000,
  226. "unknown_23": 23,
  227. "unknown_26": 26,
  228. },
  229. )