From df4a9ea1da5638089830b3ed13473d2d8263f0cf Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Thu, 18 Aug 2016 23:14:14 +0200 Subject: [PATCH] add move_postion support for HA rollershutter / CONFIG_SCHEMA (#2873) --- homeassistant/components/homematic.py | 74 ++++++++++++------- .../components/rollershutter/homematic.py | 4 +- 2 files changed, 49 insertions(+), 29 deletions(-) diff --git a/homeassistant/components/homematic.py b/homeassistant/components/homematic.py index 1a917789638..8568408f3ec 100644 --- a/homeassistant/components/homematic.py +++ b/homeassistant/components/homematic.py @@ -12,7 +12,7 @@ import voluptuous as vol import homeassistant.helpers.config_validation as cv from homeassistant.const import (EVENT_HOMEASSISTANT_STOP, STATE_UNKNOWN, - CONF_USERNAME, CONF_PASSWORD) + CONF_USERNAME, CONF_PASSWORD, CONF_PLATFORM) from homeassistant.helpers.entity import Entity from homeassistant.helpers import discovery from homeassistant.config import load_yaml_config_file @@ -67,7 +67,8 @@ HM_ATTRIBUTE_SUPPORT = { 'CONTROL_MODE': ['Mode', {0: 'Auto', 1: 'Manual', 2: 'Away', 3: 'Boost'}], 'POWER': ['Power', {}], 'CURRENT': ['Current', {}], - 'VOLTAGE': ['Voltage', {}] + 'VOLTAGE': ['Voltage', {}], + 'WORKING': ['Working', {0: 'No', 1: 'Yes'}], } HM_PRESS_EVENTS = [ @@ -97,18 +98,29 @@ CONF_REMOTE_PORT = 'remote_port' CONF_RESOLVENAMES = 'resolvenames' CONF_DELAY = 'delay' -PLATFORM_SCHEMA = vol.Schema({ - vol.Required(CONF_LOCAL_IP): cv.string, - vol.Optional(CONF_LOCAL_PORT, default=8943): cv.port, - vol.Required(CONF_REMOTE_IP): cv.string, - vol.Optional(CONF_REMOTE_PORT, default=2001): cv.port, - vol.Optional(CONF_RESOLVENAMES, default=False): - vol.In(CONF_RESOLVENAMES_OPTIONS), - vol.Optional(CONF_USERNAME, default="Admin"): cv.string, - vol.Optional(CONF_PASSWORD, default=""): cv.string, - vol.Optional(CONF_DELAY, default=0.5): cv.string, + +DEVICE_SCHEMA = vol.Schema({ + vol.Required(CONF_PLATFORM): "homematic", + vol.Required(ATTR_NAME): cv.string, + vol.Required(ATTR_ADDRESS): cv.string, + vol.Optional(ATTR_CHANNEL, default=1): vol.Coerce(int), + vol.Optional(ATTR_PARAM): cv.string, }) +CONFIG_SCHEMA = vol.Schema({ + DOMAIN: vol.Schema({ + vol.Required(CONF_LOCAL_IP): cv.string, + vol.Optional(CONF_LOCAL_PORT, default=8943): cv.port, + vol.Required(CONF_REMOTE_IP): cv.string, + vol.Optional(CONF_REMOTE_PORT, default=2001): cv.port, + vol.Optional(CONF_RESOLVENAMES, default=False): + vol.In(CONF_RESOLVENAMES_OPTIONS), + vol.Optional(CONF_USERNAME, default="Admin"): cv.string, + vol.Optional(CONF_PASSWORD, default=""): cv.string, + vol.Optional(CONF_DELAY, default=0.5): cv.string, + }), +}, extra=vol.ALLOW_EXTRA) + SCHEMA_SERVICE_VIRTUALKEY = vol.Schema({ vol.Required(ATTR_ADDRESS): cv.string, vol.Required(ATTR_CHANNEL): vol.Coerce(int), @@ -123,14 +135,14 @@ def setup(hass, config): from pyhomematic import HMConnection - local_ip = config[DOMAIN][0].get(CONF_LOCAL_IP) - local_port = config[DOMAIN][0].get(CONF_LOCAL_PORT) - remote_ip = config[DOMAIN][0].get(CONF_REMOTE_IP) - remote_port = config[DOMAIN][0].get(CONF_REMOTE_PORT) - resolvenames = config[DOMAIN][0].get(CONF_RESOLVENAMES) - username = config[DOMAIN][0].get(CONF_USERNAME) - password = config[DOMAIN][0].get(CONF_PASSWORD) - HOMEMATIC_LINK_DELAY = config[DOMAIN][0].get(CONF_DELAY) + local_ip = config[DOMAIN].get(CONF_LOCAL_IP) + local_port = config[DOMAIN].get(CONF_LOCAL_PORT) + remote_ip = config[DOMAIN].get(CONF_REMOTE_IP) + remote_port = config[DOMAIN].get(CONF_REMOTE_PORT) + resolvenames = config[DOMAIN].get(CONF_RESOLVENAMES) + username = config[DOMAIN].get(CONF_USERNAME) + password = config[DOMAIN].get(CONF_PASSWORD) + HOMEMATIC_LINK_DELAY = config[DOMAIN].get(CONF_DELAY) if remote_ip is None or local_ip is None: _LOGGER.error("Missing remote CCU/Homegear or local address") @@ -217,8 +229,9 @@ def system_callback_handler(hass, config, src, *args): def _get_devices(device_type, keys): """Get the Homematic devices.""" - # run device_arr = [] + + # pylint: disable=too-many-nested-blocks for key in keys: device = HOMEMATIC.devices[key] class_name = device.__class__.__name__ @@ -244,15 +257,22 @@ def _get_devices(device_type, keys): name = _create_ha_name(name=device.NAME, channel=channel, param=param) - device_dict = dict(platform="homematic", - address=key, - name=name, - channel=channel) + device_dict = { + CONF_PLATFORM: "homematic", + ATTR_ADDRESS: key, + ATTR_NAME: name, + ATTR_CHANNEL: channel + } if param is not None: - device_dict[ATTR_PARAM] = param + device_dict.update({ATTR_PARAM: param}) # Add new device - device_arr.append(device_dict) + try: + DEVICE_SCHEMA(device_dict) + device_arr.append(device_dict) + except vol.MultipleInvalid as err: + _LOGGER.error("Invalid device config: %s", + str(err)) else: _LOGGER.debug("Channel %i not in params", channel) else: diff --git a/homeassistant/components/rollershutter/homematic.py b/homeassistant/components/rollershutter/homematic.py index 805c5dceb82..613d7884919 100644 --- a/homeassistant/components/rollershutter/homematic.py +++ b/homeassistant/components/rollershutter/homematic.py @@ -45,8 +45,8 @@ class HMRollershutter(homematic.HMDevice, RollershutterDevice): return int((1 - self._hm_get_state()) * 100) return None - def position(self, **kwargs): - """Move to a defined position: 0 (closed) and 100 (open).""" + def move_position(self, **kwargs): + """Move the roller shutter to a specific position.""" if self.available: if ATTR_CURRENT_POSITION in kwargs: position = float(kwargs[ATTR_CURRENT_POSITION])