test_madimack_heatpump.py 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. from homeassistant.components.binary_sensor import DEVICE_CLASS_PROBLEM
  2. from homeassistant.components.climate.const import (
  3. CURRENT_HVAC_HEAT,
  4. CURRENT_HVAC_IDLE,
  5. CURRENT_HVAC_OFF,
  6. HVAC_MODE_HEAT,
  7. HVAC_MODE_OFF,
  8. SUPPORT_PRESET_MODE,
  9. SUPPORT_TARGET_TEMPERATURE,
  10. )
  11. from homeassistant.components.sensor import SensorDeviceClass
  12. from homeassistant.const import (
  13. PERCENTAGE,
  14. STATE_UNAVAILABLE,
  15. TEMP_CELSIUS,
  16. TEMP_FAHRENHEIT,
  17. )
  18. from ..const import MADIMACK_HEATPUMP_PAYLOAD
  19. from ..helpers import assert_device_properties_set
  20. from ..mixins.binary_sensor import BasicBinarySensorTests
  21. from ..mixins.climate import TargetTemperatureTests
  22. from ..mixins.sensor import MultiSensorTests
  23. from .base_device_tests import TuyaDeviceTestCase
  24. HVACMODE_DPS = "1"
  25. CURRENTTEMP_DPS = "102"
  26. UNITS_DPS = "103"
  27. POWERLEVEL_DPS = "104"
  28. OPMODE_DPS = "105"
  29. TEMPERATURE_DPS = "106"
  30. MINTEMP_DPS = "107"
  31. MAXTEMP_DPS = "108"
  32. ERROR_DPS = "115"
  33. UNKNOWN116_DPS = "116"
  34. UNKNOWN118_DPS = "118"
  35. COIL_DPS = "120"
  36. EXHAUST_DPS = "122"
  37. AMBIENT_DPS = "124"
  38. COMPRESSOR_DPS = "125"
  39. UNKNOWN126_DPS = "126"
  40. COOLINGPLATE_DPS = "127"
  41. EEV_DPS = "128"
  42. FANSPEED_DPS = "129"
  43. UNKNOWN130_DPS = "130"
  44. UNKNOWN134_DPS = "134"
  45. UNKNOWN135_DPS = "135"
  46. UNKNOWN136_DPS = "136"
  47. UNKNOWN139_DPS = "139"
  48. UNKNOWN140_DPS = "140"
  49. PRESET_DPS = "117"
  50. class TestMadimackPoolHeatpump(
  51. BasicBinarySensorTests,
  52. MultiSensorTests,
  53. TargetTemperatureTests,
  54. TuyaDeviceTestCase,
  55. ):
  56. __test__ = True
  57. def setUp(self):
  58. self.setUpForConfig("madimack_heatpump.yaml", MADIMACK_HEATPUMP_PAYLOAD)
  59. self.subject = self.entities.get("climate")
  60. self.setUpTargetTemperature(
  61. TEMPERATURE_DPS,
  62. self.subject,
  63. min=18,
  64. max=45,
  65. )
  66. self.setUpBasicBinarySensor(
  67. ERROR_DPS,
  68. self.entities.get("binary_sensor_water_flow"),
  69. device_class=DEVICE_CLASS_PROBLEM,
  70. testdata=(4, 0),
  71. )
  72. self.setUpMultiSensors(
  73. [
  74. {
  75. "dps": POWERLEVEL_DPS,
  76. "name": "sensor_power_level",
  77. "device_class": SensorDeviceClass.POWER_FACTOR,
  78. "unit": PERCENTAGE,
  79. },
  80. {
  81. "dps": COIL_DPS,
  82. "name": "sensor_evaporator_coil_pipe_temperature",
  83. "device_class": SensorDeviceClass.TEMPERATURE,
  84. "unit": TEMP_CELSIUS,
  85. },
  86. {
  87. "dps": EXHAUST_DPS,
  88. "name": "sensor_exhaust_gas_temperature",
  89. "device_class": SensorDeviceClass.TEMPERATURE,
  90. "unit": TEMP_CELSIUS,
  91. },
  92. {
  93. "dps": AMBIENT_DPS,
  94. "name": "sensor_ambient_temperature",
  95. "device_class": SensorDeviceClass.TEMPERATURE,
  96. "unit": TEMP_CELSIUS,
  97. },
  98. {
  99. "dps": COMPRESSOR_DPS,
  100. "name": "sensor_compressor_speed",
  101. "device_class": SensorDeviceClass.POWER_FACTOR,
  102. "unit": PERCENTAGE,
  103. },
  104. {
  105. "dps": COOLINGPLATE_DPS,
  106. "name": "sensor_cooling_plate_temperature",
  107. "device_class": SensorDeviceClass.TEMPERATURE,
  108. "unit": TEMP_CELSIUS,
  109. },
  110. {
  111. "dps": EEV_DPS,
  112. "name": "sensor_eev_opening",
  113. },
  114. {
  115. "dps": FANSPEED_DPS,
  116. "name": "sensor_fan_speed",
  117. },
  118. ]
  119. )
  120. self.mark_secondary(
  121. [
  122. "sensor_power_level",
  123. "sensor_ambient_temperature",
  124. "sensor_compressor_speed",
  125. "sensor_cooling_plate_temperature",
  126. "sensor_evaporator_coil_pipe_temperature",
  127. "sensor_eev_opening",
  128. "sensor_exhaust_gas_temperature",
  129. "sensor_fan_speed",
  130. "binary_sensor_water_flow",
  131. ]
  132. )
  133. def test_supported_features(self):
  134. self.assertEqual(
  135. self.subject.supported_features,
  136. SUPPORT_TARGET_TEMPERATURE | SUPPORT_PRESET_MODE,
  137. )
  138. def test_icon(self):
  139. self.dps[HVACMODE_DPS] = True
  140. self.assertEqual(self.subject.icon, "mdi:hot-tub")
  141. self.dps[HVACMODE_DPS] = False
  142. self.assertEqual(self.subject.icon, "mdi:hvac-off")
  143. def test_temperature_unit(self):
  144. self.dps[UNITS_DPS] = False
  145. self.assertEqual(self.subject.temperature_unit, TEMP_FAHRENHEIT)
  146. self.dps[UNITS_DPS] = True
  147. self.assertEqual(self.subject.temperature_unit, TEMP_CELSIUS)
  148. def test_minimum_fahrenheit_temperature(self):
  149. self.dps[UNITS_DPS] = False
  150. self.dps[MINTEMP_DPS] = 60
  151. self.assertEqual(self.subject.min_temp, 60)
  152. def test_maximum_fahrenheit_temperature(self):
  153. self.dps[UNITS_DPS] = False
  154. self.dps[MAXTEMP_DPS] = 115
  155. self.assertEqual(self.subject.max_temp, 115)
  156. def test_current_temperature(self):
  157. self.dps[CURRENTTEMP_DPS] = 25
  158. self.assertEqual(self.subject.current_temperature, 25)
  159. def test_hvac_mode(self):
  160. self.dps[HVACMODE_DPS] = True
  161. self.assertEqual(self.subject.hvac_mode, HVAC_MODE_HEAT)
  162. self.dps[HVACMODE_DPS] = False
  163. self.assertEqual(self.subject.hvac_mode, HVAC_MODE_OFF)
  164. self.dps[HVACMODE_DPS] = None
  165. self.assertEqual(self.subject.hvac_mode, STATE_UNAVAILABLE)
  166. def test_hvac_modes(self):
  167. self.assertCountEqual(self.subject.hvac_modes, [HVAC_MODE_OFF, HVAC_MODE_HEAT])
  168. async def test_turn_on(self):
  169. async with assert_device_properties_set(
  170. self.subject._device, {HVACMODE_DPS: True}
  171. ):
  172. await self.subject.async_set_hvac_mode(HVAC_MODE_HEAT)
  173. async def test_turn_off(self):
  174. async with assert_device_properties_set(
  175. self.subject._device, {HVACMODE_DPS: False}
  176. ):
  177. await self.subject.async_set_hvac_mode(HVAC_MODE_OFF)
  178. def test_preset_mode(self):
  179. self.dps[PRESET_DPS] = False
  180. self.assertEqual(self.subject.preset_mode, "Silent")
  181. self.dps[PRESET_DPS] = True
  182. self.assertEqual(self.subject.preset_mode, "Boost")
  183. self.dps[PRESET_DPS] = None
  184. self.assertIs(self.subject.preset_mode, None)
  185. def test_preset_modes(self):
  186. self.assertCountEqual(self.subject.preset_modes, ["Silent", "Boost"])
  187. async def test_set_preset_mode_to_silent(self):
  188. async with assert_device_properties_set(
  189. self.subject._device,
  190. {PRESET_DPS: False},
  191. ):
  192. await self.subject.async_set_preset_mode("Silent")
  193. async def test_set_preset_mode_to_boost(self):
  194. async with assert_device_properties_set(
  195. self.subject._device,
  196. {PRESET_DPS: True},
  197. ):
  198. await self.subject.async_set_preset_mode("Boost")
  199. def test_hvac_action(self):
  200. self.dps[HVACMODE_DPS] = True
  201. self.dps[OPMODE_DPS] = "heating"
  202. self.assertEqual(self.subject.hvac_action, CURRENT_HVAC_HEAT)
  203. self.dps[OPMODE_DPS] = "warm"
  204. self.assertEqual(self.subject.hvac_action, CURRENT_HVAC_IDLE)
  205. self.dps[HVACMODE_DPS] = False
  206. self.assertEqual(self.subject.hvac_action, CURRENT_HVAC_OFF)
  207. def test_extra_state_attributes(self):
  208. self.dps[ERROR_DPS] = 4
  209. self.dps[UNKNOWN116_DPS] = 4
  210. self.dps[UNKNOWN118_DPS] = 5
  211. self.dps[UNKNOWN126_DPS] = 10
  212. self.dps[UNKNOWN130_DPS] = True
  213. self.dps[UNKNOWN134_DPS] = False
  214. self.dps[UNKNOWN135_DPS] = True
  215. self.dps[UNKNOWN136_DPS] = False
  216. self.dps[UNKNOWN139_DPS] = True
  217. self.dps[UNKNOWN140_DPS] = "test"
  218. self.assertDictEqual(
  219. self.subject.extra_state_attributes,
  220. {
  221. "error": "Water Flow Protection",
  222. "unknown_116": 4,
  223. "unknown_118": 5,
  224. "unknown_126": 10,
  225. "unknown_130": True,
  226. "unknown_134": False,
  227. "unknown_135": True,
  228. "unknown_136": False,
  229. "unknown_139": True,
  230. "unknown_140": "test",
  231. },
  232. )