Merge pull request #12047 from home-assistant/release-0-62-1

0.62.1
This commit is contained in:
Paulus Schoutsen 2018-01-29 16:35:59 -08:00 committed by GitHub
commit 1aaf49d0c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 31 additions and 14 deletions

View File

@ -98,10 +98,16 @@ class DaikinClimate(ClimateDevice):
daikin_attr = HA_ATTR_TO_DAIKIN[ATTR_FAN_MODE] daikin_attr = HA_ATTR_TO_DAIKIN[ATTR_FAN_MODE]
if self._api.device.values.get(daikin_attr) is not None: if self._api.device.values.get(daikin_attr) is not None:
self._supported_features |= SUPPORT_FAN_MODE self._supported_features |= SUPPORT_FAN_MODE
else:
# even devices without support must have a default valid value
self._api.device.values[daikin_attr] = 'A'
daikin_attr = HA_ATTR_TO_DAIKIN[ATTR_SWING_MODE] daikin_attr = HA_ATTR_TO_DAIKIN[ATTR_SWING_MODE]
if self._api.device.values.get(daikin_attr) is not None: if self._api.device.values.get(daikin_attr) is not None:
self._supported_features |= SUPPORT_SWING_MODE self._supported_features |= SUPPORT_SWING_MODE
else:
# even devices without support must have a default valid value
self._api.device.values[daikin_attr] = '0'
def get(self, key): def get(self, key):
"""Retrieve device settings from API library cache.""" """Retrieve device settings from API library cache."""

View File

@ -214,7 +214,8 @@ class AsusWrtDeviceScanner(DeviceScanner):
for device in result: for device in result:
if device['mac'] is not None: if device['mac'] is not None:
mac = device['mac'].upper() mac = device['mac'].upper()
old_ip = cur_devices.get(mac, {}).ip or None old_device = cur_devices.get(mac)
old_ip = old_device.ip if old_device else None
devices[mac] = Device(mac, device.get('ip', old_ip), None) devices[mac] = Device(mac, device.get('ip', old_ip), None)
return devices return devices

View File

@ -23,7 +23,7 @@ from homeassistant.const import CONF_NAME, EVENT_THEMES_UPDATED
from homeassistant.core import callback from homeassistant.core import callback
from homeassistant.loader import bind_hass from homeassistant.loader import bind_hass
REQUIREMENTS = ['home-assistant-frontend==20180126.0', 'user-agents==1.1.0'] REQUIREMENTS = ['home-assistant-frontend==20180130.0', 'user-agents==1.1.0']
DOMAIN = 'frontend' DOMAIN = 'frontend'
DEPENDENCIES = ['api', 'websocket_api', 'http', 'system_log'] DEPENDENCIES = ['api', 'websocket_api', 'http', 'system_log']
@ -300,7 +300,8 @@ def async_setup(hass, config):
if is_dev: if is_dev:
for subpath in ["src", "build-translations", "build-temp", "build", for subpath in ["src", "build-translations", "build-temp", "build",
"hass_frontend", "bower_components", "panels"]: "hass_frontend", "bower_components", "panels",
"hassio"]:
hass.http.register_static_path( hass.http.register_static_path(
"/home-assistant-polymer/{}".format(subpath), "/home-assistant-polymer/{}".format(subpath),
os.path.join(repo_path, subpath), os.path.join(repo_path, subpath),

View File

@ -494,5 +494,5 @@ class SqueezeBoxDevice(MediaPlayerDevice):
all_params = [command] all_params = [command]
if parameters: if parameters:
for parameter in parameters: for parameter in parameters:
all_params.append(urllib.parse.quote(parameter, safe=':=')) all_params.append(urllib.parse.quote(parameter, safe=':=/?'))
return self.async_query(*all_params) return self.async_query(*all_params)

View File

@ -17,9 +17,10 @@ from homeassistant.components.remote import (
from homeassistant.const import ( from homeassistant.const import (
ATTR_ENTITY_ID, CONF_HOST, CONF_NAME, CONF_PORT, EVENT_HOMEASSISTANT_STOP) ATTR_ENTITY_ID, CONF_HOST, CONF_NAME, CONF_PORT, EVENT_HOMEASSISTANT_STOP)
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.exceptions import PlatformNotReady
from homeassistant.util import slugify from homeassistant.util import slugify
REQUIREMENTS = ['pyharmony==1.0.18'] REQUIREMENTS = ['pyharmony==1.0.20']
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -97,8 +98,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None):
DEVICES.append(device) DEVICES.append(device)
add_devices([device]) add_devices([device])
register_services(hass) register_services(hass)
except ValueError: except (ValueError, AttributeError):
_LOGGER.warning("Failed to initialize remote: %s", name) raise PlatformNotReady
def register_services(hass): def register_services(hass):

View File

@ -67,15 +67,17 @@ class DeutscheBahnSensor(Entity):
def device_state_attributes(self): def device_state_attributes(self):
"""Return the state attributes.""" """Return the state attributes."""
connections = self.data.connections[0] connections = self.data.connections[0]
connections['next'] = self.data.connections[1]['departure'] if len(self.data.connections) > 1:
connections['next_on'] = self.data.connections[2]['departure'] connections['next'] = self.data.connections[1]['departure']
if len(self.data.connections) > 2:
connections['next_on'] = self.data.connections[2]['departure']
return connections return connections
def update(self): def update(self):
"""Get the latest delay from bahn.de and updates the state.""" """Get the latest delay from bahn.de and updates the state."""
self.data.update() self.data.update()
self._state = self.data.connections[0].get('departure', 'Unknown') self._state = self.data.connections[0].get('departure', 'Unknown')
if self.data.connections[0]['delay'] != 0: if self.data.connections[0].get('delay', 0) != 0:
self._state += " + {}".format(self.data.connections[0]['delay']) self._state += " + {}".format(self.data.connections[0]['delay'])
@ -96,6 +98,9 @@ class SchieneData(object):
self.connections = self.schiene.connections( self.connections = self.schiene.connections(
self.start, self.goal, dt_util.as_local(dt_util.utcnow())) self.start, self.goal, dt_util.as_local(dt_util.utcnow()))
if not self.connections:
self.connections = [{}]
for con in self.connections: for con in self.connections:
# Detail info is not useful. Having a more consistent interface # Detail info is not useful. Having a more consistent interface
# simplifies usage of template sensors. # simplifies usage of template sensors.

View File

@ -2,7 +2,7 @@
"""Constants used by Home Assistant components.""" """Constants used by Home Assistant components."""
MAJOR_VERSION = 0 MAJOR_VERSION = 0
MINOR_VERSION = 62 MINOR_VERSION = 62
PATCH_VERSION = '0' PATCH_VERSION = '1'
__short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION)
__version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION)
REQUIRED_PYTHON_VER = (3, 4, 2) REQUIRED_PYTHON_VER = (3, 4, 2)

