Files
2024-01-11 15:10:51 +03:00

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"]