test_owon_pct513_thermostat.py 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. from homeassistant.components.climate.const import (
  2. CURRENT_HVAC_COOL,
  3. CURRENT_HVAC_FAN,
  4. CURRENT_HVAC_HEAT,
  5. CURRENT_HVAC_IDLE,
  6. HVAC_MODE_COOL,
  7. HVAC_MODE_HEAT,
  8. HVAC_MODE_HEAT_COOL,
  9. HVAC_MODE_OFF,
  10. SUPPORT_FAN_MODE,
  11. SUPPORT_PRESET_MODE,
  12. SUPPORT_TARGET_TEMPERATURE,
  13. )
  14. from homeassistant.const import TEMP_CELSIUS, TEMP_FAHRENHEIT
  15. from ..const import OWON_PCT513_THERMOSTAT_PAYLOAD
  16. from ..helpers import assert_device_properties_set
  17. from ..mixins.climate import TargetTemperatureTests
  18. from ..mixins.number import BasicNumberTests
  19. from .base_device_tests import TuyaDeviceTestCase
  20. HVACMODE_DPS = "2"
  21. TEMPERATURE_DPS = "16"
  22. TEMPF_DPS = "17"
  23. UNIT_DPS = "23"
  24. CURRENTTEMP_DPS = "24"
  25. CURRTEMPF_DPS = "29"
  26. CURRENTHUMID_DPS = "34"
  27. UNKNOWN45_DPS = "45"
  28. INSTALL_DPS = "107"
  29. TEMPC_DPS = "108"
  30. UNKNOWN109_DPS = "109"
  31. TEMPF2_DPS = "110"
  32. UNKNOWN111_DPS = "111"
  33. FAN_DPS = "115"
  34. UNKNOWN116_DPS = "116"
  35. SCHED_DPS = "119"
  36. PRESET_DPS = "120"
  37. DUTYCYCLE_DPS = "123"
  38. HVACACTION_DPS = "129"
  39. class TestOwonPCT513Thermostat(
  40. BasicNumberTests,
  41. TargetTemperatureTests,
  42. TuyaDeviceTestCase,
  43. ):
  44. __test__ = True
  45. def setUp(self):
  46. self.setUpForConfig(
  47. "owon_pct513_thermostat.yaml", OWON_PCT513_THERMOSTAT_PAYLOAD
  48. )
  49. self.subject = self.entities.get("climate")
  50. self.setUpTargetTemperature(
  51. TEMPERATURE_DPS,
  52. self.subject,
  53. min=15.0,
  54. max=45.0,
  55. scale=100,
  56. step=50,
  57. )
  58. self.setUpBasicNumber(
  59. DUTYCYCLE_DPS,
  60. self.entities.get("number_fan_runtime"),
  61. max=55,
  62. step=5,
  63. unit="min",
  64. )
  65. self.mark_secondary(["number_fan_runtime"])
  66. def test_supported_features(self):
  67. self.assertEqual(
  68. self.subject.supported_features,
  69. SUPPORT_FAN_MODE | SUPPORT_PRESET_MODE | SUPPORT_TARGET_TEMPERATURE,
  70. )
  71. def test_temperature_unit(self):
  72. self.dps[UNIT_DPS] = "c"
  73. self.assertEqual(self.subject.temperature_unit, TEMP_CELSIUS)
  74. self.dps[UNIT_DPS] = "f"
  75. self.assertEqual(self.subject.temperature_unit, TEMP_FAHRENHEIT)
  76. def test_current_temperature(self):
  77. self.dps[UNIT_DPS] = "c"
  78. self.dps[CURRENTTEMP_DPS] = 2100
  79. self.assertEqual(self.subject.current_temperature, 21.00)
  80. self.dps[UNIT_DPS] = "f"
  81. self.dps[CURRTEMPF_DPS] = 82
  82. self.assertEqual(self.subject.current_temperature, 82)
  83. def test_current_humidity(self):
  84. self.dps[CURRENTHUMID_DPS] = 50
  85. self.assertEqual(self.subject.current_humidity, 50)
  86. def test_hvac_modes(self):
  87. self.assertCountEqual(
  88. self.subject.hvac_modes,
  89. [
  90. HVAC_MODE_COOL,
  91. HVAC_MODE_HEAT,
  92. HVAC_MODE_HEAT_COOL,
  93. HVAC_MODE_OFF,
  94. ],
  95. )
  96. def test_hvac_mode(self):
  97. self.dps[HVACMODE_DPS] = "off"
  98. self.assertEqual(self.subject.hvac_mode, HVAC_MODE_OFF)
  99. self.dps[HVACMODE_DPS] = "cool"
  100. self.assertEqual(self.subject.hvac_mode, HVAC_MODE_COOL)
  101. self.dps[HVACMODE_DPS] = "heat"
  102. self.assertEqual(self.subject.hvac_mode, HVAC_MODE_HEAT)
  103. self.dps[HVACMODE_DPS] = "auto"
  104. self.assertEqual(self.subject.hvac_mode, HVAC_MODE_HEAT_COOL)
  105. self.dps[HVACMODE_DPS] = "emergencyheat"
  106. self.assertEqual(self.subject.hvac_mode, HVAC_MODE_HEAT)
  107. async def test_set_hvac_mode_off(self):
  108. async with assert_device_properties_set(
  109. self.subject._device, {HVACMODE_DPS: "off"}
  110. ):
  111. await self.subject.async_set_hvac_mode(HVAC_MODE_OFF)
  112. async def test_set_hvac_mode_cool(self):
  113. async with assert_device_properties_set(
  114. self.subject._device, {HVACMODE_DPS: "cool"}
  115. ):
  116. await self.subject.async_set_hvac_mode(HVAC_MODE_COOL)
  117. async def test_set_hvac_mode_heat(self):
  118. async with assert_device_properties_set(
  119. self.subject._device, {HVACMODE_DPS: "heat"}
  120. ):
  121. await self.subject.async_set_hvac_mode(HVAC_MODE_HEAT)
  122. async def test_set_hvac_mode_heatcool(self):
  123. async with assert_device_properties_set(
  124. self.subject._device, {HVACMODE_DPS: "auto"}
  125. ):
  126. await self.subject.async_set_hvac_mode(HVAC_MODE_HEAT_COOL)
  127. def test_hvac_action(self):
  128. self.dps[HVACACTION_DPS] = "coolfanon"
  129. self.assertEqual(self.subject.hvac_action, CURRENT_HVAC_COOL)
  130. self.dps[HVACACTION_DPS] = "alloff"
  131. self.assertEqual(self.subject.hvac_action, CURRENT_HVAC_IDLE)
  132. self.dps[HVACACTION_DPS] = "fanon"
  133. self.assertEqual(self.subject.hvac_action, CURRENT_HVAC_FAN)
  134. self.dps[HVACACTION_DPS] = "heatfanon"
  135. self.assertEqual(self.subject.hvac_action, CURRENT_HVAC_HEAT)
  136. def test_preset_modes(self):
  137. self.assertCountEqual(
  138. self.subject.preset_modes,
  139. ["Manual", "Follow Schedule", "Temporary Hold", "Permanent Hold"],
  140. )
  141. def test_preset_mode(self):
  142. self.dps[SCHED_DPS] = True
  143. self.dps[PRESET_DPS] = "followschedule"
  144. self.assertEqual(self.subject.preset_mode, "Follow Schedule")
  145. self.dps[PRESET_DPS] = "temphold"
  146. self.assertEqual(self.subject.preset_mode, "Temporary Hold")
  147. self.dps[PRESET_DPS] = "permhold"
  148. self.assertEqual(self.subject.preset_mode, "Permanent Hold")
  149. self.dps[SCHED_DPS] = False
  150. self.assertEqual(self.subject.preset_mode, "Manual")
  151. async def test_set_preset_to_schedule(self):
  152. async with assert_device_properties_set(
  153. self.subject._device,
  154. {
  155. SCHED_DPS: True,
  156. PRESET_DPS: "followschedule",
  157. },
  158. ):
  159. await self.subject.async_set_preset_mode("Follow Schedule")
  160. async def test_set_preset_to_temp_hold(self):
  161. async with assert_device_properties_set(
  162. self.subject._device,
  163. {
  164. SCHED_DPS: True,
  165. PRESET_DPS: "temphold",
  166. },
  167. ):
  168. await self.subject.async_set_preset_mode("Temporary Hold")
  169. async def test_set_preset_to_perm_hold(self):
  170. async with assert_device_properties_set(
  171. self.subject._device,
  172. {
  173. SCHED_DPS: True,
  174. PRESET_DPS: "permhold",
  175. },
  176. ):
  177. await self.subject.async_set_preset_mode("Permanent Hold")
  178. async def test_set_preset_to_manual(self):
  179. async with assert_device_properties_set(
  180. self.subject._device,
  181. {
  182. SCHED_DPS: False,
  183. },
  184. ):
  185. await self.subject.async_set_preset_mode("Manual")
  186. def test_fan_modes(self):
  187. self.assertCountEqual(
  188. self.subject.fan_modes,
  189. ["on", "auto", "cycle"],
  190. )
  191. def test_fan_mode(self):
  192. self.dps[FAN_DPS] = "on"
  193. self.assertEqual(self.subject.fan_mode, "on")
  194. self.dps[FAN_DPS] = "auto"
  195. self.assertEqual(self.subject.fan_mode, "auto")
  196. self.dps[FAN_DPS] = "cycle"
  197. self.assertEqual(self.subject.fan_mode, "cycle")
  198. async def test_set_fan_on(self):
  199. async with assert_device_properties_set(
  200. self.subject._device,
  201. {FAN_DPS: "on"},
  202. ):
  203. await self.subject.async_set_fan_mode("on")
  204. async def test_set_fan_auto(self):
  205. async with assert_device_properties_set(
  206. self.subject._device,
  207. {FAN_DPS: "auto"},
  208. ):
  209. await self.subject.async_set_fan_mode("auto")
  210. async def test_set_fan_cycle(self):
  211. async with assert_device_properties_set(
  212. self.subject._device,
  213. {FAN_DPS: "cycle"},
  214. ):
  215. await self.subject.async_set_fan_mode("cycle")
  216. def test_extra_state_attributes(self):
  217. self.dps[UNKNOWN45_DPS] = 45
  218. self.dps[INSTALL_DPS] = "107"
  219. self.dps[TEMPC_DPS] = 1080
  220. self.dps[UNKNOWN109_DPS] = 109
  221. self.dps[TEMPF2_DPS] = 110
  222. self.dps[UNKNOWN111_DPS] = 111
  223. self.dps[UNKNOWN116_DPS] = "116"
  224. self.assertDictEqual(
  225. self.subject.extra_state_attributes,
  226. {
  227. "unknown_45": 45,
  228. "installation": "107",
  229. "temp_c": 10.8,
  230. "unknown_109": 109,
  231. "temp_f2": 110,
  232. "unknown_111": 111,
  233. "unknown_116": "116",
  234. },
  235. )