climate.py 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. """
  2. Goldair WiFi Fan device.
  3. """
  4. from homeassistant.components.climate import ClimateEntity
  5. from homeassistant.components.climate.const import (
  6. ATTR_FAN_MODE,
  7. ATTR_HVAC_MODE,
  8. ATTR_PRESET_MODE,
  9. ATTR_SWING_MODE,
  10. SUPPORT_FAN_MODE,
  11. SUPPORT_PRESET_MODE,
  12. SUPPORT_SWING_MODE,
  13. )
  14. from homeassistant.const import ATTR_TEMPERATURE, STATE_UNAVAILABLE
  15. from ..device import TuyaLocalDevice
  16. from .const import (
  17. FAN_MODES,
  18. HVAC_MODE_TO_DPS_MODE,
  19. PRESET_MODE_TO_DPS_MODE,
  20. PROPERTY_TO_DPS_ID,
  21. SWING_MODE_TO_DPS_MODE,
  22. )
  23. SUPPORT_FLAGS = SUPPORT_FAN_MODE | SUPPORT_PRESET_MODE | SUPPORT_SWING_MODE
  24. class GoldairFan(ClimateEntity):
  25. """Representation of a Goldair WiFi fan."""
  26. def __init__(self, device):
  27. """Initialize the fan.
  28. Args:
  29. name (str): The device's name.
  30. device (TuyaLocalDevice): The device API instance."""
  31. self._device = device
  32. self._support_flags = SUPPORT_FLAGS
  33. @property
  34. def supported_features(self):
  35. """Return the list of supported features."""
  36. return self._support_flags
  37. @property
  38. def should_poll(self):
  39. """Return the polling state."""
  40. return True
  41. @property
  42. def name(self):
  43. """Return the name of the climate device."""
  44. return self._device.name
  45. @property
  46. def unique_id(self):
  47. """Return the unique id for this fan."""
  48. return self._device.unique_id
  49. @property
  50. def device_info(self):
  51. """Return device information about this fan."""
  52. return self._device.device_info
  53. @property
  54. def icon(self):
  55. """Return the icon to use in the frontend for this device."""
  56. return "mdi:fan"
  57. @property
  58. def temperature_unit(self):
  59. """This is not used but required by Home Assistant."""
  60. return self._device.temperature_unit
  61. @property
  62. def hvac_mode(self):
  63. """Return current HVAC mode, ie Fan Only or Off."""
  64. dps_mode = self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_HVAC_MODE])
  65. if dps_mode is not None:
  66. return TuyaLocalDevice.get_key_for_value(HVAC_MODE_TO_DPS_MODE, dps_mode)
  67. else:
  68. return STATE_UNAVAILABLE
  69. @property
  70. def hvac_modes(self):
  71. """Return the list of available HVAC modes."""
  72. return list(HVAC_MODE_TO_DPS_MODE.keys())
  73. async def async_set_hvac_mode(self, hvac_mode):
  74. """Set new HVAC mode."""
  75. dps_mode = HVAC_MODE_TO_DPS_MODE[hvac_mode]
  76. await self._device.async_set_property(
  77. PROPERTY_TO_DPS_ID[ATTR_HVAC_MODE], dps_mode
  78. )
  79. @property
  80. def preset_mode(self):
  81. """Return current preset mode, ie Comfort, Eco, Anti-freeze."""
  82. dps_mode = self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_PRESET_MODE])
  83. if dps_mode is not None:
  84. return TuyaLocalDevice.get_key_for_value(PRESET_MODE_TO_DPS_MODE, dps_mode)
  85. else:
  86. return None
  87. @property
  88. def preset_modes(self):
  89. """Return the list of available preset modes."""
  90. return list(PRESET_MODE_TO_DPS_MODE.keys())
  91. async def async_set_preset_mode(self, preset_mode):
  92. """Set new preset mode."""
  93. dps_mode = PRESET_MODE_TO_DPS_MODE[preset_mode]
  94. await self._device.async_set_property(
  95. PROPERTY_TO_DPS_ID[ATTR_PRESET_MODE], dps_mode
  96. )
  97. @property
  98. def swing_mode(self):
  99. """Return current swing mode: horizontal or off"""
  100. dps_mode = self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_SWING_MODE])
  101. if dps_mode is not None:
  102. return TuyaLocalDevice.get_key_for_value(SWING_MODE_TO_DPS_MODE, dps_mode)
  103. else:
  104. return None
  105. @property
  106. def swing_modes(self):
  107. """Return the list of available swing modes."""
  108. return list(SWING_MODE_TO_DPS_MODE.keys())
  109. async def async_set_swing_mode(self, swing_mode):
  110. """Set new swing mode."""
  111. dps_mode = SWING_MODE_TO_DPS_MODE[swing_mode]
  112. await self._device.async_set_property(
  113. PROPERTY_TO_DPS_ID[ATTR_SWING_MODE], dps_mode
  114. )
  115. @property
  116. def fan_mode(self):
  117. """Return current fan mode: 1-12 or 1-3 depending on the preset"""
  118. dps_mode = self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_FAN_MODE])
  119. if (
  120. dps_mode is not None
  121. and self.preset_mode is not None
  122. and dps_mode in FAN_MODES[self.preset_mode].values()
  123. ):
  124. return TuyaLocalDevice.get_key_for_value(
  125. FAN_MODES[self.preset_mode], dps_mode
  126. )
  127. else:
  128. return None
  129. @property
  130. def fan_modes(self):
  131. """Return the list of available fan modes."""
  132. if self.preset_mode is not None:
  133. return list(FAN_MODES[self.preset_mode].keys())
  134. else:
  135. return []
  136. async def async_set_fan_mode(self, fan_mode):
  137. """Set new fan mode."""
  138. if self.preset_mode is not None:
  139. dps_mode = FAN_MODES[self.preset_mode][int(fan_mode)]
  140. await self._device.async_set_property(
  141. PROPERTY_TO_DPS_ID[ATTR_FAN_MODE], dps_mode
  142. )
  143. else:
  144. raise ValueError("Fan mode can only be set when a preset mode is set")
  145. async def async_update(self):
  146. await self._device.async_refresh()