climate.py 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. """
  2. Goldair GECO WiFi Heater device.
  3. """
  4. from homeassistant.components.climate import ClimateDevice
  5. from homeassistant.components.climate.const import (
  6. ATTR_HVAC_MODE,
  7. HVAC_MODE_HEAT,
  8. SUPPORT_TARGET_TEMPERATURE,
  9. )
  10. from homeassistant.const import ATTR_TEMPERATURE, STATE_UNAVAILABLE
  11. from ..device import GoldairTuyaDevice
  12. from .const import (
  13. ATTR_ERROR,
  14. ATTR_TARGET_TEMPERATURE,
  15. HVAC_MODE_TO_DPS_MODE,
  16. PROPERTY_TO_DPS_ID,
  17. )
  18. SUPPORT_FLAGS = SUPPORT_TARGET_TEMPERATURE
  19. class GoldairGECOHeater(ClimateDevice):
  20. """Representation of a Goldair GECO WiFi heater."""
  21. def __init__(self, device):
  22. """Initialize the heater.
  23. Args:
  24. device (GoldairTuyaDevice): The device API instance."""
  25. self._device = device
  26. self._support_flags = SUPPORT_FLAGS
  27. self._TEMPERATURE_STEP = 1
  28. self._TEMPERATURE_LIMITS = {"min": 15, "max": 35}
  29. @property
  30. def supported_features(self):
  31. """Return the list of supported features."""
  32. return self._support_flags
  33. @property
  34. def should_poll(self):
  35. """Return the polling state."""
  36. return True
  37. @property
  38. def name(self):
  39. """Return the name of the climate device."""
  40. return self._device.name
  41. @property
  42. def unique_id(self):
  43. """Return the unique id for this heater."""
  44. return self._device.unique_id
  45. @property
  46. def device_info(self):
  47. """Return device information about this heater."""
  48. return self._device.device_info
  49. @property
  50. def icon(self):
  51. """Return the icon to use in the frontend for this device."""
  52. hvac_mode = self.hvac_mode
  53. if hvac_mode == HVAC_MODE_HEAT:
  54. return "mdi:radiator"
  55. else:
  56. return "mdi:radiator-disabled"
  57. @property
  58. def temperature_unit(self):
  59. """Return the unit of measurement."""
  60. return self._device.temperature_unit
  61. @property
  62. def target_temperature(self):
  63. """Return the temperature we try to reach."""
  64. return self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_TARGET_TEMPERATURE])
  65. @property
  66. def target_temperature_step(self):
  67. """Return the supported step of target temperature."""
  68. return self._TEMPERATURE_STEP
  69. @property
  70. def min_temp(self):
  71. """Return the minimum temperature."""
  72. return self._TEMPERATURE_LIMITS["min"]
  73. @property
  74. def max_temp(self):
  75. """Return the maximum temperature."""
  76. return self._TEMPERATURE_LIMITS["max"]
  77. async def async_set_temperature(self, **kwargs):
  78. """Set new target temperatures."""
  79. if kwargs.get(ATTR_TEMPERATURE) is not None:
  80. await self.async_set_target_temperature(kwargs.get(ATTR_TEMPERATURE))
  81. async def async_set_target_temperature(self, target_temperature):
  82. target_temperature = int(round(target_temperature))
  83. limits = self._TEMPERATURE_LIMITS
  84. if not limits["min"] <= target_temperature <= limits["max"]:
  85. raise ValueError(
  86. f"Target temperature ({target_temperature}) must be between "
  87. f'{limits["min"]} and {limits["max"]}'
  88. )
  89. await self._device.async_set_property(
  90. PROPERTY_TO_DPS_ID[ATTR_TARGET_TEMPERATURE], target_temperature
  91. )
  92. @property
  93. def current_temperature(self):
  94. """Return the current temperature."""
  95. return self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_TEMPERATURE])
  96. @property
  97. def hvac_mode(self):
  98. """Return current HVAC mode, ie Heat or Off."""
  99. dps_mode = self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_HVAC_MODE])
  100. if dps_mode is not None:
  101. return GoldairTuyaDevice.get_key_for_value(HVAC_MODE_TO_DPS_MODE, dps_mode)
  102. else:
  103. return STATE_UNAVAILABLE
  104. @property
  105. def hvac_modes(self):
  106. """Return the list of available HVAC modes."""
  107. return list(HVAC_MODE_TO_DPS_MODE.keys())
  108. async def async_set_hvac_mode(self, hvac_mode):
  109. """Set new HVAC mode."""
  110. dps_mode = HVAC_MODE_TO_DPS_MODE[hvac_mode]
  111. await self._device.async_set_property(
  112. PROPERTY_TO_DPS_ID[ATTR_HVAC_MODE], dps_mode
  113. )
  114. @property
  115. def device_state_attributes(self):
  116. """Get additional attributes that HA doesn't naturally support."""
  117. error = self._device.get_property(PROPERTY_TO_DPS_ID[ATTR_ERROR])
  118. return {ATTR_ERROR: error or None}
  119. async def async_update(self):
  120. await self._device.async_refresh()