194 lines
5.9 KiB
Python
194 lines
5.9 KiB
Python
import logging
|
|
|
|
from homeassistant.components.climate import ClimateEntity, HVAC_MODE_OFF, HVAC_MODE_HEAT, \
|
|
SUPPORT_FAN_MODE, SUPPORT_TARGET_TEMPERATURE, SUPPORT_PRESET_MODE
|
|
from homeassistant.const import TEMP_CELSIUS, ATTR_TEMPERATURE
|
|
|
|
from . import DOMAIN, CONF_INCLUDE, DATA_CONFIG, YandexQuasar
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
DEVICES = ['devices.types.thermostat.ac', 'devices.types.thermostat']
|
|
|
|
async def async_setup_entry(hass, entry, async_add_entities):
|
|
include = hass.data[DOMAIN][DATA_CONFIG][CONF_INCLUDE]
|
|
quasar = hass.data[DOMAIN][entry.unique_id]
|
|
devices = [
|
|
YandexClimate(quasar, device)
|
|
for device in quasar.devices
|
|
if device['name'] in include and device['type'] in DEVICES
|
|
]
|
|
async_add_entities(devices, True)
|
|
|
|
|
|
# noinspection PyAbstractClass
|
|
class YandexClimate(ClimateEntity):
|
|
_min_temp = None
|
|
_max_temp = None
|
|
_precision = None
|
|
_hvac_mode = None
|
|
_hvac_modes = None
|
|
_preset_mode = None
|
|
_preset_modes = None
|
|
_is_on = None
|
|
_t_temp = None
|
|
_c_temp = None
|
|
_fan_mode = None
|
|
_fan_modes = None
|
|
_supported = 0
|
|
|
|
def __init__(self, quasar: YandexQuasar, device: dict):
|
|
self.quasar = quasar
|
|
self.device = device
|
|
|
|
@property
|
|
def unique_id(self):
|
|
return self.device['id'].replace('-', '')
|
|
|
|
@property
|
|
def name(self):
|
|
return self.device['name']
|
|
|
|
@property
|
|
def should_poll(self):
|
|
return True
|
|
|
|
@property
|
|
def precision(self):
|
|
return self._precision
|
|
|
|
@property
|
|
def temperature_unit(self):
|
|
return TEMP_CELSIUS
|
|
|
|
@property
|
|
def hvac_mode(self):
|
|
return self._hvac_mode if self._is_on else HVAC_MODE_OFF
|
|
|
|
@property
|
|
def hvac_modes(self):
|
|
return self._hvac_modes
|
|
|
|
@property
|
|
def preset_mode(self):
|
|
return self._preset_mode
|
|
|
|
@property
|
|
def preset_modes(self):
|
|
return self._preset_modes
|
|
|
|
@property
|
|
def current_temperature(self):
|
|
if self._c_temp is None:
|
|
return self._t_temp
|
|
return self._c_temp
|
|
|
|
@property
|
|
def target_temperature(self):
|
|
return self._t_temp
|
|
|
|
@property
|
|
def fan_mode(self):
|
|
return self._fan_mode
|
|
|
|
@property
|
|
def fan_modes(self):
|
|
return self._fan_modes
|
|
|
|
@property
|
|
def supported_features(self):
|
|
return self._supported
|
|
|
|
@property
|
|
def min_temp(self):
|
|
return self._min_temp
|
|
|
|
@property
|
|
def max_temp(self):
|
|
return self._max_temp
|
|
|
|
|
|
async def async_set_hvac_mode(self, hvac_mode):
|
|
if hvac_mode == HVAC_MODE_OFF:
|
|
await self.quasar.device_action(self.device['id'], on=False)
|
|
elif hvac_mode == HVAC_MODE_HEAT:
|
|
if self._preset_modes is not None:
|
|
await self.quasar.device_action(self.device['id'], on=True)
|
|
else:
|
|
await self.quasar.device_action(self.device['id'], on=True,
|
|
thermostat=hvac_mode)
|
|
else:
|
|
await self.quasar.device_action(self.device['id'], on=True,
|
|
thermostat=hvac_mode)
|
|
|
|
async def async_set_temperature(self, **kwargs):
|
|
await self.quasar.device_action(self.device['id'],
|
|
temperature=kwargs[ATTR_TEMPERATURE])
|
|
|
|
async def async_set_fan_mode(self, fan_mode):
|
|
await self.quasar.device_action(self.device['id'], fan_speed=fan_mode)
|
|
|
|
async def async_set_preset_mode(self, preset_mode):
|
|
await self.quasar.device_action(self.device['id'], heat=preset_mode)
|
|
|
|
async def init_params(self, capabilities: dict):
|
|
for capability in capabilities:
|
|
parameters = capability['parameters']
|
|
instance = parameters.get('instance')
|
|
if instance == 'temperature':
|
|
self._supported |= SUPPORT_TARGET_TEMPERATURE
|
|
range_ = parameters['range']
|
|
self._min_temp = range_['min']
|
|
self._max_temp = range_['max']
|
|
self._precision = range_['precision']
|
|
|
|
elif instance == 'fan_speed':
|
|
self._supported |= SUPPORT_FAN_MODE
|
|
self._fan_modes = [
|
|
p['value'] for p in parameters['modes']
|
|
]
|
|
|
|
elif instance == 'thermostat':
|
|
self._hvac_modes = [HVAC_MODE_OFF] + [
|
|
p['value'] for p in parameters['modes']
|
|
]
|
|
|
|
elif instance == 'heat':
|
|
self._supported |= SUPPORT_PRESET_MODE
|
|
self._preset_modes = [
|
|
p['value'] for p in parameters['modes']
|
|
]
|
|
self._hvac_mode = HVAC_MODE_HEAT
|
|
self._hvac_modes = [HVAC_MODE_HEAT, HVAC_MODE_OFF]
|
|
|
|
async def async_update(self):
|
|
data = await self.quasar.get_device(self.device['id'])
|
|
|
|
# first time init
|
|
if self._is_on is None:
|
|
await self.init_params(data['capabilities'])
|
|
|
|
for capability in data['capabilities']:
|
|
if not capability['retrievable']:
|
|
continue
|
|
|
|
instance = capability['state']['instance']
|
|
if instance == 'on':
|
|
self._is_on = capability['state']['value']
|
|
elif instance == 'temperature':
|
|
self._t_temp = capability['state']['value']
|
|
elif instance == 'fan_speed':
|
|
self._fan_mode = capability['state']['value']
|
|
elif instance == 'thermostat':
|
|
self._hvac_mode = capability['state']['value']
|
|
elif instance == 'heat':
|
|
self._preset_mode = capability['state']['value']
|
|
|
|
for property in data["properties"]:
|
|
if not property['retrievable']:
|
|
continue
|
|
|
|
instance = property["parameters"]["instance"]
|
|
if instance == "temperature":
|
|
self._c_temp = property["state"]["value"]
|