Black
This commit is contained in:
parent
da05dfe708
commit
4de97abc3a
2676 changed files with 163166 additions and 140084 deletions
|
@ -6,54 +6,95 @@ import voluptuous as vol
|
|||
|
||||
from homeassistant.components import fan, media_player, sensor
|
||||
from homeassistant.const import (
|
||||
ATTR_CODE, ATTR_SUPPORTED_FEATURES, CONF_NAME, CONF_TYPE, TEMP_CELSIUS)
|
||||
ATTR_CODE,
|
||||
ATTR_SUPPORTED_FEATURES,
|
||||
CONF_NAME,
|
||||
CONF_TYPE,
|
||||
TEMP_CELSIUS,
|
||||
)
|
||||
from homeassistant.core import split_entity_id
|
||||
import homeassistant.helpers.config_validation as cv
|
||||
import homeassistant.util.temperature as temp_util
|
||||
|
||||
from .const import (
|
||||
CONF_FEATURE, CONF_FEATURE_LIST, CONF_LINKED_BATTERY_SENSOR,
|
||||
CONF_LOW_BATTERY_THRESHOLD, DEFAULT_LOW_BATTERY_THRESHOLD, FEATURE_ON_OFF,
|
||||
FEATURE_PLAY_PAUSE, FEATURE_PLAY_STOP, FEATURE_TOGGLE_MUTE,
|
||||
HOMEKIT_NOTIFY_ID, TYPE_FAUCET, TYPE_OUTLET, TYPE_SHOWER, TYPE_SPRINKLER,
|
||||
TYPE_SWITCH, TYPE_VALVE)
|
||||
CONF_FEATURE,
|
||||
CONF_FEATURE_LIST,
|
||||
CONF_LINKED_BATTERY_SENSOR,
|
||||
CONF_LOW_BATTERY_THRESHOLD,
|
||||
DEFAULT_LOW_BATTERY_THRESHOLD,
|
||||
FEATURE_ON_OFF,
|
||||
FEATURE_PLAY_PAUSE,
|
||||
FEATURE_PLAY_STOP,
|
||||
FEATURE_TOGGLE_MUTE,
|
||||
HOMEKIT_NOTIFY_ID,
|
||||
TYPE_FAUCET,
|
||||
TYPE_OUTLET,
|
||||
TYPE_SHOWER,
|
||||
TYPE_SPRINKLER,
|
||||
TYPE_SWITCH,
|
||||
TYPE_VALVE,
|
||||
)
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
BASIC_INFO_SCHEMA = vol.Schema({
|
||||
vol.Optional(CONF_NAME): cv.string,
|
||||
vol.Optional(CONF_LINKED_BATTERY_SENSOR): cv.entity_domain(sensor.DOMAIN),
|
||||
vol.Optional(CONF_LOW_BATTERY_THRESHOLD,
|
||||
default=DEFAULT_LOW_BATTERY_THRESHOLD): cv.positive_int,
|
||||
})
|
||||
BASIC_INFO_SCHEMA = vol.Schema(
|
||||
{
|
||||
vol.Optional(CONF_NAME): cv.string,
|
||||
vol.Optional(CONF_LINKED_BATTERY_SENSOR): cv.entity_domain(sensor.DOMAIN),
|
||||
vol.Optional(
|
||||
CONF_LOW_BATTERY_THRESHOLD, default=DEFAULT_LOW_BATTERY_THRESHOLD
|
||||
): cv.positive_int,
|
||||
}
|
||||
)
|
||||
|
||||
FEATURE_SCHEMA = BASIC_INFO_SCHEMA.extend({
|
||||
vol.Optional(CONF_FEATURE_LIST, default=None): cv.ensure_list,
|
||||
})
|
||||
FEATURE_SCHEMA = BASIC_INFO_SCHEMA.extend(
|
||||
{vol.Optional(CONF_FEATURE_LIST, default=None): cv.ensure_list}
|
||||
)
|
||||
|
||||
CODE_SCHEMA = BASIC_INFO_SCHEMA.extend({
|
||||
vol.Optional(ATTR_CODE, default=None): vol.Any(None, cv.string),
|
||||
})
|
||||
CODE_SCHEMA = BASIC_INFO_SCHEMA.extend(
|
||||
{vol.Optional(ATTR_CODE, default=None): vol.Any(None, cv.string)}
|
||||
)
|
||||
|
||||
MEDIA_PLAYER_SCHEMA = vol.Schema({
|
||||
vol.Required(CONF_FEATURE): vol.All(
|
||||
cv.string, vol.In((FEATURE_ON_OFF, FEATURE_PLAY_PAUSE,
|
||||
FEATURE_PLAY_STOP, FEATURE_TOGGLE_MUTE))),
|
||||
})
|
||||
MEDIA_PLAYER_SCHEMA = vol.Schema(
|
||||
{
|
||||
vol.Required(CONF_FEATURE): vol.All(
|
||||
cv.string,
|
||||
vol.In(
|
||||
(
|
||||
FEATURE_ON_OFF,
|
||||
FEATURE_PLAY_PAUSE,
|
||||
FEATURE_PLAY_STOP,
|
||||
FEATURE_TOGGLE_MUTE,
|
||||
)
|
||||
),
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
SWITCH_TYPE_SCHEMA = BASIC_INFO_SCHEMA.extend({
|
||||
vol.Optional(CONF_TYPE, default=TYPE_SWITCH): vol.All(
|
||||
cv.string, vol.In((
|
||||
TYPE_FAUCET, TYPE_OUTLET, TYPE_SHOWER, TYPE_SPRINKLER,
|
||||
TYPE_SWITCH, TYPE_VALVE))),
|
||||
})
|
||||
SWITCH_TYPE_SCHEMA = BASIC_INFO_SCHEMA.extend(
|
||||
{
|
||||
vol.Optional(CONF_TYPE, default=TYPE_SWITCH): vol.All(
|
||||
cv.string,
|
||||
vol.In(
|
||||
(
|
||||
TYPE_FAUCET,
|
||||
TYPE_OUTLET,
|
||||
TYPE_SHOWER,
|
||||
TYPE_SPRINKLER,
|
||||
TYPE_SWITCH,
|
||||
TYPE_VALVE,
|
||||
)
|
||||
),
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
def validate_entity_config(values):
|
||||
"""Validate config entry for CONF_ENTITY."""
|
||||
if not isinstance(values, dict):
|
||||
raise vol.Invalid('expected a dictionary')
|
||||
raise vol.Invalid("expected a dictionary")
|
||||
|
||||
entities = {}
|
||||
for entity_id, config in values.items():
|
||||
|
@ -61,10 +102,11 @@ def validate_entity_config(values):
|
|||
domain, _ = split_entity_id(entity)
|
||||
|
||||
if not isinstance(config, dict):
|
||||
raise vol.Invalid('The configuration for {} must be '
|
||||
' a dictionary.'.format(entity))
|
||||
raise vol.Invalid(
|
||||
"The configuration for {} must be " " a dictionary.".format(entity)
|
||||
)
|
||||
|
||||
if domain in ('alarm_control_panel', 'lock'):
|
||||
if domain in ("alarm_control_panel", "lock"):
|
||||
config = CODE_SCHEMA(config)
|
||||
|
||||
elif domain == media_player.const.DOMAIN:
|
||||
|
@ -74,12 +116,13 @@ def validate_entity_config(values):
|
|||
params = MEDIA_PLAYER_SCHEMA(feature)
|
||||
key = params.pop(CONF_FEATURE)
|
||||
if key in feature_list:
|
||||
raise vol.Invalid('A feature can be added only once for {}'
|
||||
.format(entity))
|
||||
raise vol.Invalid(
|
||||
"A feature can be added only once for {}".format(entity)
|
||||
)
|
||||
feature_list[key] = params
|
||||
config[CONF_FEATURE_LIST] = feature_list
|
||||
|
||||
elif domain == 'switch':
|
||||
elif domain == "switch":
|
||||
config = SWITCH_TYPE_SCHEMA(config)
|
||||
|
||||
else:
|
||||
|
@ -94,14 +137,13 @@ def validate_media_player_features(state, feature_list):
|
|||
features = state.attributes.get(ATTR_SUPPORTED_FEATURES, 0)
|
||||
|
||||
supported_modes = []
|
||||
if features & (media_player.const.SUPPORT_TURN_ON |
|
||||
media_player.const.SUPPORT_TURN_OFF):
|
||||
if features & (
|
||||
media_player.const.SUPPORT_TURN_ON | media_player.const.SUPPORT_TURN_OFF
|
||||
):
|
||||
supported_modes.append(FEATURE_ON_OFF)
|
||||
if features & (media_player.const.SUPPORT_PLAY |
|
||||
media_player.const.SUPPORT_PAUSE):
|
||||
if features & (media_player.const.SUPPORT_PLAY | media_player.const.SUPPORT_PAUSE):
|
||||
supported_modes.append(FEATURE_PLAY_PAUSE)
|
||||
if features & (media_player.const.SUPPORT_PLAY |
|
||||
media_player.const.SUPPORT_STOP):
|
||||
if features & (media_player.const.SUPPORT_PLAY | media_player.const.SUPPORT_STOP):
|
||||
supported_modes.append(FEATURE_PLAY_STOP)
|
||||
if features & media_player.const.SUPPORT_VOLUME_MUTE:
|
||||
supported_modes.append(FEATURE_TOGGLE_MUTE)
|
||||
|
@ -112,13 +154,12 @@ def validate_media_player_features(state, feature_list):
|
|||
error_list.append(feature)
|
||||
|
||||
if error_list:
|
||||
_LOGGER.error('%s does not support features: %s',
|
||||
state.entity_id, error_list)
|
||||
_LOGGER.error("%s does not support features: %s", state.entity_id, error_list)
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
SpeedRange = namedtuple('SpeedRange', ('start', 'target'))
|
||||
SpeedRange = namedtuple("SpeedRange", ("start", "target"))
|
||||
SpeedRange.__doc__ += """ Maps Home Assistant speed \
|
||||
values to percentage based HomeKit speeds.
|
||||
start: Start of the range (inclusive).
|
||||
|
@ -133,10 +174,14 @@ class HomeKitSpeedMapping:
|
|||
def __init__(self, speed_list):
|
||||
"""Initialize a new SpeedMapping object."""
|
||||
if speed_list[0] != fan.SPEED_OFF:
|
||||
_LOGGER.warning("%s does not contain the speed setting "
|
||||
"%s as its first element. "
|
||||
"Assuming that %s is equivalent to 'off'.",
|
||||
speed_list, fan.SPEED_OFF, speed_list[0])
|
||||
_LOGGER.warning(
|
||||
"%s does not contain the speed setting "
|
||||
"%s as its first element. "
|
||||
"Assuming that %s is equivalent to 'off'.",
|
||||
speed_list,
|
||||
fan.SPEED_OFF,
|
||||
speed_list[0],
|
||||
)
|
||||
self.speed_ranges = OrderedDict()
|
||||
list_size = len(speed_list)
|
||||
for index, speed in enumerate(speed_list):
|
||||
|
@ -167,11 +212,14 @@ class HomeKitSpeedMapping:
|
|||
def show_setup_message(hass, pincode):
|
||||
"""Display persistent notification with setup information."""
|
||||
pin = pincode.decode()
|
||||
_LOGGER.info('Pincode: %s', pin)
|
||||
message = 'To set up Home Assistant in the Home App, enter the ' \
|
||||
'following code:\n### {}'.format(pin)
|
||||
_LOGGER.info("Pincode: %s", pin)
|
||||
message = (
|
||||
"To set up Home Assistant in the Home App, enter the "
|
||||
"following code:\n### {}".format(pin)
|
||||
)
|
||||
hass.components.persistent_notification.create(
|
||||
message, 'HomeKit Setup', HOMEKIT_NOTIFY_ID)
|
||||
message, "HomeKit Setup", HOMEKIT_NOTIFY_ID
|
||||
)
|
||||
|
||||
|
||||
def dismiss_setup_message(hass):
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue