Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for Tfiac Climate component #21823

Merged
merged 19 commits into from Mar 25, 2019
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions .coveragerc
Expand Up @@ -83,6 +83,7 @@ omit =
homeassistant/components/proliphix/climate.py
homeassistant/components/radiotherm/climate.py
homeassistant/components/sensibo/climate.py
homeassistant/components/tfiac/climate.py
homeassistant/components/touchline/climate.py
homeassistant/components/venstar/climate.py
homeassistant/components/zhong_hong/climate.py
Expand Down
1 change: 1 addition & 0 deletions CODEOWNERS
Validating CODEOWNERS rules …
Expand Up @@ -146,6 +146,7 @@ homeassistant/components/swiss_*/* @fabaff
homeassistant/components/sytadin/sensor.py @gautric
homeassistant/components/tautulli/sensor.py @ludeeus
homeassistant/components/time_date/sensor.py @fabaff
homeassistant/components/tfiac/climate.py @fredrike @mellado
homeassistant/components/uber/sensor.py @robbiet480
homeassistant/components/version/sensor.py @fabaff
homeassistant/components/waqi/sensor.py @andrey-git
Expand Down
1 change: 1 addition & 0 deletions homeassistant/components/tfiac/__init__.py
@@ -0,0 +1 @@
"""The tfiac component."""
188 changes: 188 additions & 0 deletions homeassistant/components/tfiac/climate.py
@@ -0,0 +1,188 @@
"""Climate platform that offers a climate device for the TFIAC protocol."""
from concurrent import futures
from datetime import timedelta
import logging

import voluptuous as vol

from homeassistant.components.climate import PLATFORM_SCHEMA, ClimateDevice
from homeassistant.components.climate.const import (
STATE_AUTO, STATE_COOL, STATE_DRY, STATE_FAN_ONLY, STATE_HEAT,
SUPPORT_FAN_MODE, SUPPORT_ON_OFF, SUPPORT_OPERATION_MODE,
SUPPORT_SWING_MODE, SUPPORT_TARGET_TEMPERATURE)
from homeassistant.const import ATTR_TEMPERATURE, CONF_HOST, TEMP_FAHRENHEIT
import homeassistant.helpers.config_validation as cv
from homeassistant.util import Throttle

DOMAIN = 'tfiac'
fredrike marked this conversation as resolved.
Show resolved Hide resolved

MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=60)

REQUIREMENTS = ['pytfiac==0.3']

PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
vol.Required(CONF_HOST): cv.string,
})

_LOGGER = logging.getLogger(__name__)

MIN_TEMP = 61
MAX_TEMP = 88
OPERATION_MAP = {
STATE_HEAT: 'heat',
STATE_AUTO: 'selfFeel',
STATE_DRY: 'dehumi',
STATE_FAN_ONLY: 'fan',
STATE_COOL: 'cool',
}
OPERATION_MAP_REV = {
v: k for k, v in OPERATION_MAP.items()}
FAN_LIST = ['Auto', 'Low', 'Middle', 'High']
SWING_LIST = [
'Off',
'Vertical',
'Horizontal',
'Both',
]

CURR_TEMP = 'current_temp'
TARGET_TEMP = 'target_temp'
OPERATION_MODE = 'operation'
FAN_MODE = 'fan_mode'
SWING_MODE = 'swing_mode'
ON_MODE = 'is_on'


async def async_setup_platform(hass, config, async_add_devices,
discovery_info=None):
"""Set up the TFIAC climate device."""
from pytfiac import Tfiac

tfiac_client = Tfiac(config[CONF_HOST])
try:
await tfiac_client.update()
except futures.TimeoutError:
return
fredrike marked this conversation as resolved.
Show resolved Hide resolved
async_add_devices([TfiacClimate(hass, tfiac_client)])


class TfiacClimate(ClimateDevice):
"""TFIAC class."""

def __init__(self, hass, client):
"""Init class."""
self._client = client
self._available = True

@property
def available(self):
"""Return if the device is available."""
return self._available

@Throttle(MIN_TIME_BETWEEN_UPDATES)
fredrike marked this conversation as resolved.
Show resolved Hide resolved
async def async_update(self):
"""Update status via socket polling."""
try:
await self._client.update()
self._available = True
except futures.TimeoutError:
self._available = False

@property
def supported_features(self):
"""Return the list of supported features."""
return (SUPPORT_FAN_MODE | SUPPORT_ON_OFF | SUPPORT_OPERATION_MODE
| SUPPORT_SWING_MODE | SUPPORT_TARGET_TEMPERATURE)

@property
def min_temp(self):
"""Return the minimum temperature."""
return MIN_TEMP

@property
def max_temp(self):
"""Return the maximum temperature."""
return MAX_TEMP

@property
def name(self):
"""Return the name of the climate device."""
return self._client.name

@property
def target_temperature(self):
"""Return the temperature we try to reach."""
return self._client.status['target_temp']

@property
def temperature_unit(self):
"""Return the unit of measurement."""
return TEMP_FAHRENHEIT

@property
def current_temperature(self):
"""Return the current temperature."""
return self._client.status['current_temp']

@property
def current_operation(self):
"""Return current operation ie. heat, cool, idle."""
operation = self._client.status['operation']
return OPERATION_MAP_REV.get(operation, operation)

@property
def is_on(self):
"""Return true if on."""
return self._client.status[ON_MODE] == 'on'

@property
def operation_list(self):
"""Return the list of available operation modes."""
return sorted(OPERATION_MAP)

@property
def current_fan_mode(self):
"""Return the fan setting."""
return self._client.status['fan_mode']

@property
def fan_list(self):
"""Return the list of available fan modes."""
return FAN_LIST

@property
def current_swing_mode(self):
"""Return the swing setting."""
return self._client.status['swing_mode']

@property
def swing_list(self):
"""List of available swing modes."""
return SWING_LIST

async def async_set_temperature(self, **kwargs):
"""Set new target temperature."""
if kwargs.get(ATTR_TEMPERATURE) is not None:
await self._client.set_state(TARGET_TEMP,
kwargs.get(ATTR_TEMPERATURE))

async def async_set_operation_mode(self, operation_mode):
"""Set new operation mode."""
await self._client.set_state(OPERATION_MODE,
OPERATION_MAP[operation_mode])

async def async_set_fan_mode(self, fan_mode):
"""Set new fan mode."""
await self._client.set_state(FAN_MODE, fan_mode)

async def async_set_swing_mode(self, swing_mode):
"""Set new swing mode."""
await self._client.set_swing(swing_mode)

async def async_turn_on(self):
"""Turn device on."""
await self._client.set_state(ON_MODE, 'on')

async def async_turn_off(self):
"""Turn device off."""
await self._client.set_state(ON_MODE, 'off')
3 changes: 3 additions & 0 deletions requirements_all.txt
Expand Up @@ -1302,6 +1302,9 @@ pytautulli==0.5.0
# homeassistant.components.liveboxplaytv.media_player
pyteleloisirs==3.4

# homeassistant.components.tfiac.climate
pytfiac==0.3

# homeassistant.components.thinkingcleaner.sensor
# homeassistant.components.thinkingcleaner.switch
pythinkingcleaner==0.0.3
Expand Down