test_madimack_heatpump.py 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. from homeassistant.components.climate.const import (
  2. CURRENT_HVAC_HEAT,
  3. CURRENT_HVAC_IDLE,
  4. CURRENT_HVAC_OFF,
  5. HVAC_MODE_HEAT,
  6. HVAC_MODE_OFF,
  7. SUPPORT_PRESET_MODE,
  8. SUPPORT_TARGET_TEMPERATURE,
  9. )
  10. from homeassistant.const import (
  11. DEVICE_CLASS_POWER_FACTOR,
  12. PERCENTAGE,
  13. STATE_UNAVAILABLE,
  14. TEMP_CELSIUS,
  15. TEMP_FAHRENHEIT,
  16. )
  17. from ..const import MADIMACK_HEATPUMP_PAYLOAD
  18. from ..helpers import assert_device_properties_set
  19. from ..mixins.sensor import BasicSensorTests
  20. from .base_device_tests import TuyaDeviceTestCase
  21. HVACMODE_DPS = "1"
  22. CURRENTTEMP_DPS = "102"
  23. UNITS_DPS = "103"
  24. POWERLEVEL_DPS = "104"
  25. OPMODE_DPS = "105"
  26. TEMPERATURE_DPS = "106"
  27. UNKNOWN107_DPS = "107"
  28. UNKNOWN108_DPS = "108"
  29. UNKNOWN115_DPS = "115"
  30. UNKNOWN116_DPS = "116"
  31. UNKNOWN118_DPS = "118"
  32. UNKNOWN120_DPS = "120"
  33. UNKNOWN122_DPS = "122"
  34. UNKNOWN124_DPS = "124"
  35. UNKNOWN125_DPS = "125"
  36. UNKNOWN126_DPS = "126"
  37. UNKNOWN127_DPS = "127"
  38. UNKNOWN128_DPS = "128"
  39. UNKNOWN129_DPS = "129"
  40. UNKNOWN130_DPS = "130"
  41. UNKNOWN134_DPS = "134"
  42. UNKNOWN135_DPS = "135"
  43. UNKNOWN136_DPS = "136"
  44. UNKNOWN139_DPS = "139"
  45. UNKNOWN140_DPS = "140"
  46. PRESET_DPS = "117"
  47. class TestMadimackPoolHeatpump(BasicSensorTests, TuyaDeviceTestCase):
  48. __test__ = True
  49. def setUp(self):
  50. self.setUpForConfig("madimack_heatpump.yaml", MADIMACK_HEATPUMP_PAYLOAD)
  51. self.subject = self.entities.get("climate")
  52. self.setUpBasicSensor(
  53. POWERLEVEL_DPS,
  54. self.entities.get("sensor_power_level"),
  55. device_class=DEVICE_CLASS_POWER_FACTOR,
  56. unit=PERCENTAGE,
  57. )
  58. def test_supported_features(self):
  59. self.assertEqual(
  60. self.subject.supported_features,
  61. SUPPORT_TARGET_TEMPERATURE | SUPPORT_PRESET_MODE,
  62. )
  63. def test_icon(self):
  64. self.dps[HVACMODE_DPS] = True
  65. self.assertEqual(self.subject.icon, "mdi:hot-tub")
  66. self.dps[HVACMODE_DPS] = False
  67. self.assertEqual(self.subject.icon, "mdi:hvac-off")
  68. def test_temperature_unit(self):
  69. self.dps[UNITS_DPS] = False
  70. self.assertEqual(self.subject.temperature_unit, TEMP_FAHRENHEIT)
  71. self.dps[UNITS_DPS] = True
  72. self.assertEqual(self.subject.temperature_unit, TEMP_CELSIUS)
  73. def test_target_temperature(self):
  74. self.dps[TEMPERATURE_DPS] = 25
  75. self.assertEqual(self.subject.target_temperature, 25)
  76. def test_target_temperature_step(self):
  77. self.assertEqual(self.subject.target_temperature_step, 1)
  78. def test_minimum_target_temperature(self):
  79. self.assertEqual(self.subject.min_temp, 18)
  80. def test_maximum_target_temperature(self):
  81. self.assertEqual(self.subject.max_temp, 45)
  82. def test_minimum_fahrenheit_temperature(self):
  83. self.dps[UNITS_DPS] = False
  84. self.assertEqual(self.subject.min_temp, 60)
  85. def test_maximum_fahrenheit_temperature(self):
  86. self.dps[UNITS_DPS] = False
  87. self.assertEqual(self.subject.max_temp, 115)
  88. async def test_legacy_set_temperature_with_temperature(self):
  89. async with assert_device_properties_set(
  90. self.subject._device, {TEMPERATURE_DPS: 25}
  91. ):
  92. await self.subject.async_set_temperature(temperature=25)
  93. async def test_legacy_set_temperature_with_no_valid_properties(self):
  94. await self.subject.async_set_temperature(something="else")
  95. self.subject._device.async_set_property.assert_not_called()
  96. async def test_set_target_temperature_succeeds_within_valid_range(self):
  97. async with assert_device_properties_set(
  98. self.subject._device, {TEMPERATURE_DPS: 25}
  99. ):
  100. await self.subject.async_set_target_temperature(25)
  101. async def test_set_target_temperature_rounds_value_to_closest_integer(self):
  102. async with assert_device_properties_set(
  103. self.subject._device,
  104. {TEMPERATURE_DPS: 25},
  105. ):
  106. await self.subject.async_set_target_temperature(24.6)
  107. async def test_set_target_temperature_fails_outside_valid_range(self):
  108. with self.assertRaisesRegex(
  109. ValueError, "temperature \\(14\\) must be between 18 and 45"
  110. ):
  111. await self.subject.async_set_target_temperature(14)
  112. with self.assertRaisesRegex(
  113. ValueError, "temperature \\(46\\) must be between 18 and 45"
  114. ):
  115. await self.subject.async_set_target_temperature(46)
  116. def test_current_temperature(self):
  117. self.dps[CURRENTTEMP_DPS] = 25
  118. self.assertEqual(self.subject.current_temperature, 25)
  119. def test_hvac_mode(self):
  120. self.dps[HVACMODE_DPS] = True
  121. self.assertEqual(self.subject.hvac_mode, HVAC_MODE_HEAT)
  122. self.dps[HVACMODE_DPS] = False
  123. self.assertEqual(self.subject.hvac_mode, HVAC_MODE_OFF)
  124. self.dps[HVACMODE_DPS] = None
  125. self.assertEqual(self.subject.hvac_mode, STATE_UNAVAILABLE)
  126. def test_hvac_modes(self):
  127. self.assertCountEqual(self.subject.hvac_modes, [HVAC_MODE_OFF, HVAC_MODE_HEAT])
  128. async def test_turn_on(self):
  129. async with assert_device_properties_set(
  130. self.subject._device, {HVACMODE_DPS: True}
  131. ):
  132. await self.subject.async_set_hvac_mode(HVAC_MODE_HEAT)
  133. async def test_turn_off(self):
  134. async with assert_device_properties_set(
  135. self.subject._device, {HVACMODE_DPS: False}
  136. ):
  137. await self.subject.async_set_hvac_mode(HVAC_MODE_OFF)
  138. def test_preset_mode(self):
  139. self.dps[PRESET_DPS] = False
  140. self.assertEqual(self.subject.preset_mode, "Silent")
  141. self.dps[PRESET_DPS] = True
  142. self.assertEqual(self.subject.preset_mode, "Boost")
  143. self.dps[PRESET_DPS] = None
  144. self.assertIs(self.subject.preset_mode, None)
  145. def test_preset_modes(self):
  146. self.assertCountEqual(self.subject.preset_modes, ["Silent", "Boost"])
  147. async def test_set_preset_mode_to_silent(self):
  148. async with assert_device_properties_set(
  149. self.subject._device,
  150. {PRESET_DPS: False},
  151. ):
  152. await self.subject.async_set_preset_mode("Silent")
  153. async def test_set_preset_mode_to_boost(self):
  154. async with assert_device_properties_set(
  155. self.subject._device,
  156. {PRESET_DPS: True},
  157. ):
  158. await self.subject.async_set_preset_mode("Boost")
  159. def test_hvac_action(self):
  160. self.dps[HVACMODE_DPS] = True
  161. self.dps[OPMODE_DPS] = "heating"
  162. self.assertEqual(self.subject.hvac_action, CURRENT_HVAC_HEAT)
  163. self.dps[OPMODE_DPS] = "warm"
  164. self.assertEqual(self.subject.hvac_action, CURRENT_HVAC_IDLE)
  165. self.dps[HVACMODE_DPS] = False
  166. self.assertEqual(self.subject.hvac_action, CURRENT_HVAC_OFF)
  167. def test_device_state_attributes(self):
  168. self.dps[POWERLEVEL_DPS] = 50
  169. self.dps[UNKNOWN107_DPS] = 1
  170. self.dps[UNKNOWN108_DPS] = 2
  171. self.dps[UNKNOWN115_DPS] = 3
  172. self.dps[UNKNOWN116_DPS] = 4
  173. self.dps[UNKNOWN118_DPS] = 5
  174. self.dps[UNKNOWN120_DPS] = 6
  175. self.dps[UNKNOWN122_DPS] = 7
  176. self.dps[UNKNOWN124_DPS] = 8
  177. self.dps[UNKNOWN125_DPS] = 9
  178. self.dps[UNKNOWN126_DPS] = 10
  179. self.dps[UNKNOWN127_DPS] = 11
  180. self.dps[UNKNOWN128_DPS] = 12
  181. self.dps[UNKNOWN129_DPS] = 13
  182. self.dps[UNKNOWN130_DPS] = True
  183. self.dps[UNKNOWN134_DPS] = False
  184. self.dps[UNKNOWN135_DPS] = True
  185. self.dps[UNKNOWN136_DPS] = False
  186. self.dps[UNKNOWN139_DPS] = True
  187. self.dps[UNKNOWN140_DPS] = "test"
  188. self.assertDictEqual(
  189. self.subject.device_state_attributes,
  190. {
  191. "power_level": 50,
  192. "unknown_107": 1,
  193. "unknown_108": 2,
  194. "unknown_115": 3,
  195. "unknown_116": 4,
  196. "unknown_118": 5,
  197. "unknown_120": 6,
  198. "unknown_122": 7,
  199. "unknown_124": 8,
  200. "unknown_125": 9,
  201. "unknown_126": 10,
  202. "unknown_127": 11,
  203. "unknown_128": 12,
  204. "unknown_129": 13,
  205. "unknown_130": True,
  206. "unknown_134": False,
  207. "unknown_135": True,
  208. "unknown_136": False,
  209. "unknown_139": True,
  210. "unknown_140": "test",
  211. },
  212. )