View File

@ -352,7 +352,7 @@ hipnotify==1.0.8
holidays==0.9.3 holidays==0.9.3
# homeassistant.components.frontend # homeassistant.components.frontend
home-assistant-frontend==20180126.0 home-assistant-frontend==20180130.0
# homeassistant.components.camera.onvif # homeassistant.components.camera.onvif
http://github.com/tgaugry/suds-passworddigest-py3/archive/86fc50e39b4d2b8997481967d6a7fe1c57118999.zip#suds-passworddigest-py3==0.1.2a http://github.com/tgaugry/suds-passworddigest-py3/archive/86fc50e39b4d2b8997481967d6a7fe1c57118999.zip#suds-passworddigest-py3==0.1.2a
@ -723,7 +723,7 @@ pyflexit==0.3
pyfttt==0.3 pyfttt==0.3
# homeassistant.components.remote.harmony # homeassistant.components.remote.harmony
pyharmony==1.0.18 pyharmony==1.0.20
# homeassistant.components.binary_sensor.hikvision # homeassistant.components.binary_sensor.hikvision
pyhik==0.1.4 pyhik==0.1.4

View File

@ -75,7 +75,7 @@ hbmqtt==0.9.1
holidays==0.9.3 holidays==0.9.3
# homeassistant.components.frontend # homeassistant.components.frontend
home-assistant-frontend==20180126.0 home-assistant-frontend==20180130.0
# homeassistant.components.influxdb # homeassistant.components.influxdb
# homeassistant.components.sensor.influxdb # homeassistant.components.sensor.influxdb

View File

@ -447,6 +447,9 @@ class TestComponentsDeviceTrackerASUSWRT(unittest.TestCase):
scanner = get_scanner(self.hass, VALID_CONFIG_ROUTER_SSH) scanner = get_scanner(self.hass, VALID_CONFIG_ROUTER_SSH)
scanner.connection = mocked_ssh scanner.connection = mocked_ssh
self.assertEqual(NEIGH_DEVICES, scanner._get_neigh(ARP_DEVICES.copy())) self.assertEqual(NEIGH_DEVICES, scanner._get_neigh(ARP_DEVICES.copy()))
self.assertEqual(NEIGH_DEVICES, scanner._get_neigh({
'UN:KN:WN:DE:VI:CE': Device('UN:KN:WN:DE:VI:CE', None, None),
}))
mocked_ssh.run_command.return_value = '' mocked_ssh.run_command.return_value = ''
self.assertEqual({}, scanner._get_neigh(ARP_DEVICES.copy())) self.assertEqual({}, scanner._get_neigh(ARP_DEVICES.copy()))