Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 57 additions & 6 deletions custom_components/smartir/climate.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,12 @@

from homeassistant.components.climate import ClimateEntity, PLATFORM_SCHEMA
from homeassistant.components.climate.const import (
ClimateEntityFeature, HVACMode, HVAC_MODES, ATTR_HVAC_MODE)
ClimateEntityFeature,
HVACMode,
HVAC_MODES,
ATTR_HVAC_MODE,
PRESET_NONE,
)
from homeassistant.const import (
CONF_NAME, STATE_ON, STATE_OFF, STATE_UNKNOWN, STATE_UNAVAILABLE, ATTR_TEMPERATURE,
PRECISION_TENTHS, PRECISION_HALVES, PRECISION_WHOLE)
Expand Down Expand Up @@ -120,6 +125,8 @@ def __init__(self, hass, config, device_data):

valid_hvac_modes = [x for x in device_data['operationModes'] if x in HVAC_MODES]

self._presets_mode = device_data.get("presets", [PRESET_NONE])
self._preset = None
self._operation_modes = [HVACMode.OFF] + valid_hvac_modes
self._fan_modes = device_data['fanModes']
self._swing_modes = device_data.get('swingModes')
Expand All @@ -139,12 +146,18 @@ def __init__(self, hass, config, device_data):
#Supported features
self._support_flags = SUPPORT_FLAGS
self._support_swing = False
self._support_preset = False

if self._swing_modes:
self._support_flags = self._support_flags | ClimateEntityFeature.SWING_MODE
self._current_swing_mode = self._swing_modes[0]
self._support_swing = True

if self._presets_mode != [PRESET_NONE]:
self._support_flags = self._support_flags | ClimateEntityFeature.PRESET_MODE
self._support_preset = True
self._preset = self.preset_modes[0]

self._temp_lock = asyncio.Lock()
self._on_by_remote = False

Expand Down Expand Up @@ -244,6 +257,22 @@ def hvac_mode(self):
"""Return hvac mode ie. heat, cool."""
return self._hvac_mode

@property
def preset_mode(self):
"""Return the current preset mode, e.g., home, away, temp.

Requires ClimateEntityFeature.PRESET_MODE.
"""
return self._preset

@property
def preset_modes(self):
"""Return a list of available preset modes.

Requires ClimateEntityFeature.PRESET_MODE.
"""
return self._presets_mode

@property
def last_on_operation(self):
"""Return the last non-idle operation ie. heat, cool."""
Expand Down Expand Up @@ -348,6 +377,12 @@ async def async_set_swing_mode(self, swing_mode):
await self.send_command()
self.async_write_ha_state()

async def async_set_preset_mode(self, preset_mode: str) -> None:
"""Set new preset mode."""
self._preset = preset_mode
await self.send_command()
self.async_write_ha_state()

async def async_turn_off(self):
"""Turn off."""
await self.async_set_hvac_mode(HVACMode.OFF)
Expand All @@ -366,6 +401,7 @@ async def send_command(self):
operation_mode = self._hvac_mode
fan_mode = self._current_fan_mode
swing_mode = self._current_swing_mode
preset_mode = self._preset
target_temperature = '{0:g}'.format(self._target_temperature)

if operation_mode.lower() == HVACMode.OFF:
Expand All @@ -376,12 +412,27 @@ async def send_command(self):
await self._controller.send(self._commands['on'])
await asyncio.sleep(self._delay)

if self._support_preset:
if preset_mode == PRESET_NONE:
preset_dict = self._commands
else:
preset_dict = self._commands.get(preset_mode, {})
else:
preset_dict = self._commands

operation_dict = preset_dict.get(operation_mode, preset_dict)

fan_dict = operation_dict.get(fan_mode, operation_dict)

if self._support_swing == True:
await self._controller.send(
self._commands[operation_mode][fan_mode][swing_mode][target_temperature])
temp_dict = fan_dict.get(swing_mode, fan_dict)
else:
await self._controller.send(
self._commands[operation_mode][fan_mode][target_temperature])
temp_dict = fan_dict

command_to_send = temp_dict.get(target_temperature, None)

if command_to_send is not None:
await self._controller.send(command_to_send)

except Exception as e:
_LOGGER.exception(e)
Expand Down Expand Up @@ -451,4 +502,4 @@ def _async_update_humidity(self, state):
if state.state != STATE_UNKNOWN and state.state != STATE_UNAVAILABLE:
self._current_humidity = float(state.state)
except ValueError as ex:
_LOGGER.error("Unable to update from humidity sensor: %s", ex)
_LOGGER.error("Unable to update from humidity sensor: %s", ex)