87 lines
2.4 KiB
Python
87 lines
2.4 KiB
Python
"""
|
|
Local support for Insteon.
|
|
|
|
For more details about this component, please refer to the documentation at
|
|
https://home-assistant.io/components/insteon_local/
|
|
"""
|
|
import logging
|
|
import os
|
|
|
|
import requests
|
|
import voluptuous as vol
|
|
|
|
from homeassistant.const import (
|
|
CONF_HOST, CONF_PASSWORD, CONF_PORT, CONF_TIMEOUT, CONF_USERNAME)
|
|
import homeassistant.helpers.config_validation as cv
|
|
from homeassistant.helpers.discovery import load_platform
|
|
|
|
REQUIREMENTS = ['insteonlocal==0.53']
|
|
|
|
_LOGGER = logging.getLogger(__name__)
|
|
|
|
DEFAULT_PORT = 25105
|
|
DEFAULT_TIMEOUT = 10
|
|
DOMAIN = 'insteon_local'
|
|
|
|
INSTEON_CACHE = '.insteon_local_cache'
|
|
|
|
INSTEON_PLATFORMS = [
|
|
'light',
|
|
'switch',
|
|
'fan',
|
|
]
|
|
|
|
CONFIG_SCHEMA = vol.Schema({
|
|
DOMAIN: vol.Schema({
|
|
vol.Required(CONF_HOST): cv.string,
|
|
vol.Required(CONF_PASSWORD): cv.string,
|
|
vol.Required(CONF_USERNAME): cv.string,
|
|
vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
|
|
vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int,
|
|
})
|
|
}, extra=vol.ALLOW_EXTRA)
|
|
|
|
|
|
def setup(hass, config):
|
|
"""Set up the local Insteon hub."""
|
|
from insteonlocal.Hub import Hub
|
|
|
|
conf = config[DOMAIN]
|
|
username = conf.get(CONF_USERNAME)
|
|
password = conf.get(CONF_PASSWORD)
|
|
host = conf.get(CONF_HOST)
|
|
port = conf.get(CONF_PORT)
|
|
timeout = conf.get(CONF_TIMEOUT)
|
|
|
|
try:
|
|
if not os.path.exists(hass.config.path(INSTEON_CACHE)):
|
|
os.makedirs(hass.config.path(INSTEON_CACHE))
|
|
|
|
insteonhub = Hub(host, username, password, port, timeout, _LOGGER,
|
|
hass.config.path(INSTEON_CACHE))
|
|
|
|
# Check for successful connection
|
|
insteonhub.get_buffer_status()
|
|
except requests.exceptions.ConnectTimeout:
|
|
_LOGGER.error("Could not connect", exc_info=True)
|
|
return False
|
|
except requests.exceptions.ConnectionError:
|
|
_LOGGER.error("Could not connect", exc_info=True)
|
|
return False
|
|
except requests.exceptions.RequestException:
|
|
if insteonhub.http_code == 401:
|
|
_LOGGER.error("Bad username or password for Insteon_local hub")
|
|
else:
|
|
_LOGGER.error("Error on Insteon_local hub check", exc_info=True)
|
|
return False
|
|
|
|
linked = insteonhub.get_linked()
|
|
|
|
hass.data['insteon_local'] = insteonhub
|
|
|
|
for insteon_platform in INSTEON_PLATFORMS:
|
|
load_platform(hass, insteon_platform, DOMAIN, {'linked': linked},
|
|
config)
|
|
|
|
return True
|