add move_postion support for HA rollershutter / CONFIG_SCHEMA (#2873)

This commit is contained in:
Pascal Vizeli 2016-08-18 23:14:14 +02:00 committed by GitHub
parent c1653d2fca
commit df4a9ea1da
2 changed files with 49 additions and 29 deletions

View File

@ -12,7 +12,7 @@ import voluptuous as vol
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.const import (EVENT_HOMEASSISTANT_STOP, STATE_UNKNOWN, 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.entity import Entity
from homeassistant.helpers import discovery from homeassistant.helpers import discovery
from homeassistant.config import load_yaml_config_file 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'}], 'CONTROL_MODE': ['Mode', {0: 'Auto', 1: 'Manual', 2: 'Away', 3: 'Boost'}],
'POWER': ['Power', {}], 'POWER': ['Power', {}],
'CURRENT': ['Current', {}], 'CURRENT': ['Current', {}],
'VOLTAGE': ['Voltage', {}] 'VOLTAGE': ['Voltage', {}],
'WORKING': ['Working', {0: 'No', 1: 'Yes'}],
} }
HM_PRESS_EVENTS = [ HM_PRESS_EVENTS = [
@ -97,18 +98,29 @@ CONF_REMOTE_PORT = 'remote_port'
CONF_RESOLVENAMES = 'resolvenames' CONF_RESOLVENAMES = 'resolvenames'
CONF_DELAY = 'delay' CONF_DELAY = 'delay'
PLATFORM_SCHEMA = vol.Schema({
vol.Required(CONF_LOCAL_IP): cv.string, DEVICE_SCHEMA = vol.Schema({
vol.Optional(CONF_LOCAL_PORT, default=8943): cv.port, vol.Required(CONF_PLATFORM): "homematic",
vol.Required(CONF_REMOTE_IP): cv.string, vol.Required(ATTR_NAME): cv.string,
vol.Optional(CONF_REMOTE_PORT, default=2001): cv.port, vol.Required(ATTR_ADDRESS): cv.string,
vol.Optional(CONF_RESOLVENAMES, default=False): vol.Optional(ATTR_CHANNEL, default=1): vol.Coerce(int),
vol.In(CONF_RESOLVENAMES_OPTIONS), vol.Optional(ATTR_PARAM): cv.string,
vol.Optional(CONF_USERNAME, default="Admin"): cv.string,
vol.Optional(CONF_PASSWORD, default=""): cv.string,
vol.Optional(CONF_DELAY, default=0.5): 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({ SCHEMA_SERVICE_VIRTUALKEY = vol.Schema({
vol.Required(ATTR_ADDRESS): cv.string, vol.Required(ATTR_ADDRESS): cv.string,
vol.Required(ATTR_CHANNEL): vol.Coerce(int), vol.Required(ATTR_CHANNEL): vol.Coerce(int),
@ -123,14 +135,14 @@ def setup(hass, config):
from pyhomematic import HMConnection from pyhomematic import HMConnection
local_ip = config[DOMAIN][0].get(CONF_LOCAL_IP) local_ip = config[DOMAIN].get(CONF_LOCAL_IP)
local_port = config[DOMAIN][0].get(CONF_LOCAL_PORT) local_port = config[DOMAIN].get(CONF_LOCAL_PORT)
remote_ip = config[DOMAIN][0].get(CONF_REMOTE_IP) remote_ip = config[DOMAIN].get(CONF_REMOTE_IP)
remote_port = config[DOMAIN][0].get(CONF_REMOTE_PORT) remote_port = config[DOMAIN].get(CONF_REMOTE_PORT)
resolvenames = config[DOMAIN][0].get(CONF_RESOLVENAMES) resolvenames = config[DOMAIN].get(CONF_RESOLVENAMES)
username = config[DOMAIN][0].get(CONF_USERNAME) username = config[DOMAIN].get(CONF_USERNAME)
password = config[DOMAIN][0].get(CONF_PASSWORD) password = config[DOMAIN].get(CONF_PASSWORD)
HOMEMATIC_LINK_DELAY = config[DOMAIN][0].get(CONF_DELAY) HOMEMATIC_LINK_DELAY = config[DOMAIN].get(CONF_DELAY)
if remote_ip is None or local_ip is None: if remote_ip is None or local_ip is None:
_LOGGER.error("Missing remote CCU/Homegear or local address") _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): def _get_devices(device_type, keys):
"""Get the Homematic devices.""" """Get the Homematic devices."""
# run
device_arr = [] device_arr = []
# pylint: disable=too-many-nested-blocks
for key in keys: for key in keys:
device = HOMEMATIC.devices[key] device = HOMEMATIC.devices[key]
class_name = device.__class__.__name__ class_name = device.__class__.__name__
@ -244,15 +257,22 @@ def _get_devices(device_type, keys):
name = _create_ha_name(name=device.NAME, name = _create_ha_name(name=device.NAME,
channel=channel, channel=channel,
param=param) param=param)
device_dict = dict(platform="homematic", device_dict = {
address=key, CONF_PLATFORM: "homematic",
name=name, ATTR_ADDRESS: key,
channel=channel) ATTR_NAME: name,
ATTR_CHANNEL: channel
}
if param is not None: if param is not None:
device_dict[ATTR_PARAM] = param device_dict.update({ATTR_PARAM: param})
# Add new device # 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: else:
_LOGGER.debug("Channel %i not in params", channel) _LOGGER.debug("Channel %i not in params", channel)
else: else:

View File

@ -45,8 +45,8 @@ class HMRollershutter(homematic.HMDevice, RollershutterDevice):
return int((1 - self._hm_get_state()) * 100) return int((1 - self._hm_get_state()) * 100)
return None return None
def position(self, **kwargs): def move_position(self, **kwargs):
"""Move to a defined position: 0 (closed) and 100 (open).""" """Move the roller shutter to a specific position."""
if self.available: if self.available:
if ATTR_CURRENT_POSITION in kwargs: if ATTR_CURRENT_POSITION in kwargs:
position = float(kwargs[ATTR_CURRENT_POSITION]) position = float(kwargs[ATTR_CURRENT_POSITION])