110 lines
3.2 KiB
Python
110 lines
3.2 KiB
Python
"""The venstar component."""
|
|
import asyncio
|
|
|
|
from requests import RequestException
|
|
from venstarcolortouch import VenstarColorTouch
|
|
|
|
from homeassistant.const import (
|
|
CONF_HOST,
|
|
CONF_PASSWORD,
|
|
CONF_PIN,
|
|
CONF_SSL,
|
|
CONF_USERNAME,
|
|
)
|
|
from homeassistant.exceptions import ConfigEntryNotReady
|
|
from homeassistant.helpers.entity import Entity
|
|
|
|
from .const import _LOGGER, DOMAIN, VENSTAR_TIMEOUT
|
|
|
|
PLATFORMS = ["climate"]
|
|
|
|
|
|
async def async_setup_entry(hass, config):
|
|
"""Set up the Venstar thermostat."""
|
|
username = config.data.get(CONF_USERNAME)
|
|
password = config.data.get(CONF_PASSWORD)
|
|
pin = config.data.get(CONF_PIN)
|
|
host = config.data[CONF_HOST]
|
|
timeout = VENSTAR_TIMEOUT
|
|
protocol = "https" if config.data[CONF_SSL] else "http"
|
|
|
|
client = VenstarColorTouch(
|
|
addr=host,
|
|
timeout=timeout,
|
|
user=username,
|
|
password=password,
|
|
pin=pin,
|
|
proto=protocol,
|
|
)
|
|
|
|
try:
|
|
await hass.async_add_executor_job(client.update_info)
|
|
except (OSError, RequestException) as ex:
|
|
raise ConfigEntryNotReady(f"Unable to connect to the thermostat: {ex}") from ex
|
|
hass.data.setdefault(DOMAIN, {})[config.entry_id] = client
|
|
hass.config_entries.async_setup_platforms(config, PLATFORMS)
|
|
|
|
return True
|
|
|
|
|
|
async def async_unload_entry(hass, config):
|
|
"""Unload the config config and platforms."""
|
|
unload_ok = await hass.config_entries.async_unload_platforms(config, PLATFORMS)
|
|
if unload_ok:
|
|
hass.data[DOMAIN].pop(config.entry_id)
|
|
return unload_ok
|
|
|
|
|
|
class VenstarEntity(Entity):
|
|
"""Get the latest data and update."""
|
|
|
|
def __init__(self, config, client):
|
|
"""Initialize the data object."""
|
|
self._config = config
|
|
self._client = client
|
|
|
|
async def async_update(self):
|
|
"""Update the state."""
|
|
try:
|
|
info_success = await self.hass.async_add_executor_job(
|
|
self._client.update_info
|
|
)
|
|
except (OSError, RequestException) as ex:
|
|
_LOGGER.error("Exception during info update: %s", ex)
|
|
|
|
# older venstars sometimes cannot handle rapid sequential connections
|
|
await asyncio.sleep(3)
|
|
|
|
try:
|
|
sensor_success = await self.hass.async_add_executor_job(
|
|
self._client.update_sensors
|
|
)
|
|
except (OSError, RequestException) as ex:
|
|
_LOGGER.error("Exception during sensor update: %s", ex)
|
|
|
|
if not info_success or not sensor_success:
|
|
_LOGGER.error("Failed to update data")
|
|
|
|
@property
|
|
def name(self):
|
|
"""Return the name of the thermostat."""
|
|
return self._client.name
|
|
|
|
@property
|
|
def unique_id(self):
|
|
"""Set unique_id for this entity."""
|
|
return f"{self._config.entry_id}"
|
|
|
|
@property
|
|
def device_info(self):
|
|
"""Return the device information for this entity."""
|
|
return {
|
|
"identifiers": {(DOMAIN, self._config.entry_id)},
|
|
"name": self._client.name,
|
|
"manufacturer": "Venstar",
|
|
# pylint: disable=protected-access
|
|
"model": f"{self._client.model}-{self._client._type}",
|
|
# pylint: disable=protected-access
|
|
"sw_version": self._client._api_ver,
|
|
}
|