test_saswell_c16_thermostat.py 8.3 KB

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