Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
195 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,193 @@ | ||
""" | ||
Support for control of Elk-M1 connected thermostats. | ||
For more details about this platform, please refer to the documentation at | ||
https://home-assistant.io/components/climate.elkm1/ | ||
""" | ||
from homeassistant.components.climate import ( | ||
ATTR_TARGET_TEMP_HIGH, ATTR_TARGET_TEMP_LOW, PRECISION_WHOLE, STATE_AUTO, | ||
STATE_COOL, STATE_FAN_ONLY, STATE_HEAT, STATE_IDLE, SUPPORT_AUX_HEAT, | ||
SUPPORT_FAN_MODE, SUPPORT_OPERATION_MODE, SUPPORT_TARGET_TEMPERATURE_HIGH, | ||
SUPPORT_TARGET_TEMPERATURE_LOW, ClimateDevice) | ||
from homeassistant.components.elkm1 import ( | ||
DOMAIN as ELK_DOMAIN, ElkEntity, create_elk_entities) | ||
from homeassistant.const import STATE_ON | ||
|
||
DEPENDENCIES = [ELK_DOMAIN] | ||
|
||
|
||
async def async_setup_platform(hass, config, async_add_entities, | ||
discovery_info=None): | ||
"""Create the Elk-M1 thermostat platform.""" | ||
if discovery_info is None: | ||
return | ||
|
||
elk = hass.data[ELK_DOMAIN]['elk'] | ||
async_add_entities(create_elk_entities( | ||
hass, elk.thermostats, 'thermostat', ElkThermostat, []), True) | ||
|
||
|
||
class ElkThermostat(ElkEntity, ClimateDevice): | ||
"""Representation of an Elk-M1 Thermostat.""" | ||
|
||
def __init__(self, element, elk, elk_data): | ||
"""Initialize climate entity.""" | ||
super().__init__(element, elk, elk_data) | ||
self._state = None | ||
|
||
@property | ||
def supported_features(self): | ||
"""Return the list of supported features.""" | ||
return (SUPPORT_OPERATION_MODE | SUPPORT_FAN_MODE | SUPPORT_AUX_HEAT | ||
| SUPPORT_TARGET_TEMPERATURE_HIGH | ||
| SUPPORT_TARGET_TEMPERATURE_LOW) | ||
|
||
@property | ||
def temperature_unit(self): | ||
"""Return the temperature unit.""" | ||
return self._temperature_unit | ||
|
||
@property | ||
def current_temperature(self): | ||
"""Return the current temperature.""" | ||
return self._element.current_temp | ||
|
||
@property | ||
def target_temperature(self): | ||
"""Return the temperature we are trying to reach.""" | ||
from elkm1_lib.const import ThermostatMode | ||
if (self._element.mode == ThermostatMode.HEAT.value) or ( | ||
self._element.mode == ThermostatMode.EMERGENCY_HEAT.value): | ||
return self._element.heat_setpoint | ||
if self._element.mode == ThermostatMode.COOL.value: | ||
return self._element.cool_setpoint | ||
return None | ||
|
||
@property | ||
def target_temperature_high(self): | ||
"""Return the high target temperature.""" | ||
return self._element.cool_setpoint | ||
|
||
@property | ||
def target_temperature_low(self): | ||
"""Return the low target temperature.""" | ||
return self._element.heat_setpoint | ||
|
||
@property | ||
def target_temperature_step(self): | ||
"""Return the supported step of target temperature.""" | ||
return 1 | ||
|
||
@property | ||
def current_humidity(self): | ||
"""Return the current humidity.""" | ||
return self._element.humidity | ||
|
||
@property | ||
def current_operation(self): | ||
"""Return current operation ie. heat, cool, idle.""" | ||
return self._state | ||
|
||
@property | ||
def operation_list(self): | ||
"""Return the list of available operation modes.""" | ||
return [STATE_IDLE, STATE_HEAT, STATE_COOL, STATE_AUTO, STATE_FAN_ONLY] | ||
|
||
@property | ||
def precision(self): | ||
"""Return the precision of the system.""" | ||
return PRECISION_WHOLE | ||
|
||
@property | ||
def is_aux_heat_on(self): | ||
"""Return if aux heater is on.""" | ||
from elkm1_lib.const import ThermostatMode | ||
return self._element.mode == ThermostatMode.EMERGENCY_HEAT.value | ||
|
||
@property | ||
def min_temp(self): | ||
"""Return the minimum temperature supported.""" | ||
return 1 | ||
|
||
@property | ||
def max_temp(self): | ||
"""Return the maximum temperature supported.""" | ||
return 99 | ||
|
||
@property | ||
def current_fan_mode(self): | ||
"""Return the fan setting.""" | ||
from elkm1_lib.const import ThermostatFan | ||
if self._element.fan == ThermostatFan.AUTO.value: | ||
return STATE_AUTO | ||
if self._element.fan == ThermostatFan.ON.value: | ||
return STATE_ON | ||
return None | ||
|
||
def _elk_set(self, mode, fan): | ||
from elkm1_lib.const import ThermostatSetting | ||
if mode is not None: | ||
self._element.set(ThermostatSetting.MODE.value, mode) | ||
if fan is not None: | ||
self._element.set(ThermostatSetting.FAN.value, fan) | ||
|
||
async def async_set_operation_mode(self, operation_mode): | ||
"""Set thermostat operation mode.""" | ||
from elkm1_lib.const import ThermostatFan, ThermostatMode | ||
settings = { | ||
STATE_IDLE: (ThermostatMode.OFF.value, ThermostatFan.AUTO.value), | ||
STATE_HEAT: (ThermostatMode.HEAT.value, None), | ||
STATE_COOL: (ThermostatMode.COOL.value, None), | ||
STATE_AUTO: (ThermostatMode.AUTO.value, None), | ||
STATE_FAN_ONLY: (ThermostatMode.OFF.value, ThermostatFan.ON.value) | ||
} | ||
self._elk_set(settings[operation_mode][0], settings[operation_mode][1]) | ||
|
||
async def async_turn_aux_heat_on(self): | ||
"""Turn auxiliary heater on.""" | ||
from elkm1_lib.const import ThermostatMode | ||
self._elk_set(ThermostatMode.EMERGENCY_HEAT.value, None) | ||
|
||
async def async_turn_aux_heat_off(self): | ||
"""Turn auxiliary heater off.""" | ||
from elkm1_lib.const import ThermostatMode | ||
self._elk_set(ThermostatMode.HEAT.value, None) | ||
|
||
@property | ||
def fan_list(self): | ||
"""Return the list of available fan modes.""" | ||
return [STATE_AUTO, STATE_ON] | ||
|
||
async def async_set_fan_mode(self, fan_mode): | ||
"""Set new target fan mode.""" | ||
from elkm1_lib.const import ThermostatFan | ||
if fan_mode == STATE_AUTO: | ||
self._elk_set(None, ThermostatFan.AUTO.value) | ||
elif fan_mode == STATE_ON: | ||
self._elk_set(None, ThermostatFan.ON.value) | ||
|
||
async def async_set_temperature(self, **kwargs): | ||
"""Set new target temperature.""" | ||
from elkm1_lib.const import ThermostatSetting | ||
low_temp = kwargs.get(ATTR_TARGET_TEMP_LOW) | ||
high_temp = kwargs.get(ATTR_TARGET_TEMP_HIGH) | ||
if low_temp is not None: | ||
self._element.set( | ||
ThermostatSetting.HEAT_SETPOINT.value, round(low_temp)) | ||
if high_temp is not None: | ||
self._element.set( | ||
ThermostatSetting.COOL_SETPOINT.value, round(high_temp)) | ||
|
||
def _element_changed(self, element, changeset): | ||
from elkm1_lib.const import ThermostatFan, ThermostatMode | ||
mode_to_state = { | ||
ThermostatMode.OFF.value: STATE_IDLE, | ||
ThermostatMode.COOL.value: STATE_COOL, | ||
ThermostatMode.HEAT.value: STATE_HEAT, | ||
ThermostatMode.EMERGENCY_HEAT.value: STATE_HEAT, | ||
ThermostatMode.AUTO.value: STATE_AUTO, | ||
} | ||
self._state = mode_to_state.get(self._element.mode) | ||
if self._state == STATE_IDLE and \ | ||
self._element.fan == ThermostatFan.ON.value: | ||
self._state = STATE_FAN_ONLY |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters