diff --git a/.coveragerc b/.coveragerc index 67b1225797d..8d2c85627ed 100644 --- a/.coveragerc +++ b/.coveragerc @@ -170,6 +170,9 @@ omit = homeassistant/components/notify/twilio_sms.py homeassistant/components/notify/twilio_call.py + homeassistant/components/velux.py + homeassistant/components/*/velux.py + homeassistant/components/vera.py homeassistant/components/*/vera.py diff --git a/homeassistant/components/scene/velux.py b/homeassistant/components/scene/velux.py new file mode 100644 index 00000000000..0dca7ce76c7 --- /dev/null +++ b/homeassistant/components/scene/velux.py @@ -0,0 +1,55 @@ +""" +Support for VELUX scenes. + +Connects to VELUX KLF 200 interface + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/scene.velux/ +""" +from homeassistant.components.scene import Scene +from homeassistant.components.velux import _LOGGER, DATA_VELUX + + +DEPENDENCIES = ['velux'] + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Set up the scenes for velux platform.""" + if DATA_VELUX not in hass.data \ + or not hass.data[DATA_VELUX].initialized: + return False + + entities = [] + for scene in hass.data[DATA_VELUX].pyvlx.scenes: + entities.append(VeluxScene(hass, scene)) + add_devices(entities) + return True + + +class VeluxScene(Scene): + """Representation of a velux scene.""" + + def __init__(self, hass, scene): + """Init velux scene.""" + _LOGGER.info("Adding VELUX scene: %s", scene) + self.hass = hass + self.scene = scene + + @property + def name(self): + """Return the name of the scene.""" + return self.scene.name + + @property + def should_poll(self): + """Return that polling is not necessary.""" + return False + + @property + def is_on(self): + """There is no way of detecting if a scene is active (yet).""" + return False + + def activate(self, **kwargs): + """Activate the scene.""" + self.hass.async_add_job(self.scene.run()) diff --git a/homeassistant/components/velux.py b/homeassistant/components/velux.py new file mode 100644 index 00000000000..caf29d361dc --- /dev/null +++ b/homeassistant/components/velux.py @@ -0,0 +1,69 @@ +""" +Connects to VELUX KLF 200 interface. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/scene.velux/ + +""" + +import logging +import asyncio + +import voluptuous as vol + +from homeassistant.helpers import discovery +import homeassistant.helpers.config_validation as cv +from homeassistant.const import (CONF_HOST, CONF_PASSWORD) + +DOMAIN = "velux" +DATA_VELUX = "data_velux" +SUPPORTED_DOMAINS = ['scene'] +_LOGGER = logging.getLogger(__name__) + +REQUIREMENTS = ['pyvlx==0.1.3'] + +CONFIG_SCHEMA = vol.Schema({ + DOMAIN: vol.Schema({ + vol.Required(CONF_HOST): cv.string, + vol.Required(CONF_PASSWORD): cv.string, + }) +}, extra=vol.ALLOW_EXTRA) + + +@asyncio.coroutine +def async_setup(hass, config): + """Set up the velux component.""" + from pyvlx import PyVLXException + try: + hass.data[DATA_VELUX] = VeluxModule(hass, config) + yield from hass.data[DATA_VELUX].async_start() + + except PyVLXException as ex: + _LOGGER.exception("Can't connect to velux interface: %s", ex) + return False + + for component in SUPPORTED_DOMAINS: + hass.async_add_job( + discovery.async_load_platform(hass, component, DOMAIN, {}, config)) + return True + + +class VeluxModule: + """Abstraction for velux component.""" + + def __init__(self, hass, config): + """Initialize for velux component.""" + from pyvlx import PyVLX + self.initialized = False + host = config[DOMAIN].get(CONF_HOST) + password = config[DOMAIN].get(CONF_PASSWORD) + self.pyvlx = PyVLX( + host=host, + password=password) + self.hass = hass + + @asyncio.coroutine + def async_start(self): + """Start velux component.""" + yield from self.pyvlx.load_scenes() + self.initialized = True diff --git a/requirements_all.txt b/requirements_all.txt index 1257da77a10..cf950f03ab5 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -770,6 +770,9 @@ pyunifi==2.13 # homeassistant.components.vera pyvera==0.2.33 +# homeassistant.components.velux +pyvlx==0.1.3 + # homeassistant.components.notify.html5 pywebpush==1.0.5