diff --git a/homeassistant/components/light/zwave.py b/homeassistant/components/light/zwave.py index ab41381f5e7..1be5aba1cda 100644 --- a/homeassistant/components/light/zwave.py +++ b/homeassistant/components/light/zwave.py @@ -8,6 +8,7 @@ import logging # Because we do not compile openzwave on CI # pylint: disable=import-error +from threading import Timer from homeassistant.components.light import ATTR_BRIGHTNESS, ATTR_COLOR_TEMP, \ ATTR_RGB_COLOR, DOMAIN, Light from homeassistant.components import zwave @@ -108,7 +109,22 @@ class ZwaveDimmer(zwave.ZWaveDeviceEntity, Light): """Called when a value has changed on the network.""" if self._value.value_id == value.value_id or \ self._value.node == value.node: - self.update_properties() + + if self._refreshing: + self._refreshing = False + self.update_properties() + else: + def _refresh_value(): + """Used timer callback for delayed value refresh.""" + self._refreshing = True + self._value.refresh() + + if self._timer is not None and self._timer.isAlive(): + self._timer.cancel() + + self._timer = Timer(2, _refresh_value) + self._timer.start() + self.update_ha_state() @property diff --git a/homeassistant/components/media_player/kodi.py b/homeassistant/components/media_player/kodi.py index 3af270a05b0..e28d84417d6 100644 --- a/homeassistant/components/media_player/kodi.py +++ b/homeassistant/components/media_player/kodi.py @@ -53,7 +53,8 @@ class KodiDevice(MediaPlayerDevice): self._url = url self._server = jsonrpc_requests.Server( '{}/jsonrpc'.format(self._url), - auth=auth) + auth=auth, + timeout=5) self._turn_off_action = turn_off_action self._players = list() self._properties = None diff --git a/homeassistant/components/recorder/__init__.py b/homeassistant/components/recorder/__init__.py index 781736d3c6a..f5ce7118d01 100644 --- a/homeassistant/components/recorder/__init__.py +++ b/homeassistant/components/recorder/__init__.py @@ -58,14 +58,17 @@ def execute(q): This method also retries a few times in the case of stale connections. """ import sqlalchemy.exc - for _ in range(0, RETRIES): - try: - return [ - row for row in - (row.to_native() for row in q) - if row is not None] - except sqlalchemy.exc.SQLAlchemyError as e: - log_error(e, retry_wait=QUERY_RETRY_WAIT, rollback=True) + try: + for _ in range(0, RETRIES): + try: + return [ + row for row in + (row.to_native() for row in q) + if row is not None] + except sqlalchemy.exc.SQLAlchemyError as e: + log_error(e, retry_wait=QUERY_RETRY_WAIT, rollback=True) + finally: + Session().close() return [] diff --git a/homeassistant/const.py b/homeassistant/const.py index 60985fca23e..9e32d537255 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -1,7 +1,7 @@ # coding: utf-8 """Constants used by Home Assistant components.""" -__version__ = "0.25.0" +__version__ = "0.25.1" REQUIRED_PYTHON_VER = (3, 4) PLATFORM_FORMAT = '{}.{}' diff --git a/requirements_all.txt b/requirements_all.txt index ab861c8f941..582bc60c9d8 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -4,7 +4,7 @@ pyyaml>=3.11,<4 pytz>=2016.6.1 pip>=7.0.0 jinja2>=2.8 -voluptuous==0.9.1 +voluptuous==0.8.9 typing>=3,<4 sqlalchemy==1.0.14 diff --git a/setup.py b/setup.py index 6a7da9f70bb..7a9c1333230 100755 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ REQUIRES = [ 'pytz>=2016.6.1', 'pip>=7.0.0', 'jinja2>=2.8', - 'voluptuous==0.9.1', + 'voluptuous==0.8.9', 'typing>=3,<4', 'sqlalchemy==1.0.14', ] diff --git a/tests/helpers/test_discovery.py b/tests/helpers/test_discovery.py index b6f9ed5dec8..d7d9d629d9a 100644 --- a/tests/helpers/test_discovery.py +++ b/tests/helpers/test_discovery.py @@ -1,15 +1,10 @@ """Test discovery helpers.""" -import os - from unittest.mock import patch -from homeassistant import loader, bootstrap, config as config_util +from homeassistant import loader, bootstrap from homeassistant.helpers import discovery -from tests.common import (get_test_home_assistant, get_test_config_dir, - MockModule, MockPlatform) - -VERSION_PATH = os.path.join(get_test_config_dir(), config_util.VERSION_FILE) +from tests.common import get_test_home_assistant, MockModule, MockPlatform class TestHelpersDiscovery: @@ -17,15 +12,12 @@ class TestHelpersDiscovery: def setup_method(self, method): """Setup things to be run when tests are started.""" - self.hass = get_test_home_assistant() + self.hass = get_test_home_assistant(1) def teardown_method(self, method): """Stop everything that was started.""" self.hass.stop() - if os.path.isfile(VERSION_PATH): - os.remove(VERSION_PATH) - @patch('homeassistant.bootstrap.setup_component') def test_listen(self, mock_setup_component): """Test discovery listen/discover combo.""" @@ -105,14 +97,15 @@ class TestHelpersDiscovery: def component_setup(hass, config): """Setup mock component.""" - discovery.load_platform(hass, 'switch', 'test_circular') + discovery.load_platform(hass, 'switch', 'test_circular', 'disc', + config) component_calls.append(1) return True def setup_platform(hass, config, add_devices_callback, discovery_info=None): """Setup mock platform.""" - platform_calls.append(1) + platform_calls.append('disc' if discovery_info else 'component') loader.set_component( 'test_component', @@ -123,13 +116,12 @@ class TestHelpersDiscovery: MockPlatform(setup_platform, dependencies=['test_component'])) - bootstrap.from_config_dict({ + bootstrap.setup_component(self.hass, 'test_component', { 'test_component': None, 'switch': [{ 'platform': 'test_circular', }], - }, self.hass) - + }) self.hass.pool.block_till_done() assert 'test_component' in self.hass.config.components