* Added tado climate component named the component v1 because of the unsupported state of the api I used (mytado.com) * sensor component * climate component which uses sensors * main component initiating sensor and climate devices * order of imports * consts for username and password * removed redundant code * changed wrong calls and properties * remove pylint overrides * merged update() and push_update() * changed wrong calls * removed pylint overrides * moved try..except * renamed MyTado hass-data object * added TadoDataStore * moved update methods from sensor to TadoDataStore * reorganised climate component * use new TadoDataStore * small change to overlay handling * code refactoring * removed unnessesary comments * changed throttle to attribute * changed suggestions from PR * Added constant variable for string literal * remove wrong fget() call * changed dependencies * Changed operation mode list * added human readable list of operations * removed unnecessary const * activated update on add_devices * droped unit * removed unnused property * changed temperature conversion * removed defaults from config changed naming of tado data const * switched operation_list key/values * changed the value returned as state * added one extra line * dropped state to use base impl. * renamed component * had to inplement temperature_unit * because it is not implemented in base class * create a copy of the sensors list * because it can be changed by other components * had to check for empty data object * hass is too fast now
131 lines
3.6 KiB
Python
131 lines
3.6 KiB
Python
"""
|
|
Support for the (unofficial) tado api.
|
|
|
|
For more details about this component, please refer to the documentation at
|
|
https://home-assistant.io/components/tado/
|
|
"""
|
|
|
|
import logging
|
|
import urllib
|
|
|
|
from datetime import timedelta
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.helpers.discovery import load_platform
|
|
from homeassistant.helpers import config_validation as cv
|
|
from homeassistant.const import (
|
|
CONF_USERNAME, CONF_PASSWORD)
|
|
from homeassistant.util import Throttle
|
|
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
DOMAIN = 'tado'
|
|
|
|
REQUIREMENTS = ['https://github.com/wmalgadey/PyTado/archive/'
|
|
'0.1.10.zip#'
|
|
'PyTado==0.1.10']
|
|
|
|
TADO_COMPONENTS = [
|
|
'sensor', 'climate'
|
|
]
|
|
|
|
CONFIG_SCHEMA = vol.Schema({
|
|
DOMAIN: vol.Schema({
|
|
vol.Required(CONF_USERNAME): cv.string,
|
|
vol.Required(CONF_PASSWORD): cv.string
|
|
})
|
|
}, extra=vol.ALLOW_EXTRA)
|
|
|
|
MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=10)
|
|
|
|
DATA_TADO = 'tado_data'
|
|
|
|
|
|
def setup(hass, config):
|
|
"""Your controller/hub specific code."""
|
|
username = config[DOMAIN][CONF_USERNAME]
|
|
password = config[DOMAIN][CONF_PASSWORD]
|
|
|
|
from PyTado.interface import Tado
|
|
|
|
try:
|
|
tado = Tado(username, password)
|
|
except (RuntimeError, urllib.error.HTTPError):
|
|
_LOGGER.error("Unable to connect to mytado with username and password")
|
|
return False
|
|
|
|
hass.data[DATA_TADO] = TadoDataStore(tado)
|
|
|
|
for component in TADO_COMPONENTS:
|
|
load_platform(hass, component, DOMAIN, {}, config)
|
|
|
|
return True
|
|
|
|
|
|
class TadoDataStore:
|
|
"""An object to store the tado data."""
|
|
|
|
def __init__(self, tado):
|
|
"""Initialize Tado data store."""
|
|
self.tado = tado
|
|
|
|
self.sensors = {}
|
|
self.data = {}
|
|
|
|
@Throttle(MIN_TIME_BETWEEN_UPDATES)
|
|
def update(self):
|
|
"""Update the internal data from mytado.com."""
|
|
for data_id, sensor in list(self.sensors.items()):
|
|
data = None
|
|
|
|
try:
|
|
if "zone" in sensor:
|
|
_LOGGER.info("querying mytado.com for zone %s %s",
|
|
sensor["id"], sensor["name"])
|
|
data = self.tado.getState(sensor["id"])
|
|
|
|
if "device" in sensor:
|
|
_LOGGER.info("querying mytado.com for device %s %s",
|
|
sensor["id"], sensor["name"])
|
|
data = self.tado.getDevices()[0]
|
|
|
|
except RuntimeError:
|
|
_LOGGER.error("Unable to connect to myTado. %s %s",
|
|
sensor["id"], sensor["id"])
|
|
|
|
self.data[data_id] = data
|
|
|
|
def add_sensor(self, data_id, sensor):
|
|
"""Add a sensor to update in _update()."""
|
|
self.sensors[data_id] = sensor
|
|
self.data[data_id] = None
|
|
|
|
def get_data(self, data_id):
|
|
"""Get the cached data."""
|
|
data = {"error": "no data"}
|
|
|
|
if data_id in self.data:
|
|
data = self.data[data_id]
|
|
|
|
return data
|
|
|
|
def get_zones(self):
|
|
"""Wrapper for getZones()."""
|
|
return self.tado.getZones()
|
|
|
|
def get_capabilities(self, tado_id):
|
|
"""Wrapper for getCapabilities(..)."""
|
|
return self.tado.getCapabilities(tado_id)
|
|
|
|
def get_me(self):
|
|
"""Wrapper for getMet()."""
|
|
return self.tado.getMe()
|
|
|
|
def reset_zone_overlay(self, zone_id):
|
|
"""Wrapper for resetZoneOverlay(..)."""
|
|
return self.tado.resetZoneOverlay(zone_id)
|
|
|
|
def set_zone_overlay(self, zone_id, mode, temperature):
|
|
"""Wrapper for setZoneOverlay(..)."""
|
|
return self.tado.setZoneOverlay(zone_id, mode, temperature)
|