mirror of
https://github.com/home-assistant/core.git
synced 2026-02-04 14:25:26 +01:00
Compare commits
17 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fd8240241f | ||
|
|
786a0154b1 | ||
|
|
dd6ab79e35 | ||
|
|
5317f700d7 | ||
|
|
01eb2d5c84 | ||
|
|
0893ddcab7 | ||
|
|
e77a7f4385 | ||
|
|
39e7942dce | ||
|
|
faf5ffe610 | ||
|
|
8d2dc48261 | ||
|
|
8ae5708fa2 | ||
|
|
1e42f85a9c | ||
|
|
92d71a6612 | ||
|
|
1abbb43ebd | ||
|
|
69ecedefad | ||
|
|
0f6c9d2f75 | ||
|
|
c58fb00f03 |
@@ -1,5 +1,5 @@
|
||||
Home Assistant |Build Status| |Coverage Status| |Join the chat at https://gitter.im/home-assistant/home-assistant| |Join the dev chat at https://gitter.im/home-assistant/home-assistant/devs|
|
||||
==================================================================================================================
|
||||
==============================================================================================================================================================================================
|
||||
|
||||
Home Assistant is a home automation platform running on Python 3. The
|
||||
goal of Home Assistant is to be able to track and control all devices at
|
||||
|
||||
@@ -104,7 +104,7 @@ def _setup_component(hass, domain, config):
|
||||
try:
|
||||
config = component.CONFIG_SCHEMA(config)
|
||||
except vol.MultipleInvalid as ex:
|
||||
cv.log_exception(_LOGGER, ex, domain)
|
||||
cv.log_exception(_LOGGER, ex, domain, config)
|
||||
return False
|
||||
|
||||
elif hasattr(component, 'PLATFORM_SCHEMA'):
|
||||
@@ -114,11 +114,11 @@ def _setup_component(hass, domain, config):
|
||||
try:
|
||||
p_validated = component.PLATFORM_SCHEMA(p_config)
|
||||
except vol.MultipleInvalid as ex:
|
||||
cv.log_exception(_LOGGER, ex, domain)
|
||||
cv.log_exception(_LOGGER, ex, domain, p_config)
|
||||
return False
|
||||
|
||||
# Not all platform components follow same pattern for platforms
|
||||
# Sof if p_name is None we are not going to validate platform
|
||||
# So if p_name is None we are not going to validate platform
|
||||
# (the automation component is one of them)
|
||||
if p_name is None:
|
||||
platforms.append(p_validated)
|
||||
@@ -136,7 +136,7 @@ def _setup_component(hass, domain, config):
|
||||
p_validated = platform.PLATFORM_SCHEMA(p_validated)
|
||||
except vol.MultipleInvalid as ex:
|
||||
cv.log_exception(_LOGGER, ex, '{}.{}'
|
||||
.format(domain, p_name))
|
||||
.format(domain, p_name), p_validated)
|
||||
return False
|
||||
|
||||
platforms.append(p_validated)
|
||||
@@ -228,11 +228,13 @@ def from_config_dict(config, hass=None, config_dir=None, enable_log=True,
|
||||
hass.config.config_dir = config_dir
|
||||
mount_local_lib_path(config_dir)
|
||||
|
||||
core_config = config.get(core.DOMAIN, {})
|
||||
|
||||
try:
|
||||
process_ha_core_config(hass, config_util.CORE_CONFIG_SCHEMA(
|
||||
config.get(core.DOMAIN, {})))
|
||||
core_config))
|
||||
except vol.MultipleInvalid as ex:
|
||||
cv.log_exception(_LOGGER, ex, 'homeassistant')
|
||||
cv.log_exception(_LOGGER, ex, 'homeassistant', core_config)
|
||||
return None
|
||||
|
||||
process_ha_config_upgrade(hass)
|
||||
|
||||
@@ -143,7 +143,7 @@ def _process_if(hass, config, p_config, action):
|
||||
|
||||
# Deprecated since 0.19 - 5/5/2016
|
||||
if cond_type != DEFAULT_CONDITION_TYPE:
|
||||
_LOGGER.warning('Using condition_type: %s is deprecated. Please use '
|
||||
_LOGGER.warning('Using condition_type: "or" is deprecated. Please use '
|
||||
'"condition: or" instead.')
|
||||
|
||||
if_configs = p_config.get(CONF_CONDITION)
|
||||
|
||||
@@ -85,15 +85,15 @@ FITBIT_MEASUREMENTS = {
|
||||
"liquids": "fl. oz.",
|
||||
"blood glucose": "mg/dL",
|
||||
},
|
||||
"en_UK": {
|
||||
"en_GB": {
|
||||
"duration": "milliseconds",
|
||||
"distance": "kilometers",
|
||||
"elevation": "meters",
|
||||
"height": "centimeters",
|
||||
"weight": "stone",
|
||||
"body": "centimeters",
|
||||
"liquids": "millileters",
|
||||
"blood glucose": "mmol/l"
|
||||
"liquids": "milliliters",
|
||||
"blood glucose": "mmol/L"
|
||||
},
|
||||
"metric": {
|
||||
"duration": "milliseconds",
|
||||
@@ -102,8 +102,8 @@ FITBIT_MEASUREMENTS = {
|
||||
"height": "centimeters",
|
||||
"weight": "kilograms",
|
||||
"body": "centimeters",
|
||||
"liquids": "millileters",
|
||||
"blood glucose": "mmol/l"
|
||||
"liquids": "milliliters",
|
||||
"blood glucose": "mmol/L"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -153,7 +153,8 @@ def request_app_setup(hass, config, add_devices, config_path,
|
||||
else:
|
||||
setup_platform(hass, config, add_devices, discovery_info)
|
||||
|
||||
start_url = "{}{}".format(hass.config.api.base_url, FITBIT_AUTH_START)
|
||||
start_url = "{}{}".format(hass.config.api.base_url,
|
||||
FITBIT_AUTH_CALLBACK_PATH)
|
||||
|
||||
description = """Please create a Fitbit developer app at
|
||||
https://dev.fitbit.com/apps/new.
|
||||
@@ -222,8 +223,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||
access_token = config_file.get("access_token")
|
||||
refresh_token = config_file.get("refresh_token")
|
||||
if None not in (access_token, refresh_token):
|
||||
authd_client = fitbit.Fitbit(config.get("client_id"),
|
||||
config.get("client_secret"),
|
||||
authd_client = fitbit.Fitbit(config_file.get("client_id"),
|
||||
config_file.get("client_secret"),
|
||||
access_token=access_token,
|
||||
refresh_token=refresh_token)
|
||||
|
||||
@@ -239,8 +240,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||
add_devices(dev)
|
||||
|
||||
else:
|
||||
oauth = fitbit.api.FitbitOauth2Client(config.get("client_id"),
|
||||
config.get("client_secret"))
|
||||
oauth = fitbit.api.FitbitOauth2Client(config_file.get("client_id"),
|
||||
config_file.get("client_secret"))
|
||||
|
||||
redirect_uri = "{}{}".format(hass.config.api.base_url,
|
||||
FITBIT_AUTH_CALLBACK_PATH)
|
||||
@@ -301,9 +302,10 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||
|
||||
setup_platform(hass, config, add_devices, discovery_info=None)
|
||||
|
||||
hass.http.register_path("GET", FITBIT_AUTH_START, _start_fitbit_auth)
|
||||
hass.http.register_path("GET", FITBIT_AUTH_START, _start_fitbit_auth,
|
||||
require_auth=False)
|
||||
hass.http.register_path("GET", FITBIT_AUTH_CALLBACK_PATH,
|
||||
_finish_fitbit_auth)
|
||||
_finish_fitbit_auth, require_auth=False)
|
||||
|
||||
request_oauth_completion(hass)
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@ DEFAULT_NAME = 'ZWave Thermostat'
|
||||
|
||||
REMOTEC = 0x5254
|
||||
REMOTEC_ZXT_120 = 0x8377
|
||||
REMOTEC_ZXT_120_THERMOSTAT = (REMOTEC, REMOTEC_ZXT_120, 0)
|
||||
REMOTEC_ZXT_120_THERMOSTAT = (REMOTEC, REMOTEC_ZXT_120)
|
||||
|
||||
WORKAROUND_IGNORE = 'ignore'
|
||||
|
||||
@@ -40,16 +40,15 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||
if (value.node.manufacturer_id.strip() and
|
||||
value.node.product_id.strip()):
|
||||
specific_sensor_key = (int(value.node.manufacturer_id, 16),
|
||||
int(value.node.product_id, 16),
|
||||
value.index)
|
||||
int(value.node.product_id, 16))
|
||||
if specific_sensor_key in DEVICE_MAPPINGS:
|
||||
if DEVICE_MAPPINGS[specific_sensor_key] == WORKAROUND_IGNORE:
|
||||
_LOGGER.debug("Remotec ZXT-120 Zwave Thermostat, ignoring")
|
||||
return
|
||||
else:
|
||||
add_devices([ZWaveThermostat(value)])
|
||||
_LOGGER.debug("discovery_info=%s and zwave.NETWORK=%s",
|
||||
discovery_info, zwave.NETWORK)
|
||||
|
||||
add_devices([ZWaveThermostat(value)])
|
||||
_LOGGER.debug("discovery_info=%s and zwave.NETWORK=%s",
|
||||
discovery_info, zwave.NETWORK)
|
||||
|
||||
|
||||
# pylint: disable=too-many-arguments
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# coding: utf-8
|
||||
"""Constants used by Home Assistant components."""
|
||||
|
||||
__version__ = "0.19"
|
||||
__version__ = "0.19.4"
|
||||
REQUIRED_PYTHON_VER = (3, 4)
|
||||
|
||||
PLATFORM_FORMAT = '{}.{}'
|
||||
|
||||
@@ -146,7 +146,7 @@ def time_period_str(value):
|
||||
time_period = vol.Any(time_period_str, timedelta, time_period_dict)
|
||||
|
||||
|
||||
def log_exception(logger, ex, domain):
|
||||
def log_exception(logger, ex, domain, config):
|
||||
"""Generate log exception for config validation."""
|
||||
message = 'Invalid config for [{}]: '.format(domain)
|
||||
if 'extra keys not allowed' in ex.error_message:
|
||||
@@ -154,7 +154,12 @@ def log_exception(logger, ex, domain):
|
||||
.format(ex.path[-1], domain, domain,
|
||||
'->'.join('%s' % m for m in ex.path))
|
||||
else:
|
||||
message += ex.error_message
|
||||
message += str(ex)
|
||||
|
||||
if hasattr(config, '__line__'):
|
||||
message += " (See {}:{})".format(config.__config_file__,
|
||||
config.__line__ or '?')
|
||||
|
||||
logger.error(message)
|
||||
|
||||
|
||||
@@ -364,6 +369,8 @@ CONDITION_SCHEMA = vol.Any(
|
||||
TEMPLATE_CONDITION_SCHEMA,
|
||||
TIME_CONDITION_SCHEMA,
|
||||
ZONE_CONDITION_SCHEMA,
|
||||
AND_CONDITION_SCHEMA,
|
||||
OR_CONDITION_SCHEMA,
|
||||
)
|
||||
|
||||
_SCRIPT_DELAY_SCHEMA = vol.Schema({
|
||||
|
||||
@@ -50,8 +50,11 @@ def _ordered_dict(loader, node):
|
||||
nodes = loader.construct_pairs(node)
|
||||
|
||||
seen = {}
|
||||
min_line = None
|
||||
for (key, _), (node, _) in zip(nodes, node.value):
|
||||
line = getattr(node, '__line__', 'unknown')
|
||||
if line != 'unknown' and (min_line is None or line < min_line):
|
||||
min_line = line
|
||||
if key in seen:
|
||||
fname = getattr(loader.stream, 'name', '')
|
||||
first_mark = yaml.Mark(fname, 0, seen[key], -1, None, None)
|
||||
@@ -62,7 +65,10 @@ def _ordered_dict(loader, node):
|
||||
)
|
||||
seen[key] = line
|
||||
|
||||
return OrderedDict(nodes)
|
||||
processed = OrderedDict(nodes)
|
||||
processed.__config_file__ = loader.name
|
||||
processed.__line__ = min_line
|
||||
return processed
|
||||
|
||||
|
||||
def _env_var_yaml(loader, node):
|
||||
|
||||
Reference in New Issue
Block a user