From 05bab8c808d73e07f9c835002eff3e3d2136a9a1 Mon Sep 17 00:00:00 2001 From: JesseWebDotCom Date: Fri, 31 Mar 2017 22:19:04 -0400 Subject: [PATCH 001/146] Exposed more attributes, enabled play_media tv show or season episodes --- homeassistant/components/media_player/plex.py | 84 +++++++++++-------- 1 file changed, 50 insertions(+), 34 deletions(-) diff --git a/homeassistant/components/media_player/plex.py b/homeassistant/components/media_player/plex.py index f5677b271a38a3..d93b54897606ef 100644 --- a/homeassistant/components/media_player/plex.py +++ b/homeassistant/components/media_player/plex.py @@ -4,41 +4,26 @@ For more details about this platform, please refer to the documentation at https://home-assistant.io/components/media_player.plex/ """ +from datetime import timedelta import json import logging import os -from datetime import timedelta from urllib.parse import urlparse import requests -import voluptuous as vol + from homeassistant import util from homeassistant.components.media_player import ( - MEDIA_TYPE_MUSIC, - MEDIA_TYPE_TVSHOW, - MEDIA_TYPE_VIDEO, - PLATFORM_SCHEMA, - SUPPORT_NEXT_TRACK, - SUPPORT_PAUSE, - SUPPORT_PLAY, - SUPPORT_PREVIOUS_TRACK, - SUPPORT_STOP, - SUPPORT_TURN_OFF, - SUPPORT_VOLUME_MUTE, - SUPPORT_VOLUME_SET, - MediaPlayerDevice, -) + MEDIA_TYPE_MUSIC, MEDIA_TYPE_TVSHOW, MEDIA_TYPE_VIDEO, PLATFORM_SCHEMA, + SUPPORT_NEXT_TRACK, SUPPORT_PAUSE, SUPPORT_PLAY, SUPPORT_PREVIOUS_TRACK, + SUPPORT_STOP, SUPPORT_TURN_OFF, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_SET, + MediaPlayerDevice) from homeassistant.const import ( - DEVICE_DEFAULT_NAME, - STATE_IDLE, - STATE_OFF, - STATE_PAUSED, - STATE_PLAYING, -) + DEVICE_DEFAULT_NAME, STATE_IDLE, STATE_OFF, STATE_PAUSED, STATE_PLAYING) from homeassistant.helpers import config_validation as cv from homeassistant.helpers.event import track_utc_time_change from homeassistant.loader import get_component - +import voluptuous as vol REQUIREMENTS = ['plexapi==2.0.2'] MIN_TIME_BETWEEN_SCANS = timedelta(seconds=10) @@ -789,7 +774,7 @@ def play_media(self, media_type, media_id, **kwargs): src['library_name']).get(src['artist_name']).album( src['album_name']).get(src['track_name']) elif media_type == 'EPISODE': - media = self._get_episode( + media = self._get_tv_media( src['library_name'], src['show_name'], src['season_number'], src['episode_number']) elif media_type == 'PLAYLIST': @@ -798,18 +783,27 @@ def play_media(self, media_type, media_id, **kwargs): media = self.device.server.library.section( src['library_name']).get(src['video_name']) - if media: - self._client_play_media(media, shuffle=src['shuffle']) + if media and media_type == 'EPISODE' and str(media.type) == 'playlist': + self._client_play_media(media=media, delete=True, + shuffle=src['shuffle']) + elif media: + self._client_play_media(media=media, shuffle=src['shuffle']) - def _get_episode(self, library_name, show_name, season_number, - episode_number): - """Find TV episode and return a Plex media object.""" + def _get_tv_media(self, library_name, show_name, season_number, + episode_number): + """Find TV media and return a Plex media object.""" target_season = None target_episode = None - seasons = self.device.server.library.section(library_name).get( - show_name).seasons() - for season in seasons: + show = self.device.server.library.section(library_name).get( + show_name) + + if not season_number: + playlist_name = (self.entity_id + ' - ' + show_name + ' Episodes') + return self.device.server.createPlaylist( + playlist_name, show.episodes()) + + for season in show.seasons(): if int(season.seasonNumber) == int(season_number): target_season = season break @@ -820,6 +814,12 @@ def _get_episode(self, library_name, show_name, season_number, str(season_number).zfill(2), str(episode_number).zfill(2)) else: + if not episode_number: + playlist_name = (self.entity_id + ' - ' + show_name + + ' Season ' + str(season_number) + ' Episodes') + return self.device.server.createPlaylist( + playlist_name, target_season.episodes()) + for episode in target_season.episodes(): if int(episode.index) == int(episode_number): target_episode = episode @@ -833,7 +833,7 @@ def _get_episode(self, library_name, show_name, season_number, return target_episode - def _client_play_media(self, media, **params): + def _client_play_media(self, media, delete=False, **params): """Instruct Plex client to play a piece of media.""" if not (self.device and 'playback' in self._device_protocol_capabilities): @@ -841,10 +841,12 @@ def _client_play_media(self, media, **params): return import plexapi.playqueue - server_url = media.server.baseurl.split(':') playqueue = plexapi.playqueue.PlayQueue.create(self.device.server, media, **params) + self._local_client_control_fix() + + server_url = self.device.server.baseurl.split(':') self.device.sendCommand('playback/playMedia', **dict({ 'machineIdentifier': self.device.server.machineIdentifier, @@ -857,3 +859,17 @@ def _client_play_media(self, media, **params): 'containerKey': '/playQueues/%s?window=100&own=1' % playqueue.playQueueID, }, **params)) + + # delete dynamic playlists used to build playqueue (ex. play tv season) + if delete: + media.delete() + + @property + def device_state_attributes(self): + """Return the scene state attributes.""" + attr = {} + attr['media_content_rating'] = self._media_content_rating + attr['session_username'] = self._session_username + attr['media_library_name'] = self._app_name + + return attr From 564a01f34423a814f1bc27ae2350bdb9f059ba2f Mon Sep 17 00:00:00 2001 From: JesseWebDotCom Date: Fri, 31 Mar 2017 22:36:37 -0400 Subject: [PATCH 002/146] mend Exposed more attributes, enabled play_media tv show or season episodes --- homeassistant/components/media_player/plex.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/homeassistant/components/media_player/plex.py b/homeassistant/components/media_player/plex.py index d93b54897606ef..65957c01bdfa6f 100644 --- a/homeassistant/components/media_player/plex.py +++ b/homeassistant/components/media_player/plex.py @@ -250,6 +250,7 @@ def __init__(self, config, device, session, plex_sessions, self._machine_identifier = None self._make = '' self._media_content_id = None + self._media_content_rating = None self._media_content_type = None self._media_duration = None self._media_image_url = None @@ -259,6 +260,7 @@ def __init__(self, config, device, session, plex_sessions, self._previous_volume_level = 1 # Used in fake muting self._session = None self._session_type = None + self._session_username = None self._state = STATE_IDLE self._volume_level = 1 # since we can't retrieve remotely self._volume_muted = False # since we can't retrieve remotely From ae21fa9ce1f29aa6fc958cd7afc2399af68a7055 Mon Sep 17 00:00:00 2001 From: JesseWebDotCom Date: Fri, 31 Mar 2017 23:20:36 -0400 Subject: [PATCH 003/146] Fixed setting username and content rating data --- homeassistant/components/media_player/plex.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/homeassistant/components/media_player/plex.py b/homeassistant/components/media_player/plex.py index 65957c01bdfa6f..b328a928538607 100644 --- a/homeassistant/components/media_player/plex.py +++ b/homeassistant/components/media_player/plex.py @@ -330,6 +330,7 @@ def refresh(self, device, session): self._session.viewOffset) self._media_content_id = self._convert_na_to_none( self._session.ratingKey) + self._media_content_rating = self._session.contentRating else: self._media_position = None self._media_content_id = None @@ -341,6 +342,7 @@ def refresh(self, device, session): self._session.player.machineIdentifier) self._name = self._convert_na_to_none(self._session.player.title) self._player_state = self._session.player.state + self._session_username = self._session.username self._make = self._convert_na_to_none(self._session.player.device) else: self._is_player_available = False From b99dd19ad64e072d1e311633ac00fac9ada19c02 Mon Sep 17 00:00:00 2001 From: JesseWebDotCom Date: Sun, 2 Apr 2017 10:51:03 -0400 Subject: [PATCH 004/146] Fixed log errors if session username or content rating is blank --- homeassistant/components/media_player/plex.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/media_player/plex.py b/homeassistant/components/media_player/plex.py index b328a928538607..5145ecf1e33dcc 100644 --- a/homeassistant/components/media_player/plex.py +++ b/homeassistant/components/media_player/plex.py @@ -330,7 +330,8 @@ def refresh(self, device, session): self._session.viewOffset) self._media_content_id = self._convert_na_to_none( self._session.ratingKey) - self._media_content_rating = self._session.contentRating + self._media_content_rating = self._convert_na_to_none( + self._session.contentRating) else: self._media_position = None self._media_content_id = None @@ -342,7 +343,8 @@ def refresh(self, device, session): self._session.player.machineIdentifier) self._name = self._convert_na_to_none(self._session.player.title) self._player_state = self._session.player.state - self._session_username = self._session.username + self._session_username = self._convert_na_to_none( + self._session.username) self._make = self._convert_na_to_none(self._session.player.device) else: self._is_player_available = False From 90a834cbdabbca8bf042f06b4d2e1b23ac8a1694 Mon Sep 17 00:00:00 2001 From: JesseWebDotCom Date: Tue, 4 Apr 2017 22:33:52 -0400 Subject: [PATCH 005/146] String formatting, import order, type check fixes --- homeassistant/components/media_player/plex.py | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/media_player/plex.py b/homeassistant/components/media_player/plex.py index 5145ecf1e33dcc..d59b53a4581b73 100644 --- a/homeassistant/components/media_player/plex.py +++ b/homeassistant/components/media_player/plex.py @@ -789,7 +789,10 @@ def play_media(self, media_type, media_id, **kwargs): media = self.device.server.library.section( src['library_name']).get(src['video_name']) - if media and media_type == 'EPISODE' and str(media.type) == 'playlist': + import plexapi.playlist + if (media and media_type == 'EPISODE' and + isinstance(media, plexapi.playlist.Playlist)): + # delete episode playlist after being loaded into a play queue self._client_play_media(media=media, delete=True, shuffle=src['shuffle']) elif media: @@ -805,7 +808,8 @@ def _get_tv_media(self, library_name, show_name, season_number, show_name) if not season_number: - playlist_name = (self.entity_id + ' - ' + show_name + ' Episodes') + playlist_name = "{} - {} Episodes".format( + self.entity_id, show_name) return self.device.server.createPlaylist( playlist_name, show.episodes()) @@ -821,8 +825,8 @@ def _get_tv_media(self, library_name, show_name, season_number, str(episode_number).zfill(2)) else: if not episode_number: - playlist_name = (self.entity_id + ' - ' + show_name + - ' Season ' + str(season_number) + ' Episodes') + playlist_name = "{} - {} Season {} Episodes".format( + self.entity_id, show_name, str(season_number)) return self.device.server.createPlaylist( playlist_name, target_season.episodes()) @@ -850,6 +854,10 @@ def _client_play_media(self, media, delete=False, **params): playqueue = plexapi.playqueue.PlayQueue.create(self.device.server, media, **params) + # delete dynamic playlists used to build playqueue (ex. play tv season) + if delete: + media.delete() + self._local_client_control_fix() server_url = self.device.server.baseurl.split(':') @@ -866,10 +874,6 @@ def _client_play_media(self, media, delete=False, **params): '/playQueues/%s?window=100&own=1' % playqueue.playQueueID, }, **params)) - # delete dynamic playlists used to build playqueue (ex. play tv season) - if delete: - media.delete() - @property def device_state_attributes(self): """Return the scene state attributes.""" From 51dc8b78ccfbe6c0e103075e6dd214f255867a94 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Thu, 6 Apr 2017 18:12:24 -0400 Subject: [PATCH 006/146] Update kodi for aiohttp2 (#6967) --- homeassistant/components/media_player/kodi.py | 2 +- homeassistant/components/notify/kodi.py | 2 +- requirements_all.txt | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/media_player/kodi.py b/homeassistant/components/media_player/kodi.py index 97b10d03f0e12c..a137a332f7e6b7 100644 --- a/homeassistant/components/media_player/kodi.py +++ b/homeassistant/components/media_player/kodi.py @@ -27,7 +27,7 @@ import homeassistant.helpers.config_validation as cv from homeassistant.helpers.deprecation import get_deprecated -REQUIREMENTS = ['jsonrpc-async==0.4', 'jsonrpc-websocket==0.3'] +REQUIREMENTS = ['jsonrpc-async==0.6', 'jsonrpc-websocket==0.5'] _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/notify/kodi.py b/homeassistant/components/notify/kodi.py index be0d94afd55b9a..db72fff37d51fc 100644 --- a/homeassistant/components/notify/kodi.py +++ b/homeassistant/components/notify/kodi.py @@ -19,7 +19,7 @@ from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['jsonrpc-async==0.4'] +REQUIREMENTS = ['jsonrpc-async==0.6'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 86305ed872288a..121b48453722d3 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -337,10 +337,10 @@ insteonplm==0.7.4 # homeassistant.components.media_player.kodi # homeassistant.components.notify.kodi -jsonrpc-async==0.4 +jsonrpc-async==0.6 # homeassistant.components.media_player.kodi -jsonrpc-websocket==0.3 +jsonrpc-websocket==0.5 # homeassistant.scripts.keyring keyring>=9.3,<10.0 From 2ce8c2f80e36d51a9803251b98bca9e37e4b4d42 Mon Sep 17 00:00:00 2001 From: aufano Date: Fri, 7 Apr 2017 02:40:59 +0200 Subject: [PATCH 007/146] Fix current_temperature is rounded (#6960) * Fix current_temperature is rounded * fix Unnecessary parens after 'if' --- homeassistant/components/climate/__init__.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/climate/__init__.py b/homeassistant/components/climate/__init__.py index bd2e38433d6ba5..2a0bd2eb5c19fc 100644 --- a/homeassistant/components/climate/__init__.py +++ b/homeassistant/components/climate/__init__.py @@ -692,18 +692,16 @@ def max_humidity(self): def _convert_for_display(self, temp): """Convert temperature into preferred units for display purposes.""" - if (temp is None or not isinstance(temp, Number) or - self.temperature_unit == self.unit_of_measurement): + if temp is None or not isinstance(temp, Number): return temp - - value = convert_temperature(temp, self.temperature_unit, - self.unit_of_measurement) - + if self.temperature_unit != self.unit_of_measurement: + temp = convert_temperature(temp, self.temperature_unit, + self.unit_of_measurement) # Round in the units appropriate if self.precision == PRECISION_HALVES: - return round(value * 2) / 2.0 + return round(temp * 2) / 2.0 elif self.precision == PRECISION_TENTHS: - return round(value, 1) + return round(temp, 1) else: # PRECISION_WHOLE as a fall back - return round(value) + return round(temp) From c20d48c8e0e088be8e5e2cba6924af8eaf867800 Mon Sep 17 00:00:00 2001 From: JesseWebDotCom Date: Thu, 6 Apr 2017 20:52:56 -0400 Subject: [PATCH 008/146] import order fix --- homeassistant/components/media_player/plex.py | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/media_player/plex.py b/homeassistant/components/media_player/plex.py index d59b53a4581b73..a8aeeeef8ca83f 100644 --- a/homeassistant/components/media_player/plex.py +++ b/homeassistant/components/media_player/plex.py @@ -4,26 +4,40 @@ For more details about this platform, please refer to the documentation at https://home-assistant.io/components/media_player.plex/ """ -from datetime import timedelta import json import logging import os +from datetime import timedelta from urllib.parse import urlparse import requests - +import voluptuous as vol from homeassistant import util from homeassistant.components.media_player import ( - MEDIA_TYPE_MUSIC, MEDIA_TYPE_TVSHOW, MEDIA_TYPE_VIDEO, PLATFORM_SCHEMA, - SUPPORT_NEXT_TRACK, SUPPORT_PAUSE, SUPPORT_PLAY, SUPPORT_PREVIOUS_TRACK, - SUPPORT_STOP, SUPPORT_TURN_OFF, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_SET, - MediaPlayerDevice) + MEDIA_TYPE_MUSIC, + MEDIA_TYPE_TVSHOW, + MEDIA_TYPE_VIDEO, + PLATFORM_SCHEMA, + SUPPORT_NEXT_TRACK, + SUPPORT_PAUSE, + SUPPORT_PLAY, + SUPPORT_PREVIOUS_TRACK, + SUPPORT_STOP, + SUPPORT_TURN_OFF, + SUPPORT_VOLUME_MUTE, + SUPPORT_VOLUME_SET, + MediaPlayerDevice, +) from homeassistant.const import ( - DEVICE_DEFAULT_NAME, STATE_IDLE, STATE_OFF, STATE_PAUSED, STATE_PLAYING) + DEVICE_DEFAULT_NAME, + STATE_IDLE, + STATE_OFF, + STATE_PAUSED, + STATE_PLAYING, +) from homeassistant.helpers import config_validation as cv from homeassistant.helpers.event import track_utc_time_change from homeassistant.loader import get_component -import voluptuous as vol REQUIREMENTS = ['plexapi==2.0.2'] MIN_TIME_BETWEEN_SCANS = timedelta(seconds=10) From 74ac16035588c8324ba1ceb564b4205ca03db94b Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Fri, 7 Apr 2017 06:00:58 +0200 Subject: [PATCH 009/146] Bugfix time and task coro (#6968) * Bugfix time and task coro * fix also other create_task * fix tests * fix lint in test --- homeassistant/core.py | 22 +++++++++------------- tests/test_core.py | 42 ++++++++++++++++-------------------------- 2 files changed, 25 insertions(+), 39 deletions(-) diff --git a/homeassistant/core.py b/homeassistant/core.py index 7c4ff43bd7aa2a..03cc3d4e9f5d69 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -31,7 +31,8 @@ from homeassistant.exceptions import ( HomeAssistantError, InvalidEntityFormatError) from homeassistant.util.async import ( - run_coroutine_threadsafe, run_callback_threadsafe) + run_coroutine_threadsafe, run_callback_threadsafe, + fire_coroutine_threadsafe) import homeassistant.util as util import homeassistant.util.dt as dt_util import homeassistant.util.location as location @@ -131,7 +132,7 @@ def is_running(self) -> bool: def start(self) -> None: """Start home assistant.""" # Register the async start - self.add_job(self.async_start()) + fire_coroutine_threadsafe(self.async_start(), self.loop) # Run forever and catch keyboard interrupt try: @@ -140,7 +141,7 @@ def start(self) -> None: self.loop.run_forever() return self.exit_code except KeyboardInterrupt: - self.loop.create_task(self.async_stop()) + fire_coroutine_threadsafe(self.async_stop(), self.loop) self.loop.run_forever() finally: self.loop.close() @@ -246,8 +247,7 @@ def async_block_till_done(self): def stop(self) -> None: """Stop Home Assistant and shuts down all threads.""" - self.loop.call_soon_threadsafe( - self.loop.create_task, self.async_stop()) + fire_coroutine_threadsafe(self.async_stop(), self.loop) @asyncio.coroutine def async_stop(self, exit_code=0) -> None: @@ -1091,17 +1091,13 @@ def fire_time_event(nxt): handle = hass.loop.call_later(slp_seconds, fire_time_event, nxt) - @callback - def start_timer(event): - """Create an async timer.""" - _LOGGER.info("Timer:starting") - hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_timer) - fire_time_event(monotonic()) - @callback def stop_timer(event): """Stop the timer.""" if handle is not None: handle.cancel() - hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, start_timer) + hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_timer) + + _LOGGER.info("Timer:starting") + fire_time_event(monotonic()) diff --git a/tests/test_core.py b/tests/test_core.py index a68373b2ecce7e..ea7f40aaff73dd 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -16,8 +16,7 @@ from homeassistant.const import ( __version__, EVENT_STATE_CHANGED, ATTR_FRIENDLY_NAME, CONF_UNIT_SYSTEM, ATTR_NOW, EVENT_TIME_CHANGED, EVENT_HOMEASSISTANT_STOP, - EVENT_HOMEASSISTANT_CLOSE, EVENT_HOMEASSISTANT_START, - EVENT_SERVICE_REGISTERED, EVENT_SERVICE_REMOVED) + EVENT_HOMEASSISTANT_CLOSE, EVENT_SERVICE_REGISTERED, EVENT_SERVICE_REMOVED) from tests.common import get_test_home_assistant @@ -813,28 +812,21 @@ def mock_callback(func): funcs.append(func) return orig_callback(func) - with patch.object(ha, 'callback', mock_callback): + mock_monotonic.side_effect = 10.2, 10.3 + + with patch.object(ha, 'callback', mock_callback), \ + patch('homeassistant.core.dt_util.utcnow', + return_value=sentinel.mock_date): ha._async_create_timer(hass) - assert len(funcs) == 3 - fire_time_event, start_timer, stop_timer = funcs + assert len(funcs) == 2 + fire_time_event, stop_timer = funcs assert len(hass.bus.async_listen_once.mock_calls) == 1 - event_type, callback = hass.bus.async_listen_once.mock_calls[0][1] - assert event_type == EVENT_HOMEASSISTANT_START - assert callback is start_timer - - mock_monotonic.side_effect = 10.2, 10.3 - - with patch('homeassistant.core.dt_util.utcnow', - return_value=sentinel.mock_date): - start_timer(None) - - assert len(hass.bus.async_listen_once.mock_calls) == 2 assert len(hass.bus.async_fire.mock_calls) == 1 assert len(hass.loop.call_later.mock_calls) == 1 - event_type, callback = hass.bus.async_listen_once.mock_calls[1][1] + event_type, callback = hass.bus.async_listen_once.mock_calls[0][1] assert event_type == EVENT_HOMEASSISTANT_STOP assert callback is stop_timer @@ -859,17 +851,15 @@ def mock_callback(func): funcs.append(func) return orig_callback(func) - with patch.object(ha, 'callback', mock_callback): - ha._async_create_timer(hass) - - assert len(funcs) == 3 - fire_time_event, start_timer, stop_timer = funcs - mock_monotonic.side_effect = 10.2, 11.3, 11.3 - with patch('homeassistant.core.dt_util.utcnow', - return_value=sentinel.mock_date): - start_timer(None) + with patch.object(ha, 'callback', mock_callback), \ + patch('homeassistant.core.dt_util.utcnow', + return_value=sentinel.mock_date): + ha._async_create_timer(hass) + + assert len(funcs) == 2 + fire_time_event, stop_timer = funcs assert len(hass.loop.call_later.mock_calls) == 1 From 3e66df50c85c9b2dfd1cee7e6756d3e766de886f Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Fri, 7 Apr 2017 07:19:08 +0200 Subject: [PATCH 010/146] Initial import for HassIO (#6935) * Initial import for HassIO * Cleanup api code for views * First unittest for view * Add test for edit view * Finish unittest * fix addons test * cleanup service.yaml * Address first round with ping command * handle timeout dynamic * fix lint --- homeassistant/components/hassio.py | 272 +++++++++++++ homeassistant/components/services.yaml | 69 ++++ tests/components/test_hassio.py | 543 +++++++++++++++++++++++++ tests/test_util/aiohttp.py | 4 +- 4 files changed, 887 insertions(+), 1 deletion(-) create mode 100644 homeassistant/components/hassio.py create mode 100644 tests/components/test_hassio.py diff --git a/homeassistant/components/hassio.py b/homeassistant/components/hassio.py new file mode 100644 index 00000000000000..154be0917bbe40 --- /dev/null +++ b/homeassistant/components/hassio.py @@ -0,0 +1,272 @@ +""" +Exposes regular rest commands as services. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/hassio/ +""" +import asyncio +import logging +import os + +import aiohttp +from aiohttp import web +from aiohttp.web_exceptions import HTTPBadGateway +import async_timeout +import voluptuous as vol + +from homeassistant.config import load_yaml_config_file +from homeassistant.components.http import HomeAssistantView +from homeassistant.helpers.aiohttp_client import async_get_clientsession +import homeassistant.helpers.config_validation as cv + +DOMAIN = 'hassio' +DEPENDENCIES = ['http'] + +_LOGGER = logging.getLogger(__name__) + +LONG_TASK_TIMEOUT = 900 +DEFAULT_TIMEOUT = 10 + +SERVICE_HOST_SHUTDOWN = 'host_shutdown' +SERVICE_HOST_REBOOT = 'host_reboot' + +SERVICE_HOST_UPDATE = 'host_update' +SERVICE_SUPERVISOR_UPDATE = 'supervisor_update' +SERVICE_HOMEASSISTANT_UPDATE = 'homeassistant_update' + +SERVICE_ADDON_INSTALL = 'addon_install' +SERVICE_ADDON_UNINSTALL = 'addon_uninstall' +SERVICE_ADDON_UPDATE = 'addon_update' +SERVICE_ADDON_START = 'addon_start' +SERVICE_ADDON_STOP = 'addon_stop' + +ATTR_ADDON = 'addon' +ATTR_VERSION = 'version' + + +SCHEMA_SERVICE_UPDATE = vol.Schema({ + vol.Optional(ATTR_VERSION): cv.string, +}) + +SCHEMA_SERVICE_ADDONS = vol.Schema({ + vol.Required(ATTR_ADDON): cv.slug, +}) + +SCHEMA_SERVICE_ADDONS_VERSION = SCHEMA_SERVICE_ADDONS.extend({ + vol.Optional(ATTR_VERSION): cv.string, +}) + + +SERVICE_MAP = { + SERVICE_HOST_SHUTDOWN: None, + SERVICE_HOST_REBOOT: None, + SERVICE_HOST_UPDATE: SCHEMA_SERVICE_UPDATE, + SERVICE_SUPERVISOR_UPDATE: SCHEMA_SERVICE_UPDATE, + SERVICE_HOMEASSISTANT_UPDATE: SCHEMA_SERVICE_UPDATE, + SERVICE_ADDON_INSTALL: SCHEMA_SERVICE_ADDONS_VERSION, + SERVICE_ADDON_UNINSTALL: SCHEMA_SERVICE_ADDONS, + SERVICE_ADDON_START: SCHEMA_SERVICE_ADDONS, + SERVICE_ADDON_STOP: SCHEMA_SERVICE_ADDONS, + SERVICE_ADDON_UPDATE: SCHEMA_SERVICE_ADDONS_VERSION, +} + + +@asyncio.coroutine +def async_setup(hass, config): + """Setup the hassio component.""" + try: + host = os.environ['HASSIO'] + except KeyError: + _LOGGER.error("No HassIO supervisor detect!") + return False + + websession = async_get_clientsession(hass) + hassio = HassIO(hass.loop, websession, host) + + api_ok = yield from hassio.is_connected() + if not api_ok: + _LOGGER.error("Not connected with HassIO!") + return False + + # register base api views + for base in ('host', 'homeassistant'): + hass.http.register_view(HassIOBaseView(hassio, base)) + for base in ('supervisor', 'network'): + hass.http.register_view(HassIOBaseEditView(hassio, base)) + + # register view for addons + hass.http.register_view(HassIOAddonsView(hassio)) + + @asyncio.coroutine + def async_service_handler(service): + """Handle HassIO service calls.""" + addon = service.data.get(ATTR_ADDON) + if ATTR_VERSION in service.data: + version = {ATTR_VERSION: service.data[ATTR_VERSION]} + else: + version = None + + # map to api call + if service.service == SERVICE_HOST_UPDATE: + yield from hassio.send_command( + "/host/update", payload=version) + elif service.service == SERVICE_HOST_REBOOT: + yield from hassio.send_command("/host/reboot") + elif service.service == SERVICE_HOST_SHUTDOWN: + yield from hassio.send_command("/host/shutdown") + elif service.service == SERVICE_SUPERVISOR_UPDATE: + yield from hassio.send_command( + "/supervisor/update", payload=version) + elif service.service == SERVICE_HOMEASSISTANT_UPDATE: + yield from hassio.send_command( + "/homeassistant/update", payload=version, + timeout=LONG_TASK_TIMEOUT) + elif service.service == SERVICE_ADDON_INSTALL: + yield from hassio.send_command( + "/addons/{}/install".format(addon), payload=version, + timeout=LONG_TASK_TIMEOUT) + elif service.service == SERVICE_ADDON_UNINSTALL: + yield from hassio.send_command( + "/addons/{}/uninstall".format(addon)) + elif service.service == SERVICE_ADDON_START: + yield from hassio.send_command("/addons/{}/start".format(addon)) + elif service.service == SERVICE_ADDON_STOP: + yield from hassio.send_command("/addons/{}/stop".format(addon)) + elif service.service == SERVICE_ADDON_UPDATE: + yield from hassio.send_command( + "/addons/{}/update".format(addon), payload=version, + timeout=LONG_TASK_TIMEOUT) + + descriptions = yield from hass.loop.run_in_executor( + None, load_yaml_config_file, os.path.join( + os.path.dirname(__file__), 'services.yaml')) + + for service, schema in SERVICE_MAP.items(): + hass.services.async_register( + DOMAIN, service, async_service_handler, + descriptions[DOMAIN][service], schema=schema) + + return True + + +class HassIO(object): + """Small API wrapper for HassIO.""" + + def __init__(self, loop, websession, ip): + """Initialze HassIO api.""" + self.loop = loop + self.websession = websession + self._ip = ip + + def is_connected(self): + """Return True if it connected to HassIO supervisor. + + Return a coroutine. + """ + return self.send_command("/supervisor/ping") + + @asyncio.coroutine + def send_command(self, cmd, payload=None, timeout=DEFAULT_TIMEOUT): + """Send request to API.""" + answer = yield from self.send_raw(cmd, payload=payload) + if answer['result'] == 'ok': + return answer['data'] if answer['data'] else True + + _LOGGER.error("%s return error %s.", cmd, answer['message']) + return False + + @asyncio.coroutine + def send_raw(self, cmd, payload=None, timeout=DEFAULT_TIMEOUT): + """Send raw request to API.""" + try: + with async_timeout.timeout(timeout, loop=self.loop): + request = yield from self.websession.get( + "http://{}{}".format(self._ip, cmd), + timeout=None, json=payload + ) + + if request.status != 200: + _LOGGER.error("%s return code %d.", cmd, request.status) + return + + return (yield from request.json()) + + except asyncio.TimeoutError: + _LOGGER.error("Timeout on api request %s.", cmd) + + except aiohttp.ClientError: + _LOGGER.error("Client error on api request %s.", cmd) + + +class HassIOBaseView(HomeAssistantView): + """HassIO view to handle base part.""" + + requires_auth = True + + def __init__(self, hassio, base): + """Initialize a hassio base view.""" + self.hassio = hassio + self._url_info = "/{}/info".format(base) + + self.url = "/api/hassio/{}".format(base) + self.name = "api:hassio:{}".format(base) + + @asyncio.coroutine + def get(self, request): + """Get base data.""" + data = yield from self.hassio.send_command(self._url_info) + if not data: + raise HTTPBadGateway() + return web.json_response(data) + + +class HassIOBaseEditView(HassIOBaseView): + """HassIO view to handle base with options support.""" + + def __init__(self, hassio, base): + """Initialize a hassio base edit view.""" + super().__init__(hassio, base) + self._url_options = "/{}/options".format(base) + + @asyncio.coroutine + def post(self, request): + """Set options on host.""" + data = yield from request.json() + + response = yield from self.hassio.send_raw( + self._url_options, payload=data) + if not response: + raise HTTPBadGateway() + return web.json_response(response) + + +class HassIOAddonsView(HomeAssistantView): + """HassIO view to handle addons part.""" + + requires_auth = True + url = "/api/hassio/addons/{addon}" + name = "api:hassio:addons" + + def __init__(self, hassio): + """Initialize a hassio addon view.""" + self.hassio = hassio + + @asyncio.coroutine + def get(self, request, addon): + """Get addon data.""" + data = yield from self.hassio.send_command( + "/addons/{}/info".format(addon)) + if not data: + raise HTTPBadGateway() + return web.json_response(data) + + @asyncio.coroutine + def post(self, request, addon): + """Set options on host.""" + data = yield from request.json() + + response = yield from self.hassio.send_raw( + "/addons/{}/options".format(addon), payload=data) + if not response: + raise HTTPBadGateway() + return web.json_response(response) diff --git a/homeassistant/components/services.yaml b/homeassistant/components/services.yaml index a28a95969fb40a..cf5999200d8927 100644 --- a/homeassistant/components/services.yaml +++ b/homeassistant/components/services.yaml @@ -316,3 +316,72 @@ ffmpeg: logger: set_level: description: Set log level for components. + +hassio: + host_reboot: + description: Reboot host computer. + + host_shutdown: + description: Poweroff host computer. + + host_update: + description: Update host computer. + fields: + version: + description: Optional or it will be use the latest version. + example: '0.3' + + supervisor_update: + description: Update HassIO supervisor. + fields: + version: + description: Optional or it will be use the latest version. + example: '0.3' + + homeassistant_update: + description: Update HomeAssistant docker image. + fields: + version: + description: Optional or it will be use the latest version. + example: '0.40.1' + + addon_install: + description: Install a HassIO docker addon. + fields: + addon: + description: Name of addon. + example: 'smb_config' + version: + description: Optional or it will be use the latest version. + example: '0.2' + + addon_uninstall: + description: Uninstall a HassIO docker addon. + fields: + addon: + description: Name of addon. + example: 'smb_config' + + addon_update: + description: Update a HassIO docker addon. + fields: + addon: + description: Name of addon. + example: 'smb_config' + version: + description: Optional or it will be use the latest version. + example: '0.2' + + addon_start: + description: Start a HassIO docker addon. + fields: + addon: + description: Name of addon. + example: 'smb_config' + + addon_stop: + description: Stop a HassIO docker addon. + fields: + addon: + description: Name of addon. + example: 'smb_config' diff --git a/tests/components/test_hassio.py b/tests/components/test_hassio.py new file mode 100644 index 00000000000000..bde419c410421f --- /dev/null +++ b/tests/components/test_hassio.py @@ -0,0 +1,543 @@ +"""The tests for the hassio component.""" +import asyncio +import os + +import aiohttp + +import homeassistant.components.hassio as ho +from homeassistant.setup import setup_component, async_setup_component + +from tests.common import ( + get_test_home_assistant, assert_setup_component) + + +class TestHassIOSetup(object): + """Test the hassio component.""" + + def setup_method(self): + """Setup things to be run when tests are started.""" + self.hass = get_test_home_assistant() + + self.config = { + ho.DOMAIN: {}, + } + + os.environ['HASSIO'] = "127.0.0.1" + + def teardown_method(self): + """Stop everything that was started.""" + self.hass.stop() + + def test_setup_component(self, aioclient_mock): + """Test setup component.""" + aioclient_mock.get("http://127.0.0.1/supervisor/ping", json={ + 'result': 'ok', 'data': {} + }) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + def test_setup_component_test_service(self, aioclient_mock): + """Test setup component and check if service exits.""" + aioclient_mock.get("http://127.0.0.1/supervisor/ping", json={ + 'result': 'ok', 'data': {} + }) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + assert self.hass.services.has_service( + ho.DOMAIN, ho.SERVICE_HOST_REBOOT) + assert self.hass.services.has_service( + ho.DOMAIN, ho.SERVICE_HOST_SHUTDOWN) + assert self.hass.services.has_service( + ho.DOMAIN, ho.SERVICE_HOST_UPDATE) + + assert self.hass.services.has_service( + ho.DOMAIN, ho.SERVICE_SUPERVISOR_UPDATE) + + assert self.hass.services.has_service( + ho.DOMAIN, ho.SERVICE_ADDON_INSTALL) + assert self.hass.services.has_service( + ho.DOMAIN, ho.SERVICE_ADDON_UNINSTALL) + assert self.hass.services.has_service( + ho.DOMAIN, ho.SERVICE_ADDON_UPDATE) + assert self.hass.services.has_service( + ho.DOMAIN, ho.SERVICE_ADDON_START) + assert self.hass.services.has_service( + ho.DOMAIN, ho.SERVICE_ADDON_STOP) + + +class TestHassIOComponent(object): + """Test the HassIO component.""" + + def setup_method(self): + """Setup things to be run when tests are started.""" + self.hass = get_test_home_assistant() + self.config = { + ho.DOMAIN: {}, + } + + os.environ['HASSIO'] = "127.0.0.1" + self.url = "http://127.0.0.1/{}" + + self.error_msg = { + 'result': 'error', + 'message': 'Test error', + } + self.ok_msg = { + 'result': 'ok', + 'data': {}, + } + + def teardown_method(self): + """Stop everything that was started.""" + self.hass.stop() + + def test_rest_command_timeout(self, aioclient_mock): + """Call a hassio with timeout.""" + aioclient_mock.get( + "http://127.0.0.1/supervisor/ping", json=self.ok_msg) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + aioclient_mock.get( + self.url.format("host/update"), exc=asyncio.TimeoutError()) + + self.hass.services.call(ho.DOMAIN, ho.SERVICE_HOST_UPDATE, {}) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 2 + + def test_rest_command_aiohttp_error(self, aioclient_mock): + """Call a hassio with aiohttp exception.""" + aioclient_mock.get( + "http://127.0.0.1/supervisor/ping", json=self.ok_msg) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + aioclient_mock.get( + self.url.format("host/update"), exc=aiohttp.ClientError()) + + self.hass.services.call(ho.DOMAIN, ho.SERVICE_HOST_UPDATE, {}) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 2 + + def test_rest_command_http_error(self, aioclient_mock): + """Call a hassio with status code 503.""" + aioclient_mock.get( + "http://127.0.0.1/supervisor/ping", json=self.ok_msg) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + aioclient_mock.get( + self.url.format("host/update"), status=503) + + self.hass.services.call(ho.DOMAIN, ho.SERVICE_HOST_UPDATE, {}) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 2 + + def test_rest_command_http_error_api(self, aioclient_mock): + """Call a hassio with status code 503.""" + aioclient_mock.get( + "http://127.0.0.1/supervisor/ping", json=self.ok_msg) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + aioclient_mock.get( + self.url.format("host/update"), json=self.error_msg) + + self.hass.services.call(ho.DOMAIN, ho.SERVICE_HOST_UPDATE, {}) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 2 + + def test_rest_command_http_host_reboot(self, aioclient_mock): + """Call a hassio for host reboot.""" + aioclient_mock.get( + "http://127.0.0.1/supervisor/ping", json=self.ok_msg) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + aioclient_mock.get( + self.url.format("host/reboot"), json=self.ok_msg) + + self.hass.services.call(ho.DOMAIN, ho.SERVICE_HOST_REBOOT, {}) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 2 + + def test_rest_command_http_host_shutdown(self, aioclient_mock): + """Call a hassio for host shutdown.""" + aioclient_mock.get( + "http://127.0.0.1/supervisor/ping", json=self.ok_msg) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + aioclient_mock.get( + self.url.format("host/shutdown"), json=self.ok_msg) + + self.hass.services.call(ho.DOMAIN, ho.SERVICE_HOST_SHUTDOWN, {}) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 2 + + def test_rest_command_http_host_update(self, aioclient_mock): + """Call a hassio for host update.""" + aioclient_mock.get( + "http://127.0.0.1/supervisor/ping", json=self.ok_msg) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + aioclient_mock.get( + self.url.format("host/update"), json=self.ok_msg) + + self.hass.services.call( + ho.DOMAIN, ho.SERVICE_HOST_UPDATE, {'version': '0.4'}) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 2 + assert aioclient_mock.mock_calls[-1][2]['version'] == '0.4' + + def test_rest_command_http_supervisor_update(self, aioclient_mock): + """Call a hassio for supervisor update.""" + aioclient_mock.get( + "http://127.0.0.1/supervisor/ping", json=self.ok_msg) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + aioclient_mock.get( + self.url.format("supervisor/update"), json=self.ok_msg) + + self.hass.services.call( + ho.DOMAIN, ho.SERVICE_SUPERVISOR_UPDATE, {'version': '0.4'}) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 2 + assert aioclient_mock.mock_calls[-1][2]['version'] == '0.4' + + def test_rest_command_http_homeassistant_update(self, aioclient_mock): + """Call a hassio for homeassistant update.""" + aioclient_mock.get( + "http://127.0.0.1/supervisor/ping", json=self.ok_msg) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + aioclient_mock.get( + self.url.format("homeassistant/update"), json=self.ok_msg) + + self.hass.services.call( + ho.DOMAIN, ho.SERVICE_HOMEASSISTANT_UPDATE, {'version': '0.4'}) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 2 + assert aioclient_mock.mock_calls[-1][2]['version'] == '0.4' + + def test_rest_command_http_addon_install(self, aioclient_mock): + """Call a hassio for addon install.""" + aioclient_mock.get( + "http://127.0.0.1/supervisor/ping", json=self.ok_msg) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + aioclient_mock.get( + self.url.format("addons/smb_config/install"), json=self.ok_msg) + + self.hass.services.call( + ho.DOMAIN, ho.SERVICE_ADDON_INSTALL, { + 'addon': 'smb_config', + 'version': '0.4' + }) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 2 + assert aioclient_mock.mock_calls[-1][2]['version'] == '0.4' + + def test_rest_command_http_addon_uninstall(self, aioclient_mock): + """Call a hassio for addon uninstall.""" + aioclient_mock.get( + "http://127.0.0.1/supervisor/ping", json=self.ok_msg) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + aioclient_mock.get( + self.url.format("addons/smb_config/uninstall"), json=self.ok_msg) + + self.hass.services.call( + ho.DOMAIN, ho.SERVICE_ADDON_UNINSTALL, { + 'addon': 'smb_config' + }) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 2 + + def test_rest_command_http_addon_update(self, aioclient_mock): + """Call a hassio for addon update.""" + aioclient_mock.get( + "http://127.0.0.1/supervisor/ping", json=self.ok_msg) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + aioclient_mock.get( + self.url.format("addons/smb_config/update"), json=self.ok_msg) + + self.hass.services.call( + ho.DOMAIN, ho.SERVICE_ADDON_UPDATE, { + 'addon': 'smb_config', + 'version': '0.4' + }) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 2 + assert aioclient_mock.mock_calls[-1][2]['version'] == '0.4' + + def test_rest_command_http_addon_start(self, aioclient_mock): + """Call a hassio for addon start.""" + aioclient_mock.get( + "http://127.0.0.1/supervisor/ping", json=self.ok_msg) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + aioclient_mock.get( + self.url.format("addons/smb_config/start"), json=self.ok_msg) + + self.hass.services.call( + ho.DOMAIN, ho.SERVICE_ADDON_START, { + 'addon': 'smb_config', + }) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 2 + + def test_rest_command_http_addon_stop(self, aioclient_mock): + """Call a hassio for addon stop.""" + aioclient_mock.get( + "http://127.0.0.1/supervisor/ping", json=self.ok_msg) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + aioclient_mock.get( + self.url.format("addons/smb_config/stop"), json=self.ok_msg) + + self.hass.services.call( + ho.DOMAIN, ho.SERVICE_ADDON_STOP, { + 'addon': 'smb_config' + }) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 2 + + +@asyncio.coroutine +def test_async_hassio_host_view(aioclient_mock, hass, test_client): + """Test that it fetches the given url.""" + os.environ['HASSIO'] = "127.0.0.1" + + aioclient_mock.get("http://127.0.0.1/supervisor/ping", json={ + 'result': 'ok', 'data': {} + }) + result = yield from async_setup_component(hass, ho.DOMAIN, {ho.DOMAIN: {}}) + assert result, 'Failed to setup hasio' + + client = yield from test_client(hass.http.app) + + aioclient_mock.get('http://127.0.0.1/host/info', json={ + 'result': 'ok', + 'data': { + 'os': 'resinos', + 'version': '0.3', + 'current': '0.4', + 'level': 16, + 'hostname': 'test', + } + }) + + resp = yield from client.get('/api/hassio/host') + data = yield from resp.json() + + assert len(aioclient_mock.mock_calls) == 2 + assert resp.status == 200 + assert data['os'] == 'resinos' + assert data['version'] == '0.3' + assert data['current'] == '0.4' + assert data['level'] == 16 + assert data['hostname'] == 'test' + + +@asyncio.coroutine +def test_async_hassio_homeassistant_view(aioclient_mock, hass, test_client): + """Test that it fetches the given url.""" + os.environ['HASSIO'] = "127.0.0.1" + + aioclient_mock.get("http://127.0.0.1/supervisor/ping", json={ + 'result': 'ok', 'data': {} + }) + result = yield from async_setup_component(hass, ho.DOMAIN, {ho.DOMAIN: {}}) + assert result, 'Failed to setup hasio' + + client = yield from test_client(hass.http.app) + + aioclient_mock.get('http://127.0.0.1/homeassistant/info', json={ + 'result': 'ok', + 'data': { + 'version': '0.41', + 'current': '0.41.1', + } + }) + + resp = yield from client.get('/api/hassio/homeassistant') + data = yield from resp.json() + + assert len(aioclient_mock.mock_calls) == 2 + assert resp.status == 200 + assert data['version'] == '0.41' + assert data['current'] == '0.41.1' + + +@asyncio.coroutine +def test_async_hassio_supervisor_view(aioclient_mock, hass, test_client): + """Test that it fetches the given url.""" + os.environ['HASSIO'] = "127.0.0.1" + + aioclient_mock.get("http://127.0.0.1/supervisor/ping", json={ + 'result': 'ok', 'data': {} + }) + result = yield from async_setup_component(hass, ho.DOMAIN, {ho.DOMAIN: {}}) + assert result, 'Failed to setup hasio' + + client = yield from test_client(hass.http.app) + + aioclient_mock.get('http://127.0.0.1/supervisor/info', json={ + 'result': 'ok', + 'data': { + 'version': '0.3', + 'current': '0.4', + 'beta': False, + } + }) + + resp = yield from client.get('/api/hassio/supervisor') + data = yield from resp.json() + + assert len(aioclient_mock.mock_calls) == 2 + assert resp.status == 200 + assert data['version'] == '0.3' + assert data['current'] == '0.4' + assert not data['beta'] + + aioclient_mock.get('http://127.0.0.1/supervisor/options', json={ + 'result': 'ok', + 'data': {}, + }) + + resp = yield from client.post('/api/hassio/supervisor', json={ + 'beta': True, + }) + data = yield from resp.json() + + assert len(aioclient_mock.mock_calls) == 3 + assert resp.status == 200 + assert aioclient_mock.mock_calls[-1][2]['beta'] + + +@asyncio.coroutine +def test_async_hassio_network_view(aioclient_mock, hass, test_client): + """Test that it fetches the given url.""" + os.environ['HASSIO'] = "127.0.0.1" + + aioclient_mock.get("http://127.0.0.1/supervisor/ping", json={ + 'result': 'ok', 'data': {} + }) + result = yield from async_setup_component(hass, ho.DOMAIN, {ho.DOMAIN: {}}) + assert result, 'Failed to setup hasio' + + client = yield from test_client(hass.http.app) + + aioclient_mock.get('http://127.0.0.1/network/info', json={ + 'result': 'ok', + 'data': { + 'mode': 'dhcp', + 'ssid': 'my_wlan', + 'password': '123456', + } + }) + + resp = yield from client.get('/api/hassio/network') + data = yield from resp.json() + + assert len(aioclient_mock.mock_calls) == 2 + assert resp.status == 200 + assert data['mode'] == 'dhcp' + assert data['ssid'] == 'my_wlan' + assert data['password'] == '123456' + + aioclient_mock.get('http://127.0.0.1/network/options', json={ + 'result': 'ok', + 'data': {}, + }) + + resp = yield from client.post('/api/hassio/network', json={ + 'mode': 'dhcp', + 'ssid': 'my_wlan2', + 'password': '654321', + }) + data = yield from resp.json() + + assert len(aioclient_mock.mock_calls) == 3 + assert resp.status == 200 + assert aioclient_mock.mock_calls[-1][2]['ssid'] == 'my_wlan2' + assert aioclient_mock.mock_calls[-1][2]['password'] == '654321' + + +@asyncio.coroutine +def test_async_hassio_addon_view(aioclient_mock, hass, test_client): + """Test that it fetches the given url.""" + os.environ['HASSIO'] = "127.0.0.1" + + aioclient_mock.get("http://127.0.0.1/supervisor/ping", json={ + 'result': 'ok', 'data': {} + }) + result = yield from async_setup_component(hass, ho.DOMAIN, {ho.DOMAIN: {}}) + assert result, 'Failed to setup hasio' + + client = yield from test_client(hass.http.app) + + aioclient_mock.get('http://127.0.0.1/addons/smb_config/info', json={ + 'result': 'ok', + 'data': { + 'name': 'SMB Config', + 'state': 'running', + 'boot': 'auto', + 'options': { + 'bla': False, + } + } + }) + + resp = yield from client.get('/api/hassio/addons/smb_config') + data = yield from resp.json() + + assert len(aioclient_mock.mock_calls) == 2 + assert resp.status == 200 + assert data['name'] == 'SMB Config' + assert data['state'] == 'running' + assert data['boot'] == 'auto' + assert not data['options']['bla'] + + aioclient_mock.get('http://127.0.0.1/addons/smb_config/options', json={ + 'result': 'ok', + 'data': {}, + }) + + resp = yield from client.post('/api/hassio/addons/smb_config', json={ + 'boot': 'manual', + 'options': { + 'bla': True, + } + }) + data = yield from resp.json() + + assert len(aioclient_mock.mock_calls) == 3 + assert resp.status == 200 + assert aioclient_mock.mock_calls[-1][2]['boot'] == 'manual' + assert aioclient_mock.mock_calls[-1][2]['options']['bla'] diff --git a/tests/test_util/aiohttp.py b/tests/test_util/aiohttp.py index 23e24cac0cd741..39e926ab7e7076 100644 --- a/tests/test_util/aiohttp.py +++ b/tests/test_util/aiohttp.py @@ -75,8 +75,10 @@ def clear_requests(self): @asyncio.coroutine # pylint: disable=unused-variable def match_request(self, method, url, *, data=None, auth=None, params=None, - headers=None, allow_redirects=None): + headers=None, allow_redirects=None, timeout=None, + json=None): """Match a request against pre-registered requests.""" + data = data or json for response in self._mocks: if response.match_request(method, url, params): self.mock_calls.append((method, url, data)) From f96e06a2c23f3939cca3b546ca6675bf1c6ac16e Mon Sep 17 00:00:00 2001 From: Andrey Date: Fri, 7 Apr 2017 08:39:35 +0300 Subject: [PATCH 011/146] Preserve customize glob order. (#6963) * Preserve customize glob order. * add tests --- homeassistant/components/zwave/__init__.py | 2 +- homeassistant/config.py | 2 +- tests/components/zwave/test_init.py | 15 +++++++++++++++ tests/test_config.py | 7 +++++++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index f8903fd28cf434..254b488ccbbd84 100755 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -124,7 +124,7 @@ vol.Optional(CONF_DEVICE_CONFIG, default={}): vol.Schema({cv.entity_id: DEVICE_CONFIG_SCHEMA_ENTRY}), vol.Optional(CONF_DEVICE_CONFIG_GLOB, default={}): - vol.Schema({cv.string: DEVICE_CONFIG_SCHEMA_ENTRY}), + cv.ordered_dict(DEVICE_CONFIG_SCHEMA_ENTRY, cv.string), vol.Optional(CONF_DEVICE_CONFIG_DOMAIN, default={}): vol.Schema({cv.string: DEVICE_CONFIG_SCHEMA_ENTRY}), vol.Optional(CONF_DEBUG, default=DEFAULT_DEBUG): cv.boolean, diff --git a/homeassistant/config.py b/homeassistant/config.py index 3968ea571c5c50..1508493a6d11c3 100644 --- a/homeassistant/config.py +++ b/homeassistant/config.py @@ -108,7 +108,7 @@ vol.Optional(CONF_CUSTOMIZE_DOMAIN, default={}): vol.Schema({cv.string: dict}), vol.Optional(CONF_CUSTOMIZE_GLOB, default={}): - vol.Schema({cv.string: dict}), + cv.ordered_dict(OrderedDict, cv.string), }) CORE_CONFIG_SCHEMA = CUSTOMIZE_CONFIG_SCHEMA.extend({ diff --git a/tests/components/zwave/test_init.py b/tests/components/zwave/test_init.py index b982b357849b54..14b2a0226fe99f 100644 --- a/tests/components/zwave/test_init.py +++ b/tests/components/zwave/test_init.py @@ -1,7 +1,11 @@ """Tests for the Z-Wave init.""" import asyncio +import unittest +from collections import OrderedDict from homeassistant.bootstrap import async_setup_component +from homeassistant.components.zwave import ( + CONFIG_SCHEMA, CONF_DEVICE_CONFIG_GLOB) @asyncio.coroutine @@ -34,3 +38,14 @@ def test_invalid_device_config(hass, mock_openzwave): }}) assert not result + + +class TestZwave(unittest.TestCase): + """Test zwave init.""" + + def test_device_config_glob_is_ordered(self): + """Test that device_config_glob preserves order.""" + conf = CONFIG_SCHEMA( + {'zwave': {CONF_DEVICE_CONFIG_GLOB: OrderedDict()}}) + self.assertIsInstance( + conf['zwave'][CONF_DEVICE_CONFIG_GLOB], OrderedDict) diff --git a/tests/test_config.py b/tests/test_config.py index 990bd557e705df..1d1208f8859429 100644 --- a/tests/test_config.py +++ b/tests/test_config.py @@ -3,6 +3,7 @@ import os import unittest import unittest.mock as mock +from collections import OrderedDict import pytest from voluptuous import MultipleInvalid @@ -205,6 +206,12 @@ def test_core_config_schema(self): }, }) + def test_customize_glob_is_ordered(self): + """Test that customize_glob preserves order.""" + conf = config_util.CORE_CONFIG_SCHEMA( + {'customize_glob': OrderedDict()}) + self.assertIsInstance(conf['customize_glob'], OrderedDict) + def _compute_state(self, config): run_coroutine_threadsafe( config_util.async_process_ha_core_config(self.hass, config), From 9254e7e862506ee8cd896d29c95d17c7b8360a1e Mon Sep 17 00:00:00 2001 From: viswa-swami Date: Fri, 7 Apr 2017 01:40:33 -0400 Subject: [PATCH 012/146] Foscam Camera: Adding exception handling when fetching the camera image to avoid python exception errors when host is not reachable or rather any url error to camera (#6964) * Adding exception handling when fetching the camera image to avoid python errors when host is not reachable or any url errors to camera * Added exception as ConnectionError instead of plain except * Added exception as ConnectionError instead of plain except. Removed the unused error handle --- homeassistant/components/camera/foscam.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/camera/foscam.py b/homeassistant/components/camera/foscam.py index a374d19f4d1293..c1f9513d2c69ee 100644 --- a/homeassistant/components/camera/foscam.py +++ b/homeassistant/components/camera/foscam.py @@ -66,9 +66,13 @@ def __init__(self, device_info): def camera_image(self): """Return a still image reponse from the camera.""" # Send the request to snap a picture and return raw jpg data - response = requests.get(self._snap_picture_url, timeout=10) - - return response.content + # Handle exception if host is not reachable or url failed + try: + response = requests.get(self._snap_picture_url, timeout=10) + except requests.exceptions.ConnectionError: + return None + else: + return response.content @property def name(self): From d952a07658408f9f5bd231a20da48b377014343a Mon Sep 17 00:00:00 2001 From: Teemu R Date: Fri, 7 Apr 2017 07:41:47 +0200 Subject: [PATCH 013/146] light.yeelight: catch i/o related exceptions from the backend lib (#6952) Fixes/mitigates problems with #5949 and #6624 --- homeassistant/components/light/yeelight.py | 50 ++++++++++++++++------ 1 file changed, 38 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/light/yeelight.py b/homeassistant/components/light/yeelight.py index 65b32786ce7480..9253f471431b33 100644 --- a/homeassistant/components/light/yeelight.py +++ b/homeassistant/components/light/yeelight.py @@ -255,7 +255,8 @@ def set_default(self) -> None: def set_flash(self, flash) -> None: """Activate flash.""" if flash: - from yeelight import RGBTransition, SleepTransition, Flow + from yeelight import (RGBTransition, SleepTransition, Flow, + BulbException) if self._bulb.last_properties["color_mode"] != 1: _LOGGER.error("Flash supported currently only in RGB mode.") return @@ -280,10 +281,14 @@ def set_flash(self, flash) -> None: duration=duration)) flow = Flow(count=count, transitions=transitions) - self._bulb.start_flow(flow) + try: + self._bulb.start_flow(flow) + except BulbException as ex: + _LOGGER.error("Unable to set flash: %s", ex) def turn_on(self, **kwargs) -> None: """Turn the bulb on.""" + import yeelight brightness = kwargs.get(ATTR_BRIGHTNESS) colortemp = kwargs.get(ATTR_COLOR_TEMP) rgb = kwargs.get(ATTR_RGB_COLOR) @@ -293,22 +298,43 @@ def turn_on(self, **kwargs) -> None: if ATTR_TRANSITION in kwargs: # passed kwarg overrides config duration = int(kwargs.get(ATTR_TRANSITION) * 1000) # kwarg in s - self._bulb.turn_on(duration=duration) + try: + self._bulb.turn_on(duration=duration) + except yeelight.BulbException as ex: + _LOGGER.error("Unable to turn the bulb on: %s", ex) + return if self.config[CONF_MODE_MUSIC] and not self._bulb.music_mode: - self.set_music_mode(self.config[CONF_MODE_MUSIC]) + try: + self.set_music_mode(self.config[CONF_MODE_MUSIC]) + except yeelight.BulbException as ex: + _LOGGER.error("Unable to turn on music mode," + "consider disabling it: %s", ex) - # values checked for none in methods - self.set_rgb(rgb, duration) - self.set_colortemp(colortemp, duration) - self.set_brightness(brightness, duration) - self.set_flash(flash) + try: + # values checked for none in methods + self.set_rgb(rgb, duration) + self.set_colortemp(colortemp, duration) + self.set_brightness(brightness, duration) + self.set_flash(flash) + except yeelight.BulbException as ex: + _LOGGER.error("Unable to set bulb properties: %s", ex) + return # save the current state if we had a manual change. - if self.config[CONF_SAVE_ON_CHANGE]: - if brightness or colortemp or rgb: + if self.config[CONF_SAVE_ON_CHANGE] and (brightness + or colortemp + or rgb): + try: self.set_default() + except yeelight.BulbException as ex: + _LOGGER.error("Unable to set the defaults: %s", ex) + return def turn_off(self, **kwargs) -> None: """Turn off.""" - self._bulb.turn_off() + import yeelight + try: + self._bulb.turn_off() + except yeelight.BulbException as ex: + _LOGGER.error("Unable to turn the bulb off: %s", ex) From 216c2682f0afc6bd85fcca5e59ed9b11c21dca31 Mon Sep 17 00:00:00 2001 From: happyleavesaoc Date: Fri, 7 Apr 2017 01:47:03 -0400 Subject: [PATCH 014/146] Crime Reports sensor (#6966) * add crimereports * add crimereports metadata * implicit interval * remove zone support --- .coveragerc | 1 + .../components/sensor/crimereports.py | 123 ++++++++++++++++++ requirements_all.txt | 3 + 3 files changed, 127 insertions(+) create mode 100644 homeassistant/components/sensor/crimereports.py diff --git a/.coveragerc b/.coveragerc index edf66c6252b3d5..3d32256e9fbb1d 100644 --- a/.coveragerc +++ b/.coveragerc @@ -326,6 +326,7 @@ omit = homeassistant/components/sensor/coinmarketcap.py homeassistant/components/sensor/comed_hourly_pricing.py homeassistant/components/sensor/cpuspeed.py + homeassistant/components/sensor/crimereports.py homeassistant/components/sensor/cups.py homeassistant/components/sensor/currencylayer.py homeassistant/components/sensor/darksky.py diff --git a/homeassistant/components/sensor/crimereports.py b/homeassistant/components/sensor/crimereports.py new file mode 100644 index 00000000000000..8f118fc3c32501 --- /dev/null +++ b/homeassistant/components/sensor/crimereports.py @@ -0,0 +1,123 @@ +""" +Sensor for Crime Reports. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/sensor.crimereports/ +""" +from collections import defaultdict +from datetime import timedelta +import logging + +import voluptuous as vol + +from homeassistant.components.sensor import PLATFORM_SCHEMA +from homeassistant.const import ( + CONF_INCLUDE, CONF_EXCLUDE, CONF_NAME, CONF_LATITUDE, CONF_LONGITUDE, + ATTR_ATTRIBUTION, ATTR_LATITUDE, ATTR_LONGITUDE, + LENGTH_KILOMETERS, LENGTH_METERS) +from homeassistant.helpers.entity import Entity +from homeassistant.util import slugify +from homeassistant.util.distance import convert +from homeassistant.util.dt import now +import homeassistant.helpers.config_validation as cv + +REQUIREMENTS = ['crimereports==1.0.0'] + +_LOGGER = logging.getLogger(__name__) + +SCAN_INTERVAL = timedelta(minutes=30) +DOMAIN = 'crimereports' +EVENT_INCIDENT = '{}_incident'.format(DOMAIN) +CONF_RADIUS = 'radius' + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_NAME): cv.string, + vol.Required(CONF_RADIUS): vol.Coerce(float), + vol.Inclusive(CONF_LATITUDE, 'coordinates'): cv.latitude, + vol.Inclusive(CONF_LONGITUDE, 'coordinates'): cv.longitude, + vol.Optional(CONF_INCLUDE): vol.All(cv.ensure_list, [cv.string]), + vol.Optional(CONF_EXCLUDE): vol.All(cv.ensure_list, [cv.string]) +}) + + +# pylint: disable=unused-argument +def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup the Crime Reports platform.""" + latitude = config.get(CONF_LATITUDE, hass.config.latitude) + longitude = config.get(CONF_LONGITUDE, hass.config.longitude) + add_devices([CrimeReportsSensor(hass, config.get(CONF_NAME), + latitude, longitude, + config.get(CONF_RADIUS), + config.get(CONF_INCLUDE), + config.get(CONF_EXCLUDE))], True) + + +class CrimeReportsSensor(Entity): + """Crime Reports Sensor.""" + + def __init__(self, hass, name, latitude, longitude, radius, + include, exclude): + """Initialize the sensor.""" + import crimereports + self._hass = hass + self._name = name + self._include = include + self._exclude = exclude + radius_kilometers = convert(radius, LENGTH_METERS, LENGTH_KILOMETERS) + self._crimereports = crimereports.CrimeReports((latitude, longitude), + radius_kilometers) + self._attributes = None + self._state = None + self._previous_incidents = set() + + @property + def name(self): + """Return the name of the sensor.""" + return self._name + + @property + def state(self): + """Return the state of the sensor.""" + return self._state + + @property + def device_state_attributes(self): + """Return the state attributes.""" + return self._attributes + + def _incident_event(self, incident): + data = { + 'type': incident.get('type'), + 'description': incident.get('friendly_description'), + 'timestamp': incident.get('timestamp'), + 'location': incident.get('location') + } + if incident.get('coordinates'): + data.update({ + ATTR_LATITUDE: incident.get('coordinates')[0], + ATTR_LONGITUDE: incident.get('coordinates')[1] + }) + self._hass.bus.fire(EVENT_INCIDENT, data) + + def update(self): + """Update device state.""" + import crimereports + incident_counts = defaultdict(int) + incidents = self._crimereports.get_incidents(now().date(), + include=self._include, + exclude=self._exclude) + fire_events = len(self._previous_incidents) > 0 + if len(incidents) < len(self._previous_incidents): + self._previous_incidents = set() + for incident in incidents: + incident_type = slugify(incident.get('type')) + incident_counts[incident_type] += 1 + if (fire_events and incident.get('id') + not in self._previous_incidents): + self._incident_event(incident) + self._previous_incidents.add(incident.get('id')) + self._attributes = { + ATTR_ATTRIBUTION: crimereports.ATTRIBUTION + } + self._attributes.update(incident_counts) + self._state = len(incidents) diff --git a/requirements_all.txt b/requirements_all.txt index 121b48453722d3..01539981b8f45e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -108,6 +108,9 @@ colorlog>2.1,<3 # homeassistant.components.binary_sensor.concord232 concord232==0.14 +# homeassistant.components.sensor.crimereports +crimereports==1.0.0 + # homeassistant.components.sensor.metoffice # homeassistant.components.weather.metoffice datapoint==0.4.3 From 8cff98d07b2d615aeaa87712b2ca4b55ce880e96 Mon Sep 17 00:00:00 2001 From: Nate Date: Fri, 7 Apr 2017 07:59:41 +0200 Subject: [PATCH 015/146] From Dusk till Dawn (#6857) * Added dawn, dusk, noon and midnight to the Sun component * Created a helper method for the solar events --- homeassistant/components/sun.py | 163 ++++++++++++++++++++++++++++---- tests/components/test_sun.py | 44 +++++++++ 2 files changed, 189 insertions(+), 18 deletions(-) diff --git a/homeassistant/components/sun.py b/homeassistant/components/sun.py index 19f0b0fabbaaf7..f5fb0115a43268 100644 --- a/homeassistant/components/sun.py +++ b/homeassistant/components/sun.py @@ -30,6 +30,10 @@ STATE_ATTR_AZIMUTH = 'azimuth' STATE_ATTR_ELEVATION = 'elevation' +STATE_ATTR_NEXT_DAWN = 'next_dawn' +STATE_ATTR_NEXT_DUSK = 'next_dusk' +STATE_ATTR_NEXT_MIDNIGHT = 'next_midnight' +STATE_ATTR_NEXT_NOON = 'next_noon' STATE_ATTR_NEXT_RISING = 'next_rising' STATE_ATTR_NEXT_SETTING = 'next_setting' @@ -47,6 +51,118 @@ def is_on(hass, entity_id=None): return hass.states.is_state(entity_id, STATE_ABOVE_HORIZON) +def next_dawn(hass, entity_id=None): + """Local datetime object of the next dawn. + + Async friendly. + """ + utc_next = next_dawn_utc(hass, entity_id) + + return dt_util.as_local(utc_next) if utc_next else None + + +def next_dawn_utc(hass, entity_id=None): + """UTC datetime object of the next dawn. + + Async friendly. + """ + entity_id = entity_id or ENTITY_ID + + state = hass.states.get(ENTITY_ID) + + try: + return dt_util.parse_datetime( + state.attributes[STATE_ATTR_NEXT_DAWN]) + except (AttributeError, KeyError): + # AttributeError if state is None + # KeyError if STATE_ATTR_NEXT_DAWN does not exist + return None + + +def next_dusk(hass, entity_id=None): + """Local datetime object of the next dusk. + + Async friendly. + """ + utc_next = next_dusk_utc(hass, entity_id) + + return dt_util.as_local(utc_next) if utc_next else None + + +def next_dusk_utc(hass, entity_id=None): + """UTC datetime object of the next dusk. + + Async friendly. + """ + entity_id = entity_id or ENTITY_ID + + state = hass.states.get(ENTITY_ID) + + try: + return dt_util.parse_datetime( + state.attributes[STATE_ATTR_NEXT_DUSK]) + except (AttributeError, KeyError): + # AttributeError if state is None + # KeyError if STATE_ATTR_NEXT_DUSK does not exist + return None + + +def next_midnight(hass, entity_id=None): + """Local datetime object of the next midnight. + + Async friendly. + """ + utc_next = next_midnight_utc(hass, entity_id) + + return dt_util.as_local(utc_next) if utc_next else None + + +def next_midnight_utc(hass, entity_id=None): + """UTC datetime object of the next midnight. + + Async friendly. + """ + entity_id = entity_id or ENTITY_ID + + state = hass.states.get(ENTITY_ID) + + try: + return dt_util.parse_datetime( + state.attributes[STATE_ATTR_NEXT_MIDNIGHT]) + except (AttributeError, KeyError): + # AttributeError if state is None + # KeyError if STATE_ATTR_NEXT_MIDNIGHT does not exist + return None + + +def next_noon(hass, entity_id=None): + """Local datetime object of the next solar noon. + + Async friendly. + """ + utc_next = next_noon_utc(hass, entity_id) + + return dt_util.as_local(utc_next) if utc_next else None + + +def next_noon_utc(hass, entity_id=None): + """UTC datetime object of the next noon. + + Async friendly. + """ + entity_id = entity_id or ENTITY_ID + + state = hass.states.get(ENTITY_ID) + + try: + return dt_util.parse_datetime( + state.attributes[STATE_ATTR_NEXT_NOON]) + except (AttributeError, KeyError): + # AttributeError if state is None + # KeyError if STATE_ATTR_NEXT_NOON does not exist + return None + + def next_setting(hass, entity_id=None): """Local datetime object of the next sun setting. @@ -153,6 +269,8 @@ def __init__(self, hass, location): self.hass = hass self.location = location self._state = self.next_rising = self.next_setting = None + self.next_dawn = self.next_dusk = None + self.next_midnight = self.next_noon = None self.solar_elevation = self.solar_azimuth = 0 track_utc_time_change(hass, self.timer_update, second=30) @@ -174,6 +292,10 @@ def state(self): def state_attributes(self): """Return the state attributes of the sun.""" return { + STATE_ATTR_NEXT_DAWN: self.next_dawn.isoformat(), + STATE_ATTR_NEXT_DUSK: self.next_dusk.isoformat(), + STATE_ATTR_NEXT_MIDNIGHT: self.next_midnight.isoformat(), + STATE_ATTR_NEXT_NOON: self.next_noon.isoformat(), STATE_ATTR_NEXT_RISING: self.next_rising.isoformat(), STATE_ATTR_NEXT_SETTING: self.next_setting.isoformat(), STATE_ATTR_ELEVATION: round(self.solar_elevation, 2), @@ -183,36 +305,41 @@ def state_attributes(self): @property def next_change(self): """Datetime when the next change to the state is.""" - return min(self.next_rising, self.next_setting) + return min(self.next_dawn, self.next_dusk, self.next_midnight, + self.next_noon, self.next_rising, self.next_setting) - def update_as_of(self, utc_point_in_time): + @staticmethod + def get_next_solar_event(callable_on_astral_location, + utc_point_in_time, mod, increment): """Calculate sun state at a point in UTC time.""" import astral - mod = -1 while True: try: - next_rising_dt = self.location.sunrise( + next_dt = callable_on_astral_location( utc_point_in_time + timedelta(days=mod), local=False) - if next_rising_dt > utc_point_in_time: + if next_dt > utc_point_in_time: break except astral.AstralError: pass - mod += 1 + mod += increment - mod = -1 - while True: - try: - next_setting_dt = (self.location.sunset( - utc_point_in_time + timedelta(days=mod), local=False)) - if next_setting_dt > utc_point_in_time: - break - except astral.AstralError: - pass - mod += 1 + return next_dt - self.next_rising = next_rising_dt - self.next_setting = next_setting_dt + def update_as_of(self, utc_point_in_time): + """Update the attributes containing solar events.""" + self.next_dawn = Sun.get_next_solar_event( + self.location.dawn, utc_point_in_time, -1, 1) + self.next_dusk = Sun.get_next_solar_event( + self.location.dusk, utc_point_in_time, -1, 1) + self.next_midnight = Sun.get_next_solar_event( + self.location.solar_midnight, utc_point_in_time, -1, 1) + self.next_noon = Sun.get_next_solar_event( + self.location.solar_noon, utc_point_in_time, -1, 1) + self.next_rising = Sun.get_next_solar_event( + self.location.sunrise, utc_point_in_time, -1, 1) + self.next_setting = Sun.get_next_solar_event( + self.location.sunset, utc_point_in_time, -1, 1) def update_sun_position(self, utc_point_in_time): """Calculate the position of the sun.""" diff --git a/tests/components/test_sun.py b/tests/components/test_sun.py index 33fc5ad40c55d7..659e4b1a43d3b0 100644 --- a/tests/components/test_sun.py +++ b/tests/components/test_sun.py @@ -44,6 +44,38 @@ def test_setting_rising(self): latitude = self.hass.config.latitude longitude = self.hass.config.longitude + mod = -1 + while True: + next_dawn = (astral.dawn_utc(utc_now + + timedelta(days=mod), latitude, longitude)) + if next_dawn > utc_now: + break + mod += 1 + + mod = -1 + while True: + next_dusk = (astral.dusk_utc(utc_now + + timedelta(days=mod), latitude, longitude)) + if next_dusk > utc_now: + break + mod += 1 + + mod = -1 + while True: + next_midnight = (astral.solar_midnight_utc(utc_now + + timedelta(days=mod), longitude)) + if next_midnight > utc_now: + break + mod += 1 + + mod = -1 + while True: + next_noon = (astral.solar_noon_utc(utc_now + + timedelta(days=mod), longitude)) + if next_noon > utc_now: + break + mod += 1 + mod = -1 while True: next_rising = (astral.sunrise_utc(utc_now + @@ -60,15 +92,27 @@ def test_setting_rising(self): break mod += 1 + self.assertEqual(next_dawn, sun.next_dawn_utc(self.hass)) + self.assertEqual(next_dusk, sun.next_dusk_utc(self.hass)) + self.assertEqual(next_midnight, sun.next_midnight_utc(self.hass)) + self.assertEqual(next_noon, sun.next_noon_utc(self.hass)) self.assertEqual(next_rising, sun.next_rising_utc(self.hass)) self.assertEqual(next_setting, sun.next_setting_utc(self.hass)) # Point it at a state without the proper attributes self.hass.states.set(sun.ENTITY_ID, sun.STATE_ABOVE_HORIZON) + self.assertIsNone(sun.next_dawn(self.hass)) + self.assertIsNone(sun.next_dusk(self.hass)) + self.assertIsNone(sun.next_midnight(self.hass)) + self.assertIsNone(sun.next_noon(self.hass)) self.assertIsNone(sun.next_rising(self.hass)) self.assertIsNone(sun.next_setting(self.hass)) # Point it at a non-existing state + self.assertIsNone(sun.next_dawn(self.hass, 'non.existing')) + self.assertIsNone(sun.next_dusk(self.hass, 'non.existing')) + self.assertIsNone(sun.next_midnight(self.hass, 'non.existing')) + self.assertIsNone(sun.next_noon(self.hass, 'non.existing')) self.assertIsNone(sun.next_rising(self.hass, 'non.existing')) self.assertIsNone(sun.next_setting(self.hass, 'non.existing')) From df77529bfec0b730a69c7810a8e354cb86e1bd24 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Fri, 7 Apr 2017 09:17:23 -0400 Subject: [PATCH 016/146] Tests for zwave services (#6937) * Initial tests for zwave services * Fix linter issues * Complete zwave service tests --- .coveragerc | 2 - homeassistant/components/zwave/__init__.py | 14 +- tests/components/climate/test_zwave.py | 5 +- tests/components/zwave/test_init.py | 371 ++++++++++++++++++++- tests/conftest.py | 10 +- tests/mock/zwave.py | 86 ++++- 6 files changed, 452 insertions(+), 36 deletions(-) diff --git a/.coveragerc b/.coveragerc index 3d32256e9fbb1d..a8e771c9ad27f6 100644 --- a/.coveragerc +++ b/.coveragerc @@ -175,7 +175,6 @@ omit = homeassistant/components/climate/oem.py homeassistant/components/climate/proliphix.py homeassistant/components/climate/radiotherm.py - homeassistant/components/config/zwave.py homeassistant/components/cover/garadget.py homeassistant/components/cover/homematic.py homeassistant/components/cover/myq.py @@ -442,7 +441,6 @@ omit = homeassistant/components/weather/openweathermap.py homeassistant/components/weather/zamg.py homeassistant/components/zeroconf.py - homeassistant/components/zwave/__init__.py homeassistant/components/zwave/util.py diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index 254b488ccbbd84..0dba4927e2046d 100755 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -185,8 +185,8 @@ def get_config_value(node, value_index, tries=5): """Return the current configuration value for a specific index.""" try: for value in node.values.values(): - # 112 == config command class - if value.command_class == 112 and value.index == value_index: + if (value.command_class == const.COMMAND_CLASS_CONFIGURATION + and value.index == value_index): return value.data except RuntimeError: # If we get an runtime error the dict has changed while @@ -384,7 +384,7 @@ def test_network(service): _LOGGER.info("Zwave test_network have been initialized.") NETWORK.test() - def stop_zwave(_service_or_event): + def stop_network(_service_or_event): """Stop Z-Wave network.""" _LOGGER.info("Stopping ZWave network.") NETWORK.stop() @@ -532,7 +532,7 @@ def start_zwave(_service_or_event): poll_interval = NETWORK.get_poll_interval() _LOGGER.info("zwave polling interval set to %d ms", poll_interval) - hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_zwave) + hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_network) # Register node services for Z-Wave network hass.services.register(DOMAIN, const.SERVICE_ADD_NODE, add_node, @@ -553,7 +553,8 @@ def start_zwave(_service_or_event): hass.services.register(DOMAIN, const.SERVICE_TEST_NETWORK, test_network, descriptions[const.SERVICE_TEST_NETWORK]) - hass.services.register(DOMAIN, const.SERVICE_STOP_NETWORK, stop_zwave, + hass.services.register(DOMAIN, const.SERVICE_STOP_NETWORK, + stop_network, descriptions[const.SERVICE_STOP_NETWORK]) hass.services.register(DOMAIN, const.SERVICE_START_NETWORK, start_zwave, @@ -840,4 +841,5 @@ def device_state_attributes(self): def refresh_from_network(self): """Refresh all dependent values from zwave network.""" for value in self.values: - self.node.refresh_value(value.value_id) + if value is not None: + self.node.refresh_value(value.value_id) diff --git a/tests/components/climate/test_zwave.py b/tests/components/climate/test_zwave.py index 711c7f2fabb449..ed9e0cf9daa85e 100644 --- a/tests/components/climate/test_zwave.py +++ b/tests/components/climate/test_zwave.py @@ -15,7 +15,7 @@ def device(hass, mock_openzwave): node = MockNode() values = MockEntityValues( primary=MockValue(data=1, node=node), - temperature=MockValue(data=5, node=node), + temperature=MockValue(data=5, node=node, units=None), mode=MockValue(data=b'test1', data_items=[0, 1, 2], node=node), fan_mode=MockValue(data=b'test2', data_items=[3, 4, 5], node=node), operating_state=MockValue(data=6, node=node), @@ -30,9 +30,10 @@ def device(hass, mock_openzwave): def device_zxt_120(hass, mock_openzwave): """Fixture to provide a precreated climate device.""" node = MockNode(manufacturer_id='5254', product_id='8377') + values = MockEntityValues( primary=MockValue(data=1, node=node), - temperature=MockValue(data=5, node=node), + temperature=MockValue(data=5, node=node, units=None), mode=MockValue(data=b'test1', data_items=[0, 1, 2], node=node), fan_mode=MockValue(data=b'test2', data_items=[3, 4, 5], node=node), operating_state=MockValue(data=6, node=node), diff --git a/tests/components/zwave/test_init.py b/tests/components/zwave/test_init.py index 14b2a0226fe99f..3fea3113337d99 100644 --- a/tests/components/zwave/test_init.py +++ b/tests/components/zwave/test_init.py @@ -1,11 +1,21 @@ """Tests for the Z-Wave init.""" import asyncio -import unittest from collections import OrderedDict from homeassistant.bootstrap import async_setup_component +from homeassistant.const import ATTR_ENTITY_ID, EVENT_HOMEASSISTANT_START +from homeassistant.components import zwave +from homeassistant.components.binary_sensor.zwave import get_device from homeassistant.components.zwave import ( - CONFIG_SCHEMA, CONF_DEVICE_CONFIG_GLOB) + const, CONFIG_SCHEMA, CONF_DEVICE_CONFIG_GLOB) +from homeassistant.setup import setup_component + +import pytest +import unittest +from unittest.mock import patch, MagicMock + +from tests.common import get_test_home_assistant +from tests.mock.zwave import MockNetwork, MockNode, MockValue, MockEntityValues @asyncio.coroutine @@ -49,3 +59,360 @@ def test_device_config_glob_is_ordered(self): {'zwave': {CONF_DEVICE_CONFIG_GLOB: OrderedDict()}}) self.assertIsInstance( conf['zwave'][CONF_DEVICE_CONFIG_GLOB], OrderedDict) + + +class TestZWaveServices(unittest.TestCase): + """Tests for zwave services.""" + + @pytest.fixture(autouse=True) + def set_mock_openzwave(self, mock_openzwave): + """Use the mock_openzwave fixture for this class.""" + self.mock_openzwave = mock_openzwave + + def setUp(self): + """Initialize values for this testcase class.""" + self.hass = get_test_home_assistant() + self.hass.start() + + # Initialize zwave + setup_component(self.hass, 'zwave', {'zwave': {}}) + self.hass.block_till_done() + zwave.NETWORK.state = MockNetwork.STATE_READY + self.hass.bus.fire(EVENT_HOMEASSISTANT_START) + self.hass.block_till_done() + + def tearDown(self): # pylint: disable=invalid-name + """Stop everything that was started.""" + self.hass.stop() + + def test_add_node(self): + """Test zwave add_node service.""" + self.hass.services.call('zwave', 'add_node', {}) + self.hass.block_till_done() + + assert zwave.NETWORK.controller.add_node.called + assert len(zwave.NETWORK.controller.add_node.mock_calls) == 1 + assert len(zwave.NETWORK.controller.add_node.mock_calls[0][1]) == 0 + + def test_add_node_secure(self): + """Test zwave add_node_secure service.""" + self.hass.services.call('zwave', 'add_node_secure', {}) + self.hass.block_till_done() + + assert zwave.NETWORK.controller.add_node.called + assert len(zwave.NETWORK.controller.add_node.mock_calls) == 1 + assert zwave.NETWORK.controller.add_node.mock_calls[0][1][0] is True + + def test_remove_node(self): + """Test zwave remove_node service.""" + self.hass.services.call('zwave', 'remove_node', {}) + self.hass.block_till_done() + + assert zwave.NETWORK.controller.remove_node.called + assert len(zwave.NETWORK.controller.remove_node.mock_calls) == 1 + + def test_cancel_command(self): + """Test zwave cancel_command service.""" + self.hass.services.call('zwave', 'cancel_command', {}) + self.hass.block_till_done() + + assert zwave.NETWORK.controller.cancel_command.called + assert len(zwave.NETWORK.controller.cancel_command.mock_calls) == 1 + + def test_heal_network(self): + """Test zwave heal_network service.""" + self.hass.services.call('zwave', 'heal_network', {}) + self.hass.block_till_done() + + assert zwave.NETWORK.heal.called + assert len(zwave.NETWORK.heal.mock_calls) == 1 + + def test_soft_reset(self): + """Test zwave soft_reset service.""" + self.hass.services.call('zwave', 'soft_reset', {}) + self.hass.block_till_done() + + assert zwave.NETWORK.controller.soft_reset.called + assert len(zwave.NETWORK.controller.soft_reset.mock_calls) == 1 + + def test_test_network(self): + """Test zwave test_network service.""" + self.hass.services.call('zwave', 'test_network', {}) + self.hass.block_till_done() + + assert zwave.NETWORK.test.called + assert len(zwave.NETWORK.test.mock_calls) == 1 + + def test_stop_network(self): + """Test zwave stop_network service.""" + self.hass.services.call('zwave', 'stop_network', {}) + self.hass.block_till_done() + + assert zwave.NETWORK.stop.called + assert len(zwave.NETWORK.stop.mock_calls) == 1 + + def test_rename_node(self): + """Test zwave rename_node service.""" + zwave.NETWORK.nodes = {11: MagicMock()} + self.hass.services.call('zwave', 'rename_node', { + const.ATTR_NODE_ID: 11, + const.ATTR_NAME: 'test_name', + }) + self.hass.block_till_done() + + assert zwave.NETWORK.nodes[11].name == 'test_name' + + def test_remove_failed_node(self): + """Test zwave remove_failed_node service.""" + self.hass.services.call('zwave', 'remove_failed_node', { + const.ATTR_NODE_ID: 12, + }) + self.hass.block_till_done() + + remove_failed_node = zwave.NETWORK.controller.remove_failed_node + assert remove_failed_node.called + assert len(remove_failed_node.mock_calls) == 1 + assert remove_failed_node.mock_calls[0][1][0] == 12 + + def test_replace_failed_node(self): + """Test zwave replace_failed_node service.""" + self.hass.services.call('zwave', 'replace_failed_node', { + const.ATTR_NODE_ID: 13, + }) + self.hass.block_till_done() + + replace_failed_node = zwave.NETWORK.controller.replace_failed_node + assert replace_failed_node.called + assert len(replace_failed_node.mock_calls) == 1 + assert replace_failed_node.mock_calls[0][1][0] == 13 + + def test_set_config_parameter(self): + """Test zwave set_config_parameter service.""" + value = MockValue( + index=12, + command_class=const.COMMAND_CLASS_CONFIGURATION, + ) + value_list = MockValue( + index=13, + command_class=const.COMMAND_CLASS_CONFIGURATION, + type=const.TYPE_LIST, + data_items=['item1', 'item2', 'item3'], + ) + node = MockNode(node_id=14) + node.get_values.return_value = {12: value, 13: value_list} + zwave.NETWORK.nodes = {14: node} + + self.hass.services.call('zwave', 'set_config_parameter', { + const.ATTR_NODE_ID: 14, + const.ATTR_CONFIG_PARAMETER: 13, + const.ATTR_CONFIG_VALUE: 1, + }) + self.hass.block_till_done() + + assert node.set_config_param.called + assert len(node.set_config_param.mock_calls) == 1 + assert node.set_config_param.mock_calls[0][1][0] == 13 + assert node.set_config_param.mock_calls[0][1][1] == 1 + assert node.set_config_param.mock_calls[0][1][2] == 2 + node.set_config_param.reset_mock() + + self.hass.services.call('zwave', 'set_config_parameter', { + const.ATTR_NODE_ID: 14, + const.ATTR_CONFIG_PARAMETER: 13, + const.ATTR_CONFIG_VALUE: 7, + }) + self.hass.block_till_done() + + assert not node.set_config_param.called + node.set_config_param.reset_mock() + + self.hass.services.call('zwave', 'set_config_parameter', { + const.ATTR_NODE_ID: 14, + const.ATTR_CONFIG_PARAMETER: 12, + const.ATTR_CONFIG_VALUE: 0x01020304, + const.ATTR_CONFIG_SIZE: 4, + }) + self.hass.block_till_done() + + assert node.set_config_param.called + assert len(node.set_config_param.mock_calls) == 1 + assert node.set_config_param.mock_calls[0][1][0] == 12 + assert node.set_config_param.mock_calls[0][1][1] == 0x01020304 + assert node.set_config_param.mock_calls[0][1][2] == 4 + node.set_config_param.reset_mock() + + def test_print_config_parameter(self): + """Test zwave print_config_parameter service.""" + value1 = MockValue( + index=12, + command_class=const.COMMAND_CLASS_CONFIGURATION, + data=1234, + ) + value2 = MockValue( + index=13, + command_class=const.COMMAND_CLASS_CONFIGURATION, + data=2345, + ) + node = MockNode(node_id=14) + node.values = {12: value1, 13: value2} + zwave.NETWORK.nodes = {14: node} + + with patch.object(zwave, '_LOGGER') as mock_logger: + self.hass.services.call('zwave', 'print_config_parameter', { + const.ATTR_NODE_ID: 14, + const.ATTR_CONFIG_PARAMETER: 13, + }) + self.hass.block_till_done() + + assert mock_logger.info.called + assert len(mock_logger.info.mock_calls) == 1 + assert mock_logger.info.mock_calls[0][1][1] == 13 + assert mock_logger.info.mock_calls[0][1][2] == 14 + assert mock_logger.info.mock_calls[0][1][3] == 2345 + + def test_print_node(self): + """Test zwave print_config_parameter service.""" + node1 = MockNode(node_id=14) + node2 = MockNode(node_id=15) + zwave.NETWORK.nodes = {14: node1, 15: node2} + + with patch.object(zwave, 'pprint') as mock_pprint: + self.hass.services.call('zwave', 'print_node', { + const.ATTR_NODE_ID: 15, + }) + self.hass.block_till_done() + + assert mock_pprint.called + assert len(mock_pprint.mock_calls) == 1 + assert mock_pprint.mock_calls[0][1][0]['node_id'] == 15 + + def test_set_wakeup(self): + """Test zwave set_wakeup service.""" + value = MockValue( + index=12, + command_class=const.COMMAND_CLASS_WAKE_UP, + ) + node = MockNode(node_id=14) + node.values = {12: value} + node.get_values.return_value = node.values + zwave.NETWORK.nodes = {14: node} + + self.hass.services.call('zwave', 'set_wakeup', { + const.ATTR_NODE_ID: 14, + const.ATTR_CONFIG_VALUE: 15, + }) + self.hass.block_till_done() + + assert value.data == 15 + + node.can_wake_up_value = False + self.hass.services.call('zwave', 'set_wakeup', { + const.ATTR_NODE_ID: 14, + const.ATTR_CONFIG_VALUE: 20, + }) + self.hass.block_till_done() + + assert value.data == 15 + + def test_add_association(self): + """Test zwave change_association service.""" + ZWaveGroup = self.mock_openzwave.group.ZWaveGroup + group = MagicMock() + ZWaveGroup.return_value = group + + value = MockValue( + index=12, + command_class=const.COMMAND_CLASS_WAKE_UP, + ) + node = MockNode(node_id=14) + node.values = {12: value} + node.get_values.return_value = node.values + zwave.NETWORK.nodes = {14: node} + + self.hass.services.call('zwave', 'change_association', { + const.ATTR_ASSOCIATION: 'add', + const.ATTR_NODE_ID: 14, + const.ATTR_TARGET_NODE_ID: 24, + const.ATTR_GROUP: 3, + const.ATTR_INSTANCE: 5, + }) + self.hass.block_till_done() + + assert ZWaveGroup.called + assert len(ZWaveGroup.mock_calls) == 2 + assert ZWaveGroup.mock_calls[0][1][0] == 3 + assert ZWaveGroup.mock_calls[0][1][2] == 14 + assert group.add_association.called + assert len(group.add_association.mock_calls) == 1 + assert group.add_association.mock_calls[0][1][0] == 24 + assert group.add_association.mock_calls[0][1][1] == 5 + + def test_remove_association(self): + """Test zwave change_association service.""" + ZWaveGroup = self.mock_openzwave.group.ZWaveGroup + group = MagicMock() + ZWaveGroup.return_value = group + + value = MockValue( + index=12, + command_class=const.COMMAND_CLASS_WAKE_UP, + ) + node = MockNode(node_id=14) + node.values = {12: value} + node.get_values.return_value = node.values + zwave.NETWORK.nodes = {14: node} + + self.hass.services.call('zwave', 'change_association', { + const.ATTR_ASSOCIATION: 'remove', + const.ATTR_NODE_ID: 14, + const.ATTR_TARGET_NODE_ID: 24, + const.ATTR_GROUP: 3, + const.ATTR_INSTANCE: 5, + }) + self.hass.block_till_done() + + assert ZWaveGroup.called + assert len(ZWaveGroup.mock_calls) == 2 + assert ZWaveGroup.mock_calls[0][1][0] == 3 + assert ZWaveGroup.mock_calls[0][1][2] == 14 + assert group.remove_association.called + assert len(group.remove_association.mock_calls) == 1 + assert group.remove_association.mock_calls[0][1][0] == 24 + assert group.remove_association.mock_calls[0][1][1] == 5 + + def test_refresh_entity(self): + """Test zwave refresh_entity service.""" + node = MockNode() + value = MockValue(data=False, node=node, + command_class=const.COMMAND_CLASS_SENSOR_BINARY) + power_value = MockValue(data=50, node=node, + command_class=const.COMMAND_CLASS_METER) + values = MockEntityValues(primary=value, power=power_value) + device = get_device(node=node, values=values, node_config={}) + device.hass = self.hass + device.entity_id = 'binary_sensor.mock_entity_id' + self.hass.add_job(device.async_added_to_hass()) + self.hass.block_till_done() + + self.hass.services.call('zwave', 'refresh_entity', { + ATTR_ENTITY_ID: 'binary_sensor.mock_entity_id', + }) + self.hass.block_till_done() + + assert node.refresh_value.called + assert len(node.refresh_value.mock_calls) == 2 + self.assertEqual(sorted([node.refresh_value.mock_calls[0][1][0], + node.refresh_value.mock_calls[1][1][0]]), + sorted([value.value_id, power_value.value_id])) + + def test_refresh_node(self): + """Test zwave refresh_node service.""" + node = MockNode(node_id=14) + zwave.NETWORK.nodes = {14: node} + self.hass.services.call('zwave', 'refresh_node', { + const.ATTR_NODE_ID: 14, + }) + self.hass.block_till_done() + + assert node.refresh_info.called + assert len(node.refresh_info.mock_calls) == 1 diff --git a/tests/conftest.py b/tests/conftest.py index 56d4c793b8eb23..b6c9795f1278c9 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -12,9 +12,9 @@ from homeassistant.util import location from homeassistant.components import mqtt -from .common import async_test_home_assistant, mock_coro -from .test_util.aiohttp import mock_aiohttp_client -from .mock.zwave import SIGNAL_VALUE_CHANGED, SIGNAL_NODE, SIGNAL_NOTIFICATION +from tests.common import async_test_home_assistant, mock_coro +from tests.test_util.aiohttp import mock_aiohttp_client +from tests.mock.zwave import MockNetwork if os.environ.get('UVLOOP') == '1': import uvloop @@ -100,9 +100,7 @@ def mock_openzwave(): base_mock = MagicMock() libopenzwave = base_mock.libopenzwave libopenzwave.__file__ = 'test' - base_mock.network.ZWaveNetwork.SIGNAL_VALUE_CHANGED = SIGNAL_VALUE_CHANGED - base_mock.network.ZWaveNetwork.SIGNAL_NODE = SIGNAL_NODE - base_mock.network.ZWaveNetwork.SIGNAL_NOTIFICATION = SIGNAL_NOTIFICATION + base_mock.network.ZWaveNetwork = MockNetwork with patch.dict('sys.modules', { 'libopenzwave': libopenzwave, diff --git a/tests/mock/zwave.py b/tests/mock/zwave.py index 0e20be6db4b5c9..513c606aab26e0 100644 --- a/tests/mock/zwave.py +++ b/tests/mock/zwave.py @@ -3,15 +3,11 @@ from pydispatch import dispatcher -SIGNAL_VALUE_CHANGED = 'mock_value_changed' -SIGNAL_NODE = 'mock_node' -SIGNAL_NOTIFICATION = 'mock_notification' - def value_changed(value): """Fire a value changed.""" dispatcher.send( - SIGNAL_VALUE_CHANGED, + MockNetwork.SIGNAL_VALUE_CHANGED, value=value, node=value.node, network=value.node._network @@ -21,7 +17,7 @@ def value_changed(value): def node_changed(node): """Fire a node changed.""" dispatcher.send( - SIGNAL_NODE, + MockNetwork.SIGNAL_NODE, node=node, network=node._network ) @@ -30,12 +26,70 @@ def node_changed(node): def notification(node_id, network=None): """Fire a notification.""" dispatcher.send( - SIGNAL_NOTIFICATION, + MockNetwork.SIGNAL_NOTIFICATION, args={'nodeId': node_id}, network=network ) +class MockNetwork(MagicMock): + """Mock Z-Wave network.""" + + SIGNAL_NETWORK_FAILED = 'mock_NetworkFailed' + SIGNAL_NETWORK_STARTED = 'mock_NetworkStarted' + SIGNAL_NETWORK_READY = 'mock_NetworkReady' + SIGNAL_NETWORK_STOPPED = 'mock_NetworkStopped' + SIGNAL_NETWORK_RESETTED = 'mock_DriverResetted' + SIGNAL_NETWORK_AWAKED = 'mock_DriverAwaked' + SIGNAL_DRIVER_FAILED = 'mock_DriverFailed' + SIGNAL_DRIVER_READY = 'mock_DriverReady' + SIGNAL_DRIVER_RESET = 'mock_DriverReset' + SIGNAL_DRIVER_REMOVED = 'mock_DriverRemoved' + SIGNAL_GROUP = 'mock_Group' + SIGNAL_NODE = 'mock_Node' + SIGNAL_NODE_ADDED = 'mock_NodeAdded' + SIGNAL_NODE_EVENT = 'mock_NodeEvent' + SIGNAL_NODE_NAMING = 'mock_NodeNaming' + SIGNAL_NODE_NEW = 'mock_NodeNew' + SIGNAL_NODE_PROTOCOL_INFO = 'mock_NodeProtocolInfo' + SIGNAL_NODE_READY = 'mock_NodeReady' + SIGNAL_NODE_REMOVED = 'mock_NodeRemoved' + SIGNAL_SCENE_EVENT = 'mock_SceneEvent' + SIGNAL_VALUE = 'mock_Value' + SIGNAL_VALUE_ADDED = 'mock_ValueAdded' + SIGNAL_VALUE_CHANGED = 'mock_ValueChanged' + SIGNAL_VALUE_REFRESHED = 'mock_ValueRefreshed' + SIGNAL_VALUE_REMOVED = 'mock_ValueRemoved' + SIGNAL_POLLING_ENABLED = 'mock_PollingEnabled' + SIGNAL_POLLING_DISABLED = 'mock_PollingDisabled' + SIGNAL_CREATE_BUTTON = 'mock_CreateButton' + SIGNAL_DELETE_BUTTON = 'mock_DeleteButton' + SIGNAL_BUTTON_ON = 'mock_ButtonOn' + SIGNAL_BUTTON_OFF = 'mock_ButtonOff' + SIGNAL_ESSENTIAL_NODE_QUERIES_COMPLETE = \ + 'mock_EssentialNodeQueriesComplete' + SIGNAL_NODE_QUERIES_COMPLETE = 'mock_NodeQueriesComplete' + SIGNAL_AWAKE_NODES_QUERIED = 'mock_AwakeNodesQueried' + SIGNAL_ALL_NODES_QUERIED = 'mock_AllNodesQueried' + SIGNAL_ALL_NODES_QUERIED_SOME_DEAD = 'mock_AllNodesQueriedSomeDead' + SIGNAL_MSG_COMPLETE = 'mock_MsgComplete' + SIGNAL_NOTIFICATION = 'mock_Notification' + SIGNAL_CONTROLLER_COMMAND = 'mock_ControllerCommand' + SIGNAL_CONTROLLER_WAITING = 'mock_ControllerWaiting' + + STATE_STOPPED = 0 + STATE_FAILED = 1 + STATE_RESETTED = 3 + STATE_STARTED = 5 + STATE_AWAKED = 7 + STATE_READY = 10 + + def __init__(self, *args, **kwargs): + """Initialize a Z-Wave mock network.""" + super().__init__() + self.state = MockNetwork.STATE_STOPPED + + class MockNode(MagicMock): """Mock Z-Wave node.""" @@ -47,6 +101,7 @@ def __init__(self, *, product_type='678', command_classes=None, can_wake_up_value=True, + network=None, **kwargs): """Initialize a Z-Wave mock node.""" super().__init__() @@ -57,6 +112,8 @@ def __init__(self, *, self.product_type = product_type self.can_wake_up_value = can_wake_up_value self._command_classes = command_classes or [] + if network is not None: + self._network = network for attr_name in kwargs: setattr(self, attr_name, kwargs[attr_name]) @@ -84,30 +141,23 @@ class MockValue(MagicMock): def __init__(self, *, label='Mock Value', - data=None, - data_items=None, node=None, instance=0, index=0, - command_class=None, - units=None, - type=None, - value_id=None): + value_id=None, + **kwargs): """Initialize a Z-Wave mock value.""" super().__init__() self.label = label - self.data = data - self.data_items = data_items self.node = node self.instance = instance self.index = index - self.command_class = command_class - self.units = units - self.type = type if value_id is None: MockValue._mock_value_id += 1 value_id = MockValue._mock_value_id self.value_id = value_id + for attr_name in kwargs: + setattr(self, attr_name, kwargs[attr_name]) def _get_child_mock(self, **kw): """Create child mocks with right MagicMock class.""" From 64174f5763927886a0417aff9709c4faf770ca63 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 7 Apr 2017 12:02:49 -0700 Subject: [PATCH 017/146] Fix control+c quitting HASS (#6974) --- homeassistant/core.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/core.py b/homeassistant/core.py index 03cc3d4e9f5d69..ba19f392931d12 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -141,7 +141,8 @@ def start(self) -> None: self.loop.run_forever() return self.exit_code except KeyboardInterrupt: - fire_coroutine_threadsafe(self.async_stop(), self.loop) + self.loop.call_soon_threadsafe( + self.loop.create_task, self.async_stop()) self.loop.run_forever() finally: self.loop.close() From ad8ee1383ce4da4ac57cf1a2de868101dc828166 Mon Sep 17 00:00:00 2001 From: John Mihalic Date: Fri, 7 Apr 2017 22:17:10 -0400 Subject: [PATCH 018/146] Update Emby for aiohttp v2 (#6981) --- homeassistant/components/media_player/emby.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/media_player/emby.py b/homeassistant/components/media_player/emby.py index 3dc0131531fd9f..3ed6d42e76a013 100644 --- a/homeassistant/components/media_player/emby.py +++ b/homeassistant/components/media_player/emby.py @@ -21,7 +21,7 @@ import homeassistant.helpers.config_validation as cv import homeassistant.util.dt as dt_util -REQUIREMENTS = ['pyemby==1.1'] +REQUIREMENTS = ['pyemby==1.2'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 01539981b8f45e..61a14c72ae42e3 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -512,7 +512,7 @@ pydroid-ipcam==0.8 pyebox==0.1.0 # homeassistant.components.media_player.emby -pyemby==1.1 +pyemby==1.2 # homeassistant.components.envisalink pyenvisalink==2.0 From 55077b996505638f94d44a3d0d01eb2af4a0016e Mon Sep 17 00:00:00 2001 From: Teemu R Date: Sat, 8 Apr 2017 04:19:11 +0200 Subject: [PATCH 019/146] switch.tplink: upgrade to the newest upstream release which adds support for plugs using the newer communication protocol (#6979) From 475ac52180f2da8e64b1742dd316803d354b8b48 Mon Sep 17 00:00:00 2001 From: Teemu R Date: Sat, 8 Apr 2017 15:33:25 +0200 Subject: [PATCH 020/146] switch.tplink: bump pyhs100 version requirement (#6986) --- homeassistant/components/switch/tplink.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/switch/tplink.py b/homeassistant/components/switch/tplink.py index b4c1df3db739e2..cc00a3691ee64a 100644 --- a/homeassistant/components/switch/tplink.py +++ b/homeassistant/components/switch/tplink.py @@ -14,7 +14,7 @@ from homeassistant.const import (CONF_HOST, CONF_NAME) import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['pyHS100==0.2.4.1'] +REQUIREMENTS = ['pyHS100==0.2.4.2'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 61a14c72ae42e3..43c0240452c275 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -469,7 +469,7 @@ py-cpuinfo==3.0.0 pyCEC==0.4.13 # homeassistant.components.switch.tplink -pyHS100==0.2.4.1 +pyHS100==0.2.4.2 # homeassistant.components.rfxtrx pyRFXtrx==0.17.0 From 31da54d530ec9bf79f23a0aded4f70aecb920456 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Sat, 8 Apr 2017 09:34:59 -0400 Subject: [PATCH 021/146] Add tests for ZWaveDeviceEntityValues helper (#6978) * Add tests for ZWaveDeviceEntityValues helper * Add remaining coverage --- homeassistant/components/zwave/__init__.py | 2 +- tests/components/zwave/test_init.py | 308 +++++++++++++++++++++ 2 files changed, 309 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index 0dba4927e2046d..daeca63f52bf36 100755 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -733,7 +733,7 @@ def _check_entity_ready(self): device = platform.get_device( node=self._node, values=self, node_config=node_config, hass=self._hass) - if not device: + if device is None: # No entity will be created for this value self._workaround_ignore = True return diff --git a/tests/components/zwave/test_init.py b/tests/components/zwave/test_init.py index 3fea3113337d99..fe104b1e33a5c3 100644 --- a/tests/components/zwave/test_init.py +++ b/tests/components/zwave/test_init.py @@ -50,6 +50,314 @@ def test_invalid_device_config(hass, mock_openzwave): assert not result +class TestZWaveDeviceEntityValues(unittest.TestCase): + """Tests for the ZWaveDeviceEntityValues helper.""" + + @pytest.fixture(autouse=True) + def set_mock_openzwave(self, mock_openzwave): + """Use the mock_openzwave fixture for this class.""" + self.mock_openzwave = mock_openzwave + + def setUp(self): + """Initialize values for this testcase class.""" + self.hass = get_test_home_assistant() + self.hass.start() + + setup_component(self.hass, 'zwave', {'zwave': {}}) + self.hass.block_till_done() + + self.node = MockNode() + self.mock_schema = { + const.DISC_COMPONENT: 'mock_component', + const.DISC_VALUES: { + const.DISC_PRIMARY: { + const.DISC_COMMAND_CLASS: ['mock_primary_class'], + }, + 'secondary': { + const.DISC_COMMAND_CLASS: ['mock_secondary_class'], + }, + 'optional': { + const.DISC_COMMAND_CLASS: ['mock_optional_class'], + const.DISC_OPTIONAL: True, + }}} + self.primary = MockValue( + command_class='mock_primary_class', node=self.node) + self.secondary = MockValue( + command_class='mock_secondary_class', node=self.node) + self.duplicate_secondary = MockValue( + command_class='mock_secondary_class', node=self.node) + self.optional = MockValue( + command_class='mock_optional_class', node=self.node) + self.no_match_value = MockValue( + command_class='mock_bad_class', node=self.node) + + self.entity_id = '{}.{}'.format('mock_component', + zwave.object_id(self.primary)) + self.zwave_config = {} + self.device_config = {self.entity_id: {}} + + def tearDown(self): # pylint: disable=invalid-name + """Stop everything that was started.""" + self.hass.stop() + + @patch.object(zwave, 'get_platform') + @patch.object(zwave, 'discovery') + def test_entity_discovery(self, discovery, get_platform): + """Test the creation of a new entity.""" + values = zwave.ZWaveDeviceEntityValues( + hass=self.hass, + schema=self.mock_schema, + primary_value=self.primary, + zwave_config=self.zwave_config, + device_config=self.device_config, + ) + + assert values.primary is self.primary + assert len(list(values)) == 3 + self.assertEqual(sorted(list(values), + key=lambda a: id(a)), + sorted([self.primary, None, None], + key=lambda a: id(a))) + assert not discovery.async_load_platform.called + + values.check_value(self.secondary) + self.hass.block_till_done() + + assert values.secondary is self.secondary + assert len(list(values)) == 3 + self.assertEqual(sorted(list(values), + key=lambda a: id(a)), + sorted([self.primary, self.secondary, None], + key=lambda a: id(a))) + + assert discovery.async_load_platform.called + # Second call is to async yield from + assert len(discovery.async_load_platform.mock_calls) == 2 + args = discovery.async_load_platform.mock_calls[0][1] + assert args[0] == self.hass + assert args[1] == 'mock_component' + assert args[2] == 'zwave' + assert args[3] == {const.DISCOVERY_DEVICE: id(values)} + assert args[4] == self.zwave_config + + discovery.async_load_platform.reset_mock() + values.check_value(self.optional) + values.check_value(self.duplicate_secondary) + values.check_value(self.no_match_value) + self.hass.block_till_done() + + assert values.optional is self.optional + assert len(list(values)) == 3 + self.assertEqual(sorted(list(values), + key=lambda a: id(a)), + sorted([self.primary, self.secondary, self.optional], + key=lambda a: id(a))) + assert not discovery.async_load_platform.called + + assert values._entity.value_added.called + assert len(values._entity.value_added.mock_calls) == 1 + assert values._entity.value_changed.called + assert len(values._entity.value_changed.mock_calls) == 1 + + @patch.object(zwave, 'get_platform') + @patch.object(zwave, 'discovery') + def test_entity_existing_values(self, discovery, get_platform): + """Test the loading of already discovered values.""" + self.node.values = { + self.primary.value_id: self.primary, + self.secondary.value_id: self.secondary, + self.optional.value_id: self.optional, + self.no_match_value.value_id: self.no_match_value, + } + + values = zwave.ZWaveDeviceEntityValues( + hass=self.hass, + schema=self.mock_schema, + primary_value=self.primary, + zwave_config=self.zwave_config, + device_config=self.device_config, + ) + self.hass.block_till_done() + + assert values.primary is self.primary + assert values.secondary is self.secondary + assert values.optional is self.optional + assert len(list(values)) == 3 + self.assertEqual(sorted(list(values), + key=lambda a: id(a)), + sorted([self.primary, self.secondary, self.optional], + key=lambda a: id(a))) + + assert discovery.async_load_platform.called + # Second call is to async yield from + assert len(discovery.async_load_platform.mock_calls) == 2 + args = discovery.async_load_platform.mock_calls[0][1] + assert args[0] == self.hass + assert args[1] == 'mock_component' + assert args[2] == 'zwave' + assert args[3] == {const.DISCOVERY_DEVICE: id(values)} + assert args[4] == self.zwave_config + assert not self.primary.enable_poll.called + assert self.primary.disable_poll.called + + @patch.object(zwave, 'get_platform') + @patch.object(zwave, 'discovery') + def test_node_schema_mismatch(self, discovery, get_platform): + """Test node schema mismatch.""" + self.node.generic = 'no_match' + self.node.values = { + self.primary.value_id: self.primary, + self.secondary.value_id: self.secondary, + } + self.mock_schema[const.DISC_GENERIC_DEVICE_CLASS] = ['generic_match'] + values = zwave.ZWaveDeviceEntityValues( + hass=self.hass, + schema=self.mock_schema, + primary_value=self.primary, + zwave_config=self.zwave_config, + device_config=self.device_config, + ) + values._check_entity_ready() + self.hass.block_till_done() + + assert not discovery.async_load_platform.called + + @patch.object(zwave, 'get_platform') + @patch.object(zwave, 'discovery') + def test_entity_workaround_component(self, discovery, get_platform): + """Test ignore workaround.""" + self.node.manufacturer_id = '010f' + self.node.product_type = '0b00' + self.primary.command_class = const.COMMAND_CLASS_SENSOR_ALARM + self.entity_id = '{}.{}'.format('binary_sensor', + zwave.object_id(self.primary)) + self.device_config = {self.entity_id: {}} + + self.mock_schema = { + const.DISC_COMPONENT: 'mock_component', + const.DISC_VALUES: { + const.DISC_PRIMARY: { + const.DISC_COMMAND_CLASS: [ + const.COMMAND_CLASS_SWITCH_BINARY], + }}} + + values = zwave.ZWaveDeviceEntityValues( + hass=self.hass, + schema=self.mock_schema, + primary_value=self.primary, + zwave_config=self.zwave_config, + device_config=self.device_config, + ) + values._check_entity_ready() + self.hass.block_till_done() + + assert discovery.async_load_platform.called + # Second call is to async yield from + assert len(discovery.async_load_platform.mock_calls) == 2 + args = discovery.async_load_platform.mock_calls[0][1] + assert args[1] == 'binary_sensor' + + @patch.object(zwave, 'get_platform') + @patch.object(zwave, 'discovery') + def test_entity_workaround_ignore(self, discovery, get_platform): + """Test ignore workaround.""" + self.node.manufacturer_id = '010f' + self.node.product_type = '0301' + self.primary.command_class = const.COMMAND_CLASS_SWITCH_BINARY + + self.mock_schema = { + const.DISC_COMPONENT: 'mock_component', + const.DISC_VALUES: { + const.DISC_PRIMARY: { + const.DISC_COMMAND_CLASS: [ + const.COMMAND_CLASS_SWITCH_BINARY], + }}} + + values = zwave.ZWaveDeviceEntityValues( + hass=self.hass, + schema=self.mock_schema, + primary_value=self.primary, + zwave_config=self.zwave_config, + device_config=self.device_config, + ) + values._check_entity_ready() + self.hass.block_till_done() + + assert not discovery.async_load_platform.called + + @patch.object(zwave, 'get_platform') + @patch.object(zwave, 'discovery') + def test_entity_config_ignore(self, discovery, get_platform): + """Test ignore config.""" + self.node.values = { + self.primary.value_id: self.primary, + self.secondary.value_id: self.secondary, + } + self.device_config = {self.entity_id: { + zwave.CONF_IGNORED: True + }} + values = zwave.ZWaveDeviceEntityValues( + hass=self.hass, + schema=self.mock_schema, + primary_value=self.primary, + zwave_config=self.zwave_config, + device_config=self.device_config, + ) + values._check_entity_ready() + self.hass.block_till_done() + + assert not discovery.async_load_platform.called + + @patch.object(zwave, 'get_platform') + @patch.object(zwave, 'discovery') + def test_entity_platform_ignore(self, discovery, get_platform): + """Test platform ignore device.""" + self.node.values = { + self.primary.value_id: self.primary, + self.secondary.value_id: self.secondary, + } + platform = MagicMock() + get_platform.return_value = platform + platform.get_device.return_value = None + zwave.ZWaveDeviceEntityValues( + hass=self.hass, + schema=self.mock_schema, + primary_value=self.primary, + zwave_config=self.zwave_config, + device_config=self.device_config, + ) + self.hass.block_till_done() + + assert not discovery.async_load_platform.called + + @patch.object(zwave, 'get_platform') + @patch.object(zwave, 'discovery') + def test_config_polling_intensity(self, discovery, get_platform): + """Test polling intensity.""" + self.node.values = { + self.primary.value_id: self.primary, + self.secondary.value_id: self.secondary, + } + self.device_config = {self.entity_id: { + zwave.CONF_POLLING_INTENSITY: 123, + }} + values = zwave.ZWaveDeviceEntityValues( + hass=self.hass, + schema=self.mock_schema, + primary_value=self.primary, + zwave_config=self.zwave_config, + device_config=self.device_config, + ) + values._check_entity_ready() + self.hass.block_till_done() + + assert discovery.async_load_platform.called + assert self.primary.enable_poll.called + assert len(self.primary.enable_poll.mock_calls) == 1 + assert self.primary.enable_poll.mock_calls[0][1][0] == 123 + assert not self.primary.disable_poll.called + + class TestZwave(unittest.TestCase): """Test zwave init.""" From c5d89499fa5801dd89812b9f5b71a1e31680f87c Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Sat, 8 Apr 2017 17:52:10 -0400 Subject: [PATCH 022/146] Bump Amcrest module to 1.1.8 (#6990) Fixed traceback when calculating SD card percent storage self._state = self._camera.percent(sd_used[0], sd_total[0]) AttributeError: 'Http' object has no attribute 'percent' --- homeassistant/components/camera/amcrest.py | 2 +- homeassistant/components/sensor/amcrest.py | 4 ++-- requirements_all.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/camera/amcrest.py b/homeassistant/components/camera/amcrest.py index 294a63bcff9fc0..a50cdc859a7745 100644 --- a/homeassistant/components/camera/amcrest.py +++ b/homeassistant/components/camera/amcrest.py @@ -18,7 +18,7 @@ from homeassistant.helpers.aiohttp_client import ( async_get_clientsession, async_aiohttp_proxy_web) -REQUIREMENTS = ['amcrest==1.1.5'] +REQUIREMENTS = ['amcrest==1.1.8'] _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/sensor/amcrest.py b/homeassistant/components/sensor/amcrest.py index 5a349d28b7cb03..2d05372220bc65 100644 --- a/homeassistant/components/sensor/amcrest.py +++ b/homeassistant/components/sensor/amcrest.py @@ -19,7 +19,7 @@ from requests.exceptions import HTTPError, ConnectTimeout -REQUIREMENTS = ['amcrest==1.1.5'] +REQUIREMENTS = ['amcrest==1.1.8'] _LOGGER = logging.getLogger(__name__) @@ -146,4 +146,4 @@ def update(self): sd_total = self._camera.storage_total self._attrs['Total'] = '{0} {1}'.format(*sd_total) self._attrs['Used'] = '{0} {1}'.format(*sd_used) - self._state = self._camera.percent(sd_used[0], sd_total[0]) + self._state = self._camera.storage_used_percent diff --git a/requirements_all.txt b/requirements_all.txt index 43c0240452c275..7e800d62548d11 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -48,7 +48,7 @@ aiolifx==0.4.2 # homeassistant.components.camera.amcrest # homeassistant.components.sensor.amcrest -amcrest==1.1.5 +amcrest==1.1.8 # homeassistant.components.media_player.anthemav anthemav==1.1.8 From 2277778d8d269982a72bd18e64e7454a95a30476 Mon Sep 17 00:00:00 2001 From: happyleavesaoc Date: Sat, 8 Apr 2017 17:53:16 -0400 Subject: [PATCH 023/146] update gstreamer (#6987) --- .../components/media_player/gstreamer.py | 39 +++++++------------ requirements_all.txt | 2 +- 2 files changed, 14 insertions(+), 27 deletions(-) diff --git a/homeassistant/components/media_player/gstreamer.py b/homeassistant/components/media_player/gstreamer.py index b74af4a4ddb00a..f9c20c4d4eaa31 100644 --- a/homeassistant/components/media_player/gstreamer.py +++ b/homeassistant/components/media_player/gstreamer.py @@ -9,9 +9,9 @@ import voluptuous as vol from homeassistant.components.media_player import ( - MEDIA_TYPE_MUSIC, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_SET, - SUPPORT_PAUSE, SUPPORT_SEEK, SUPPORT_STOP, SUPPORT_PLAY_MEDIA, - SUPPORT_PLAY, SUPPORT_NEXT_TRACK, PLATFORM_SCHEMA, MediaPlayerDevice) + MEDIA_TYPE_MUSIC, SUPPORT_VOLUME_SET, SUPPORT_PAUSE, + SUPPORT_PLAY_MEDIA, SUPPORT_PLAY, SUPPORT_NEXT_TRACK, + PLATFORM_SCHEMA, MediaPlayerDevice) from homeassistant.const import ( STATE_IDLE, CONF_NAME, EVENT_HOMEASSISTANT_STOP) import homeassistant.helpers.config_validation as cv @@ -20,14 +20,13 @@ _LOGGER = logging.getLogger(__name__) -REQUIREMENTS = ['gstreamer-player==1.0.0'] +REQUIREMENTS = ['gstreamer-player==1.1.0'] DOMAIN = 'gstreamer' CONF_PIPELINE = 'pipeline' -SUPPORT_GSTREAMER = SUPPORT_VOLUME_SET | SUPPORT_VOLUME_MUTE | \ - SUPPORT_PLAY | SUPPORT_PAUSE | SUPPORT_SEEK | SUPPORT_STOP | \ - SUPPORT_PLAY_MEDIA | SUPPORT_SEEK | SUPPORT_NEXT_TRACK +SUPPORT_GSTREAMER = SUPPORT_VOLUME_SET | SUPPORT_PLAY | SUPPORT_PAUSE |\ + SUPPORT_PLAY_MEDIA | SUPPORT_NEXT_TRACK PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME): cv.string, @@ -61,7 +60,6 @@ def __init__(self, player, name): self._state = STATE_IDLE self._volume = None self._duration = None - self._position = None self._uri = None self._title = None self._artist = None @@ -72,16 +70,11 @@ def update(self): self._state = self._player.state self._volume = self._player.volume self._duration = self._player.duration - self._position = self._player.position self._uri = self._player.uri self._title = self._player.title self._album = self._player.album self._artist = self._player.artist - def mute_volume(self, mute): - """Send the mute command.""" - self._player.mute() - def set_volume_level(self, volume): """Set the volume level.""" self._player.volume = volume @@ -93,9 +86,13 @@ def play_media(self, media_type, media_id, **kwargs): return self._player.queue(media_id) - def media_seek(self, position): - """Seek.""" - self._player.position = position + def media_play(self): + """Play.""" + self._player.play() + + def media_pause(self): + """Pause.""" + self._player.pause() def media_next_track(self): """Next track.""" @@ -121,11 +118,6 @@ def volume_level(self): """Return the volume level.""" return self._volume - @property - def is_volume_muted(self): - """Volume muted.""" - return self._volume == 0 - @property def supported_features(self): """Flag media player features that are supported.""" @@ -141,11 +133,6 @@ def media_duration(self): """Duration of current playing media in seconds.""" return self._duration - @property - def media_position(self): - """Position of current playing media in seconds.""" - return self._position - @property def media_title(self): """Media title.""" diff --git a/requirements_all.txt b/requirements_all.txt index 7e800d62548d11..8b4ed11ac887ea 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -212,7 +212,7 @@ googlemaps==2.4.6 gps3==0.33.3 # homeassistant.components.media_player.gstreamer -gstreamer-player==1.0.0 +gstreamer-player==1.1.0 # homeassistant.components.ffmpeg ha-ffmpeg==1.5 From 5d3fe83e623ccedc69997d7efbb059750cf038e8 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 8 Apr 2017 14:53:32 -0700 Subject: [PATCH 024/146] Warn if start takes a long time. (#6975) * Warn if start takes a long time. * ps - cleanup * Tweak message * Add tests * Tweak messagE --- homeassistant/core.py | 16 +++++++++++++++- tests/test_core.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/homeassistant/core.py b/homeassistant/core.py index ba19f392931d12..899bed064edf6e 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -18,6 +18,7 @@ from types import MappingProxyType from typing import Optional, Any, Callable, List # NOQA +from async_timeout import timeout import voluptuous as vol from voluptuous.humanize import humanize_error @@ -49,6 +50,8 @@ # Size of a executor pool EXECUTOR_POOL_SIZE = 10 +# How long to wait till things that run on startup have to finish. +TIMEOUT_EVENT_START = 15 _LOGGER = logging.getLogger(__name__) @@ -159,7 +162,18 @@ def async_start(self): # pylint: disable=protected-access self.loop._thread_ident = threading.get_ident() self.bus.async_fire(EVENT_HOMEASSISTANT_START) - yield from self.async_stop_track_tasks() + + try: + with timeout(TIMEOUT_EVENT_START, loop=self.loop): + yield from self.async_stop_track_tasks() + except asyncio.TimeoutError: + _LOGGER.warning( + 'Something is blocking Home Assistant from wrapping up the ' + 'start up phase. We\'re going to continue anyway. Please ' + 'report the following info at http://bit.ly/2ogP58T : %s', + ', '.join(self.config.components)) + self._track_task = False + self.state = CoreState.running _async_create_timer(self) diff --git a/tests/test_core.py b/tests/test_core.py index ea7f40aaff73dd..b2fca047292718 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -5,6 +5,7 @@ from unittest.mock import patch, MagicMock, sentinel from datetime import datetime, timedelta +import logging import pytz import pytest @@ -867,3 +868,45 @@ def mock_callback(func): assert slp_seconds == 1 assert callback is fire_time_event assert abs(nxt - 12.3) < 0.001 + + +@asyncio.coroutine +def test_hass_start_starts_the_timer(loop): + """Test when hass starts, it starts the timer.""" + hass = ha.HomeAssistant(loop=loop) + + try: + with patch('homeassistant.core._async_create_timer') as mock_timer: + yield from hass.async_start() + + assert hass.state == ha.CoreState.running + assert not hass._track_task + assert len(mock_timer.mock_calls) == 1 + assert mock_timer.mock_calls[0][1][0] is hass + + finally: + yield from hass.async_stop() + assert hass.state == ha.CoreState.not_running + + +@asyncio.coroutine +def test_start_taking_too_long(loop, caplog): + """Test when async_start takes too long.""" + hass = ha.HomeAssistant(loop=loop) + caplog.set_level(logging.WARNING) + + try: + with patch('homeassistant.core.timeout', + side_effect=asyncio.TimeoutError), \ + patch('homeassistant.core._async_create_timer') as mock_timer: + yield from hass.async_start() + + assert not hass._track_task + assert hass.state == ha.CoreState.running + assert len(mock_timer.mock_calls) == 1 + assert mock_timer.mock_calls[0][1][0] is hass + assert 'Something is blocking Home Assistant' in caplog.text + + finally: + yield from hass.async_stop() + assert hass.state == ha.CoreState.not_running From eb0a9869d853941b415bc38bbc2631dffadd2bd7 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 8 Apr 2017 18:29:28 -0700 Subject: [PATCH 025/146] Upgrade to aiohttp 2.0.6 (#6992) --- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index a8e8df3d250c70..2f9b45377adea8 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -5,5 +5,5 @@ pip>=7.1.0 jinja2>=2.9.5 voluptuous==0.9.3 typing>=3,<4 -aiohttp==2.0.5 +aiohttp==2.0.6 async_timeout==1.2.0 diff --git a/requirements_all.txt b/requirements_all.txt index 8b4ed11ac887ea..42048eb8920ba0 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -6,7 +6,7 @@ pip>=7.1.0 jinja2>=2.9.5 voluptuous==0.9.3 typing>=3,<4 -aiohttp==2.0.5 +aiohttp==2.0.6 async_timeout==1.2.0 # homeassistant.components.nuimo_controller diff --git a/setup.py b/setup.py index cdc4c43e7a207d..ef6eb0f79a74b1 100755 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ 'jinja2>=2.9.5', 'voluptuous==0.9.3', 'typing>=3,<4', - 'aiohttp==2.0.5', + 'aiohttp==2.0.6', 'async_timeout==1.2.0', ] From ba8488d8f1d2f24791958bf5940e16d8f136ec68 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 9 Apr 2017 01:05:34 -0700 Subject: [PATCH 026/146] Make discovery not block start (#6991) * Make discovery not block start * Fix tests --- homeassistant/components/discovery.py | 10 +++- tests/components/test_discovery.py | 79 +++++++++------------------ 2 files changed, 35 insertions(+), 54 deletions(-) diff --git a/homeassistant/components/discovery.py b/homeassistant/components/discovery.py index 26036342452275..891e34ee8a99c6 100644 --- a/homeassistant/components/discovery.py +++ b/homeassistant/components/discovery.py @@ -13,6 +13,7 @@ import voluptuous as vol +from homeassistant.core import callback from homeassistant.const import EVENT_HOMEASSISTANT_START import homeassistant.helpers.config_validation as cv from homeassistant.helpers.event import async_track_point_in_utc_time @@ -105,7 +106,7 @@ def new_service_found(service, info): hass, component, platform, info, config) @asyncio.coroutine - def scan_devices(_): + def scan_devices(now): """Scan for devices.""" results = yield from hass.loop.run_in_executor( None, _discover, netdisco) @@ -116,7 +117,12 @@ def scan_devices(_): async_track_point_in_utc_time(hass, scan_devices, dt_util.utcnow() + SCAN_INTERVAL) - hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, scan_devices) + @callback + def schedule_first(event): + """Schedule the first discovery when Home Assistant starts up.""" + async_track_point_in_utc_time(hass, scan_devices, dt_util.utcnow()) + + hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, schedule_first) return True diff --git a/tests/components/test_discovery.py b/tests/components/test_discovery.py index abffc3b17cdec1..6b03ffa34e747d 100644 --- a/tests/components/test_discovery.py +++ b/tests/components/test_discovery.py @@ -5,9 +5,9 @@ from homeassistant.bootstrap import async_setup_component from homeassistant.components import discovery -from homeassistant.const import EVENT_HOMEASSISTANT_START +from homeassistant.util.dt import utcnow -from tests.common import mock_coro +from tests.common import mock_coro, fire_time_changed # One might consider to "mock" services, but it's easy enough to just use # what is already available. @@ -34,25 +34,35 @@ @asyncio.coroutine -def test_unknown_service(hass): - """Test that unknown service is ignored.""" - result = yield from async_setup_component(hass, 'discovery', { - 'discovery': {}, - }) +def mock_discovery(hass, discoveries, config=BASE_CONFIG): + """Helper to mock discoveries.""" + result = yield from async_setup_component(hass, 'discovery', config) assert result - def discover(netdisco): - """Fake discovery.""" - return [('this_service_will_never_be_supported', {'info': 'some'})] + yield from hass.async_start() - with patch.object(discovery, '_discover', discover), \ + with patch.object(discovery, '_discover', discoveries), \ patch('homeassistant.components.discovery.async_discover', return_value=mock_coro()) as mock_discover, \ patch('homeassistant.components.discovery.async_load_platform', return_value=mock_coro()) as mock_platform: - hass.bus.async_fire(EVENT_HOMEASSISTANT_START) + fire_time_changed(hass, utcnow()) + # Work around an issue where our loop.call_soon not get caught + yield from hass.async_block_till_done() yield from hass.async_block_till_done() + return mock_discover, mock_platform + + +@asyncio.coroutine +def test_unknown_service(hass): + """Test that unknown service is ignored.""" + def discover(netdisco): + """Fake discovery.""" + return [('this_service_will_never_be_supported', {'info': 'some'})] + + mock_discover, mock_platform = yield from mock_discovery(hass, discover) + assert not mock_discover.called assert not mock_platform.called @@ -60,20 +70,11 @@ def discover(netdisco): @asyncio.coroutine def test_load_platform(hass): """Test load a platform.""" - result = yield from async_setup_component(hass, 'discovery', BASE_CONFIG) - assert result - def discover(netdisco): """Fake discovery.""" return [(SERVICE, SERVICE_INFO)] - with patch.object(discovery, '_discover', discover), \ - patch('homeassistant.components.discovery.async_discover', - return_value=mock_coro()) as mock_discover, \ - patch('homeassistant.components.discovery.async_load_platform', - return_value=mock_coro()) as mock_platform: - hass.bus.async_fire(EVENT_HOMEASSISTANT_START) - yield from hass.async_block_till_done() + mock_discover, mock_platform = yield from mock_discovery(hass, discover) assert not mock_discover.called assert mock_platform.called @@ -84,20 +85,11 @@ def discover(netdisco): @asyncio.coroutine def test_load_component(hass): """Test load a component.""" - result = yield from async_setup_component(hass, 'discovery', BASE_CONFIG) - assert result - def discover(netdisco): """Fake discovery.""" return [(SERVICE_NO_PLATFORM, SERVICE_INFO)] - with patch.object(discovery, '_discover', discover), \ - patch('homeassistant.components.discovery.async_discover', - return_value=mock_coro()) as mock_discover, \ - patch('homeassistant.components.discovery.async_load_platform', - return_value=mock_coro()) as mock_platform: - hass.bus.async_fire(EVENT_HOMEASSISTANT_START) - yield from hass.async_block_till_done() + mock_discover, mock_platform = yield from mock_discovery(hass, discover) assert mock_discover.called assert not mock_platform.called @@ -109,20 +101,12 @@ def discover(netdisco): @asyncio.coroutine def test_ignore_service(hass): """Test ignore service.""" - result = yield from async_setup_component(hass, 'discovery', IGNORE_CONFIG) - assert result - def discover(netdisco): """Fake discovery.""" return [(SERVICE_NO_PLATFORM, SERVICE_INFO)] - with patch.object(discovery, '_discover', discover), \ - patch('homeassistant.components.discovery.async_discover', - return_value=mock_coro()) as mock_discover, \ - patch('homeassistant.components.discovery.async_load_platform', - return_value=mock_coro()) as mock_platform: - hass.bus.async_fire(EVENT_HOMEASSISTANT_START) - yield from hass.async_block_till_done() + mock_discover, mock_platform = yield from mock_discovery(hass, discover, + IGNORE_CONFIG) assert not mock_discover.called assert not mock_platform.called @@ -131,21 +115,12 @@ def discover(netdisco): @asyncio.coroutine def test_discover_duplicates(hass): """Test load a component.""" - result = yield from async_setup_component(hass, 'discovery', BASE_CONFIG) - assert result - def discover(netdisco): """Fake discovery.""" return [(SERVICE_NO_PLATFORM, SERVICE_INFO), (SERVICE_NO_PLATFORM, SERVICE_INFO)] - with patch.object(discovery, '_discover', discover), \ - patch('homeassistant.components.discovery.async_discover', - return_value=mock_coro()) as mock_discover, \ - patch('homeassistant.components.discovery.async_load_platform', - return_value=mock_coro()) as mock_platform: - hass.bus.async_fire(EVENT_HOMEASSISTANT_START) - yield from hass.async_block_till_done() + mock_discover, mock_platform = yield from mock_discovery(hass, discover) assert mock_discover.called assert mock_discover.call_count == 1 From c42293eb10a9eee6ee402db6ea6b5b0b438f1506 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 9 Apr 2017 01:36:01 -0700 Subject: [PATCH 027/146] Downgrade aiohttp to 205 (#6994) --- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index 2f9b45377adea8..a8e8df3d250c70 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -5,5 +5,5 @@ pip>=7.1.0 jinja2>=2.9.5 voluptuous==0.9.3 typing>=3,<4 -aiohttp==2.0.6 +aiohttp==2.0.5 async_timeout==1.2.0 diff --git a/requirements_all.txt b/requirements_all.txt index 42048eb8920ba0..8b4ed11ac887ea 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -6,7 +6,7 @@ pip>=7.1.0 jinja2>=2.9.5 voluptuous==0.9.3 typing>=3,<4 -aiohttp==2.0.6 +aiohttp==2.0.5 async_timeout==1.2.0 # homeassistant.components.nuimo_controller diff --git a/setup.py b/setup.py index ef6eb0f79a74b1..cdc4c43e7a207d 100755 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ 'jinja2>=2.9.5', 'voluptuous==0.9.3', 'typing>=3,<4', - 'aiohttp==2.0.6', + 'aiohttp==2.0.5', 'async_timeout==1.2.0', ] From ecfe0770ed5ec94e70a360eea38b1f357233fef1 Mon Sep 17 00:00:00 2001 From: Greg Dowling Date: Sun, 9 Apr 2017 22:48:18 +0100 Subject: [PATCH 028/146] Bump pywemo version. (#7004) --- homeassistant/components/wemo.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/wemo.py b/homeassistant/components/wemo.py index dfcc0c96c0bd64..88008874628c1f 100644 --- a/homeassistant/components/wemo.py +++ b/homeassistant/components/wemo.py @@ -14,7 +14,7 @@ from homeassistant.const import EVENT_HOMEASSISTANT_STOP -REQUIREMENTS = ['pywemo==0.4.16'] +REQUIREMENTS = ['pywemo==0.4.17'] DOMAIN = 'wemo' diff --git a/requirements_all.txt b/requirements_all.txt index 8b4ed11ac887ea..3941a201c40478 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -660,7 +660,7 @@ pyvera==0.2.25 pywebpush==0.6.1 # homeassistant.components.wemo -pywemo==0.4.16 +pywemo==0.4.17 # homeassistant.components.zabbix pyzabbix==0.7.4 From d5e3cd51a558b2dc80a00990504fa15e20750b39 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 9 Apr 2017 23:19:22 -0700 Subject: [PATCH 029/146] Fix Synology camera content type (#7010) --- homeassistant/components/camera/synology.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/camera/synology.py b/homeassistant/components/camera/synology.py index e986d81887b033..dd6061dcacf983 100644 --- a/homeassistant/components/camera/synology.py +++ b/homeassistant/components/camera/synology.py @@ -81,7 +81,9 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): params=query_payload ) - query_resp = yield from query_req.json() + # Skip content type check because Synology doesn't return JSON with + # right content type + query_resp = yield from query_req.json(content_type=None) auth_path = query_resp['data'][AUTH_API]['path'] camera_api = query_resp['data'][CAMERA_API]['path'] camera_path = query_resp['data'][CAMERA_API]['path'] From 90e73fda3c26e1b7f1aa44c6c74146da28577038 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 10 Apr 2017 01:18:37 -0700 Subject: [PATCH 030/146] Fix two more instances of JSON parsing synology (#7014) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add an optional extended description… --- homeassistant/components/camera/synology.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/camera/synology.py b/homeassistant/components/camera/synology.py index dd6061dcacf983..378d75ac26daed 100644 --- a/homeassistant/components/camera/synology.py +++ b/homeassistant/components/camera/synology.py @@ -129,7 +129,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): _LOGGER.exception("Error on %s", syno_camera_url) return False - camera_resp = yield from camera_req.json() + camera_resp = yield from camera_req.json(content_type=None) cameras = camera_resp['data']['cameras'] # add cameras @@ -174,7 +174,7 @@ def get_session_id(hass, websession, username, password, login_url, timeout): login_url, params=auth_payload ) - auth_resp = yield from auth_req.json() + auth_resp = yield from auth_req.json(content_type=None) return auth_resp['data']['sid'] except (asyncio.TimeoutError, aiohttp.ClientError): From 6cd3758b58fb8f90cbbb9dfbcca108e29f4c9e34 Mon Sep 17 00:00:00 2001 From: Xorso Date: Mon, 10 Apr 2017 08:13:07 -0600 Subject: [PATCH 031/146] Bump pyalarmdotcom to support new version of aiohttp (#7021) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add an optional extended description… --- homeassistant/components/alarm_control_panel/alarmdotcom.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/alarm_control_panel/alarmdotcom.py b/homeassistant/components/alarm_control_panel/alarmdotcom.py index 22cbdefd40399e..6e99ba672571b0 100644 --- a/homeassistant/components/alarm_control_panel/alarmdotcom.py +++ b/homeassistant/components/alarm_control_panel/alarmdotcom.py @@ -17,7 +17,7 @@ import homeassistant.helpers.config_validation as cv from homeassistant.helpers.aiohttp_client import async_get_clientsession -REQUIREMENTS = ['pyalarmdotcom==0.2.9'] +REQUIREMENTS = ['pyalarmdotcom==0.3.0'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 3941a201c40478..82296816dac6da 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -475,7 +475,7 @@ pyHS100==0.2.4.2 pyRFXtrx==0.17.0 # homeassistant.components.alarm_control_panel.alarmdotcom -pyalarmdotcom==0.2.9 +pyalarmdotcom==0.3.0 # homeassistant.components.notify.xmpp pyasn1-modules==0.0.8 From ab247b0f4d6a85a3fa070d88b4f810e78fcf91d6 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 10 Apr 2017 16:13:43 +0200 Subject: [PATCH 032/146] Fix US states check (fixes #7015) (#7017) --- homeassistant/components/binary_sensor/workday.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/binary_sensor/workday.py b/homeassistant/components/binary_sensor/workday.py index c2590925df7f13..c25ea81922ba23 100644 --- a/homeassistant/components/binary_sensor/workday.py +++ b/homeassistant/components/binary_sensor/workday.py @@ -66,8 +66,9 @@ def setup_platform(hass, config, add_devices, discovery_info=None): obj_holidays = getattr(holidays, country)(years=year) if province: - if province not in obj_holidays.PROVINCES: - _LOGGER.error('There is no province/state %s in country %s', + if province not in obj_holidays.PROVINCES and \ + province not in obj_holidays.STATES: + _LOGGER.error("There is no province/state %s in country %s", province, country) return False else: From d081e5ab3a4116c83ed8cfd42b21a5a4e3fbf6d9 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Mon, 10 Apr 2017 09:04:19 -0700 Subject: [PATCH 033/146] Remove deprecated remote classes (#7011) * Remove deprecated remote classes * Lint * Fix tests * Lint --- homeassistant/components/api.py | 78 +--------- homeassistant/const.py | 1 - homeassistant/remote.py | 250 +------------------------------- tests/components/test_api.py | 75 ---------- tests/test_remote.py | 121 +--------------- 5 files changed, 9 insertions(+), 516 deletions(-) diff --git a/homeassistant/components/api.py b/homeassistant/components/api.py index b22bd8511906f5..8beb737ae89c31 100644 --- a/homeassistant/components/api.py +++ b/homeassistant/components/api.py @@ -17,9 +17,9 @@ from homeassistant.const import ( EVENT_HOMEASSISTANT_STOP, EVENT_TIME_CHANGED, HTTP_BAD_REQUEST, HTTP_CREATED, HTTP_NOT_FOUND, - HTTP_UNPROCESSABLE_ENTITY, MATCH_ALL, URL_API, URL_API_COMPONENTS, + MATCH_ALL, URL_API, URL_API_COMPONENTS, URL_API_CONFIG, URL_API_DISCOVERY_INFO, URL_API_ERROR_LOG, - URL_API_EVENT_FORWARD, URL_API_EVENTS, URL_API_SERVICES, + URL_API_EVENTS, URL_API_SERVICES, URL_API_STATES, URL_API_STATES_ENTITY, URL_API_STREAM, URL_API_TEMPLATE, __version__) from homeassistant.exceptions import TemplateError @@ -48,7 +48,6 @@ def setup(hass, config): hass.http.register_view(APIEventView) hass.http.register_view(APIServicesView) hass.http.register_view(APIDomainServicesView) - hass.http.register_view(APIEventForwardingView) hass.http.register_view(APIComponentsView) hass.http.register_view(APITemplateView) @@ -319,79 +318,6 @@ def post(self, request, domain, service): return self.json(changed_states) -class APIEventForwardingView(HomeAssistantView): - """View to handle EventForwarding requests.""" - - url = URL_API_EVENT_FORWARD - name = "api:event-forward" - event_forwarder = None - - @asyncio.coroutine - def post(self, request): - """Setup an event forwarder.""" - _LOGGER.warning('Event forwarding is deprecated. ' - 'Will be removed by 0.43') - hass = request.app['hass'] - try: - data = yield from request.json() - except ValueError: - return self.json_message("No data received.", HTTP_BAD_REQUEST) - - try: - host = data['host'] - api_password = data['api_password'] - except KeyError: - return self.json_message("No host or api_password received.", - HTTP_BAD_REQUEST) - - try: - port = int(data['port']) if 'port' in data else None - except ValueError: - return self.json_message("Invalid value received for port.", - HTTP_UNPROCESSABLE_ENTITY) - - api = rem.API(host, api_password, port) - - valid = yield from hass.loop.run_in_executor( - None, api.validate_api) - if not valid: - return self.json_message("Unable to validate API.", - HTTP_UNPROCESSABLE_ENTITY) - - if self.event_forwarder is None: - self.event_forwarder = rem.EventForwarder(hass) - - self.event_forwarder.async_connect(api) - - return self.json_message("Event forwarding setup.") - - @asyncio.coroutine - def delete(self, request): - """Remove event forwarder.""" - try: - data = yield from request.json() - except ValueError: - return self.json_message("No data received.", HTTP_BAD_REQUEST) - - try: - host = data['host'] - except KeyError: - return self.json_message("No host received.", HTTP_BAD_REQUEST) - - try: - port = int(data['port']) if 'port' in data else None - except ValueError: - return self.json_message("Invalid value received for port.", - HTTP_UNPROCESSABLE_ENTITY) - - if self.event_forwarder is not None: - api = rem.API(host, None, port) - - self.event_forwarder.async_disconnect(api) - - return self.json_message("Event forwarding cancelled.") - - class APIComponentsView(HomeAssistantView): """View to handle Components requests.""" diff --git a/homeassistant/const.py b/homeassistant/const.py index bb882ca4ea92c2..b73f64bfa72f6d 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -361,7 +361,6 @@ URL_API_EVENTS_EVENT = '/api/events/{}' URL_API_SERVICES = '/api/services' URL_API_SERVICES_SERVICE = '/api/services/{}/{}' -URL_API_EVENT_FORWARD = '/api/event_forwarding' URL_API_COMPONENTS = '/api/components' URL_API_ERROR_LOG = '/api/error_log' URL_API_LOG_OUT = '/api/log_out' diff --git a/homeassistant/remote.py b/homeassistant/remote.py index 1107eda8742743..c0e3d9d6459dff 100644 --- a/homeassistant/remote.py +++ b/homeassistant/remote.py @@ -7,23 +7,19 @@ For more details about the Python API, please refer to the documentation at https://home-assistant.io/developers/python_api/ """ -import asyncio -from concurrent.futures import ThreadPoolExecutor from datetime import datetime import enum import json import logging -import time -import threading import urllib.parse from typing import Optional import requests -from homeassistant import setup, core as ha +from homeassistant import core as ha from homeassistant.const import ( - HTTP_HEADER_HA_AUTH, SERVER_PORT, URL_API, URL_API_EVENT_FORWARD, + HTTP_HEADER_HA_AUTH, SERVER_PORT, URL_API, URL_API_EVENTS, URL_API_EVENTS_EVENT, URL_API_SERVICES, URL_API_CONFIG, URL_API_SERVICES_SERVICE, URL_API_STATES, URL_API_STATES_ENTITY, HTTP_HEADER_CONTENT_TYPE, CONTENT_TYPE_JSON) @@ -116,195 +112,6 @@ def __repr__(self) -> str: self.base_url, 'yes' if self.api_password is not None else 'no') -class HomeAssistant(ha.HomeAssistant): - """Home Assistant that forwards work.""" - - # pylint: disable=super-init-not-called - def __init__(self, remote_api, local_api=None, loop=None): - """Initalize the forward instance.""" - _LOGGER.warning('Remote instances of Home Assistant are deprecated. ' - 'Will be removed by 0.43') - if not remote_api.validate_api(): - raise HomeAssistantError( - "Remote API at {}:{} not valid: {}".format( - remote_api.host, remote_api.port, remote_api.status)) - - self.remote_api = remote_api - - self.loop = loop or asyncio.get_event_loop() - self.executor = ThreadPoolExecutor(max_workers=5) - self.loop.set_default_executor(self.executor) - self.loop.set_exception_handler(ha.async_loop_exception_handler) - self._pending_tasks = [] - self._pending_sheduler = None - - self.bus = EventBus(remote_api, self) - self.services = ha.ServiceRegistry(self) - self.states = StateMachine(self.bus, self.loop, self.remote_api) - self.config = ha.Config() - # This is a dictionary that any component can store any data on. - self.data = {} - self.state = ha.CoreState.not_running - self.exit_code = None - self.config.api = local_api - - def start(self): - """Start the instance.""" - # Ensure a local API exists to connect with remote - if 'api' not in self.config.components: - if not setup.setup_component(self, 'api'): - raise HomeAssistantError( - 'Unable to setup local API to receive events') - - self.state = ha.CoreState.starting - # pylint: disable=protected-access - ha._async_create_timer(self) - - self.bus.fire(ha.EVENT_HOMEASSISTANT_START, - origin=ha.EventOrigin.remote) - - # Ensure local HTTP is started - self.block_till_done() - self.state = ha.CoreState.running - time.sleep(0.05) - - # Setup that events from remote_api get forwarded to local_api - # Do this after we are running, otherwise HTTP is not started - # or requests are blocked - if not connect_remote_events(self.remote_api, self.config.api): - raise HomeAssistantError(( - 'Could not setup event forwarding from api {} to ' - 'local api {}').format(self.remote_api, self.config.api)) - - def stop(self): - """Stop Home Assistant and shuts down all threads.""" - _LOGGER.info("Stopping") - self.state = ha.CoreState.stopping - - self.bus.fire(ha.EVENT_HOMEASSISTANT_STOP, - origin=ha.EventOrigin.remote) - - # Disconnect master event forwarding - disconnect_remote_events(self.remote_api, self.config.api) - self.state = ha.CoreState.not_running - - -class EventBus(ha.EventBus): - """EventBus implementation that forwards fire_event to remote API.""" - - def __init__(self, api, hass): - """Initalize the eventbus.""" - super().__init__(hass) - self._api = api - - def fire(self, event_type, event_data=None, origin=ha.EventOrigin.local): - """Forward local events to remote target. - - Handles remote event as usual. - """ - # All local events that are not TIME_CHANGED are forwarded to API - if origin == ha.EventOrigin.local and \ - event_type != ha.EVENT_TIME_CHANGED: - - fire_event(self._api, event_type, event_data) - - else: - super().fire(event_type, event_data, origin) - - -class EventForwarder(object): - """Listens for events and forwards to specified APIs.""" - - def __init__(self, hass, restrict_origin=None): - """Initalize the event forwarder.""" - _LOGGER.warning('API forwarding is deprecated. ' - 'Will be removed by 0.43') - - self.hass = hass - self.restrict_origin = restrict_origin - - # We use a tuple (host, port) as key to ensure - # that we do not forward to the same host twice - self._targets = {} - - self._lock = threading.Lock() - self._async_unsub_listener = None - - @ha.callback - def async_connect(self, api): - """Attach to a Home Assistant instance and forward events. - - Will overwrite old target if one exists with same host/port. - """ - if self._async_unsub_listener is None: - self._async_unsub_listener = self.hass.bus.async_listen( - ha.MATCH_ALL, self._event_listener) - - key = (api.host, api.port) - - self._targets[key] = api - - @ha.callback - def async_disconnect(self, api): - """Remove target from being forwarded to.""" - key = (api.host, api.port) - - did_remove = self._targets.pop(key, None) is None - - if len(self._targets) == 0: - # Remove event listener if no forwarding targets present - self._async_unsub_listener() - self._async_unsub_listener = None - - return did_remove - - def _event_listener(self, event): - """Listen and forward all events.""" - with self._lock: - # We don't forward time events or, if enabled, non-local events - if event.event_type == ha.EVENT_TIME_CHANGED or \ - (self.restrict_origin and event.origin != self.restrict_origin): - return - - for api in self._targets.values(): - fire_event(api, event.event_type, event.data) - - -class StateMachine(ha.StateMachine): - """Fire set events to an API. Uses state_change events to track states.""" - - def __init__(self, bus, loop, api): - """Initalize the statemachine.""" - super().__init__(bus, loop) - self._api = api - self.mirror() - - bus.listen(ha.EVENT_STATE_CHANGED, self._state_changed_listener) - - def remove(self, entity_id): - """Remove the state of an entity. - - Returns boolean to indicate if an entity was removed. - """ - return remove_state(self._api, entity_id) - - def set(self, entity_id, new_state, attributes=None, force_update=False): - """Call set_state on remote API.""" - set_state(self._api, entity_id, new_state, attributes, force_update) - - def mirror(self): - """Discard current data and mirrors the remote state machine.""" - self._states = {state.entity_id: state for state - in get_states(self._api)} - - def _state_changed_listener(self, event): - """Listen for state changed events and applies them.""" - if event.data['new_state'] is None: - self._states.pop(event.data['entity_id'], None) - else: - self._states[event.data['entity_id']] = event.data['new_state'] - - class JSONEncoder(json.JSONEncoder): """JSONEncoder that supports Home Assistant objects.""" @@ -352,59 +159,6 @@ def validate_api(api): return APIStatus.CANNOT_CONNECT -def connect_remote_events(from_api, to_api): - """Setup from_api to forward all events to to_api.""" - _LOGGER.warning('Event forwarding is deprecated. ' - 'Will be removed by 0.43') - data = { - 'host': to_api.host, - 'api_password': to_api.api_password, - 'port': to_api.port - } - - try: - req = from_api(METHOD_POST, URL_API_EVENT_FORWARD, data) - - if req.status_code == 200: - return True - else: - _LOGGER.error( - "Error setting up event forwarding: %s - %s", - req.status_code, req.text) - - return False - - except HomeAssistantError: - _LOGGER.exception("Error setting up event forwarding") - return False - - -def disconnect_remote_events(from_api, to_api): - """Disconnect forwarding events from from_api to to_api.""" - _LOGGER.warning('Event forwarding is deprecated. ' - 'Will be removed by 0.43') - data = { - 'host': to_api.host, - 'port': to_api.port - } - - try: - req = from_api(METHOD_DELETE, URL_API_EVENT_FORWARD, data) - - if req.status_code == 200: - return True - else: - _LOGGER.error( - "Error removing event forwarding: %s - %s", - req.status_code, req.text) - - return False - - except HomeAssistantError: - _LOGGER.exception("Error removing an event forwarder") - return False - - def get_event_listeners(api): """List of events that is being listened for.""" try: diff --git a/tests/components/test_api.py b/tests/components/test_api.py index e2d93c9cce7008..8d6041b49c1cb8 100644 --- a/tests/components/test_api.py +++ b/tests/components/test_api.py @@ -337,81 +337,6 @@ def test_api_template_error(self): self.assertEqual(400, req.status_code) - def test_api_event_forward(self): - """Test setting up event forwarding.""" - req = requests.post( - _url(const.URL_API_EVENT_FORWARD), - headers=HA_HEADERS) - self.assertEqual(400, req.status_code) - - req = requests.post( - _url(const.URL_API_EVENT_FORWARD), - data=json.dumps({'host': '127.0.0.1'}), - headers=HA_HEADERS) - self.assertEqual(400, req.status_code) - - req = requests.post( - _url(const.URL_API_EVENT_FORWARD), - data=json.dumps({'api_password': 'bla-di-bla'}), - headers=HA_HEADERS) - self.assertEqual(400, req.status_code) - - req = requests.post( - _url(const.URL_API_EVENT_FORWARD), - data=json.dumps({ - 'api_password': 'bla-di-bla', - 'host': '127.0.0.1', - 'port': 'abcd' - }), - headers=HA_HEADERS) - self.assertEqual(422, req.status_code) - - req = requests.post( - _url(const.URL_API_EVENT_FORWARD), - data=json.dumps({ - 'api_password': 'bla-di-bla', - 'host': '127.0.0.1', - 'port': get_test_instance_port() - }), - headers=HA_HEADERS) - self.assertEqual(422, req.status_code) - - # Setup a real one - req = requests.post( - _url(const.URL_API_EVENT_FORWARD), - data=json.dumps({ - 'api_password': API_PASSWORD, - 'host': '127.0.0.1', - 'port': SERVER_PORT - }), - headers=HA_HEADERS) - self.assertEqual(200, req.status_code) - - # Delete it again.. - req = requests.delete( - _url(const.URL_API_EVENT_FORWARD), - data=json.dumps({}), - headers=HA_HEADERS) - self.assertEqual(400, req.status_code) - - req = requests.delete( - _url(const.URL_API_EVENT_FORWARD), - data=json.dumps({ - 'host': '127.0.0.1', - 'port': 'abcd' - }), - headers=HA_HEADERS) - self.assertEqual(422, req.status_code) - - req = requests.delete( - _url(const.URL_API_EVENT_FORWARD), - data=json.dumps({ - 'host': '127.0.0.1', - 'port': SERVER_PORT - }), - headers=HA_HEADERS) - self.assertEqual(200, req.status_code) - def test_stream(self): """Test the stream.""" listen_count = self._listen_count() diff --git a/tests/test_remote.py b/tests/test_remote.py index eec7b4cf98d0cf..41011794914019 100644 --- a/tests/test_remote.py +++ b/tests/test_remote.py @@ -1,9 +1,6 @@ """Test Home Assistant remote methods and classes.""" # pylint: disable=protected-access -import asyncio -import threading import unittest -from unittest.mock import patch from homeassistant import remote, setup, core as ha import homeassistant.components.http as http @@ -11,18 +8,17 @@ import homeassistant.util.dt as dt_util from tests.common import ( - get_test_instance_port, get_test_home_assistant, get_test_config_dir) + get_test_instance_port, get_test_home_assistant) API_PASSWORD = 'test1234' MASTER_PORT = get_test_instance_port() -SLAVE_PORT = get_test_instance_port() BROKEN_PORT = get_test_instance_port() HTTP_BASE_URL = 'http://127.0.0.1:{}'.format(MASTER_PORT) HA_HEADERS = {HTTP_HEADER_HA_AUTH: API_PASSWORD} broken_api = remote.API('127.0.0.1', "bladybla", port=get_test_instance_port()) -hass, slave, master_api = None, None, None +hass, master_api = None, None def _url(path=''): @@ -32,8 +28,8 @@ def _url(path=''): # pylint: disable=invalid-name def setUpModule(): - """Initalization of a Home Assistant server and Slave instance.""" - global hass, slave, master_api + """Initalization of a Home Assistant server instance.""" + global hass, master_api hass = get_test_home_assistant() @@ -51,30 +47,10 @@ def setUpModule(): master_api = remote.API('127.0.0.1', API_PASSWORD, MASTER_PORT) - # Start slave - loop = asyncio.new_event_loop() - - # FIXME: should not be a daemon - threading.Thread(name='SlaveThread', daemon=True, - target=loop.run_forever).start() - - slave = remote.HomeAssistant(master_api, loop=loop) - slave.async_track_tasks() - slave.config.config_dir = get_test_config_dir() - slave.config.skip_pip = True - setup.setup_component( - slave, http.DOMAIN, - {http.DOMAIN: {http.CONF_API_PASSWORD: API_PASSWORD, - http.CONF_SERVER_PORT: SLAVE_PORT}}) - - with patch.object(ha, '_async_create_timer', return_value=None): - slave.start() - # pylint: disable=invalid-name def tearDownModule(): - """Stop the Home Assistant server and slave.""" - slave.stop() + """Stop the Home Assistant server.""" hass.stop() @@ -83,7 +59,6 @@ class TestRemoteMethods(unittest.TestCase): def tearDown(self): """Stop everything that was started.""" - slave.block_till_done() hass.block_till_done() def test_validate_api(self): @@ -228,89 +203,3 @@ def test_json_encoder(self): now = dt_util.utcnow() self.assertEqual(now.isoformat(), ha_json_enc.default(now)) - - -class TestRemoteClasses(unittest.TestCase): - """Test the homeassistant.remote module.""" - - def tearDown(self): - """Stop everything that was started.""" - slave.block_till_done() - hass.block_till_done() - - def test_home_assistant_init(self): - """Test HomeAssistant init.""" - # Wrong password - self.assertRaises( - ha.HomeAssistantError, remote.HomeAssistant, - remote.API('127.0.0.1', API_PASSWORD + 'A', 8124)) - - # Wrong port - self.assertRaises( - ha.HomeAssistantError, remote.HomeAssistant, - remote.API('127.0.0.1', API_PASSWORD, BROKEN_PORT)) - - def test_statemachine_init(self): - """Test if remote.StateMachine copies all states on init.""" - self.assertEqual(sorted(hass.states.all()), - sorted(slave.states.all())) - - def test_statemachine_set(self): - """Test if setting the state on a slave is recorded.""" - slave.states.set("remote.test", "remote.statemachine test") - - # Wait till slave tells master - slave.block_till_done() - # Wait till master gives updated state - hass.block_till_done() - - self.assertEqual("remote.statemachine test", - slave.states.get("remote.test").state) - - def test_statemachine_remove_from_master(self): - """Remove statemachine from master.""" - hass.states.set("remote.master_remove", "remove me!") - hass.block_till_done() - slave.block_till_done() - - self.assertIn('remote.master_remove', slave.states.entity_ids()) - - hass.states.remove("remote.master_remove") - hass.block_till_done() - slave.block_till_done() - - self.assertNotIn('remote.master_remove', slave.states.entity_ids()) - - def test_statemachine_remove_from_slave(self): - """Remove statemachine from slave.""" - hass.states.set("remote.slave_remove", "remove me!") - hass.block_till_done() - - self.assertIn('remote.slave_remove', slave.states.entity_ids()) - - self.assertTrue(slave.states.remove("remote.slave_remove")) - slave.block_till_done() - hass.block_till_done() - - self.assertNotIn('remote.slave_remove', slave.states.entity_ids()) - - def test_eventbus_fire(self): - """Test if events fired from the eventbus get fired.""" - hass_call = [] - slave_call = [] - - hass.bus.listen("test.event_no_data", lambda _: hass_call.append(1)) - slave.bus.listen("test.event_no_data", lambda _: slave_call.append(1)) - slave.bus.fire("test.event_no_data") - - # Wait till slave tells master - slave.block_till_done() - # Wait till master gives updated event - hass.block_till_done() - - self.assertEqual(1, len(hass_call)) - self.assertEqual(1, len(slave_call)) - - def test_get_config(self): - """Test the return of the configuration.""" - self.assertEqual(hass.config.as_dict(), remote.get_config(master_api)) From 89e8e1a4c7ea00bc21fb391a7d63d13aa9fc1d4c Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Mon, 10 Apr 2017 18:43:40 +0200 Subject: [PATCH 034/146] Replace 'vendor_id' with 'arch' (fixes #7003) (#7023) --- homeassistant/components/sensor/cpuspeed.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/cpuspeed.py b/homeassistant/components/sensor/cpuspeed.py index a86d28a1a06b30..eeb52b8e35bbf6 100644 --- a/homeassistant/components/sensor/cpuspeed.py +++ b/homeassistant/components/sensor/cpuspeed.py @@ -19,7 +19,7 @@ ATTR_BRAND = 'Brand' ATTR_HZ = 'GHz Advertised' -ATTR_VENDOR = 'Vendor ID' +ATTR_ARCH = 'arch' DEFAULT_NAME = 'CPU speed' ICON = 'mdi:pulse' @@ -67,7 +67,7 @@ def device_state_attributes(self): """Return the state attributes.""" if self.info is not None: return { - ATTR_VENDOR: self.info['vendor_id'], + ATTR_ARCH: self.info['arch'], ATTR_BRAND: self.info['brand'], ATTR_HZ: round(self.info['hz_advertised_raw'][0]/10**9, 2) } From 05eb73a0e337af00be80b9191ee64ec101573fb7 Mon Sep 17 00:00:00 2001 From: micw Date: Mon, 10 Apr 2017 21:51:46 +0200 Subject: [PATCH 035/146] more tests for slugify (#7027) --- tests/util/test_init.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/tests/util/test_init.py b/tests/util/test_init.py index d6d583342d73d9..3ccb72920d4625 100644 --- a/tests/util/test_init.py +++ b/tests/util/test_init.py @@ -31,6 +31,12 @@ def test_slugify(self): self.assertEqual("test_more", util.slugify("Test More")) self.assertEqual("test_more", util.slugify("Test_(More)")) self.assertEqual("test_more", util.slugify("Tèst_Mörê")) + self.assertEqual("b827eb000000", util.slugify("B8:27:EB:00:00:00")) + self.assertEqual("testcom", util.slugify("test.com")) + self.assertEqual("greg_phone__exp_wayp1", + util.slugify("greg_phone - exp_wayp1")) + self.assertEqual("we_are_we_are_a_test_calendar", + util.slugify("We are, we are, a... Test Calendar")) def test_repr_helper(self): """Test repr_helper.""" From ee988dc8846e8ba498d3193382e76d77d6c853eb Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Mon, 10 Apr 2017 16:11:39 -0400 Subject: [PATCH 036/146] Additional ZWave coverage (#7024) * Additional ZWave coverage * setup_platform tests --- homeassistant/components/zwave/__init__.py | 16 ++-- tests/components/zwave/test_init.py | 100 ++++++++++++++++++++- 2 files changed, 105 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index daeca63f52bf36..38827bc55338e7 100755 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -13,6 +13,7 @@ import voluptuous as vol +from homeassistant.core import CoreState from homeassistant.loader import get_platform from homeassistant.helpers import discovery from homeassistant.helpers.entity_component import EntityComponent @@ -201,14 +202,15 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Generic Z-Wave platform setup.""" if discovery_info is None or NETWORK is None: return False + device = hass.data[DATA_ZWAVE_DICT].pop( - discovery_info[const.DISCOVERY_DEVICE]) - if device: - async_add_devices([device]) - return True - else: + discovery_info[const.DISCOVERY_DEVICE], None) + if device is None: return False + async_add_devices([device]) + return True + # pylint: disable=R0914 def setup(hass, config): @@ -258,7 +260,7 @@ def setup(hass, config): NETWORK = ZWaveNetwork(options, autostart=False) hass.data[DATA_ZWAVE_DICT] = {} - if use_debug: + if use_debug: # pragma: no cover def log_all(signal, value=None): """Log all the signals.""" print("") @@ -388,7 +390,7 @@ def stop_network(_service_or_event): """Stop Z-Wave network.""" _LOGGER.info("Stopping ZWave network.") NETWORK.stop() - if hass.state == 'RUNNING': + if hass.state == CoreState.running: hass.bus.fire(const.EVENT_NETWORK_STOP) def rename_node(service): diff --git a/tests/components/zwave/test_init.py b/tests/components/zwave/test_init.py index fe104b1e33a5c3..2e80e5b53315ca 100644 --- a/tests/components/zwave/test_init.py +++ b/tests/components/zwave/test_init.py @@ -18,6 +18,13 @@ from tests.mock.zwave import MockNetwork, MockNode, MockValue, MockEntityValues +@asyncio.coroutine +def test_missing_openzwave(hass): + """Test that missing openzwave lib stops setup.""" + result = yield from async_setup_component(hass, 'zwave', {'zwave': {}}) + assert not result + + @asyncio.coroutine def test_valid_device_config(hass, mock_openzwave): """Test valid device config.""" @@ -50,6 +57,87 @@ def test_invalid_device_config(hass, mock_openzwave): assert not result +def test_config_access_error(): + """Test threading error accessing config values.""" + node = MagicMock() + + def side_effect(): + raise RuntimeError + + node.values.values.side_effect = side_effect + result = zwave.get_config_value(node, 1) + assert result is None + + +@asyncio.coroutine +@patch.object(zwave, 'NETWORK') +def test_setup_platform(mock_network, hass, mock_openzwave): + """Test invalid device config.""" + mock_device = MagicMock() + hass.data[zwave.DATA_ZWAVE_DICT] = {456: mock_device} + async_add_devices = MagicMock() + + result = yield from zwave.async_setup_platform( + hass, None, async_add_devices, None) + assert not result + assert not async_add_devices.called + + result = yield from zwave.async_setup_platform( + hass, None, async_add_devices, {const.DISCOVERY_DEVICE: 123}) + assert not result + assert not async_add_devices.called + + result = yield from zwave.async_setup_platform( + hass, None, async_add_devices, {const.DISCOVERY_DEVICE: 456}) + assert result + assert async_add_devices.called + assert len(async_add_devices.mock_calls) == 1 + assert async_add_devices.mock_calls[0][1][0] == [mock_device] + + +@asyncio.coroutine +def test_zwave_ready_wait(hass, mock_openzwave): + """Test that zwave continues after waiting for network ready.""" + # Initialize zwave + yield from async_setup_component(hass, 'zwave', {'zwave': {}}) + yield from hass.async_block_till_done() + + with patch.object(zwave.time, 'sleep') as mock_sleep: + with patch.object(zwave, '_LOGGER') as mock_logger: + zwave.NETWORK.state = MockNetwork.STATE_STARTED + hass.bus.async_fire(EVENT_HOMEASSISTANT_START) + yield from hass.async_block_till_done() + + assert mock_sleep.called + assert len(mock_sleep.mock_calls) == const.NETWORK_READY_WAIT_SECS + assert mock_logger.warning.called + assert len(mock_logger.warning.mock_calls) == 1 + assert mock_logger.warning.mock_calls[0][1][1] == \ + const.NETWORK_READY_WAIT_SECS + + +@asyncio.coroutine +def test_device_entity(hass, mock_openzwave): + """Test device entity base class.""" + node = MockNode(node_id='10', name='Mock Node') + value = MockValue(data=False, node=node, instance=2, object_id='11', + label='Sensor', + command_class=const.COMMAND_CLASS_SENSOR_BINARY) + power_value = MockValue(data=50.123456, node=node, precision=3, + command_class=const.COMMAND_CLASS_METER) + values = MockEntityValues(primary=value, power=power_value) + device = zwave.ZWaveDeviceEntity(values, 'zwave') + device.hass = hass + device.value_added() + device.update_properties() + yield from hass.async_block_till_done() + + assert not device.should_poll + assert device.unique_id == "ZWAVE-10-11" + assert device.name == 'Mock Node Sensor' + assert device.device_state_attributes[zwave.ATTR_POWER] == 50.123 + + class TestZWaveDeviceEntityValues(unittest.TestCase): """Tests for the ZWaveDeviceEntityValues helper.""" @@ -453,11 +541,15 @@ def test_test_network(self): def test_stop_network(self): """Test zwave stop_network service.""" - self.hass.services.call('zwave', 'stop_network', {}) - self.hass.block_till_done() + with patch.object(self.hass.bus, 'fire') as mock_fire: + self.hass.services.call('zwave', 'stop_network', {}) + self.hass.block_till_done() - assert zwave.NETWORK.stop.called - assert len(zwave.NETWORK.stop.mock_calls) == 1 + assert zwave.NETWORK.stop.called + assert len(zwave.NETWORK.stop.mock_calls) == 1 + assert mock_fire.called + assert len(mock_fire.mock_calls) == 2 + assert mock_fire.mock_calls[0][1][0] == const.EVENT_NETWORK_STOP def test_rename_node(self): """Test zwave rename_node service.""" From 32da1634212caab59b86478404aea68d4322f020 Mon Sep 17 00:00:00 2001 From: happyleavesaoc Date: Tue, 11 Apr 2017 02:09:39 -0400 Subject: [PATCH 037/146] bump ups version (#7033) --- homeassistant/components/sensor/ups.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/ups.py b/homeassistant/components/sensor/ups.py index 4d4e0601ca5a6f..415ff1f874537e 100644 --- a/homeassistant/components/sensor/ups.py +++ b/homeassistant/components/sensor/ups.py @@ -19,7 +19,7 @@ from homeassistant.util.dt import now, parse_date import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['upsmychoice==1.0.1'] +REQUIREMENTS = ['upsmychoice==1.0.2'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 82296816dac6da..ca1e1fd4812904 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -762,7 +762,7 @@ twilio==5.7.0 uber_rides==0.2.7 # homeassistant.components.sensor.ups -upsmychoice==1.0.1 +upsmychoice==1.0.2 # homeassistant.components.camera.uvc uvcclient==0.10.0 From aa91351ff0dc86961a6680950d181507b34270bd Mon Sep 17 00:00:00 2001 From: happyleavesaoc Date: Tue, 11 Apr 2017 02:10:07 -0400 Subject: [PATCH 038/146] update usps version (#7035) --- homeassistant/components/sensor/usps.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/usps.py b/homeassistant/components/sensor/usps.py index 5c2bb84daa138e..c0fc3d9cfe46a0 100644 --- a/homeassistant/components/sensor/usps.py +++ b/homeassistant/components/sensor/usps.py @@ -19,7 +19,7 @@ from homeassistant.util.dt import now, parse_datetime import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['myusps==1.0.3'] +REQUIREMENTS = ['myusps==1.0.5'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index ca1e1fd4812904..b537812a20facc 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -389,7 +389,7 @@ miflora==0.1.16 mutagen==1.36.2 # homeassistant.components.sensor.usps -myusps==1.0.3 +myusps==1.0.5 # homeassistant.components.discovery netdisco==0.9.2 From aa3ccf16cac25568f1a4ef6e738d125231e727da Mon Sep 17 00:00:00 2001 From: happyleavesaoc Date: Tue, 11 Apr 2017 02:10:31 -0400 Subject: [PATCH 039/146] update fedex (#7034) --- homeassistant/components/sensor/fedex.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/fedex.py b/homeassistant/components/sensor/fedex.py index 9cbeb753b2b76b..2e1b8e6a6a0d26 100644 --- a/homeassistant/components/sensor/fedex.py +++ b/homeassistant/components/sensor/fedex.py @@ -19,7 +19,7 @@ from homeassistant.util.dt import now, parse_date import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['fedexdeliverymanager==1.0.1'] +REQUIREMENTS = ['fedexdeliverymanager==1.0.2'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index b537812a20facc..30a2e07a4f5b11 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -162,7 +162,7 @@ evohomeclient==0.2.5 fastdotcom==0.0.1 # homeassistant.components.sensor.fedex -fedexdeliverymanager==1.0.1 +fedexdeliverymanager==1.0.2 # homeassistant.components.feedreader feedparser==5.2.1 From 197db6bded5e9b24de80912595127a922b225140 Mon Sep 17 00:00:00 2001 From: pezinek Date: Tue, 11 Apr 2017 10:27:45 +0200 Subject: [PATCH 040/146] Google TTS can't read percent sign (#6971) (#7030) --- homeassistant/components/tts/google.py | 2 +- tests/components/tts/test_google.py | 15 ++++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/tts/google.py b/homeassistant/components/tts/google.py index d433aef8c47ce4..e88022a8ba9427 100644 --- a/homeassistant/components/tts/google.py +++ b/homeassistant/components/tts/google.py @@ -87,7 +87,7 @@ def async_get_tts_audio(self, message, language, options=None): url_param = { 'ie': 'UTF-8', 'tl': language, - 'q': yarl.quote(part), + 'q': yarl.quote(part, strict=False), 'tk': part_token, 'total': len(message_parts), 'idx': idx, diff --git a/tests/components/tts/test_google.py b/tests/components/tts/test_google.py index 4cbec95dc2bcd1..9f7cc9e9d502b8 100644 --- a/tests/components/tts/test_google.py +++ b/tests/components/tts/test_google.py @@ -23,10 +23,11 @@ def setup_method(self): self.url = "http://translate.google.com/translate_tts" self.url_param = { 'tl': 'en', - 'q': 'I%20person%20is%20on%20front%20of%20your%20door.', + 'q': + '90%25%20of%20I%20person%20is%20on%20front%20of%20your%20door.', 'tk': 5, 'client': 'tw-ob', - 'textlen': 34, + 'textlen': 41, 'total': 1, 'idx': 0, 'ie': 'UTF-8', @@ -70,7 +71,7 @@ def test_service_say(self, mock_calculate, aioclient_mock): setup_component(self.hass, tts.DOMAIN, config) self.hass.services.call(tts.DOMAIN, 'google_say', { - tts.ATTR_MESSAGE: "I person is on front of your door.", + tts.ATTR_MESSAGE: "90% of I person is on front of your door.", }) self.hass.block_till_done() @@ -99,7 +100,7 @@ def test_service_say_german_config(self, mock_calculate, aioclient_mock): setup_component(self.hass, tts.DOMAIN, config) self.hass.services.call(tts.DOMAIN, 'google_say', { - tts.ATTR_MESSAGE: "I person is on front of your door.", + tts.ATTR_MESSAGE: "90% of I person is on front of your door.", }) self.hass.block_till_done() @@ -126,7 +127,7 @@ def test_service_say_german_service(self, mock_calculate, aioclient_mock): setup_component(self.hass, tts.DOMAIN, config) self.hass.services.call(tts.DOMAIN, 'google_say', { - tts.ATTR_MESSAGE: "I person is on front of your door.", + tts.ATTR_MESSAGE: "90% of I person is on front of your door.", tts.ATTR_LANGUAGE: "de" }) self.hass.block_till_done() @@ -153,7 +154,7 @@ def test_service_say_error(self, mock_calculate, aioclient_mock): setup_component(self.hass, tts.DOMAIN, config) self.hass.services.call(tts.DOMAIN, 'google_say', { - tts.ATTR_MESSAGE: "I person is on front of your door.", + tts.ATTR_MESSAGE: "90% of I person is on front of your door.", }) self.hass.block_till_done() @@ -179,7 +180,7 @@ def test_service_say_timeout(self, mock_calculate, aioclient_mock): setup_component(self.hass, tts.DOMAIN, config) self.hass.services.call(tts.DOMAIN, 'google_say', { - tts.ATTR_MESSAGE: "I person is on front of your door.", + tts.ATTR_MESSAGE: "90% of I person is on front of your door.", }) self.hass.block_till_done() From f76a4b28064811b657246e1abbb972aeed69eb1d Mon Sep 17 00:00:00 2001 From: micw Date: Tue, 11 Apr 2017 13:52:12 +0200 Subject: [PATCH 041/146] Feature/min max improvements (#6786) * Fix #6783, remove a test that makes no sense anymore * Fix #6784 * Fix typo in docstring * Fix handling of known->unknown state, extended test, fix lint errors * Better handling of mismatch in unit of measurement. Set state to "unkown" and unit of measurement to "ERR" if unit of measurement differs between aggregatet states. Add entity_id to logged warning. * Make icon configurable * Fix typo * Fix lint * Fix lint * Fix lint * Add option to set entity_id on min_max sensor * Fix lint logging-not-lazy * Revert "Add option to set entity_id on min_max sensor" This reverts commit 4685f266477dfaba92cf8a256ecfe62c929c877b. * Revert "Make icon configurable" This reverts commit fe45aec82d9a07e730bebb4d47dc9618fb695fe6. * Fixes --- homeassistant/components/sensor/min_max.py | 71 +++++++++++++++++----- tests/components/sensor/test_min_max.py | 36 +++++++---- 2 files changed, 79 insertions(+), 28 deletions(-) diff --git a/homeassistant/components/sensor/min_max.py b/homeassistant/components/sensor/min_max.py index d612ca5cf26981..33ffc76999197c 100644 --- a/homeassistant/components/sensor/min_max.py +++ b/homeassistant/components/sensor/min_max.py @@ -34,8 +34,6 @@ CONF_ENTITY_IDS = 'entity_ids' CONF_ROUND_DIGITS = 'round_digits' -DEFAULT_NAME = 'Min/Max/Avg Sensor' - ICON = 'mdi:calculator' SENSOR_TYPES = { @@ -47,7 +45,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_TYPE, default=SENSOR_TYPES[ATTR_MAX_VALUE]): vol.All(cv.string, vol.In(SENSOR_TYPES.values())), - vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + vol.Optional(CONF_NAME): cv.string, vol.Required(CONF_ENTITY_IDS): cv.entity_ids, vol.Optional(CONF_ROUND_DIGITS, default=2): vol.Coerce(int), }) @@ -67,6 +65,39 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): return True +def calc_min(sensor_values): + """Calculate min value, honoring unknown states.""" + val = STATE_UNKNOWN + for sval in sensor_values: + if sval != STATE_UNKNOWN: + if val == STATE_UNKNOWN or val > sval: + val = sval + return val + + +def calc_max(sensor_values): + """Calculate max value, honoring unknown states.""" + val = STATE_UNKNOWN + for sval in sensor_values: + if sval != STATE_UNKNOWN: + if val == STATE_UNKNOWN or val < sval: + val = sval + return val + + +def calc_mean(sensor_values, round_digits): + """Calculate mean value, honoring unknown states.""" + val = 0 + count = 0 + for sval in sensor_values: + if sval != STATE_UNKNOWN: + val += sval + count += 1 + if count == 0: + return STATE_UNKNOWN + return round(val/count, round_digits) + + class MinMaxSensor(Entity): """Representation of a min/max sensor.""" @@ -76,10 +107,15 @@ def __init__(self, hass, entity_ids, name, sensor_type, round_digits): self._entity_ids = entity_ids self._sensor_type = sensor_type self._round_digits = round_digits - self._name = '{} {}'.format( - name, next(v for k, v in SENSOR_TYPES.items() - if self._sensor_type == v)) + + if name: + self._name = name + else: + self._name = '{} sensor'.format( + next(v for k, v in SENSOR_TYPES.items() + if self._sensor_type == v)).capitalize() self._unit_of_measurement = None + self._unit_of_measurement_mismatch = False self.min_value = self.max_value = self.mean = STATE_UNKNOWN self.count_sensors = len(self._entity_ids) self.states = {} @@ -89,6 +125,8 @@ def __init__(self, hass, entity_ids, name, sensor_type, round_digits): def async_min_max_sensor_state_listener(entity, old_state, new_state): """Called when the sensor changes state.""" if new_state.state is None or new_state.state in STATE_UNKNOWN: + self.states[entity] = STATE_UNKNOWN + hass.async_add_job(self.async_update_ha_state, True) return if self._unit_of_measurement is None: @@ -97,8 +135,11 @@ def async_min_max_sensor_state_listener(entity, old_state, new_state): if self._unit_of_measurement != new_state.attributes.get( ATTR_UNIT_OF_MEASUREMENT): - _LOGGER.warning("Units of measurement do not match") - return + _LOGGER.warning( + "Units of measurement do not match for entity %s", + self.entity_id) + self._unit_of_measurement_mismatch = True + try: self.states[entity] = float(new_state.state) except ValueError: @@ -118,12 +159,16 @@ def name(self): @property def state(self): """Return the state of the sensor.""" + if self._unit_of_measurement_mismatch: + return STATE_UNKNOWN return getattr(self, next( k for k, v in SENSOR_TYPES.items() if self._sensor_type == v)) @property def unit_of_measurement(self): """Return the unit the value is expressed in.""" + if self._unit_of_measurement_mismatch: + return "ERR" return self._unit_of_measurement @property @@ -150,10 +195,6 @@ def async_update(self): """Get the latest data and updates the states.""" sensor_values = [self.states[k] for k in self._entity_ids if k in self.states] - if len(sensor_values) == self.count_sensors: - self.min_value = min(sensor_values) - self.max_value = max(sensor_values) - self.mean = round(sum(sensor_values) / self.count_sensors, - self._round_digits) - else: - self.min_value = self.max_value = self.mean = STATE_UNKNOWN + self.min_value = calc_min(sensor_values) + self.max_value = calc_max(sensor_values) + self.mean = calc_mean(sensor_values, self._round_digits) diff --git a/tests/components/sensor/test_min_max.py b/tests/components/sensor/test_min_max.py index b610775b39bfee..a6d6a5adc68893 100644 --- a/tests/components/sensor/test_min_max.py +++ b/tests/components/sensor/test_min_max.py @@ -30,7 +30,7 @@ def test_min_sensor(self): config = { 'sensor': { 'platform': 'min_max', - 'name': 'test', + 'name': 'test_min', 'type': 'min', 'entity_ids': [ 'sensor.test_1', @@ -59,7 +59,7 @@ def test_max_sensor(self): config = { 'sensor': { 'platform': 'min_max', - 'name': 'test', + 'name': 'test_max', 'type': 'max', 'entity_ids': [ 'sensor.test_1', @@ -88,7 +88,7 @@ def test_mean_sensor(self): config = { 'sensor': { 'platform': 'min_max', - 'name': 'test', + 'name': 'test_mean', 'type': 'mean', 'entity_ids': [ 'sensor.test_1', @@ -117,7 +117,7 @@ def test_mean_1_digit_sensor(self): config = { 'sensor': { 'platform': 'min_max', - 'name': 'test', + 'name': 'test_mean', 'type': 'mean', 'round_digits': 1, 'entity_ids': [ @@ -147,7 +147,7 @@ def test_mean_4_digit_sensor(self): config = { 'sensor': { 'platform': 'min_max', - 'name': 'test', + 'name': 'test_mean', 'type': 'mean', 'round_digits': 4, 'entity_ids': [ @@ -177,7 +177,7 @@ def test_not_enough_sensor_value(self): config = { 'sensor': { 'platform': 'min_max', - 'name': 'test', + 'name': 'test_max', 'type': 'max', 'entity_ids': [ 'sensor.test_1', @@ -191,7 +191,7 @@ def test_not_enough_sensor_value(self): entity_ids = config['sensor']['entity_ids'] - self.hass.states.set(entity_ids[0], self.values[0]) + self.hass.states.set(entity_ids[0], STATE_UNKNOWN) self.hass.block_till_done() state = self.hass.states.get('sensor.test_max') @@ -201,14 +201,20 @@ def test_not_enough_sensor_value(self): self.hass.block_till_done() state = self.hass.states.get('sensor.test_max') - self.assertEqual(STATE_UNKNOWN, state.state) + self.assertNotEqual(STATE_UNKNOWN, state.state) - self.hass.states.set(entity_ids[2], self.values[2]) + self.hass.states.set(entity_ids[2], STATE_UNKNOWN) self.hass.block_till_done() state = self.hass.states.get('sensor.test_max') self.assertNotEqual(STATE_UNKNOWN, state.state) + self.hass.states.set(entity_ids[1], STATE_UNKNOWN) + self.hass.block_till_done() + + state = self.hass.states.get('sensor.test_max') + self.assertEqual(STATE_UNKNOWN, state.state) + def test_different_unit_of_measurement(self): """Test for different unit of measurement.""" config = { @@ -232,21 +238,25 @@ def test_different_unit_of_measurement(self): {ATTR_UNIT_OF_MEASUREMENT: TEMP_CELSIUS}) self.hass.block_till_done() - state = self.hass.states.get('sensor.test_mean') + state = self.hass.states.get('sensor.test') - self.assertEqual(STATE_UNKNOWN, state.state) + self.assertEqual(str(float(self.values[0])), state.state) self.assertEqual('°C', state.attributes.get('unit_of_measurement')) self.hass.states.set(entity_ids[1], self.values[1], {ATTR_UNIT_OF_MEASUREMENT: TEMP_FAHRENHEIT}) self.hass.block_till_done() + state = self.hass.states.get('sensor.test') + self.assertEqual(STATE_UNKNOWN, state.state) - self.assertEqual('°C', state.attributes.get('unit_of_measurement')) + self.assertEqual('ERR', state.attributes.get('unit_of_measurement')) self.hass.states.set(entity_ids[2], self.values[2], {ATTR_UNIT_OF_MEASUREMENT: '%'}) self.hass.block_till_done() + state = self.hass.states.get('sensor.test') + self.assertEqual(STATE_UNKNOWN, state.state) - self.assertEqual('°C', state.attributes.get('unit_of_measurement')) + self.assertEqual('ERR', state.attributes.get('unit_of_measurement')) From 2748bc4165a516bcc14abd2fb670d466a4be84af Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 11 Apr 2017 13:52:34 +0200 Subject: [PATCH 042/146] Upgrade psutil to 5.2.2 (#7037) --- homeassistant/components/sensor/systemmonitor.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/systemmonitor.py b/homeassistant/components/sensor/systemmonitor.py index 4b402d32792ff8..fee12c31acf4a2 100755 --- a/homeassistant/components/sensor/systemmonitor.py +++ b/homeassistant/components/sensor/systemmonitor.py @@ -16,7 +16,7 @@ import homeassistant.helpers.config_validation as cv import homeassistant.util.dt as dt_util -REQUIREMENTS = ['psutil==5.2.1'] +REQUIREMENTS = ['psutil==5.2.2'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 30a2e07a4f5b11..1fa528b712212e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -448,7 +448,7 @@ pmsensor==0.4 proliphix==0.4.1 # homeassistant.components.sensor.systemmonitor -psutil==5.2.1 +psutil==5.2.2 # homeassistant.components.wink pubnubsub-handler==1.0.2 From 2cfdb44df6c208bbce0ce998a13e8c533e8ecd11 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 11 Apr 2017 13:52:47 +0200 Subject: [PATCH 043/146] Upgrade sendgrid to 4.0.0 (#7038) --- homeassistant/components/notify/sendgrid.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/notify/sendgrid.py b/homeassistant/components/notify/sendgrid.py index f2ef64a9ea0e10..4db12a5b8d8107 100644 --- a/homeassistant/components/notify/sendgrid.py +++ b/homeassistant/components/notify/sendgrid.py @@ -13,7 +13,7 @@ from homeassistant.const import (CONF_API_KEY, CONF_SENDER, CONF_RECIPIENT) import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['sendgrid==3.6.5'] +REQUIREMENTS = ['sendgrid==4.0.0'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 1fa528b712212e..0fcba62c153665 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -693,7 +693,7 @@ schiene==0.18 scsgate==0.1.0 # homeassistant.components.notify.sendgrid -sendgrid==3.6.5 +sendgrid==4.0.0 # homeassistant.components.sensor.sensehat sense-hat==2.2.0 From 07bb64815d3a1d20fe344bd8b909738ef12a4d7d Mon Sep 17 00:00:00 2001 From: David Straub Date: Tue, 11 Apr 2017 13:55:42 +0200 Subject: [PATCH 044/146] Missing line name restriction added (fixes #7039) (#7040) --- homeassistant/components/sensor/mvglive.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/homeassistant/components/sensor/mvglive.py b/homeassistant/components/sensor/mvglive.py index 7043da53222e7d..b8bab2a6b5d832 100644 --- a/homeassistant/components/sensor/mvglive.py +++ b/homeassistant/components/sensor/mvglive.py @@ -143,6 +143,9 @@ def update(self): # find the first departure meeting the criteria if not _departure['destination'].startswith(self._destination): continue + elif (self._line is not None + and _departure['linename'] != self._line): + continue elif _departure['time'] < self._offset: continue # now select the relevant data From f099aee69a90b4c275a4750a20cff120ced2ba77 Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Tue, 11 Apr 2017 17:58:51 +0200 Subject: [PATCH 045/146] Plug file leak on LIFX unregister (#7031) * Plug file leak on LIFX unregister The aiolifx 0.4.4 release closes its socket when the unregister callback is called. This plugs a file descriptor leak but also means that we must be careful to not use the device after it goes unavailable. Also, when a light reappears, it has a new device that must be used. * Do not test self.available in service calls The core will learn to handle that. --- homeassistant/components/light/lifx.py | 3 ++- requirements_all.txt | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/light/lifx.py b/homeassistant/components/light/lifx.py index 76a2a9e907d090..da09601c1bb01b 100644 --- a/homeassistant/components/light/lifx.py +++ b/homeassistant/components/light/lifx.py @@ -26,7 +26,7 @@ _LOGGER = logging.getLogger(__name__) -REQUIREMENTS = ['aiolifx==0.4.2'] +REQUIREMENTS = ['aiolifx==0.4.4'] UDP_BROADCAST_PORT = 56700 @@ -84,6 +84,7 @@ def register(self, device): entity = self.entities[device.mac_addr] _LOGGER.debug("%s register AGAIN", entity.ipaddr) entity.available = True + entity.device = device self.hass.async_add_job(entity.async_update_ha_state()) else: _LOGGER.debug("%s register NEW", device.ip_addr) diff --git a/requirements_all.txt b/requirements_all.txt index 0fcba62c153665..017df5e87dd5e1 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -44,7 +44,7 @@ aiodns==1.1.1 aiohttp_cors==0.5.2 # homeassistant.components.light.lifx -aiolifx==0.4.2 +aiolifx==0.4.4 # homeassistant.components.camera.amcrest # homeassistant.components.sensor.amcrest From d7ca9e7a66ddda3e075819bd34e4318d1b35524c Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 11 Apr 2017 17:59:46 +0200 Subject: [PATCH 046/146] Make core to look avilable state of device on servicecall (#7045) --- homeassistant/helpers/entity_component.py | 8 +++--- tests/helpers/test_entity_component.py | 31 +++++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/homeassistant/helpers/entity_component.py b/homeassistant/helpers/entity_component.py index 5330eafed19e8d..9e059528619437 100644 --- a/homeassistant/helpers/entity_component.py +++ b/homeassistant/helpers/entity_component.py @@ -95,7 +95,7 @@ def extract_from_service(self, service, expand_group=True): ).result() def async_extract_from_service(self, service, expand_group=True): - """Extract all known entities from a service call. + """Extract all known and available entities from a service call. Will return all entities if no entities specified in call. Will return an empty list if entities specified but unknown. @@ -103,11 +103,13 @@ def async_extract_from_service(self, service, expand_group=True): This method must be run in the event loop. """ if ATTR_ENTITY_ID not in service.data: - return list(self.entities.values()) + return [entity for entity in self.entities.values() + if entity.available] return [self.entities[entity_id] for entity_id in extract_entity_ids(self.hass, service, expand_group) - if entity_id in self.entities] + if entity_id in self.entities and + self.entities[entity_id].available] @asyncio.coroutine def _async_setup_platform(self, platform_type, platform_config, diff --git a/tests/helpers/test_entity_component.py b/tests/helpers/test_entity_component.py index 38dc01b4387934..a76b3a15068c42 100644 --- a/tests/helpers/test_entity_component.py +++ b/tests/helpers/test_entity_component.py @@ -50,6 +50,11 @@ def unique_id(self): """Return the unique ID of the entity.""" return self._handle('unique_id') + @property + def available(self): + """Return True if entity is available.""" + return self._handle('available') + def _handle(self, attr): """Helper for the attributes.""" if attr in self._values: @@ -474,3 +479,29 @@ def test_platform_warn_slow_setup(hass): assert logger_method == _LOGGER.warning assert mock_call().cancel.called + + +@asyncio.coroutine +def test_extract_from_service_available_device(hass): + """Test the extraction of entity from service and device is available.""" + component = EntityComponent(_LOGGER, DOMAIN, hass) + yield from component.async_add_entities([ + EntityTest(name='test_1'), + EntityTest(name='test_2', available=False), + EntityTest(name='test_3'), + EntityTest(name='test_4', available=False), + ]) + + call_1 = ha.ServiceCall('test', 'service') + + assert ['test_domain.test_1', 'test_domain.test_3'] == \ + sorted(ent.entity_id for ent in + component.async_extract_from_service(call_1)) + + call_2 = ha.ServiceCall('test', 'service', data={ + 'entity_id': ['test_domain.test_3', 'test_domain.test_4'], + }) + + assert ['test_domain.test_3'] == \ + sorted(ent.entity_id for ent in + component.async_extract_from_service(call_2)) From cc459e25cc268d9c64a8f1f9648c9378f7a1feb7 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 11 Apr 2017 18:05:27 +0200 Subject: [PATCH 047/146] Remove configuration sample (#7048) --- .../components/device_tracker/ping.py | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/device_tracker/ping.py b/homeassistant/components/device_tracker/ping.py index 04537dd6e4d0a2..7c217b7aabb75f 100644 --- a/homeassistant/components/device_tracker/ping.py +++ b/homeassistant/components/device_tracker/ping.py @@ -1,15 +1,8 @@ """ -Tracks devices by sending a ICMP ping. +Tracks devices by sending a ICMP echo request (ping). For more details about this platform, please refer to the documentation at https://home-assistant.io/components/device_tracker.ping/ - -device_tracker: - - platform: ping - count: 2 - hosts: - host_one: pc.local - host_two: 192.168.2.25 """ import logging import subprocess @@ -18,14 +11,12 @@ import voluptuous as vol +import homeassistant.helpers.config_validation as cv from homeassistant.components.device_tracker import ( PLATFORM_SCHEMA, DEFAULT_SCAN_INTERVAL, SOURCE_TYPE_ROUTER) from homeassistant.helpers.event import track_point_in_utc_time from homeassistant import util from homeassistant import const -import homeassistant.helpers.config_validation as cv - -DEPENDENCIES = [] _LOGGER = logging.getLogger(__name__) @@ -37,7 +28,7 @@ }) -class Host: +class Host(object): """Host object with ping detection.""" def __init__(self, ip_address, dev_id, hass, config): @@ -53,7 +44,7 @@ def __init__(self, ip_address, dev_id, hass, config): self.ip_address] def ping(self): - """Send ICMP ping and return True if success.""" + """Send an ICMP echo request and return True if success.""" pinger = subprocess.Popen(self._ping_cmd, stdout=subprocess.PIPE) try: pinger.communicate() @@ -70,7 +61,7 @@ def update(self, see): return True failed += 1 - _LOGGER.debug("ping KO on ip=%s failed=%d", self.ip_address, failed) + _LOGGER.debug("No response from %s failed=%d", self.ip_address, failed) def setup_scanner(hass, config, see, discovery_info=None): From b52cabf2c0242585b55e6dff86fda93ff120f951 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 11 Apr 2017 18:09:31 +0200 Subject: [PATCH 048/146] Bugfix wait on start event (#7013) * Bugfix wait on start event * Paulus sugestion * Change handling with stop_track_task * Add new unittests * Update test_core.py --- homeassistant/core.py | 12 +++++------- tests/common.py | 3 +-- tests/test_core.py | 17 ++++++++++++++++- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/homeassistant/core.py b/homeassistant/core.py index 899bed064edf6e..320e857ac9e537 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -164,15 +164,16 @@ def async_start(self): self.bus.async_fire(EVENT_HOMEASSISTANT_START) try: + # only block for EVENT_HOMEASSISTANT_START listener + self.async_stop_track_tasks() with timeout(TIMEOUT_EVENT_START, loop=self.loop): - yield from self.async_stop_track_tasks() + yield from self.async_block_till_done() except asyncio.TimeoutError: _LOGGER.warning( 'Something is blocking Home Assistant from wrapping up the ' 'start up phase. We\'re going to continue anyway. Please ' 'report the following info at http://bit.ly/2ogP58T : %s', ', '.join(self.config.components)) - self._track_task = False self.state = CoreState.running _async_create_timer(self) @@ -218,10 +219,9 @@ def async_track_tasks(self): """Track tasks so you can wait for all tasks to be done.""" self._track_task = True - @asyncio.coroutine + @callback def async_stop_track_tasks(self): - """Track tasks so you can wait for all tasks to be done.""" - yield from self.async_block_till_done() + """Stop track tasks so you can't wait for all tasks to be done.""" self._track_task = False @callback @@ -246,8 +246,6 @@ def block_till_done(self) -> None: @asyncio.coroutine def async_block_till_done(self): """Block till all pending work is done.""" - assert self._track_task, 'Not tracking tasks' - # To flush out any call_soon_threadsafe yield from asyncio.sleep(0, loop=self.loop) diff --git a/tests/common.py b/tests/common.py index 9dc077dc3f7767..03a4de235d7c26 100644 --- a/tests/common.py +++ b/tests/common.py @@ -122,8 +122,7 @@ def mock_async_start(): # 1. We only mock time during tests # 2. We want block_till_done that is called inside stop_track_tasks with patch('homeassistant.core._async_create_timer'), \ - patch.object(hass, 'async_stop_track_tasks', - hass.async_block_till_done): + patch.object(hass, 'async_stop_track_tasks'): yield from orig_start() hass.async_start = mock_async_start diff --git a/tests/test_core.py b/tests/test_core.py index b2fca047292718..89ae6c5f651a9f 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -901,7 +901,6 @@ def test_start_taking_too_long(loop, caplog): patch('homeassistant.core._async_create_timer') as mock_timer: yield from hass.async_start() - assert not hass._track_task assert hass.state == ha.CoreState.running assert len(mock_timer.mock_calls) == 1 assert mock_timer.mock_calls[0][1][0] is hass @@ -910,3 +909,19 @@ def test_start_taking_too_long(loop, caplog): finally: yield from hass.async_stop() assert hass.state == ha.CoreState.not_running + + +@asyncio.coroutine +def test_track_task_functions(loop): + """Test function to start/stop track task and initial state.""" + hass = ha.HomeAssistant(loop=loop) + try: + assert hass._track_task + + hass.async_stop_track_tasks() + assert not hass._track_task + + hass.async_track_tasks() + assert hass._track_task + finally: + yield from hass.async_stop() From 11125864c6a4cbf0c8324091341e898625b802b7 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 11 Apr 2017 18:23:41 +0200 Subject: [PATCH 049/146] Bugfix slider (#7047) * Bugfix slider * Update input_slider.py * Update input_slider.py --- homeassistant/components/input_slider.py | 4 ++-- tests/components/test_input_slider.py | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/input_slider.py b/homeassistant/components/input_slider.py index d10120e673be6f..c4976bb43e8c36 100644 --- a/homeassistant/components/input_slider.py +++ b/homeassistant/components/input_slider.py @@ -174,8 +174,8 @@ def async_added_to_hass(self): state = yield from async_get_last_state(self.hass, self.entity_id) value = state and float(state.state) - # Check against False because value can be 0 - if value is not False and self._minimum < value < self._maximum: + # Check against None because value can be 0 + if value is not None and self._minimum <= value <= self._maximum: self._current_value = value else: self._current_value = self._minimum diff --git a/tests/components/test_input_slider.py b/tests/components/test_input_slider.py index 7097e87e6463bd..f550091e31fb43 100644 --- a/tests/components/test_input_slider.py +++ b/tests/components/test_input_slider.py @@ -133,3 +133,21 @@ def test_initial_state_overrules_restore_state(hass): state = hass.states.get('input_slider.b2') assert state assert float(state.state) == 60 + + +@asyncio.coroutine +def test_no_initial_state_and_no_restore_state(hass): + """Ensure that entity is create without initial and restore feature.""" + hass.state = CoreState.starting + + yield from async_setup_component(hass, DOMAIN, { + DOMAIN: { + 'b1': { + 'min': 0, + 'max': 100, + }, + }}) + + state = hass.states.get('input_slider.b1') + assert state + assert float(state.state) == 0 From ed012014bc567cc4e10e25676d78915d1590b369 Mon Sep 17 00:00:00 2001 From: johanpalmqvist Date: Tue, 11 Apr 2017 22:52:44 +0200 Subject: [PATCH 050/146] Add MaryTTS platform (#6988) * Add MaryTTS platform * Fix lint error * Doc link, config and formatting fixes * Remove stuff not needed with aiohttp2 * Get rid of unnecessary else statement --- homeassistant/components/tts/marytts.py | 117 +++++++++++++++++++++++ tests/components/tts/test_marytts.py | 121 ++++++++++++++++++++++++ 2 files changed, 238 insertions(+) create mode 100644 homeassistant/components/tts/marytts.py create mode 100644 tests/components/tts/test_marytts.py diff --git a/homeassistant/components/tts/marytts.py b/homeassistant/components/tts/marytts.py new file mode 100644 index 00000000000000..ffb6950d79becb --- /dev/null +++ b/homeassistant/components/tts/marytts.py @@ -0,0 +1,117 @@ +""" +Support for the MaryTTS service. + +For more details about this component, please refer to the documentation at +https://home-assistant.io/components/tts.marytts/ +""" +import asyncio +import logging +import re + +import aiohttp +import async_timeout +import voluptuous as vol + +from homeassistant.const import CONF_HOST, CONF_PORT +from homeassistant.components.tts import Provider, PLATFORM_SCHEMA, CONF_LANG +from homeassistant.helpers.aiohttp_client import async_get_clientsession +import homeassistant.helpers.config_validation as cv + +_LOGGER = logging.getLogger(__name__) + +SUPPORT_LANGUAGES = [ + 'de', 'en-GB', 'en-US', 'fr', 'it', 'lb', 'ru', 'sv', 'te', 'tr' +] + +SUPPORT_VOICES = [ + 'cmu-slt-hsmm' +] + +SUPPORT_CODEC = [ + 'aiff', 'au', 'wav' +] + +CONF_VOICE = 'voice' +CONF_CODEC = 'codec' + +DEFAULT_HOST = 'localhost' +DEFAULT_PORT = 59125 +DEFAULT_LANG = 'en-US' +DEFAULT_VOICE = 'cmu-slt-hsmm' +DEFAULT_CODEC = 'wav' + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, + vol.Optional(CONF_LANG, default=DEFAULT_LANG): vol.In(SUPPORT_LANGUAGES), + vol.Optional(CONF_VOICE, default=DEFAULT_VOICE): vol.In(SUPPORT_VOICES), + vol.Optional(CONF_CODEC, default=DEFAULT_CODEC): vol.In(SUPPORT_CODEC) +}) + + +@asyncio.coroutine +def async_get_engine(hass, config): + """Setup MaryTTS speech component.""" + return MaryTTSProvider(hass, config) + + +class MaryTTSProvider(Provider): + """MaryTTS speech api provider.""" + + def __init__(self, hass, conf): + """Init MaryTTS TTS service.""" + self.hass = hass + self._host = conf.get(CONF_HOST) + self._port = conf.get(CONF_PORT) + self._codec = conf.get(CONF_CODEC) + self._voice = conf.get(CONF_VOICE) + self._language = conf.get(CONF_LANG) + self.name = 'MaryTTS' + + @property + def default_language(self): + """Default language.""" + return self._language + + @property + def supported_languages(self): + """List of supported languages.""" + return SUPPORT_LANGUAGES + + @asyncio.coroutine + def async_get_tts_audio(self, message, language, options=None): + """Load TTS from MaryTTS.""" + websession = async_get_clientsession(self.hass) + + actual_language = re.sub('-', '_', language) + + try: + with async_timeout.timeout(10, loop=self.hass.loop): + url = 'http://{}:{}/process?'.format(self._host, self._port) + + audio = self._codec.upper() + if audio == 'WAV': + audio = 'WAVE' + + url_param = { + 'INPUT_TEXT': message, + 'INPUT_TYPE': 'TEXT', + 'AUDIO': audio, + 'VOICE': self._voice, + 'OUTPUT_TYPE': 'AUDIO', + 'LOCALE': actual_language + } + + request = yield from websession.get(url, params=url_param) + + if request.status != 200: + _LOGGER.error("Error %d on load url %s.", + request.status, request.url) + return (None, None) + data = yield from request.read() + + except (asyncio.TimeoutError, aiohttp.ClientError): + _LOGGER.error("Timeout for MaryTTS API.") + return (None, None) + + return (self._codec, data) diff --git a/tests/components/tts/test_marytts.py b/tests/components/tts/test_marytts.py new file mode 100644 index 00000000000000..29e1a6354621aa --- /dev/null +++ b/tests/components/tts/test_marytts.py @@ -0,0 +1,121 @@ +"""The tests for the MaryTTS speech platform.""" +import asyncio +import os +import shutil + +import homeassistant.components.tts as tts +from homeassistant.setup import setup_component +from homeassistant.components.media_player import ( + SERVICE_PLAY_MEDIA, DOMAIN as DOMAIN_MP) + +from tests.common import ( + get_test_home_assistant, assert_setup_component, mock_service) + + +class TestTTSMaryTTSPlatform(object): + """Test the speech component.""" + + def setup_method(self): + """Setup things to be run when tests are started.""" + self.hass = get_test_home_assistant() + + self.url = "http://localhost:59125/process?" + self.url_param = { + 'INPUT_TEXT': 'HomeAssistant', + 'INPUT_TYPE': 'TEXT', + 'AUDIO': 'WAVE', + 'VOICE': 'cmu-slt-hsmm', + 'OUTPUT_TYPE': 'AUDIO', + 'LOCALE': 'en_US' + } + + def teardown_method(self): + """Stop everything that was started.""" + default_tts = self.hass.config.path(tts.DEFAULT_CACHE_DIR) + if os.path.isdir(default_tts): + shutil.rmtree(default_tts) + + self.hass.stop() + + def test_setup_component(self): + """Test setup component.""" + config = { + tts.DOMAIN: { + 'platform': 'marytts' + } + } + + with assert_setup_component(1, tts.DOMAIN): + setup_component(self.hass, tts.DOMAIN, config) + + def test_service_say(self, aioclient_mock): + """Test service call say.""" + calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) + + aioclient_mock.get( + self.url, params=self.url_param, status=200, content=b'test') + + config = { + tts.DOMAIN: { + 'platform': 'marytts', + } + } + + with assert_setup_component(1, tts.DOMAIN): + setup_component(self.hass, tts.DOMAIN, config) + + self.hass.services.call(tts.DOMAIN, 'marytts_say', { + tts.ATTR_MESSAGE: "HomeAssistant", + }) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 1 + assert len(calls) == 1 + + def test_service_say_timeout(self, aioclient_mock): + """Test service call say.""" + calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) + + aioclient_mock.get( + self.url, params=self.url_param, status=200, + exc=asyncio.TimeoutError()) + + config = { + tts.DOMAIN: { + 'platform': 'marytts', + } + } + + with assert_setup_component(1, tts.DOMAIN): + setup_component(self.hass, tts.DOMAIN, config) + + self.hass.services.call(tts.DOMAIN, 'marytts_say', { + tts.ATTR_MESSAGE: "HomeAssistant", + }) + self.hass.block_till_done() + + assert len(calls) == 0 + assert len(aioclient_mock.mock_calls) == 1 + + def test_service_say_http_error(self, aioclient_mock): + """Test service call say.""" + calls = mock_service(self.hass, DOMAIN_MP, SERVICE_PLAY_MEDIA) + + aioclient_mock.get( + self.url, params=self.url_param, status=403, content=b'test') + + config = { + tts.DOMAIN: { + 'platform': 'marytts', + } + } + + with assert_setup_component(1, tts.DOMAIN): + setup_component(self.hass, tts.DOMAIN, config) + + self.hass.services.call(tts.DOMAIN, 'marytts_say', { + tts.ATTR_MESSAGE: "HomeAssistant", + }) + self.hass.block_till_done() + + assert len(calls) == 0 From 4e388666b27d21a186294a902290219d46f1abf8 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Wed, 12 Apr 2017 04:17:09 +0200 Subject: [PATCH 051/146] Fix mysensors callback (#7057) * Fix mysensors callback * All messages was not triggering proper updates. Fix by checking all child value types each update. * Upgrade mysensors dep * Fix pickle persistence when upgrading. --- .../components/device_tracker/mysensors.py | 54 +++++++++--------- homeassistant/components/mysensors.py | 56 +++++++++---------- requirements_all.txt | 2 +- 3 files changed, 56 insertions(+), 56 deletions(-) diff --git a/homeassistant/components/device_tracker/mysensors.py b/homeassistant/components/device_tracker/mysensors.py index e1a16a017e4bb1..04801f834df7d3 100644 --- a/homeassistant/components/device_tracker/mysensors.py +++ b/homeassistant/components/device_tracker/mysensors.py @@ -20,37 +20,39 @@ def mysensors_callback(gateway, msg): """Callback for mysensors platform.""" node = gateway.sensors[msg.node_id] if node.sketch_name is None: - _LOGGER.info('No sketch_name: node %s', msg.node_id) + _LOGGER.debug('No sketch_name: node %s', msg.node_id) return pres = gateway.const.Presentation set_req = gateway.const.SetReq - for child in node.children.values(): - position = child.values.get(set_req.V_POSITION) - if child.type != pres.S_GPS or position is None: - continue - try: - latitude, longitude, _ = position.split(',') - except ValueError: - _LOGGER.error('Payload for V_POSITION %s is not of format ' - 'latitude,longitude,altitude', position) - continue - name = '{} {} {}'.format( - node.sketch_name, msg.node_id, child.id) - attr = { - mysensors.ATTR_CHILD_ID: child.id, - mysensors.ATTR_DESCRIPTION: child.description, - mysensors.ATTR_DEVICE: gateway.device, - mysensors.ATTR_NODE_ID: msg.node_id, - } - see( - dev_id=slugify(name), - host_name=name, - gps=(latitude, longitude), - battery=node.battery_level, - attributes=attr - ) + child = node.children.get(msg.child_id) + if child is None: + return + position = child.values.get(set_req.V_POSITION) + if child.type != pres.S_GPS or position is None: + return + try: + latitude, longitude, _ = position.split(',') + except ValueError: + _LOGGER.error('Payload for V_POSITION %s is not of format ' + 'latitude,longitude,altitude', position) + return + name = '{} {} {}'.format( + node.sketch_name, msg.node_id, child.id) + attr = { + mysensors.ATTR_CHILD_ID: child.id, + mysensors.ATTR_DESCRIPTION: child.description, + mysensors.ATTR_DEVICE: gateway.device, + mysensors.ATTR_NODE_ID: msg.node_id, + } + see( + dev_id=slugify(name), + host_name=name, + gps=(latitude, longitude), + battery=node.battery_level, + attributes=attr + ) gateways = hass.data.get(mysensors.MYSENSORS_GATEWAYS) diff --git a/homeassistant/components/mysensors.py b/homeassistant/components/mysensors.py index afe5fc11762a01..dbf66c2288b7c6 100644 --- a/homeassistant/components/mysensors.py +++ b/homeassistant/components/mysensors.py @@ -46,7 +46,7 @@ MQTT_COMPONENT = 'mqtt' REQUIREMENTS = [ 'https://github.com/theolind/pymysensors/archive/' - 'ff3476b70edc9c995b939cddb9d51f8d2d018581.zip#pymysensors==0.9.0'] + 'c6990eaaa741444a638608e6e00488195e2ca74c.zip#pymysensors==0.9.1'] def is_socket_address(value): @@ -206,12 +206,9 @@ def gw_start(event): for node_id in gateway.sensors: node = gateway.sensors[node_id] for child_id in node.children: - child = node.children[child_id] - for value_type in child.values: - msg = mysensors.Message().modify( - node_id=node_id, child_id=child_id, type=1, - sub_type=value_type) - gateway.event_callback(msg) + msg = mysensors.Message().modify( + node_id=node_id, child_id=child_id) + gateway.event_callback(msg) gateway.start() hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, lambda event: gateway.stop()) @@ -274,32 +271,33 @@ def mysensors_callback(gateway, msg): _LOGGER.debug('No sketch_name: node %s', msg.node_id) return child = gateway.sensors[msg.node_id].children.get(msg.child_id) - if child is None or child.values.get(msg.sub_type) is None: + if child is None: return - key = msg.node_id, child.id, msg.sub_type - if child.type not in map_sv_types or \ - msg.sub_type not in map_sv_types[child.type]: - return - if key in devices: + for value_type in child.values: + key = msg.node_id, child.id, value_type + if child.type not in map_sv_types or \ + value_type not in map_sv_types[child.type]: + continue + if key in devices: + if add_devices: + devices[key].schedule_update_ha_state(True) + else: + devices[key].update() + continue + name = '{} {} {}'.format( + gateway.sensors[msg.node_id].sketch_name, msg.node_id, + child.id) + if isinstance(entity_class, dict): + device_class = entity_class[child.type] + else: + device_class = entity_class + devices[key] = device_class( + gateway, msg.node_id, child.id, name, value_type) if add_devices: - devices[key].schedule_update_ha_state(True) + _LOGGER.info('Adding new devices: %s', [devices[key]]) + add_devices([devices[key]], True) else: devices[key].update() - return - name = '{} {} {}'.format( - gateway.sensors[msg.node_id].sketch_name, msg.node_id, - child.id) - if isinstance(entity_class, dict): - device_class = entity_class[child.type] - else: - device_class = entity_class - devices[key] = device_class( - gateway, msg.node_id, child.id, name, msg.sub_type) - if add_devices: - _LOGGER.info('Adding new devices: %s', [devices[key]]) - add_devices([devices[key]], True) - else: - devices[key].update() return mysensors_callback diff --git a/requirements_all.txt b/requirements_all.txt index 017df5e87dd5e1..13d3939a87f9ca 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -314,7 +314,7 @@ https://github.com/tfriedel/python-lightify/archive/d6eadcf311e6e21746182d1480e9 https://github.com/thecynic/pylutron/archive/v0.1.0.zip#pylutron==0.1.0 # homeassistant.components.mysensors -https://github.com/theolind/pymysensors/archive/ff3476b70edc9c995b939cddb9d51f8d2d018581.zip#pymysensors==0.9.0 +https://github.com/theolind/pymysensors/archive/c6990eaaa741444a638608e6e00488195e2ca74c.zip#pymysensors==0.9.1 # homeassistant.components.sensor.modem_callerid https://github.com/vroomfonde1/basicmodem/archive/0.7.zip#basicmodem==0.7 From 4d9e681fc1820b5e7daa56ff81313a2fe26bf91a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 11 Apr 2017 19:50:43 -0700 Subject: [PATCH 052/146] Constrain chardet to 2.3 (#7063) --- homeassistant/package_constraints.txt | 1 + requirements_all.txt | 1 + setup.py | 1 + 3 files changed, 3 insertions(+) diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index a8e8df3d250c70..b21a938a1a1cc8 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -7,3 +7,4 @@ voluptuous==0.9.3 typing>=3,<4 aiohttp==2.0.5 async_timeout==1.2.0 +chardet==2.3 diff --git a/requirements_all.txt b/requirements_all.txt index 13d3939a87f9ca..147f4462efac70 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -8,6 +8,7 @@ voluptuous==0.9.3 typing>=3,<4 aiohttp==2.0.5 async_timeout==1.2.0 +chardet==2.3 # homeassistant.components.nuimo_controller --only-binary=all http://github.com/getSenic/nuimo-linux-python/archive/29fc42987f74d8090d0e2382e8f248ff5990b8c9.zip#nuimo==1.0.0 diff --git a/setup.py b/setup.py index cdc4c43e7a207d..b9ef099a1adea3 100755 --- a/setup.py +++ b/setup.py @@ -24,6 +24,7 @@ 'typing>=3,<4', 'aiohttp==2.0.5', 'async_timeout==1.2.0', + 'chardet==2.3' ] setup( From 3c35d5ea5801f2a7d806449c681bbedc11c8c3e1 Mon Sep 17 00:00:00 2001 From: micw Date: Wed, 12 Apr 2017 04:51:07 +0200 Subject: [PATCH 053/146] Fix/slugify with german umlaut ss (#7029) * more tests for slugify * Fix german umlauts in slugify * Update __init__.py --- homeassistant/util/__init__.py | 11 +++++++++-- tests/util/test_init.py | 1 + 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/homeassistant/util/__init__.py b/homeassistant/util/__init__.py index 6d77f67161dcd0..1186892b512c97 100644 --- a/homeassistant/util/__init__.py +++ b/homeassistant/util/__init__.py @@ -22,6 +22,9 @@ RE_SANITIZE_FILENAME = re.compile(r'(~|\.\.|/|\\)') RE_SANITIZE_PATH = re.compile(r'(~|\.(\.)+)') RE_SLUGIFY = re.compile(r'[^a-z0-9_]+') +TBL_SLUGIFY = { + ord('ß'): 'ss' +} def sanitize_filename(filename: str) -> str: @@ -36,9 +39,13 @@ def sanitize_path(path: str) -> str: def slugify(text: str) -> str: """Slugify a given text.""" - text = normalize('NFKD', text).lower().replace(" ", "_") + text = normalize('NFKD', text) + text = text.lower() + text = text.replace(" ", "_") + text = text.translate(TBL_SLUGIFY) + text = RE_SLUGIFY.sub("", text) - return RE_SLUGIFY.sub("", text) + return text def repr_helper(inp: Any) -> str: diff --git a/tests/util/test_init.py b/tests/util/test_init.py index 3ccb72920d4625..ba8415d597fac8 100644 --- a/tests/util/test_init.py +++ b/tests/util/test_init.py @@ -37,6 +37,7 @@ def test_slugify(self): util.slugify("greg_phone - exp_wayp1")) self.assertEqual("we_are_we_are_a_test_calendar", util.slugify("We are, we are, a... Test Calendar")) + self.assertEqual("test_aouss_aou", util.slugify("Tèst_äöüß_ÄÖÜ")) def test_repr_helper(self): """Test repr_helper.""" From 72a01b8a9063e4ad6a91aa6e5924f019f7c8780f Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 11 Apr 2017 19:58:54 -0700 Subject: [PATCH 054/146] Speed up aiohttp (#7064) --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 8c7ab8a9039280..cd219b2408475b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -21,7 +21,7 @@ RUN virtualization/Docker/setup_docker_prereqs # Install hass component dependencies COPY requirements_all.txt requirements_all.txt RUN pip3 install --no-cache-dir -r requirements_all.txt && \ - pip3 install --no-cache-dir mysqlclient psycopg2 uvloop + pip3 install --no-cache-dir mysqlclient psycopg2 uvloop cchardet # Copy source COPY . . From edf500e66b9122837c2e46f4615a89aa058e10ec Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 11 Apr 2017 20:10:02 -0700 Subject: [PATCH 055/146] Upgrade netdisco to 1.0.0rc2 (#7008) * Upgrade netdisco to 1.0.0rc2 * fix tests --- homeassistant/components/discovery.py | 3 +- homeassistant/components/light/flux_led.py | 14 ---------- homeassistant/components/light/hue.py | 7 ++--- .../components/media_player/apple_tv.py | 2 +- homeassistant/components/media_player/cast.py | 10 ++++--- .../components/media_player/denonavr.py | 4 +-- .../components/media_player/directv.py | 13 +++++---- .../media_player/frontier_silicon.py | 3 +- .../components/media_player/openhome.py | 22 ++++++++------- .../media_player/panasonic_viera.py | 7 ++--- homeassistant/components/media_player/plex.py | 2 +- homeassistant/components/media_player/roku.py | 10 ++++--- .../components/media_player/samsungtv.py | 4 ++- .../components/media_player/sonos.py | 2 +- .../components/media_player/yamaha.py | 8 +++--- homeassistant/components/wemo.py | 3 +- requirements_all.txt | 2 +- tests/components/media_player/test_cast.py | 6 ++-- tests/components/media_player/test_sonos.py | 28 ++++++++++++++----- 19 files changed, 79 insertions(+), 71 deletions(-) diff --git a/homeassistant/components/discovery.py b/homeassistant/components/discovery.py index 891e34ee8a99c6..08190ed10024d2 100644 --- a/homeassistant/components/discovery.py +++ b/homeassistant/components/discovery.py @@ -20,7 +20,7 @@ from homeassistant.helpers.discovery import async_load_platform, async_discover import homeassistant.util.dt as dt_util -REQUIREMENTS = ['netdisco==0.9.2'] +REQUIREMENTS = ['netdisco==1.0.0rc2'] DOMAIN = 'discovery' @@ -45,7 +45,6 @@ 'denonavr': ('media_player', 'denonavr'), 'samsung_tv': ('media_player', 'samsungtv'), 'yeelight': ('light', 'yeelight'), - 'flux_led': ('light', 'flux_led'), 'apple_tv': ('media_player', 'apple_tv'), 'frontier_silicon': ('media_player', 'frontier_silicon'), 'openhome': ('media_player', 'openhome'), diff --git a/homeassistant/components/light/flux_led.py b/homeassistant/components/light/flux_led.py index 22bfd5eb6f9f35..f599d788994bfd 100644 --- a/homeassistant/components/light/flux_led.py +++ b/homeassistant/components/light/flux_led.py @@ -108,20 +108,6 @@ def setup_platform(hass, config, add_devices, discovery_info=None): lights.append(light) light_ips.append(ipaddr) - if discovery_info: - device = {} - # discovery_info: ip address,device id,device type - device['ipaddr'] = discovery_info[0] - device['name'] = discovery_info[1] - # As we don't know protocol and mode set to none to autodetect. - device[CONF_PROTOCOL] = None - device[ATTR_MODE] = None - - light = FluxLight(device) - if light.is_valid: - lights.append(light) - light_ips.append(device['ipaddr']) - if not config.get(CONF_AUTOMATIC_ADD, False): add_devices(lights) return diff --git a/homeassistant/components/light/hue.py b/homeassistant/components/light/hue.py index 31ec88f3c97669..22e2541b271deb 100644 --- a/homeassistant/components/light/hue.py +++ b/homeassistant/components/light/hue.py @@ -10,7 +10,6 @@ import random import socket from datetime import timedelta -from urllib.parse import urlparse import voluptuous as vol @@ -115,11 +114,11 @@ def setup_platform(hass, config, add_devices, discovery_info=None): allow_hue_groups = config.get(CONF_ALLOW_HUE_GROUPS) if discovery_info is not None: - host = urlparse(discovery_info[1]).hostname - - if "HASS Bridge" in discovery_info[0]: + if "HASS Bridge" in discovery_info.get('name', ''): _LOGGER.info('Emulated hue found, will not add') return False + + host = discovery_info.get('host') else: host = config.get(CONF_HOST, None) diff --git a/homeassistant/components/media_player/apple_tv.py b/homeassistant/components/media_player/apple_tv.py index 7a865cd2d8aa07..4059d81a671952 100644 --- a/homeassistant/components/media_player/apple_tv.py +++ b/homeassistant/components/media_player/apple_tv.py @@ -51,7 +51,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): if discovery_info is not None: name = discovery_info['name'] host = discovery_info['host'] - login_id = discovery_info['hsgid'] + login_id = discovery_info['properties']['hsgid'] start_off = False else: name = config.get(CONF_NAME) diff --git a/homeassistant/components/media_player/cast.py b/homeassistant/components/media_player/cast.py index c2aa8a0bcca5ba..148cdee1d48702 100644 --- a/homeassistant/components/media_player/cast.py +++ b/homeassistant/components/media_player/cast.py @@ -51,11 +51,13 @@ def setup_platform(hass, config, add_devices, discovery_info=None): hosts = [] - if discovery_info and discovery_info in KNOWN_HOSTS: - return + if discovery_info: + host = (discovery_info.get('host'), discovery_info.get('port')) - elif discovery_info: - hosts = [discovery_info] + if host in KNOWN_HOSTS: + return + + hosts = [host] elif CONF_HOST in config: hosts = [(config.get(CONF_HOST), DEFAULT_PORT)] diff --git a/homeassistant/components/media_player/denonavr.py b/homeassistant/components/media_player/denonavr.py index eba2d031158272..5e91a5418e2a2d 100644 --- a/homeassistant/components/media_player/denonavr.py +++ b/homeassistant/components/media_player/denonavr.py @@ -64,8 +64,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None): _LOGGER.info("Denon receiver at host %s initialized", host) # 2. option: discovery using netdisco if discovery_info is not None: - host = discovery_info[0] - name = discovery_info[1] + host = discovery_info.get('host') + name = discovery_info.get('name') # Check if host not in cache, append it and save for later starting if host not in cache: cache.add(host) diff --git a/homeassistant/components/media_player/directv.py b/homeassistant/components/media_player/directv.py index 035fe6d9cd68ea..ef3333d4da3cce 100644 --- a/homeassistant/components/media_player/directv.py +++ b/homeassistant/components/media_player/directv.py @@ -37,14 +37,15 @@ def setup_platform(hass, config, add_devices, discovery_info=None): """Setup the DirecTV platform.""" hosts = [] - if discovery_info and discovery_info in KNOWN_HOSTS: - return + if discovery_info: + host = discovery_info.get('host') + + if host in KNOWN_HOSTS: + return - if discovery_info is not None: hosts.append([ - 'DirecTV_' + discovery_info[1], - discovery_info[0], - DEFAULT_PORT + 'DirecTV_' + discovery_info.get('serial', ''), + host, DEFAULT_PORT ]) elif CONF_HOST in config: diff --git a/homeassistant/components/media_player/frontier_silicon.py b/homeassistant/components/media_player/frontier_silicon.py index 8bd36b4535cdce..f46d065760470a 100644 --- a/homeassistant/components/media_player/frontier_silicon.py +++ b/homeassistant/components/media_player/frontier_silicon.py @@ -47,7 +47,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None): if discovery_info is not None: add_devices( - [FSAPIDevice(discovery_info, DEFAULT_PASSWORD)], + [FSAPIDevice(discovery_info['ssdp_description'], + DEFAULT_PASSWORD)], update_before_add=True) return True diff --git a/homeassistant/components/media_player/openhome.py b/homeassistant/components/media_player/openhome.py index af58b4cb654855..c70822381a43ed 100644 --- a/homeassistant/components/media_player/openhome.py +++ b/homeassistant/components/media_player/openhome.py @@ -31,20 +31,22 @@ def setup_platform(hass, config, add_devices, discovery_info=None): """Setup Openhome Platform.""" from openhomedevice.Device import Device - if discovery_info: - _LOGGER.info('Openhome device found, (%s)', discovery_info[0]) - device = Device(discovery_info[1]) + if not discovery_info: + return True - # if device has already been discovered - if device.Uuid() in [x.unique_id for x in DEVICES]: - return True + name = discovery_info.get('name') + description = discovery_info.get('ssdp_description') + _LOGGER.info('Openhome device found, (%s)', name) + device = Device(description) - device = OpenhomeDevice(hass, device) + # if device has already been discovered + if device.Uuid() in [x.unique_id for x in DEVICES]: + return True - add_devices([device], True) - DEVICES.append(device) + device = OpenhomeDevice(hass, device) - return True + add_devices([device], True) + DEVICES.append(device) return True diff --git a/homeassistant/components/media_player/panasonic_viera.py b/homeassistant/components/media_player/panasonic_viera.py index 30672069558df5..a5f9979d2d486a 100644 --- a/homeassistant/components/media_player/panasonic_viera.py +++ b/homeassistant/components/media_player/panasonic_viera.py @@ -51,11 +51,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None): if discovery_info: _LOGGER.debug('%s', discovery_info) - vals = discovery_info.split(':') - if len(vals) > 1: - port = vals[1] - - host = vals[0] + host = discovery_info.get('host') + port = discovery_info.get('port') remote = RemoteControl(host, port) add_devices([PanasonicVieraTVDevice(mac, name, remote)]) return True diff --git a/homeassistant/components/media_player/plex.py b/homeassistant/components/media_player/plex.py index 66d4f02c5263f4..1b7eca36910aaf 100644 --- a/homeassistant/components/media_player/plex.py +++ b/homeassistant/components/media_player/plex.py @@ -102,7 +102,7 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): # Via discovery elif discovery_info is not None: # Parse discovery data - host = urlparse(discovery_info[1]).netloc + host = discovery_info.get('host') _LOGGER.info('Discovered PLEX server: %s', host) if host in _CONFIGURING: diff --git a/homeassistant/components/media_player/roku.py b/homeassistant/components/media_player/roku.py index a33f331b737af4..59e6a19bff8653 100644 --- a/homeassistant/components/media_player/roku.py +++ b/homeassistant/components/media_player/roku.py @@ -42,11 +42,13 @@ def setup_platform(hass, config, add_devices, discovery_info=None): """Setup the Roku platform.""" hosts = [] - if discovery_info and discovery_info in KNOWN_HOSTS: - return + if discovery_info: + host = discovery_info[0] - if discovery_info is not None: - _LOGGER.debug('Discovered Roku: %s', discovery_info[0]) + if host in KNOWN_HOSTS: + return + + _LOGGER.debug('Discovered Roku: %s', host) hosts.append(discovery_info[0]) elif CONF_HOST in config: diff --git a/homeassistant/components/media_player/samsungtv.py b/homeassistant/components/media_player/samsungtv.py index b71e37fda1917f..c99ad49577c0d0 100644 --- a/homeassistant/components/media_player/samsungtv.py +++ b/homeassistant/components/media_player/samsungtv.py @@ -58,7 +58,9 @@ def setup_platform(hass, config, add_devices, discovery_info=None): mac = config.get(CONF_MAC) timeout = config.get(CONF_TIMEOUT) elif discovery_info is not None: - tv_name, model, host = discovery_info + tv_name = discovery_info.get('name') + model = discovery_info.get('model_name') + host = discovery_info.get('host') name = "{} ({})".format(tv_name, model) port = DEFAULT_PORT timeout = DEFAULT_TIMEOUT diff --git a/homeassistant/components/media_player/sonos.py b/homeassistant/components/media_player/sonos.py index 0fc402caf6c17f..cd837948b46e2b 100644 --- a/homeassistant/components/media_player/sonos.py +++ b/homeassistant/components/media_player/sonos.py @@ -103,7 +103,7 @@ def setup_platform(hass, config, add_devices, discovery_info=None): soco.config.EVENT_ADVERTISE_IP = advertise_addr if discovery_info: - player = soco.SoCo(discovery_info) + player = soco.SoCo(discovery_info.get('host')) # if device allready exists by config if player.uid in [x.unique_id for x in hass.data[DATA_SONOS]]: diff --git a/homeassistant/components/media_player/yamaha.py b/homeassistant/components/media_player/yamaha.py index 928d15b595042a..243b96220c92ee 100644 --- a/homeassistant/components/media_player/yamaha.py +++ b/homeassistant/components/media_player/yamaha.py @@ -59,10 +59,10 @@ def setup_platform(hass, config, add_devices, discovery_info=None): zone_ignore = config.get(CONF_ZONE_IGNORE) if discovery_info is not None: - name = discovery_info[0] - model = discovery_info[1] - ctrl_url = discovery_info[2] - desc_url = discovery_info[3] + name = discovery_info.get('name') + model = discovery_info.get('model_name') + ctrl_url = discovery_info.get('control_url') + desc_url = discovery_info.get('description_url') if ctrl_url in hass.data[KNOWN]: _LOGGER.info("%s already manually configured", ctrl_url) return diff --git a/homeassistant/components/wemo.py b/homeassistant/components/wemo.py index 88008874628c1f..20c9f6eeca2674 100644 --- a/homeassistant/components/wemo.py +++ b/homeassistant/components/wemo.py @@ -62,7 +62,8 @@ def stop_wemo(event): def discovery_dispatch(service, discovery_info): """Dispatcher for WeMo discovery events.""" # name, model, location, mac - _, model_name, _, _, serial = discovery_info + model_name = discovery_info.get('model_name') + serial = discovery_info.get('serial') # Only register a device once if serial in KNOWN_DEVICES: diff --git a/requirements_all.txt b/requirements_all.txt index 147f4462efac70..49c13c1adc5e5e 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -393,7 +393,7 @@ mutagen==1.36.2 myusps==1.0.5 # homeassistant.components.discovery -netdisco==0.9.2 +netdisco==1.0.0rc2 # homeassistant.components.sensor.neurio_energy neurio==0.3.1 diff --git a/tests/components/media_player/test_cast.py b/tests/components/media_player/test_cast.py index 582f5f8eb1c639..c29d41cc59017b 100644 --- a/tests/components/media_player/test_cast.py +++ b/tests/components/media_player/test_cast.py @@ -37,6 +37,8 @@ def test_filter_duplicates(self, mock_get_chromecasts, mock_device): assert not mock_device.called # Test chromecasts as if they were automatically discovered - cast.setup_platform(None, {}, lambda _: _, ('some_host', - cast.DEFAULT_PORT)) + cast.setup_platform(None, {}, lambda _: _, { + 'host': 'some_host', + 'port': cast.DEFAULT_PORT, + }) assert not mock_device.called diff --git a/tests/components/media_player/test_sonos.py b/tests/components/media_player/test_sonos.py index c157b8651a40d4..0a111ef3b364aa 100644 --- a/tests/components/media_player/test_sonos.py +++ b/tests/components/media_player/test_sonos.py @@ -143,7 +143,9 @@ def tearDown(self): @mock.patch('socket.create_connection', side_effect=socket.error()) def test_ensure_setup_discovery(self, *args): """Test a single device using the autodiscovery provided by HASS.""" - sonos.setup_platform(self.hass, {}, fake_add_device, '192.0.2.1') + sonos.setup_platform(self.hass, {}, fake_add_device, { + 'host': '192.0.2.1' + }) self.assertEqual(len(self.hass.data[sonos.DATA_SONOS]), 1) self.assertEqual(self.hass.data[sonos.DATA_SONOS][0].name, 'Kitchen') @@ -250,7 +252,9 @@ def test_ensure_setup_sonos_discovery(self, *args): @mock.patch.object(SoCoMock, 'join') def test_sonos_group_players(self, join_mock, *args): """Ensuring soco methods called for sonos_group_players service.""" - sonos.setup_platform(self.hass, {}, fake_add_device, '192.0.2.1') + sonos.setup_platform(self.hass, {}, fake_add_device, { + 'host': '192.0.2.1' + }) device = self.hass.data[sonos.DATA_SONOS][-1] device.hass = self.hass @@ -268,7 +272,9 @@ def test_sonos_group_players(self, join_mock, *args): @mock.patch.object(SoCoMock, 'unjoin') def test_sonos_unjoin(self, unjoinMock, *args): """Ensuring soco methods called for sonos_unjoin service.""" - sonos.setup_platform(self.hass, {}, fake_add_device, '192.0.2.1') + sonos.setup_platform(self.hass, {}, fake_add_device, { + 'host': '192.0.2.1' + }) device = self.hass.data[sonos.DATA_SONOS][-1] device.hass = self.hass @@ -282,7 +288,9 @@ def test_sonos_unjoin(self, unjoinMock, *args): @mock.patch.object(SoCoMock, 'set_sleep_timer') def test_sonos_set_sleep_timer(self, set_sleep_timerMock, *args): """Ensuring soco methods called for sonos_set_sleep_timer service.""" - sonos.setup_platform(self.hass, {}, fake_add_device, '192.0.2.1') + sonos.setup_platform(self.hass, {}, fake_add_device, { + 'host': '192.0.2.1' + }) device = self.hass.data[sonos.DATA_SONOS][-1] device.hass = self.hass @@ -294,7 +302,9 @@ def test_sonos_set_sleep_timer(self, set_sleep_timerMock, *args): @mock.patch.object(SoCoMock, 'set_sleep_timer') def test_sonos_clear_sleep_timer(self, set_sleep_timerMock, *args): """Ensuring soco methods called for sonos_clear_sleep_timer service.""" - sonos.setup_platform(self.hass, {}, mock.MagicMock(), '192.0.2.1') + sonos.setup_platform(self.hass, {}, mock.MagicMock(), { + 'host': '192.0.2.1' + }) device = self.hass.data[sonos.DATA_SONOS][-1] device.hass = self.hass @@ -306,7 +316,9 @@ def test_sonos_clear_sleep_timer(self, set_sleep_timerMock, *args): @mock.patch.object(soco.snapshot.Snapshot, 'snapshot') def test_sonos_snapshot(self, snapshotMock, *args): """Ensuring soco methods called for sonos_snapshot service.""" - sonos.setup_platform(self.hass, {}, fake_add_device, '192.0.2.1') + sonos.setup_platform(self.hass, {}, fake_add_device, { + 'host': '192.0.2.1' + }) device = self.hass.data[sonos.DATA_SONOS][-1] device.hass = self.hass @@ -322,7 +334,9 @@ def test_sonos_restore(self, restoreMock, *args): """Ensuring soco methods called for sonos_restor service.""" from soco.snapshot import Snapshot - sonos.setup_platform(self.hass, {}, fake_add_device, '192.0.2.1') + sonos.setup_platform(self.hass, {}, fake_add_device, { + 'host': '192.0.2.1' + }) device = self.hass.data[sonos.DATA_SONOS][-1] device.hass = self.hass From 7cb8f49d62fc47f0edabf9b7d1d484cb07a38341 Mon Sep 17 00:00:00 2001 From: sander76 Date: Wed, 12 Apr 2017 06:10:56 +0200 Subject: [PATCH 056/146] Telegram bot component (incl. webhook and polling platform) (#6913) * first commit. * removed pointless string statement * manually removed # homeassistant.components.telegram_webhooks from requirements_all.txt * deleted obsolete file. * coveragerc abc --- .coveragerc | 2 +- .../components/telegram_bot/__init__.py | 131 ++++++++++++++++ .../components/telegram_bot/polling.py | 121 +++++++++++++++ .../components/telegram_bot/webhooks.py | 97 ++++++++++++ homeassistant/components/telegram_webhooks.py | 143 ------------------ requirements_all.txt | 3 +- 6 files changed, 352 insertions(+), 145 deletions(-) create mode 100644 homeassistant/components/telegram_bot/__init__.py create mode 100644 homeassistant/components/telegram_bot/polling.py create mode 100644 homeassistant/components/telegram_bot/webhooks.py delete mode 100644 homeassistant/components/telegram_webhooks.py diff --git a/.coveragerc b/.coveragerc index a8e771c9ad27f6..578276cac4316e 100644 --- a/.coveragerc +++ b/.coveragerc @@ -431,7 +431,7 @@ omit = homeassistant/components/switch/tplink.py homeassistant/components/switch/transmission.py homeassistant/components/switch/wake_on_lan.py - homeassistant/components/telegram_webhooks.py + homeassistant/components/telegram_bot/* homeassistant/components/thingspeak.py homeassistant/components/tts/amazon_polly.py homeassistant/components/tts/picotts.py diff --git a/homeassistant/components/telegram_bot/__init__.py b/homeassistant/components/telegram_bot/__init__.py new file mode 100644 index 00000000000000..92a87153d99b72 --- /dev/null +++ b/homeassistant/components/telegram_bot/__init__.py @@ -0,0 +1,131 @@ +""" +Component to receive telegram messages. + +Either by polling or webhook. +""" + +import asyncio +import logging +import voluptuous as vol +import homeassistant.helpers.config_validation as cv +from homeassistant.const import CONF_PLATFORM, CONF_API_KEY +from homeassistant.exceptions import HomeAssistantError +from homeassistant.helpers import discovery, config_per_platform +from homeassistant.setup import async_prepare_setup_platform + +DOMAIN = 'telegram_bot' + +_LOGGER = logging.getLogger(__name__) + +EVENT_TELEGRAM_COMMAND = 'telegram_command' +EVENT_TELEGRAM_TEXT = 'telegram_text' + +ATTR_COMMAND = 'command' +ATTR_USER_ID = 'user_id' +ATTR_ARGS = 'args' +ATTR_FROM_FIRST = 'from_first' +ATTR_FROM_LAST = 'from_last' +ATTR_TEXT = 'text' + +CONF_ALLOWED_CHAT_IDS = 'allowed_chat_ids' + +PLATFORM_SCHEMA = vol.Schema({ + vol.Required(CONF_PLATFORM): cv.string, + vol.Required(CONF_API_KEY): cv.string, + vol.Required(CONF_ALLOWED_CHAT_IDS): vol.All(cv.ensure_list, + [cv.positive_int]) +}, extra=vol.ALLOW_EXTRA) + + +@asyncio.coroutine +def async_setup(hass, config): + """Setup the telegram bot component.""" + @asyncio.coroutine + def async_setup_platform(p_type, p_config=None, discovery_info=None): + """Setup a telegram bot platform.""" + platform = yield from async_prepare_setup_platform( + hass, config, DOMAIN, p_type) + + if platform is None: + _LOGGER.error("Unknown notification service specified") + return + + _LOGGER.info("Setting up1 %s.%s", DOMAIN, p_type) + + try: + if hasattr(platform, 'async_setup_platform'): + notify_service = yield from \ + platform.async_setup_platform(hass, p_config, + discovery_info) + elif hasattr(platform, 'setup_platform'): + notify_service = yield from hass.loop.run_in_executor( + None, platform.setup_platform, hass, p_config, + discovery_info) + else: + raise HomeAssistantError("Invalid telegram bot platform.") + + if notify_service is None: + _LOGGER.error( + "Failed to initialize telegram bot %s", p_type) + return + + except Exception: # pylint: disable=broad-except + _LOGGER.exception('Error setting up platform %s', p_type) + return + + return True + + setup_tasks = [async_setup_platform(p_type, p_config) for p_type, p_config + in config_per_platform(config, DOMAIN)] + + if setup_tasks: + yield from asyncio.wait(setup_tasks, loop=hass.loop) + + @asyncio.coroutine + def async_platform_discovered(platform, info): + """Callback to load a platform.""" + yield from async_setup_platform(platform, discovery_info=info) + + discovery.async_listen_platform(hass, DOMAIN, async_platform_discovered) + + return True + + +class BaseTelegramBotEntity: + """The base class for the telegram bot.""" + + def __init__(self, hass, allowed_chat_ids): + """Initialize the bot base class.""" + self.allowed_chat_ids = allowed_chat_ids + self.hass = hass + + def process_message(self, data): + """Check for basic message rules and fire an event if message is ok.""" + data = data.get('message') + + if (not data + or 'from' not in data + or 'text' not in data + or data['from'].get('id') not in self.allowed_chat_ids): + # Message is not correct. + _LOGGER.error("Incoming message does not have required data.") + return False + + event = EVENT_TELEGRAM_COMMAND + event_data = { + ATTR_USER_ID: data['from']['id'], + ATTR_FROM_FIRST: data['from']['first_name'], + ATTR_FROM_LAST: data['from']['last_name']} + + if data['text'][0] == '/': + pieces = data['text'].split(' ') + event_data[ATTR_COMMAND] = pieces[0] + event_data[ATTR_ARGS] = pieces[1:] + + else: + event_data[ATTR_TEXT] = data['text'] + event = EVENT_TELEGRAM_TEXT + + self.hass.bus.async_fire(event, event_data) + + return True diff --git a/homeassistant/components/telegram_bot/polling.py b/homeassistant/components/telegram_bot/polling.py new file mode 100644 index 00000000000000..3e0dfa893751fc --- /dev/null +++ b/homeassistant/components/telegram_bot/polling.py @@ -0,0 +1,121 @@ +"""Telegram bot polling implementation.""" + +import asyncio +from asyncio.futures import CancelledError +import logging + +import async_timeout +from aiohttp.client_exceptions import ClientError + +from homeassistant.components.telegram_bot import CONF_ALLOWED_CHAT_IDS, \ + BaseTelegramBotEntity, PLATFORM_SCHEMA +from homeassistant.const import EVENT_HOMEASSISTANT_START, \ + EVENT_HOMEASSISTANT_STOP, CONF_API_KEY +from homeassistant.core import callback +from homeassistant.helpers.aiohttp_client import async_get_clientsession + +_LOGGER = logging.getLogger(__name__) + +REQUIREMENTS = ['python-telegram-bot==5.3.0'] + +PLATFORM_SCHEMA = PLATFORM_SCHEMA + + +@asyncio.coroutine +def async_setup_platform(hass, config, async_add_devices, discovery_info=None): + """Setup the polling platform.""" + import telegram + bot = telegram.Bot(config[CONF_API_KEY]) + pol = TelegramPoll(bot, hass, config[CONF_ALLOWED_CHAT_IDS]) + + @callback + def _start_bot(_event): + """Start the bot.""" + pol.start_polling() + + @callback + def _stop_bot(_event): + """Stop the bot.""" + pol.stop_polling() + + hass.bus.async_listen_once( + EVENT_HOMEASSISTANT_START, + _start_bot + ) + hass.bus.async_listen_once( + EVENT_HOMEASSISTANT_STOP, + _stop_bot + ) + + return True + + +class TelegramPoll(BaseTelegramBotEntity): + """asyncio telegram incoming message handler.""" + + def __init__(self, bot, hass, allowed_chat_ids): + """Initialize the polling instance.""" + BaseTelegramBotEntity.__init__(self, hass, allowed_chat_ids) + self.update_id = 0 + self.websession = async_get_clientsession(hass) + self.update_url = '{0}/getUpdates'.format(bot.base_url) + self.polling_task = None # The actuall polling task. + self.timeout = 15 # async post timeout + # polling timeout should always be less than async post timeout. + self.post_data = {'timeout': self.timeout - 5} + + def start_polling(self): + """Start the polling task.""" + self.polling_task = self.hass.async_add_job(self.check_incoming()) + + def stop_polling(self): + """Stop the polling task.""" + self.polling_task.cancel() + + @asyncio.coroutine + def get_updates(self, offset): + """Bypass the default long polling method to enable asyncio.""" + resp = None + _json = [] # The actual value to be returned. + + if offset: + self.post_data['offset'] = offset + try: + with async_timeout.timeout(self.timeout, loop=self.hass.loop): + resp = yield from self.websession.post( + self.update_url, data=self.post_data, + headers={'connection': 'keep-alive'} + ) + if resp.status != 200: + _LOGGER.error("Error %s on %s", resp.status, self.update_url) + _json = yield from resp.json() + except ValueError: + _LOGGER.error("Error parsing Json message") + except (asyncio.TimeoutError, ClientError): + _LOGGER.error("Client connection error") + finally: + if resp is not None: + yield from resp.release() + + return _json + + @asyncio.coroutine + def handle(self): + """" Receiving and processing incoming messages.""" + _updates = yield from self.get_updates(self.update_id) + for update in _updates['result']: + self.update_id = update['update_id'] + 1 + self.process_message(update) + + @asyncio.coroutine + def check_incoming(self): + """"Loop which continuously checks for incoming telegram messages.""" + try: + while True: + # Each handle call sends a long polling post request + # to the telegram server. If no incoming message it will return + # an empty list. Calling self.handle() without any delay or + # timeout will for this reason not really stress the processor. + yield from self.handle() + except CancelledError: + _LOGGER.debug("Stopping telegram polling bot") diff --git a/homeassistant/components/telegram_bot/webhooks.py b/homeassistant/components/telegram_bot/webhooks.py new file mode 100644 index 00000000000000..3ffc03780bd870 --- /dev/null +++ b/homeassistant/components/telegram_bot/webhooks.py @@ -0,0 +1,97 @@ +""" +Allows utilizing telegram webhooks. + +See https://core.telegram.org/bots/webhooks for details + about webhooks. + +""" +import asyncio +import logging +from ipaddress import ip_network + +import voluptuous as vol + + +from homeassistant.const import ( + HTTP_BAD_REQUEST, HTTP_UNAUTHORIZED) +import homeassistant.helpers.config_validation as cv +from homeassistant.components.http import HomeAssistantView +from homeassistant.components.telegram_bot import CONF_ALLOWED_CHAT_IDS, \ + BaseTelegramBotEntity, PLATFORM_SCHEMA +from homeassistant.const import CONF_API_KEY +from homeassistant.components.http.util import get_real_ip + +DEPENDENCIES = ['http'] +REQUIREMENTS = ['python-telegram-bot==5.3.0'] + +_LOGGER = logging.getLogger(__name__) + +TELEGRAM_HANDLER_URL = '/api/telegram_webhooks' + +CONF_TRUSTED_NETWORKS = 'trusted_networks' +DEFAULT_TRUSTED_NETWORKS = [ + ip_network('149.154.167.197/32'), + ip_network('149.154.167.198/31'), + ip_network('149.154.167.200/29'), + ip_network('149.154.167.208/28'), + ip_network('149.154.167.224/29'), + ip_network('149.154.167.232/31') +] + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Optional(CONF_TRUSTED_NETWORKS, default=DEFAULT_TRUSTED_NETWORKS): + vol.All(cv.ensure_list, [ip_network]) +}) + + +def setup_platform(hass, config, async_add_devices, discovery_info=None): + """Setup the polling platform.""" + import telegram + bot = telegram.Bot(config[CONF_API_KEY]) + + current_status = bot.getWebhookInfo() + handler_url = "{0}{1}".format(hass.config.api.base_url, + TELEGRAM_HANDLER_URL) + if current_status and current_status['url'] != handler_url: + if bot.setWebhook(handler_url): + _LOGGER.info("set new telegram webhook %s", handler_url) + + hass.http.register_view( + BotPushReceiver( + hass, + config[CONF_ALLOWED_CHAT_IDS], + config[CONF_TRUSTED_NETWORKS])) + + else: + _LOGGER.error("set telegram webhook failed %s", handler_url) + + +class BotPushReceiver(HomeAssistantView, BaseTelegramBotEntity): + """Handle pushes from telegram.""" + + requires_auth = False + url = TELEGRAM_HANDLER_URL + name = "telegram_webhooks" + + def __init__(self, hass, allowed_chat_ids, trusted_networks): + """Initialize the class.""" + BaseTelegramBotEntity.__init__(self, hass, allowed_chat_ids) + self.trusted_networks = trusted_networks + + @asyncio.coroutine + def post(self, request): + """Accept the POST from telegram.""" + real_ip = get_real_ip(request) + if not any(real_ip in net for net in self.trusted_networks): + _LOGGER.warning("Access denied from %s", real_ip) + return self.json_message('Access denied', HTTP_UNAUTHORIZED) + + try: + data = yield from request.json() + except ValueError: + return self.json_message('Invalid JSON', HTTP_BAD_REQUEST) + + if not self.process_message(data): + return self.json_message('Invalid message', HTTP_BAD_REQUEST) + else: + return self.json({}) diff --git a/homeassistant/components/telegram_webhooks.py b/homeassistant/components/telegram_webhooks.py deleted file mode 100644 index f952145f822d14..00000000000000 --- a/homeassistant/components/telegram_webhooks.py +++ /dev/null @@ -1,143 +0,0 @@ -""" -Allows utilizing telegram webhooks. - -See https://core.telegram.org/bots/webhooks for details - about webhooks. - -""" -import asyncio -import logging -from ipaddress import ip_network - -import voluptuous as vol - -from homeassistant.const import ( - HTTP_BAD_REQUEST, HTTP_UNAUTHORIZED) -import homeassistant.helpers.config_validation as cv -from homeassistant.components.http import HomeAssistantView -from homeassistant.const import CONF_API_KEY -from homeassistant.components.http.util import get_real_ip - -DOMAIN = 'telegram_webhooks' -DEPENDENCIES = ['http'] -REQUIREMENTS = ['python-telegram-bot==5.3.0'] - -_LOGGER = logging.getLogger(__name__) - -EVENT_TELEGRAM_COMMAND = 'telegram_command' -EVENT_TELEGRAM_TEXT = 'telegram_text' - -TELEGRAM_HANDLER_URL = '/api/telegram_webhooks' - -CONF_USER_ID = 'user_id' -CONF_TRUSTED_NETWORKS = 'trusted_networks' -DEFAULT_TRUSTED_NETWORKS = [ - ip_network('149.154.167.197/32'), - ip_network('149.154.167.198/31'), - ip_network('149.154.167.200/29'), - ip_network('149.154.167.208/28'), - ip_network('149.154.167.224/29'), - ip_network('149.154.167.232/31') -] - -ATTR_COMMAND = 'command' -ATTR_TEXT = 'text' -ATTR_USER_ID = 'user_id' -ATTR_ARGS = 'args' - -CONFIG_SCHEMA = vol.Schema({ - DOMAIN: vol.Schema({ - vol.Optional(CONF_API_KEY): cv.string, - vol.Optional(CONF_TRUSTED_NETWORKS, default=DEFAULT_TRUSTED_NETWORKS): - vol.All(cv.ensure_list, [ip_network]), - vol.Required(CONF_USER_ID): {cv.string: cv.positive_int}, - }), -}, extra=vol.ALLOW_EXTRA) - - -def setup(hass, config): - """Setup the telegram_webhooks component. - - register webhook if API_KEY is specified - register /api/telegram_webhooks as web service for telegram bot - """ - import telegram - - conf = config[DOMAIN] - - if CONF_API_KEY in conf: - bot = telegram.Bot(conf[CONF_API_KEY]) - current_status = bot.getWebhookInfo() - _LOGGER.debug("telegram webhook status: %s", current_status) - handler_url = "{0}{1}".format(hass.config.api.base_url, - TELEGRAM_HANDLER_URL) - if current_status and current_status['url'] != handler_url: - if bot.setWebhook(handler_url): - _LOGGER.info("set new telegram webhook %s", handler_url) - else: - _LOGGER.error("set telegram webhook failed %s", handler_url) - - hass.http.register_view(BotPushReceiver(conf[CONF_USER_ID], - conf[CONF_TRUSTED_NETWORKS])) - return True - - -class BotPushReceiver(HomeAssistantView): - """Handle pushes from telegram.""" - - requires_auth = False - url = TELEGRAM_HANDLER_URL - name = "telegram_webhooks" - - def __init__(self, user_id_array, trusted_networks): - """Initialize users allowed to send messages to bot.""" - self.trusted_networks = trusted_networks - self.users = {user_id: dev_id for dev_id, user_id in - user_id_array.items()} - _LOGGER.debug("users allowed: %s", self.users) - - @asyncio.coroutine - def post(self, request): - """Accept the POST from telegram.""" - real_ip = get_real_ip(request) - if not any(real_ip in net for net in self.trusted_networks): - _LOGGER.warning("Access denied from %s", real_ip) - return self.json_message('Access denied', HTTP_UNAUTHORIZED) - - try: - data = yield from request.json() - except ValueError: - _LOGGER.error("Received telegram data: %s", data) - return self.json_message('Invalid JSON', HTTP_BAD_REQUEST) - - # check for basic message rules - data = data.get('message') - if not data or 'from' not in data or 'text' not in data: - return self.json({}) - - if data['from'].get('id') not in self.users: - _LOGGER.warning("User not allowed") - return self.json_message('Invalid user', HTTP_BAD_REQUEST) - - _LOGGER.debug("Received telegram data: %s", data) - if not data['text']: - _LOGGER.warning('no text') - return self.json({}) - - if data['text'][:1] == '/': - # telegram command "/blabla arg1 arg2 ..." - pieces = data['text'].split(' ') - - request.app['hass'].bus.async_fire(EVENT_TELEGRAM_COMMAND, { - ATTR_COMMAND: pieces[0], - ATTR_ARGS: " ".join(pieces[1:]), - ATTR_USER_ID: data['from']['id'], - }) - - # telegram text "bla bla" - request.app['hass'].bus.async_fire(EVENT_TELEGRAM_TEXT, { - ATTR_TEXT: data['text'], - ATTR_USER_ID: data['from']['id'], - }) - - return self.json({}) diff --git a/requirements_all.txt b/requirements_all.txt index 49c13c1adc5e5e..c1f8f1eec2ba93 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -632,8 +632,9 @@ python-pushover==0.2 # homeassistant.components.sensor.synologydsm python-synology==0.1.0 -# homeassistant.components.telegram_webhooks # homeassistant.components.notify.telegram +# homeassistant.components.telegram_bot.polling +# homeassistant.components.telegram_bot.webhooks python-telegram-bot==5.3.0 # homeassistant.components.sensor.twitch From f06cff35ff6647c962c2c1103b3d95fdda341856 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 12 Apr 2017 09:48:21 +0200 Subject: [PATCH 057/146] Upgrade paho-mqtt to 1.2.2 (#7066) --- homeassistant/components/mqtt/__init__.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/mqtt/__init__.py b/homeassistant/components/mqtt/__init__.py index e53209e3b4c058..0e8c666d147f6d 100644 --- a/homeassistant/components/mqtt/__init__.py +++ b/homeassistant/components/mqtt/__init__.py @@ -28,7 +28,7 @@ CONF_PASSWORD, CONF_PORT, CONF_PROTOCOL, CONF_PAYLOAD) from homeassistant.components.mqtt.server import HBMQTT_CONFIG_SCHEMA -REQUIREMENTS = ['paho-mqtt==1.2.1'] +REQUIREMENTS = ['paho-mqtt==1.2.2'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index c1f8f1eec2ba93..a37ecb1f775848 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -414,7 +414,7 @@ openhomedevice==0.2.1 orvibo==1.1.1 # homeassistant.components.mqtt -paho-mqtt==1.2.1 +paho-mqtt==1.2.2 # homeassistant.components.media_player.panasonic_viera panasonic_viera==0.2 From e026717239f1e7653fed6029c3dc7d967ef2c855 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Wed, 12 Apr 2017 09:51:19 +0200 Subject: [PATCH 058/146] Fix handling with register callbacks on added_to_hass (#7067) --- homeassistant/components/lutron_caseta.py | 6 ++++-- homeassistant/components/media_player/sonos.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/lutron_caseta.py b/homeassistant/components/lutron_caseta.py index 416c9f7fd003b5..5519240bc4938d 100644 --- a/homeassistant/components/lutron_caseta.py +++ b/homeassistant/components/lutron_caseta.py @@ -77,8 +77,10 @@ def __init__(self, device, bridge): @asyncio.coroutine def async_added_to_hass(self): """Register callbacks.""" - self._smartbridge.add_subscriber(self._device_id, - self._update_callback) + self.hass.async_add_job( + self._smartbridge.add_subscriber, self._device_id, + self._update_callback + ) def _update_callback(self): self.schedule_update_ha_state() diff --git a/homeassistant/components/media_player/sonos.py b/homeassistant/components/media_player/sonos.py index cd837948b46e2b..00cc52ab3a127f 100644 --- a/homeassistant/components/media_player/sonos.py +++ b/homeassistant/components/media_player/sonos.py @@ -292,7 +292,7 @@ def __init__(self, player): @asyncio.coroutine def async_added_to_hass(self): """Subscribe sonos events.""" - self.hass.loop.run_in_executor(None, self._subscribe_to_player_events) + self.hass.async_add_job(self._subscribe_to_player_events) @property def should_poll(self): From 9d20a176421609f6088dfe50dc2098edabb71ac5 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Wed, 12 Apr 2017 09:52:01 +0200 Subject: [PATCH 059/146] Lutron. Bugfix callback registration. (#7042) * Lutron. Bugfix callback registration. * Change handling to event --- homeassistant/components/light/lutron.py | 9 +++------ homeassistant/components/lutron.py | 16 ++++++++++------ 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/light/lutron.py b/homeassistant/components/light/lutron.py index 36742950b9c8b8..5322fd7948922c 100644 --- a/homeassistant/components/light/lutron.py +++ b/homeassistant/components/light/lutron.py @@ -14,12 +14,9 @@ # pylint: disable=unused-argument def setup_platform(hass, config, add_devices, discovery_info=None): """Setup Lutron lights.""" - area_devs = {} devs = [] for (area_name, device) in hass.data[LUTRON_DEVICES]['light']: - dev = LutronLight(hass, area_name, device, - hass.data[LUTRON_CONTROLLER]) - area_devs.setdefault(area_name, []).append(dev) + dev = LutronLight(area_name, device, hass.data[LUTRON_CONTROLLER]) devs.append(dev) add_devices(devs, True) @@ -39,10 +36,10 @@ def to_hass_level(level): class LutronLight(LutronDevice, Light): """Representation of a Lutron Light, including dimmable.""" - def __init__(self, hass, area_name, lutron_device, controller): + def __init__(self, area_name, lutron_device, controller): """Initialize the light.""" self._prev_brightness = None - LutronDevice.__init__(self, hass, area_name, lutron_device, controller) + LutronDevice.__init__(self, area_name, lutron_device, controller) @property def supported_features(self): diff --git a/homeassistant/components/lutron.py b/homeassistant/components/lutron.py index a428ea10cfa218..d5e889027d1aab 100644 --- a/homeassistant/components/lutron.py +++ b/homeassistant/components/lutron.py @@ -4,6 +4,7 @@ For more details about this component, please refer to the documentation at https://home-assistant.io/components/lutron/ """ +import asyncio import logging from homeassistant.helpers import discovery @@ -50,16 +51,19 @@ def setup(hass, base_config): class LutronDevice(Entity): """Representation of a Lutron device entity.""" - def __init__(self, hass, area_name, lutron_device, controller): + def __init__(self, area_name, lutron_device, controller): """Initialize the device.""" self._lutron_device = lutron_device self._controller = controller self._area_name = area_name - self.hass = hass - self.object_id = '{} {}'.format(area_name, lutron_device.name) - - self._controller.subscribe(self._lutron_device, self._update_callback) + @asyncio.coroutine + def async_add_to_hass(self): + """Register callbacks.""" + self.hass.async_add_job( + self._controller.subscribe, self._lutron_device, + self._update_callback + ) def _update_callback(self, _device): """Callback invoked by pylutron when the device state changes.""" @@ -68,7 +72,7 @@ def _update_callback(self, _device): @property def name(self): """Return the name of the device.""" - return self._lutron_device.name + return "{} {}".format(self._area_name, self._lutron_device.name) @property def should_poll(self): From f68542ba0d487c3ccf1f1c9447c8c0a995a43565 Mon Sep 17 00:00:00 2001 From: hawk259 Date: Wed, 12 Apr 2017 05:35:35 -0400 Subject: [PATCH 060/146] Adding AlarmDecoder platform (#6900) * Added AlarmDecoder platform * remove try/catch for generic execption * Changes for @pvizeli, thanks for the review! Removed _ prefix from normal function variables Removed _hass as it will be set via .hass for us Broke out the three config (socket, serial, usb) and use vol.Any Added support for USB I think, don't have device, but should work Removed components dictionary, was form old group all code that didn't work * Fix hass string handling --- .coveragerc | 3 + .../alarm_control_panel/alarmdecoder.py | 119 ++++++++++++ homeassistant/components/alarmdecoder.py | 171 ++++++++++++++++++ .../components/binary_sensor/alarmdecoder.py | 123 +++++++++++++ .../components/sensor/alarmdecoder.py | 75 ++++++++ requirements_all.txt | 3 + 6 files changed, 494 insertions(+) create mode 100644 homeassistant/components/alarm_control_panel/alarmdecoder.py create mode 100644 homeassistant/components/alarmdecoder.py create mode 100644 homeassistant/components/binary_sensor/alarmdecoder.py create mode 100644 homeassistant/components/sensor/alarmdecoder.py diff --git a/.coveragerc b/.coveragerc index 578276cac4316e..b2f6a21c84b5b4 100644 --- a/.coveragerc +++ b/.coveragerc @@ -8,6 +8,9 @@ omit = homeassistant/helpers/signal.py # omit pieces of code that rely on external devices being present + homeassistant/components/alarmdecoder.py + homeassistant/components/*/alarmdecoder.py + homeassistant/components/apcupsd.py homeassistant/components/*/apcupsd.py diff --git a/homeassistant/components/alarm_control_panel/alarmdecoder.py b/homeassistant/components/alarm_control_panel/alarmdecoder.py new file mode 100644 index 00000000000000..f176a87827b2d9 --- /dev/null +++ b/homeassistant/components/alarm_control_panel/alarmdecoder.py @@ -0,0 +1,119 @@ +""" +Support for AlarmDecoder-based alarm control panels (Honeywell/DSC). + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/alarm_control_panel.alarmdecoder/ +""" +import asyncio +import logging + +from homeassistant.core import callback +from homeassistant.helpers.dispatcher import async_dispatcher_connect +import homeassistant.components.alarm_control_panel as alarm + +from homeassistant.components.alarmdecoder import (DATA_AD, + SIGNAL_PANEL_MESSAGE) + +from homeassistant.const import ( + STATE_ALARM_ARMED_AWAY, STATE_ALARM_ARMED_HOME, STATE_ALARM_DISARMED, + STATE_UNKNOWN, STATE_ALARM_TRIGGERED) + +_LOGGER = logging.getLogger(__name__) + +DEPENDENCIES = ['alarmdecoder'] + + +@asyncio.coroutine +def async_setup_platform(hass, config, async_add_devices, discovery_info=None): + """Perform the setup for AlarmDecoder alarm panels.""" + _LOGGER.debug("AlarmDecoderAlarmPanel: setup") + + device = AlarmDecoderAlarmPanel("Alarm Panel", hass) + + async_add_devices([device]) + + return True + + +class AlarmDecoderAlarmPanel(alarm.AlarmControlPanel): + """Representation of an AlarmDecoder-based alarm panel.""" + + def __init__(self, name, hass): + """Initialize the alarm panel.""" + self._display = "" + self._name = name + self._state = STATE_UNKNOWN + + _LOGGER.debug("AlarmDecoderAlarm: Setting up panel") + + @asyncio.coroutine + def async_added_to_hass(self): + """Register callbacks.""" + async_dispatcher_connect( + self.hass, SIGNAL_PANEL_MESSAGE, self._message_callback) + + @callback + def _message_callback(self, message): + if message.alarm_sounding or message.fire_alarm: + if self._state != STATE_ALARM_TRIGGERED: + self._state = STATE_ALARM_TRIGGERED + self.hass.async_add_job(self.async_update_ha_state()) + elif message.armed_away: + if self._state != STATE_ALARM_ARMED_AWAY: + self._state = STATE_ALARM_ARMED_AWAY + self.hass.async_add_job(self.async_update_ha_state()) + elif message.armed_home: + if self._state != STATE_ALARM_ARMED_HOME: + self._state = STATE_ALARM_ARMED_HOME + self.hass.async_add_job(self.async_update_ha_state()) + else: + if self._state != STATE_ALARM_DISARMED: + self._state = STATE_ALARM_DISARMED + self.hass.async_add_job(self.async_update_ha_state()) + + @property + def name(self): + """Return the name of the device.""" + return self._name + + @property + def should_poll(self): + """No polling needed.""" + return False + + @property + def code_format(self): + """Regex for code format or None if no code is required.""" + return '^\\d{4,6}$' + + @property + def state(self): + """Return the state of the device.""" + return self._state + + @asyncio.coroutine + def async_alarm_disarm(self, code=None): + """Send disarm command.""" + _LOGGER.debug("AlarmDecoderAlarm::alarm_disarm: %s", code) + if code: + _LOGGER.debug("AlarmDecoderAlarm::alarm_disarm: sending %s1", + str(code)) + self.hass.data[DATA_AD].send("{!s}1".format(code)) + + @asyncio.coroutine + def async_alarm_arm_away(self, code=None): + """Send arm away command.""" + _LOGGER.debug("AlarmDecoderAlarm::alarm_arm_away: %s", code) + if code: + _LOGGER.debug("AlarmDecoderAlarm::alarm_arm_away: sending %s2", + str(code)) + self.hass.data[DATA_AD].send("{!s}2".format(code)) + + @asyncio.coroutine + def async_alarm_arm_home(self, code=None): + """Send arm home command.""" + _LOGGER.debug("AlarmDecoderAlarm::alarm_arm_home: %s", code) + if code: + _LOGGER.debug("AlarmDecoderAlarm::alarm_arm_home: sending %s3", + str(code)) + self.hass.data[DATA_AD].send("{!s}3".format(code)) diff --git a/homeassistant/components/alarmdecoder.py b/homeassistant/components/alarmdecoder.py new file mode 100644 index 00000000000000..ec99f2381e5fb3 --- /dev/null +++ b/homeassistant/components/alarmdecoder.py @@ -0,0 +1,171 @@ +""" +Support for AlarmDecoder devices. + +For more details about this component, please refer to the documentation at +https://home-assistant.io/components/alarmdecoder/ +""" +import asyncio +import logging + +import voluptuous as vol +import homeassistant.helpers.config_validation as cv + +from homeassistant.core import callback +from homeassistant.const import EVENT_HOMEASSISTANT_STOP + +from homeassistant.helpers.discovery import async_load_platform +from homeassistant.helpers.dispatcher import async_dispatcher_send + +REQUIREMENTS = ['alarmdecoder==0.12.1.0'] + +_LOGGER = logging.getLogger(__name__) + +DOMAIN = 'alarmdecoder' + +DATA_AD = 'alarmdecoder' + + +CONF_DEVICE = 'device' +CONF_DEVICE_TYPE = 'type' +CONF_DEVICE_HOST = 'host' +CONF_DEVICE_PORT = 'port' +CONF_DEVICE_PATH = 'path' +CONF_DEVICE_BAUD = 'baudrate' + +CONF_ZONES = 'zones' +CONF_ZONE_NAME = 'name' +CONF_ZONE_TYPE = 'type' + +CONF_PANEL_DISPLAY = 'panel_display' + +DEFAULT_DEVICE_TYPE = 'socket' +DEFAULT_DEVICE_HOST = 'localhost' +DEFAULT_DEVICE_PORT = 10000 +DEFAULT_DEVICE_PATH = '/dev/ttyUSB0' +DEFAULT_DEVICE_BAUD = 115200 + +DEFAULT_PANEL_DISPLAY = False + +DEFAULT_ZONE_TYPE = 'opening' + +SIGNAL_PANEL_MESSAGE = 'alarmdecoder.panel_message' +SIGNAL_PANEL_ARM_AWAY = 'alarmdecoder.panel_arm_away' +SIGNAL_PANEL_ARM_HOME = 'alarmdecoder.panel_arm_home' +SIGNAL_PANEL_DISARM = 'alarmdecoder.panel_disarm' + +SIGNAL_ZONE_FAULT = 'alarmdecoder.zone_fault' +SIGNAL_ZONE_RESTORE = 'alarmdecoder.zone_restore' + +DEVICE_SOCKET_SCHEMA = vol.Schema({ + vol.Required(CONF_DEVICE_TYPE): 'socket', + vol.Optional(CONF_DEVICE_HOST, default=DEFAULT_DEVICE_HOST): cv.string, + vol.Optional(CONF_DEVICE_PORT, default=DEFAULT_DEVICE_PORT): cv.port}) + +DEVICE_SERIAL_SCHEMA = vol.Schema({ + vol.Required(CONF_DEVICE_TYPE): 'serial', + vol.Optional(CONF_DEVICE_PATH, default=DEFAULT_DEVICE_PATH): cv.string, + vol.Optional(CONF_DEVICE_BAUD, default=DEFAULT_DEVICE_BAUD): cv.string}) + +DEVICE_USB_SCHEMA = vol.Schema({ + vol.Required(CONF_DEVICE_TYPE): 'usb'}) + +ZONE_SCHEMA = vol.Schema({ + vol.Required(CONF_ZONE_NAME): cv.string, + vol.Optional(CONF_ZONE_TYPE, default=DEFAULT_ZONE_TYPE): cv.string}) + +CONFIG_SCHEMA = vol.Schema({ + DOMAIN: vol.Schema({ + vol.Required(CONF_DEVICE): vol.Any(DEVICE_SOCKET_SCHEMA, + DEVICE_SERIAL_SCHEMA, + DEVICE_USB_SCHEMA), + vol.Optional(CONF_PANEL_DISPLAY, + default=DEFAULT_PANEL_DISPLAY): cv.boolean, + vol.Optional(CONF_ZONES): {vol.Coerce(int): ZONE_SCHEMA}, + }), +}, extra=vol.ALLOW_EXTRA) + + +@asyncio.coroutine +def async_setup(hass, config): + """Common setup for AlarmDecoder devices.""" + from alarmdecoder import AlarmDecoder + from alarmdecoder.devices import (SocketDevice, SerialDevice, USBDevice) + + conf = config.get(DOMAIN) + + device = conf.get(CONF_DEVICE) + display = conf.get(CONF_PANEL_DISPLAY) + zones = conf.get(CONF_ZONES) + + device_type = device.get(CONF_DEVICE_TYPE) + host = DEFAULT_DEVICE_HOST + port = DEFAULT_DEVICE_PORT + path = DEFAULT_DEVICE_PATH + baud = DEFAULT_DEVICE_BAUD + + sync_connect = asyncio.Future(loop=hass.loop) + + def handle_open(device): + """Callback for a successful connection.""" + _LOGGER.info("Established a connection with the alarmdecoder.") + hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, stop_alarmdecoder) + sync_connect.set_result(True) + + @callback + def stop_alarmdecoder(event): + """Callback to handle shutdown alarmdecoder.""" + _LOGGER.debug("Shutting down alarmdecoder.") + controller.close() + + @callback + def handle_message(sender, message): + """Callback to handle message from alarmdecoder.""" + async_dispatcher_send(hass, SIGNAL_PANEL_MESSAGE, message) + + def zone_fault_callback(sender, zone): + """Callback to handle zone fault from alarmdecoder.""" + async_dispatcher_send(hass, SIGNAL_ZONE_FAULT, zone) + + def zone_restore_callback(sender, zone): + """Callback to handle zone restore from alarmdecoder.""" + async_dispatcher_send(hass, SIGNAL_ZONE_RESTORE, zone) + + controller = False + if device_type == 'socket': + host = device.get(CONF_DEVICE_HOST) + port = device.get(CONF_DEVICE_PORT) + controller = AlarmDecoder(SocketDevice(interface=(host, port))) + elif device_type == 'serial': + path = device.get(CONF_DEVICE_PATH) + baud = device.get(CONF_DEVICE_BAUD) + controller = AlarmDecoder(SerialDevice(interface=path)) + elif device_type == 'usb': + AlarmDecoder(USBDevice.find()) + return False + + controller.on_open += handle_open + controller.on_message += handle_message + controller.on_zone_fault += zone_fault_callback + controller.on_zone_restore += zone_restore_callback + + hass.data[DATA_AD] = controller + + controller.open(baud) + + result = yield from sync_connect + + if not result: + return False + + hass.async_add_job(async_load_platform(hass, 'alarm_control_panel', DOMAIN, + conf, config)) + + if zones: + hass.async_add_job(async_load_platform( + hass, 'binary_sensor', DOMAIN, {CONF_ZONES: zones}, config)) + + if display: + hass.async_add_job(async_load_platform(hass, 'sensor', DOMAIN, + conf, config)) + + return True diff --git a/homeassistant/components/binary_sensor/alarmdecoder.py b/homeassistant/components/binary_sensor/alarmdecoder.py new file mode 100644 index 00000000000000..e6292128710929 --- /dev/null +++ b/homeassistant/components/binary_sensor/alarmdecoder.py @@ -0,0 +1,123 @@ +""" +Support for AlarmDecoder zone states- represented as binary sensors. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/binary_sensor.alarmdecoder/ +""" +import asyncio +import logging + +from homeassistant.core import callback +from homeassistant.helpers.dispatcher import async_dispatcher_connect +from homeassistant.components.binary_sensor import BinarySensorDevice + +from homeassistant.const import (STATE_ON, STATE_OFF, STATE_OPEN, STATE_CLOSED) +from homeassistant.components.alarmdecoder import (ZONE_SCHEMA, + CONF_ZONES, + CONF_ZONE_NAME, + CONF_ZONE_TYPE, + SIGNAL_ZONE_FAULT, + SIGNAL_ZONE_RESTORE) + + +DEPENDENCIES = ['alarmdecoder'] + +_LOGGER = logging.getLogger(__name__) + + +@asyncio.coroutine +def async_setup_platform(hass, config, async_add_devices, discovery_info=None): + """Setup AlarmDecoder binary sensor devices.""" + configured_zones = discovery_info[CONF_ZONES] + + devices = [] + + for zone_num in configured_zones: + device_config_data = ZONE_SCHEMA(configured_zones[zone_num]) + zone_type = device_config_data[CONF_ZONE_TYPE] + zone_name = device_config_data[CONF_ZONE_NAME] + device = AlarmDecoderBinarySensor(hass, + zone_num, + zone_name, + zone_type) + devices.append(device) + + async_add_devices(devices) + + return True + + +class AlarmDecoderBinarySensor(BinarySensorDevice): + """Representation of an AlarmDecoder binary sensor.""" + + def __init__(self, hass, zone_number, zone_name, zone_type): + """Initialize the binary_sensor.""" + self._zone_number = zone_number + self._zone_type = zone_type + self._state = 0 + self._name = zone_name + self._type = zone_type + + _LOGGER.debug('AlarmDecoderBinarySensor: Setup up zone: ' + zone_name) + + @asyncio.coroutine + def async_added_to_hass(self): + """Register callbacks.""" + async_dispatcher_connect( + self.hass, SIGNAL_ZONE_FAULT, self._fault_callback) + + async_dispatcher_connect( + self.hass, SIGNAL_ZONE_RESTORE, self._restore_callback) + + @property + def state(self): + """Return the state of the binary sensor.""" + if self._type == 'opening': + return STATE_OPEN if self.is_on else STATE_CLOSED + + return STATE_ON if self.is_on else STATE_OFF + + @property + def name(self): + """Return the name of the entity.""" + return self._name + + @property + def icon(self): + """Icon for device by its type.""" + if "window" in self._name.lower(): + return "mdi:window-open" if self.is_on else "mdi:window-closed" + + if self._type == 'smoke': + return "mdi:fire" + + return None + + @property + def should_poll(self): + """No polling needed.""" + return False + + @property + def is_on(self): + """Return true if sensor is on.""" + return self._state == 1 + + @property + def device_class(self): + """Return the class of this sensor, from DEVICE_CLASSES.""" + return self._zone_type + + @callback + def _fault_callback(self, zone): + """Update the zone's state, if needed.""" + if zone is None or int(zone) == self._zone_number: + self._state = 1 + self.hass.async_add_job(self.async_update_ha_state()) + + @callback + def _restore_callback(self, zone): + """Update the zone's state, if needed.""" + if zone is None or int(zone) == self._zone_number: + self._state = 0 + self.hass.async_add_job(self.async_update_ha_state()) diff --git a/homeassistant/components/sensor/alarmdecoder.py b/homeassistant/components/sensor/alarmdecoder.py new file mode 100644 index 00000000000000..88246cc0bc2218 --- /dev/null +++ b/homeassistant/components/sensor/alarmdecoder.py @@ -0,0 +1,75 @@ +""" +Support for AlarmDecoder Sensors (Shows Panel Display). + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/sensor.alarmdecoder/ +""" +import asyncio +import logging + +from homeassistant.core import callback +from homeassistant.helpers.dispatcher import async_dispatcher_connect +from homeassistant.helpers.entity import Entity + +from homeassistant.components.alarmdecoder import (SIGNAL_PANEL_MESSAGE) + +from homeassistant.const import (STATE_UNKNOWN) + +DEPENDENCIES = ['alarmdecoder'] + +_LOGGER = logging.getLogger(__name__) + + +@asyncio.coroutine +def async_setup_platform(hass, config, async_add_devices, discovery_info=None): + """Perform the setup for AlarmDecoder sensor devices.""" + _LOGGER.debug("AlarmDecoderSensor: async_setup_platform") + + device = AlarmDecoderSensor(hass) + + async_add_devices([device]) + + +class AlarmDecoderSensor(Entity): + """Representation of an AlarmDecoder keypad.""" + + def __init__(self, hass): + """Initialize the alarm panel.""" + self._display = "" + self._state = STATE_UNKNOWN + self._icon = 'mdi:alarm-check' + self._name = 'Alarm Panel Display' + + _LOGGER.debug("AlarmDecoderSensor: Setting up panel") + + @asyncio.coroutine + def async_added_to_hass(self): + """Register callbacks.""" + async_dispatcher_connect( + self.hass, SIGNAL_PANEL_MESSAGE, self._message_callback) + + @callback + def _message_callback(self, message): + if self._display != message.text: + self._display = message.text + self.hass.async_add_job(self.async_update_ha_state()) + + @property + def icon(self): + """Return the icon if any.""" + return self._icon + + @property + def state(self): + """Return the overall state.""" + return self._display + + @property + def name(self): + """Return the name of the device.""" + return self._name + + @property + def should_poll(self): + """No polling needed.""" + return False diff --git a/requirements_all.txt b/requirements_all.txt index a37ecb1f775848..cbecf913943eca 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -47,6 +47,9 @@ aiohttp_cors==0.5.2 # homeassistant.components.light.lifx aiolifx==0.4.4 +# homeassistant.components.alarmdecoder +alarmdecoder==0.12.1.0 + # homeassistant.components.camera.amcrest # homeassistant.components.sensor.amcrest amcrest==1.1.8 From d63028e44af753dd0df2e16273b0aa5e253fc859 Mon Sep 17 00:00:00 2001 From: John Arild Berentsen Date: Wed, 12 Apr 2017 19:09:29 +0200 Subject: [PATCH 061/146] Add communication data attributes to Zwave node_entity (#6813) * Add quality attribute to node * Move quality to node_entity * adjustments * Line lenght * flake8 * Cleanup and add each entry from getNodeStatistics as attribute * resolve conflict * Move NETWORK to hass.data * Test Done * Cleanup from review * Resolve conflicts * Review changes * Long lines.... * blank line * import-error-disable * Update tests Part1... Again * Hound * Argh! * Argh! * YABBADABBADOOOOOOO! * Enhance tests * hound * Resolve * resolve tests... --- homeassistant/components/cover/zwave.py | 13 +-- homeassistant/components/lock/zwave.py | 7 +- homeassistant/components/zwave/__init__.py | 61 ++++++------ homeassistant/components/zwave/node_entity.py | 17 +++- tests/components/cover/test_zwave.py | 52 ++++++---- tests/components/lock/test_zwave.py | 94 +++++++++---------- tests/components/zwave/test_init.py | 75 ++++++++------- tests/components/zwave/test_node_entity.py | 69 +++++++++++++- 8 files changed, 240 insertions(+), 148 deletions(-) diff --git a/homeassistant/components/cover/zwave.py b/homeassistant/components/cover/zwave.py index 3f26da183b5474..f860e52de95ebd 100644 --- a/homeassistant/components/cover/zwave.py +++ b/homeassistant/components/cover/zwave.py @@ -20,13 +20,13 @@ SUPPORT_GARAGE = SUPPORT_OPEN | SUPPORT_CLOSE -def get_device(values, node_config, **kwargs): +def get_device(hass, values, node_config, **kwargs): """Create zwave entity device.""" invert_buttons = node_config.get(zwave.CONF_INVERT_OPENCLOSE_BUTTONS) if (values.primary.command_class == zwave.const.COMMAND_CLASS_SWITCH_MULTILEVEL and values.primary.index == 0): - return ZwaveRollershutter(values, invert_buttons) + return ZwaveRollershutter(hass, values, invert_buttons) elif (values.primary.command_class in [ zwave.const.COMMAND_CLASS_SWITCH_BINARY, zwave.const.COMMAND_CLASS_BARRIER_OPERATOR]): @@ -37,10 +37,11 @@ def get_device(values, node_config, **kwargs): class ZwaveRollershutter(zwave.ZWaveDeviceEntity, CoverDevice): """Representation of an Zwave roller shutter.""" - def __init__(self, values, invert_buttons): + def __init__(self, hass, values, invert_buttons): """Initialize the zwave rollershutter.""" ZWaveDeviceEntity.__init__(self, values, DOMAIN) # pylint: disable=no-member + self._network = hass.data[zwave.ZWAVE_NETWORK] self._open_id = None self._close_id = None self._current_position = None @@ -90,11 +91,11 @@ def current_cover_position(self): def open_cover(self, **kwargs): """Move the roller shutter up.""" - zwave.NETWORK.manager.pressButton(self._open_id) + self._network.manager.pressButton(self._open_id) def close_cover(self, **kwargs): """Move the roller shutter down.""" - zwave.NETWORK.manager.pressButton(self._close_id) + self._network.manager.pressButton(self._close_id) def set_cover_position(self, position, **kwargs): """Move the roller shutter to a specific position.""" @@ -102,7 +103,7 @@ def set_cover_position(self, position, **kwargs): def stop_cover(self, **kwargs): """Stop the roller shutter.""" - zwave.NETWORK.manager.releaseButton(self._open_id) + self._network.manager.releaseButton(self._open_id) class ZwaveGarageDoor(zwave.ZWaveDeviceEntity, CoverDevice): diff --git a/homeassistant/components/lock/zwave.py b/homeassistant/components/lock/zwave.py index 676775aace5ec8..9a3e2e34fcc0eb 100644 --- a/homeassistant/components/lock/zwave.py +++ b/homeassistant/components/lock/zwave.py @@ -128,11 +128,12 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): descriptions = load_yaml_config_file( path.join(path.dirname(__file__), 'services.yaml')) + network = hass.data[zwave.ZWAVE_NETWORK] def set_usercode(service): """Set the usercode to index X on the lock.""" node_id = service.data.get(zwave.const.ATTR_NODE_ID) - lock_node = zwave.NETWORK.nodes[node_id] + lock_node = network.nodes[node_id] code_slot = service.data.get(ATTR_CODE_SLOT) usercode = service.data.get(ATTR_USERCODE) @@ -151,7 +152,7 @@ def set_usercode(service): def get_usercode(service): """Get a usercode at index X on the lock.""" node_id = service.data.get(zwave.const.ATTR_NODE_ID) - lock_node = zwave.NETWORK.nodes[node_id] + lock_node = network.nodes[node_id] code_slot = service.data.get(ATTR_CODE_SLOT) for value in lock_node.get_values( @@ -164,7 +165,7 @@ def get_usercode(service): def clear_usercode(service): """Set usercode to slot X on the lock.""" node_id = service.data.get(zwave.const.ATTR_NODE_ID) - lock_node = zwave.NETWORK.nodes[node_id] + lock_node = network.nodes[node_id] code_slot = service.data.get(ATTR_CODE_SLOT) data = '' diff --git a/homeassistant/components/zwave/__init__.py b/homeassistant/components/zwave/__init__.py index 38827bc55338e7..eb755dbf1b8404 100755 --- a/homeassistant/components/zwave/__init__.py +++ b/homeassistant/components/zwave/__init__.py @@ -65,8 +65,7 @@ DEFAULT_CONF_REFRESH_DELAY = 5 DATA_ZWAVE_DICT = 'zwave_devices' - -NETWORK = None +ZWAVE_NETWORK = 'zwave_network' RENAME_NODE_SCHEMA = vol.Schema({ vol.Required(const.ATTR_NODE_ID): vol.Coerce(int), @@ -200,7 +199,7 @@ def get_config_value(node, value_index, tries=5): @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Generic Z-Wave platform setup.""" - if discovery_info is None or NETWORK is None: + if discovery_info is None or ZWAVE_NETWORK not in hass.data: return False device = hass.data[DATA_ZWAVE_DICT].pop( @@ -218,9 +217,6 @@ def setup(hass, config): Will automatically load components to support devices found on the network. """ - # pylint: disable=global-statement, import-error - global NETWORK - descriptions = conf_util.load_yaml_config_file( os.path.join(os.path.dirname(__file__), 'services.yaml')) @@ -232,6 +228,7 @@ def setup(hass, config): "https://home-assistant.io/components/zwave/") return False from pydispatch import dispatcher + # pylint: disable=import-error from openzwave.option import ZWaveOption from openzwave.network import ZWaveNetwork from openzwave.group import ZWaveGroup @@ -257,7 +254,7 @@ def setup(hass, config): options.set_console_output(use_debug) options.lock() - NETWORK = ZWaveNetwork(options, autostart=False) + network = hass.data[ZWAVE_NETWORK] = ZWaveNetwork(options, autostart=False) hass.data[DATA_ZWAVE_DICT] = {} if use_debug: # pragma: no cover @@ -301,7 +298,7 @@ def value_added(node, value): def node_added(node): """Called when a node is added on the network.""" - entity = ZWaveNodeEntity(node) + entity = ZWaveNodeEntity(node, network) node_config = device_config.get(entity.entity_id) if node_config.get(CONF_IGNORED): _LOGGER.info( @@ -354,49 +351,49 @@ def network_complete(): def add_node(service): """Switch into inclusion mode.""" _LOGGER.info("Zwave add_node have been initialized.") - NETWORK.controller.add_node() + network.controller.add_node() def add_node_secure(service): """Switch into secure inclusion mode.""" _LOGGER.info("Zwave add_node_secure have been initialized.") - NETWORK.controller.add_node(True) + network.controller.add_node(True) def remove_node(service): """Switch into exclusion mode.""" _LOGGER.info("Zwave remove_node have been initialized.") - NETWORK.controller.remove_node() + network.controller.remove_node() def cancel_command(service): """Cancel a running controller command.""" _LOGGER.info("Cancel running ZWave command.") - NETWORK.controller.cancel_command() + network.controller.cancel_command() def heal_network(service): """Heal the network.""" _LOGGER.info("ZWave heal running.") - NETWORK.heal() + network.heal() def soft_reset(service): """Soft reset the controller.""" _LOGGER.info("Zwave soft_reset have been initialized.") - NETWORK.controller.soft_reset() + network.controller.soft_reset() def test_network(service): """Test the network by sending commands to all the nodes.""" _LOGGER.info("Zwave test_network have been initialized.") - NETWORK.test() + network.test() def stop_network(_service_or_event): """Stop Z-Wave network.""" _LOGGER.info("Stopping ZWave network.") - NETWORK.stop() + network.stop() if hass.state == CoreState.running: hass.bus.fire(const.EVENT_NETWORK_STOP) def rename_node(service): """Rename a node.""" node_id = service.data.get(const.ATTR_NODE_ID) - node = NETWORK.nodes[node_id] + node = hass.data[ZWAVE_NETWORK].nodes[node_id] name = service.data.get(const.ATTR_NAME) node.name = name _LOGGER.info( @@ -406,18 +403,18 @@ def remove_failed_node(service): """Remove failed node.""" node_id = service.data.get(const.ATTR_NODE_ID) _LOGGER.info('Trying to remove zwave node %d', node_id) - NETWORK.controller.remove_failed_node(node_id) + network.controller.remove_failed_node(node_id) def replace_failed_node(service): """Replace failed node.""" node_id = service.data.get(const.ATTR_NODE_ID) _LOGGER.info('Trying to replace zwave node %d', node_id) - NETWORK.controller.replace_failed_node(node_id) + network.controller.replace_failed_node(node_id) def set_config_parameter(service): """Set a config parameter to a node.""" node_id = service.data.get(const.ATTR_NODE_ID) - node = NETWORK.nodes[node_id] + node = network.nodes[node_id] param = service.data.get(const.ATTR_CONFIG_PARAMETER) selection = service.data.get(const.ATTR_CONFIG_VALUE) size = service.data.get(const.ATTR_CONFIG_SIZE, 2) @@ -446,7 +443,7 @@ def set_config_parameter(service): def print_config_parameter(service): """Print a config parameter from a node.""" node_id = service.data.get(const.ATTR_NODE_ID) - node = NETWORK.nodes[node_id] + node = network.nodes[node_id] param = service.data.get(const.ATTR_CONFIG_PARAMETER) _LOGGER.info("Config parameter %s on Node %s : %s", param, node_id, get_config_value(node, param)) @@ -454,13 +451,13 @@ def print_config_parameter(service): def print_node(service): """Print all information about z-wave node.""" node_id = service.data.get(const.ATTR_NODE_ID) - node = NETWORK.nodes[node_id] + node = network.nodes[node_id] nice_print_node(node) def set_wakeup(service): """Set wake-up interval of a node.""" node_id = service.data.get(const.ATTR_NODE_ID) - node = NETWORK.nodes[node_id] + node = network.nodes[node_id] value = service.data.get(const.ATTR_CONFIG_VALUE) if node.can_wake_up(): for value_id in node.get_values( @@ -478,7 +475,7 @@ def change_association(service): group = service.data.get(const.ATTR_GROUP) instance = service.data.get(const.ATTR_INSTANCE) - node = ZWaveGroup(group, NETWORK, node_id) + node = ZWaveGroup(group, network, node_id) if association_type == 'add': node.add_association(target_node_id, instance) _LOGGER.info("Adding association for node:%s in group:%s " @@ -500,13 +497,13 @@ def async_refresh_entity(service): def refresh_node(service): """Refresh all node info.""" node_id = service.data.get(const.ATTR_NODE_ID) - node = NETWORK.nodes[node_id] + node = network.nodes[node_id] node.refresh_info() def start_zwave(_service_or_event): """Startup Z-Wave network.""" _LOGGER.info("Starting ZWave network.") - NETWORK.start() + network.start() hass.bus.fire(const.EVENT_NETWORK_START) # Need to be in STATE_AWAKED before talking to nodes. @@ -514,8 +511,9 @@ def start_zwave(_service_or_event): # to be ready. for i in range(const.NETWORK_READY_WAIT_SECS): _LOGGER.debug( - "network state: %d %s", NETWORK.state, NETWORK.state_str) - if NETWORK.state >= NETWORK.STATE_AWAKED: + "network state: %d %s", hass.data[ZWAVE_NETWORK].state, + network.state_str) + if network.state >= network.STATE_AWAKED: _LOGGER.info("zwave ready after %d seconds", i) break time.sleep(1) @@ -524,14 +522,15 @@ def start_zwave(_service_or_event): "zwave not ready after %d seconds, continuing anyway", const.NETWORK_READY_WAIT_SECS) _LOGGER.info( - "final network state: %d %s", NETWORK.state, NETWORK.state_str) + "final network state: %d %s", network.state, + network.state_str) polling_interval = convert( config[DOMAIN].get(CONF_POLLING_INTERVAL), int) if polling_interval is not None: - NETWORK.set_poll_interval(polling_interval, False) + network.set_poll_interval(polling_interval, False) - poll_interval = NETWORK.get_poll_interval() + poll_interval = network.get_poll_interval() _LOGGER.info("zwave polling interval set to %d ms", poll_interval) hass.bus.listen_once(EVENT_HOMEASSISTANT_STOP, stop_network) diff --git a/homeassistant/components/zwave/node_entity.py b/homeassistant/components/zwave/node_entity.py index 0ec699b8ee6cd9..d0c75dd0b73a46 100644 --- a/homeassistant/components/zwave/node_entity.py +++ b/homeassistant/components/zwave/node_entity.py @@ -22,6 +22,10 @@ ATTR_QUERY_STAGE, ATTR_AWAKE, ATTR_READY, ATTR_FAILED, 'is_info_received', 'max_baud_rate', 'is_zwave_plus'] _OPTIONAL_ATTRIBUTES = ['capabilities', 'neighbors', 'location'] +_COMM_ATTRIBUTES = [ + 'sentCnt', 'sentFailed', 'retries', 'receivedCnt', 'receivedDups', + 'receivedUnsolicited', 'sentTS', 'receivedTS', 'lastRequestRTT', + 'averageRequestRTT', 'lastResponseRTT', 'averageResponseRTT'] ATTRIBUTES = _REQUIRED_ATTRIBUTES + _OPTIONAL_ATTRIBUTES @@ -65,12 +69,13 @@ def sub_status(status, stage): class ZWaveNodeEntity(ZWaveBaseEntity): """Representation of a Z-Wave node.""" - def __init__(self, node): + def __init__(self, node, network): """Initialize node.""" # pylint: disable=import-error super().__init__() from openzwave.network import ZWaveNetwork from pydispatch import dispatcher + self._network = network self.node = node self.node_id = self.node.node_id self._name = node_name(self.node) @@ -95,13 +100,22 @@ def network_node_changed(self, node=None, args=None): return self.node_changed() + def get_node_statistics(self): + """Retrieve statistics from the node.""" + return self._network.manager.getNodeStatistics(self._network.home_id, + self.node_id) + def node_changed(self): """Update node properties.""" self._attributes = {} + stats = self.get_node_statistics() + for attr in ATTRIBUTES: value = getattr(self.node, attr) if attr in _REQUIRED_ATTRIBUTES or value: self._attributes[attr] = value + for attr in _COMM_ATTRIBUTES: + self._attributes[attr] = stats[attr] if self.node.can_wake_up(): for value in self.node.get_values(COMMAND_CLASS_WAKE_UP).values(): @@ -152,4 +166,5 @@ def device_state_attributes(self): attrs[ATTR_BATTERY_LEVEL] = self.battery_level if self.wakeup_interval is not None: attrs[ATTR_WAKEUP] = self.wakeup_interval + return attrs diff --git a/tests/components/cover/test_zwave.py b/tests/components/cover/test_zwave.py index 425331ff35c48a..aebc04c2d4cd68 100644 --- a/tests/components/cover/test_zwave.py +++ b/tests/components/cover/test_zwave.py @@ -1,5 +1,5 @@ """Test Z-Wave cover devices.""" -from unittest.mock import patch +from unittest.mock import MagicMock from homeassistant.components.cover import zwave, SUPPORT_OPEN, SUPPORT_CLOSE from homeassistant.components.zwave import const @@ -8,58 +8,66 @@ MockNode, MockValue, MockEntityValues, value_changed) -def test_get_device_detects_none(mock_openzwave): +def test_get_device_detects_none(hass, mock_openzwave): """Test device returns none.""" node = MockNode() value = MockValue(data=0, node=node) values = MockEntityValues(primary=value, node=node) - device = zwave.get_device(node=node, values=values, node_config={}) + device = zwave.get_device(hass=hass, node=node, values=values, + node_config={}) assert device is None -def test_get_device_detects_rollershutter(mock_openzwave): +def test_get_device_detects_rollershutter(hass, mock_openzwave): """Test device returns rollershutter.""" + hass.data[zwave.zwave.ZWAVE_NETWORK] = MagicMock() node = MockNode() value = MockValue(data=0, node=node, command_class=const.COMMAND_CLASS_SWITCH_MULTILEVEL) values = MockEntityValues(primary=value, open=None, close=None, node=node) - device = zwave.get_device(node=node, values=values, node_config={}) + device = zwave.get_device(hass=hass, node=node, values=values, + node_config={}) assert isinstance(device, zwave.ZwaveRollershutter) -def test_get_device_detects_garagedoor(mock_openzwave): +def test_get_device_detects_garagedoor(hass, mock_openzwave): """Test device returns garage door.""" node = MockNode() value = MockValue(data=0, node=node, command_class=const.COMMAND_CLASS_BARRIER_OPERATOR) values = MockEntityValues(primary=value, node=node) - device = zwave.get_device(node=node, values=values, node_config={}) + device = zwave.get_device(hass=hass, node=node, values=values, + node_config={}) assert isinstance(device, zwave.ZwaveGarageDoor) assert device.device_class == "garage" assert device.supported_features == SUPPORT_OPEN | SUPPORT_CLOSE -def test_roller_no_position_workaround(mock_openzwave): +def test_roller_no_position_workaround(hass, mock_openzwave): """Test position changed.""" + hass.data[zwave.zwave.ZWAVE_NETWORK] = MagicMock() node = MockNode(manufacturer_id='0047', product_type='5a52') value = MockValue(data=45, node=node, command_class=const.COMMAND_CLASS_SWITCH_MULTILEVEL) values = MockEntityValues(primary=value, open=None, close=None, node=node) - device = zwave.get_device(node=node, values=values, node_config={}) + device = zwave.get_device(hass=hass, node=node, values=values, + node_config={}) assert device.current_cover_position is None -def test_roller_value_changed(mock_openzwave): +def test_roller_value_changed(hass, mock_openzwave): """Test position changed.""" + hass.data[zwave.zwave.ZWAVE_NETWORK] = MagicMock() node = MockNode() value = MockValue(data=None, node=node, command_class=const.COMMAND_CLASS_SWITCH_MULTILEVEL) values = MockEntityValues(primary=value, open=None, close=None, node=node) - device = zwave.get_device(node=node, values=values, node_config={}) + device = zwave.get_device(hass=hass, node=node, values=values, + node_config={}) assert device.current_cover_position is None assert device.is_closed is None @@ -83,9 +91,9 @@ def test_roller_value_changed(mock_openzwave): assert not device.is_closed -@patch('homeassistant.components.zwave.NETWORK') -def test_roller_commands(mock_network, mock_openzwave): +def test_roller_commands(hass, mock_openzwave): """Test position changed.""" + mock_network = hass.data[zwave.zwave.ZWAVE_NETWORK] = MagicMock() node = MockNode() value = MockValue(data=50, node=node, command_class=const.COMMAND_CLASS_SWITCH_MULTILEVEL) @@ -93,7 +101,8 @@ def test_roller_commands(mock_network, mock_openzwave): close_value = MockValue(data=False, node=node) values = MockEntityValues(primary=value, open=open_value, close=close_value, node=node) - device = zwave.get_device(node=node, values=values, node_config={}) + device = zwave.get_device(hass=hass, node=node, values=values, + node_config={}) device.set_cover_position(25) assert node.set_dimmer.called @@ -117,9 +126,9 @@ def test_roller_commands(mock_network, mock_openzwave): assert value_id == open_value.value_id -@patch('homeassistant.components.zwave.NETWORK') -def test_roller_reverse_open_close(mock_network, mock_openzwave): +def test_roller_reverse_open_close(hass, mock_openzwave): """Test position changed.""" + mock_network = hass.data[zwave.zwave.ZWAVE_NETWORK] = MagicMock() node = MockNode() value = MockValue(data=50, node=node, command_class=const.COMMAND_CLASS_SWITCH_MULTILEVEL) @@ -128,6 +137,7 @@ def test_roller_reverse_open_close(mock_network, mock_openzwave): values = MockEntityValues(primary=value, open=open_value, close=close_value, node=node) device = zwave.get_device( + hass=hass, node=node, values=values, node_config={zwave.zwave.CONF_INVERT_OPENCLOSE_BUTTONS: True}) @@ -148,13 +158,14 @@ def test_roller_reverse_open_close(mock_network, mock_openzwave): assert value_id == close_value.value_id -def test_garage_value_changed(mock_openzwave): +def test_garage_value_changed(hass, mock_openzwave): """Test position changed.""" node = MockNode() value = MockValue(data=False, node=node, command_class=const.COMMAND_CLASS_BARRIER_OPERATOR) values = MockEntityValues(primary=value, node=node) - device = zwave.get_device(node=node, values=values, node_config={}) + device = zwave.get_device(hass=hass, node=node, values=values, + node_config={}) assert device.is_closed @@ -164,13 +175,14 @@ def test_garage_value_changed(mock_openzwave): assert not device.is_closed -def test_garage_commands(mock_openzwave): +def test_garage_commands(hass, mock_openzwave): """Test position changed.""" node = MockNode() value = MockValue(data=False, node=node, command_class=const.COMMAND_CLASS_BARRIER_OPERATOR) values = MockEntityValues(primary=value, node=node) - device = zwave.get_device(node=node, values=values, node_config={}) + device = zwave.get_device(hass=hass, node=node, values=values, + node_config={}) assert value.data is False device.open_cover() diff --git a/tests/components/lock/test_zwave.py b/tests/components/lock/test_zwave.py index 33cc2e61483c9e..9fb634f49e2f53 100644 --- a/tests/components/lock/test_zwave.py +++ b/tests/components/lock/test_zwave.py @@ -7,7 +7,7 @@ from homeassistant.components.zwave import const from tests.mock.zwave import ( - MockNode, MockValue, MockEntityValues, value_changed) + MockNode, MockValue, MockEntityValues, value_changed) def test_get_device_detects_lock(mock_openzwave): @@ -171,6 +171,7 @@ def test_lock_alarm_level(mock_openzwave): @asyncio.coroutine def test_lock_set_usercode_service(hass, mock_openzwave): """Test the zwave lock set_usercode service.""" + mock_network = hass.data[zwave.zwave.ZWAVE_NETWORK] = MagicMock() node = MockNode(node_id=12) value0 = MockValue(data=None, node=node, index=0) value1 = MockValue(data=None, node=node, index=1) @@ -182,31 +183,29 @@ def test_lock_set_usercode_service(hass, mock_openzwave): value1.value_id: value1, } - with patch.object(zwave.zwave, 'NETWORK') as mock_network: - mock_network.nodes = { - node.node_id: node - } - yield from hass.services.async_call( - zwave.DOMAIN, zwave.SERVICE_SET_USERCODE, { - const.ATTR_NODE_ID: node.node_id, - zwave.ATTR_USERCODE: '1234', - zwave.ATTR_CODE_SLOT: 1, - }) - yield from hass.async_block_till_done() + mock_network.nodes = { + node.node_id: node + } + yield from hass.services.async_call( + zwave.DOMAIN, zwave.SERVICE_SET_USERCODE, { + const.ATTR_NODE_ID: node.node_id, + zwave.ATTR_USERCODE: '1234', + zwave.ATTR_CODE_SLOT: 1, + }) + yield from hass.async_block_till_done() assert value1.data == '1234' - with patch.object(zwave.zwave, 'NETWORK') as mock_network: - mock_network.nodes = { - node.node_id: node - } - yield from hass.services.async_call( - zwave.DOMAIN, zwave.SERVICE_SET_USERCODE, { - const.ATTR_NODE_ID: node.node_id, - zwave.ATTR_USERCODE: '12345', - zwave.ATTR_CODE_SLOT: 1, - }) - yield from hass.async_block_till_done() + mock_network.nodes = { + node.node_id: node + } + yield from hass.services.async_call( + zwave.DOMAIN, zwave.SERVICE_SET_USERCODE, { + const.ATTR_NODE_ID: node.node_id, + zwave.ATTR_USERCODE: '12345', + zwave.ATTR_CODE_SLOT: 1, + }) + yield from hass.async_block_till_done() assert value1.data == '1234' @@ -214,6 +213,7 @@ def test_lock_set_usercode_service(hass, mock_openzwave): @asyncio.coroutine def test_lock_get_usercode_service(hass, mock_openzwave): """Test the zwave lock get_usercode service.""" + mock_network = hass.data[zwave.zwave.ZWAVE_NETWORK] = MagicMock() node = MockNode(node_id=12) value0 = MockValue(data=None, node=node, index=0) value1 = MockValue(data='1234', node=node, index=1) @@ -225,27 +225,24 @@ def test_lock_get_usercode_service(hass, mock_openzwave): value1.value_id: value1, } - with patch.object(zwave.zwave, 'NETWORK') as mock_network: - with patch.object(zwave, '_LOGGER') as mock_logger: - mock_network.nodes = { - node.node_id: node - } - yield from hass.services.async_call( - zwave.DOMAIN, zwave.SERVICE_GET_USERCODE, { - const.ATTR_NODE_ID: node.node_id, - zwave.ATTR_CODE_SLOT: 1, - }) - yield from hass.async_block_till_done() - - # This service only seems to write to the log - assert mock_logger.info.called - assert len(mock_logger.info.mock_calls) == 1 - assert mock_logger.info.mock_calls[0][1][2] == '1234' + with patch.object(zwave, '_LOGGER') as mock_logger: + mock_network.nodes = {node.node_id: node} + yield from hass.services.async_call( + zwave.DOMAIN, zwave.SERVICE_GET_USERCODE, { + const.ATTR_NODE_ID: node.node_id, + zwave.ATTR_CODE_SLOT: 1, + }) + yield from hass.async_block_till_done() + # This service only seems to write to the log + assert mock_logger.info.called + assert len(mock_logger.info.mock_calls) == 1 + assert mock_logger.info.mock_calls[0][1][2] == '1234' @asyncio.coroutine def test_lock_clear_usercode_service(hass, mock_openzwave): """Test the zwave lock clear_usercode service.""" + mock_network = hass.data[zwave.zwave.ZWAVE_NETWORK] = MagicMock() node = MockNode(node_id=12) value0 = MockValue(data=None, node=node, index=0) value1 = MockValue(data='123', node=node, index=1) @@ -257,15 +254,14 @@ def test_lock_clear_usercode_service(hass, mock_openzwave): value1.value_id: value1, } - with patch.object(zwave.zwave, 'NETWORK') as mock_network: - mock_network.nodes = { - node.node_id: node - } - yield from hass.services.async_call( - zwave.DOMAIN, zwave.SERVICE_CLEAR_USERCODE, { - const.ATTR_NODE_ID: node.node_id, - zwave.ATTR_CODE_SLOT: 1 - }) - yield from hass.async_block_till_done() + mock_network.nodes = { + node.node_id: node + } + yield from hass.services.async_call( + zwave.DOMAIN, zwave.SERVICE_CLEAR_USERCODE, { + const.ATTR_NODE_ID: node.node_id, + zwave.ATTR_CODE_SLOT: 1 + }) + yield from hass.async_block_till_done() assert value1.data == '\0\0\0' diff --git a/tests/components/zwave/test_init.py b/tests/components/zwave/test_init.py index 2e80e5b53315ca..91902f9c4a8e7b 100644 --- a/tests/components/zwave/test_init.py +++ b/tests/components/zwave/test_init.py @@ -7,7 +7,7 @@ from homeassistant.components import zwave from homeassistant.components.binary_sensor.zwave import get_device from homeassistant.components.zwave import ( - const, CONFIG_SCHEMA, CONF_DEVICE_CONFIG_GLOB) + const, CONFIG_SCHEMA, CONF_DEVICE_CONFIG_GLOB, ZWAVE_NETWORK) from homeassistant.setup import setup_component import pytest @@ -70,10 +70,10 @@ def side_effect(): @asyncio.coroutine -@patch.object(zwave, 'NETWORK') -def test_setup_platform(mock_network, hass, mock_openzwave): +def test_setup_platform(hass, mock_openzwave): """Test invalid device config.""" mock_device = MagicMock() + hass.data[ZWAVE_NETWORK] = MagicMock() hass.data[zwave.DATA_ZWAVE_DICT] = {456: mock_device} async_add_devices = MagicMock() @@ -104,7 +104,7 @@ def test_zwave_ready_wait(hass, mock_openzwave): with patch.object(zwave.time, 'sleep') as mock_sleep: with patch.object(zwave, '_LOGGER') as mock_logger: - zwave.NETWORK.state = MockNetwork.STATE_STARTED + hass.data[ZWAVE_NETWORK].state = MockNetwork.STATE_STARTED hass.bus.async_fire(EVENT_HOMEASSISTANT_START) yield from hass.async_block_till_done() @@ -473,12 +473,15 @@ def setUp(self): # Initialize zwave setup_component(self.hass, 'zwave', {'zwave': {}}) self.hass.block_till_done() - zwave.NETWORK.state = MockNetwork.STATE_READY + self.zwave_network = self.hass.data[ZWAVE_NETWORK] + self.zwave_network.state = MockNetwork.STATE_READY self.hass.bus.fire(EVENT_HOMEASSISTANT_START) self.hass.block_till_done() def tearDown(self): # pylint: disable=invalid-name """Stop everything that was started.""" + self.hass.services.call('zwave', 'stop_network', {}) + self.hass.block_till_done() self.hass.stop() def test_add_node(self): @@ -486,58 +489,62 @@ def test_add_node(self): self.hass.services.call('zwave', 'add_node', {}) self.hass.block_till_done() - assert zwave.NETWORK.controller.add_node.called - assert len(zwave.NETWORK.controller.add_node.mock_calls) == 1 - assert len(zwave.NETWORK.controller.add_node.mock_calls[0][1]) == 0 + assert self.zwave_network.controller.add_node.called + assert len(self.zwave_network.controller + .add_node.mock_calls) == 1 + assert len(self.zwave_network.controller + .add_node.mock_calls[0][1]) == 0 def test_add_node_secure(self): """Test zwave add_node_secure service.""" self.hass.services.call('zwave', 'add_node_secure', {}) self.hass.block_till_done() - assert zwave.NETWORK.controller.add_node.called - assert len(zwave.NETWORK.controller.add_node.mock_calls) == 1 - assert zwave.NETWORK.controller.add_node.mock_calls[0][1][0] is True + assert self.zwave_network.controller.add_node.called + assert len(self.zwave_network.controller.add_node.mock_calls) == 1 + assert (self.zwave_network.controller + .add_node.mock_calls[0][1][0] is True) def test_remove_node(self): """Test zwave remove_node service.""" self.hass.services.call('zwave', 'remove_node', {}) self.hass.block_till_done() - assert zwave.NETWORK.controller.remove_node.called - assert len(zwave.NETWORK.controller.remove_node.mock_calls) == 1 + assert self.zwave_network.controller.remove_node.called + assert len(self.zwave_network.controller.remove_node.mock_calls) == 1 def test_cancel_command(self): """Test zwave cancel_command service.""" self.hass.services.call('zwave', 'cancel_command', {}) self.hass.block_till_done() - assert zwave.NETWORK.controller.cancel_command.called - assert len(zwave.NETWORK.controller.cancel_command.mock_calls) == 1 + assert self.zwave_network.controller.cancel_command.called + assert len(self.zwave_network.controller + .cancel_command.mock_calls) == 1 def test_heal_network(self): """Test zwave heal_network service.""" self.hass.services.call('zwave', 'heal_network', {}) self.hass.block_till_done() - assert zwave.NETWORK.heal.called - assert len(zwave.NETWORK.heal.mock_calls) == 1 + assert self.zwave_network.heal.called + assert len(self.zwave_network.heal.mock_calls) == 1 def test_soft_reset(self): """Test zwave soft_reset service.""" self.hass.services.call('zwave', 'soft_reset', {}) self.hass.block_till_done() - assert zwave.NETWORK.controller.soft_reset.called - assert len(zwave.NETWORK.controller.soft_reset.mock_calls) == 1 + assert self.zwave_network.controller.soft_reset.called + assert len(self.zwave_network.controller.soft_reset.mock_calls) == 1 def test_test_network(self): """Test zwave test_network service.""" self.hass.services.call('zwave', 'test_network', {}) self.hass.block_till_done() - assert zwave.NETWORK.test.called - assert len(zwave.NETWORK.test.mock_calls) == 1 + assert self.zwave_network.test.called + assert len(self.zwave_network.test.mock_calls) == 1 def test_stop_network(self): """Test zwave stop_network service.""" @@ -545,22 +552,22 @@ def test_stop_network(self): self.hass.services.call('zwave', 'stop_network', {}) self.hass.block_till_done() - assert zwave.NETWORK.stop.called - assert len(zwave.NETWORK.stop.mock_calls) == 1 + assert self.zwave_network.stop.called + assert len(self.zwave_network.stop.mock_calls) == 1 assert mock_fire.called assert len(mock_fire.mock_calls) == 2 assert mock_fire.mock_calls[0][1][0] == const.EVENT_NETWORK_STOP def test_rename_node(self): """Test zwave rename_node service.""" - zwave.NETWORK.nodes = {11: MagicMock()} + self.zwave_network.nodes = {11: MagicMock()} self.hass.services.call('zwave', 'rename_node', { const.ATTR_NODE_ID: 11, const.ATTR_NAME: 'test_name', }) self.hass.block_till_done() - assert zwave.NETWORK.nodes[11].name == 'test_name' + assert self.zwave_network.nodes[11].name == 'test_name' def test_remove_failed_node(self): """Test zwave remove_failed_node service.""" @@ -569,7 +576,7 @@ def test_remove_failed_node(self): }) self.hass.block_till_done() - remove_failed_node = zwave.NETWORK.controller.remove_failed_node + remove_failed_node = self.zwave_network.controller.remove_failed_node assert remove_failed_node.called assert len(remove_failed_node.mock_calls) == 1 assert remove_failed_node.mock_calls[0][1][0] == 12 @@ -581,7 +588,7 @@ def test_replace_failed_node(self): }) self.hass.block_till_done() - replace_failed_node = zwave.NETWORK.controller.replace_failed_node + replace_failed_node = self.zwave_network.controller.replace_failed_node assert replace_failed_node.called assert len(replace_failed_node.mock_calls) == 1 assert replace_failed_node.mock_calls[0][1][0] == 13 @@ -600,7 +607,7 @@ def test_set_config_parameter(self): ) node = MockNode(node_id=14) node.get_values.return_value = {12: value, 13: value_list} - zwave.NETWORK.nodes = {14: node} + self.zwave_network.nodes = {14: node} self.hass.services.call('zwave', 'set_config_parameter', { const.ATTR_NODE_ID: 14, @@ -655,7 +662,7 @@ def test_print_config_parameter(self): ) node = MockNode(node_id=14) node.values = {12: value1, 13: value2} - zwave.NETWORK.nodes = {14: node} + self.zwave_network.nodes = {14: node} with patch.object(zwave, '_LOGGER') as mock_logger: self.hass.services.call('zwave', 'print_config_parameter', { @@ -674,7 +681,7 @@ def test_print_node(self): """Test zwave print_config_parameter service.""" node1 = MockNode(node_id=14) node2 = MockNode(node_id=15) - zwave.NETWORK.nodes = {14: node1, 15: node2} + self.zwave_network.nodes = {14: node1, 15: node2} with patch.object(zwave, 'pprint') as mock_pprint: self.hass.services.call('zwave', 'print_node', { @@ -695,7 +702,7 @@ def test_set_wakeup(self): node = MockNode(node_id=14) node.values = {12: value} node.get_values.return_value = node.values - zwave.NETWORK.nodes = {14: node} + self.zwave_network.nodes = {14: node} self.hass.services.call('zwave', 'set_wakeup', { const.ATTR_NODE_ID: 14, @@ -727,7 +734,7 @@ def test_add_association(self): node = MockNode(node_id=14) node.values = {12: value} node.get_values.return_value = node.values - zwave.NETWORK.nodes = {14: node} + self.zwave_network.nodes = {14: node} self.hass.services.call('zwave', 'change_association', { const.ATTR_ASSOCIATION: 'add', @@ -760,7 +767,7 @@ def test_remove_association(self): node = MockNode(node_id=14) node.values = {12: value} node.get_values.return_value = node.values - zwave.NETWORK.nodes = {14: node} + self.zwave_network.nodes = {14: node} self.hass.services.call('zwave', 'change_association', { const.ATTR_ASSOCIATION: 'remove', @@ -808,7 +815,7 @@ def test_refresh_entity(self): def test_refresh_node(self): """Test zwave refresh_node service.""" node = MockNode(node_id=14) - zwave.NETWORK.nodes = {14: node} + self.zwave_network.nodes = {14: node} self.hass.services.call('zwave', 'refresh_node', { const.ATTR_NODE_ID: 14, }) diff --git a/tests/components/zwave/test_node_entity.py b/tests/components/zwave/test_node_entity.py index c171155404f996..223f8f8c419aa5 100644 --- a/tests/components/zwave/test_node_entity.py +++ b/tests/components/zwave/test_node_entity.py @@ -1,7 +1,7 @@ """Test Z-Wave node entity.""" import asyncio import unittest -from unittest.mock import patch +from unittest.mock import patch, MagicMock import tests.mock.zwave as mock_zwave import pytest from homeassistant.components.zwave import node_entity @@ -36,11 +36,13 @@ class TestZWaveNodeEntity(unittest.TestCase): def setUp(self): """Initialize values for this testcase class.""" + self.zwave_network = MagicMock() self.node = mock_zwave.MockNode( query_stage='Dynamic', is_awake=True, is_ready=False, is_failed=False, is_info_received=True, max_baud_rate=40000, is_zwave_plus=False, capabilities=[], neighbors=[], location=None) - self.entity = node_entity.ZWaveNodeEntity(self.node) + self.entity = node_entity.ZWaveNodeEntity(self.node, + self.zwave_network) def test_network_node_changed_from_value(self): """Test for network_node_changed.""" @@ -76,14 +78,61 @@ def test_network_node_changed_from_another_notification(self): def test_node_changed(self): """Test node_changed function.""" + self.maxDiff = None self.assertEqual({'node_id': self.node.node_id}, self.entity.device_state_attributes) self.node.get_values.return_value = { 1: mock_zwave.MockValue(data=1800) } + self.zwave_network.manager.getNodeStatistics.return_value = { + "receivedCnt": 4, "ccData": [{"receivedCnt": 0, + "commandClassId": 134, + "sentCnt": 0}, + {"receivedCnt": 1, + "commandClassId": 133, + "sentCnt": 1}, + {"receivedCnt": 1, + "commandClassId": 115, + "sentCnt": 1}, + {"receivedCnt": 0, + "commandClassId": 114, + "sentCnt": 0}, + {"receivedCnt": 0, + "commandClassId": 112, + "sentCnt": 0}, + {"receivedCnt": 1, + "commandClassId": 32, + "sentCnt": 1}, + {"receivedCnt": 0, + "commandClassId": 0, + "sentCnt": 0}], + "receivedUnsolicited": 0, + "sentTS": "2017-03-27 15:38:15:620 ", "averageRequestRTT": 2462, + "lastResponseRTT": 3679, "retries": 0, "sentFailed": 1, + "sentCnt": 7, "quality": 0, "lastRequestRTT": 1591, + "lastReceivedMessage": [0, 4, 0, 15, 3, 32, 3, 0, 221, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0], "receivedDups": 1, + "averageResponseRTT": 2443, + "receivedTS": "2017-03-27 15:38:19:298 "} self.entity.node_changed() - self.assertEqual( {'node_id': self.node.node_id, 'query_stage': 'Dynamic', @@ -94,7 +143,19 @@ def test_node_changed(self): 'max_baud_rate': 40000, 'is_zwave_plus': False, 'battery_level': 42, - 'wake_up_interval': 1800}, + 'wake_up_interval': 1800, + 'averageRequestRTT': 2462, + 'averageResponseRTT': 2443, + 'lastRequestRTT': 1591, + 'lastResponseRTT': 3679, + 'receivedCnt': 4, + 'receivedDups': 1, + 'receivedTS': '2017-03-27 15:38:19:298 ', + 'receivedUnsolicited': 0, + 'retries': 0, + 'sentCnt': 7, + 'sentFailed': 1, + 'sentTS': '2017-03-27 15:38:15:620 '}, self.entity.device_state_attributes) self.node.can_wake_up_value = False From 5e18c997f7df6742cf4ac2f84b306e1099ac8858 Mon Sep 17 00:00:00 2001 From: Andrey Date: Wed, 12 Apr 2017 21:12:37 +0300 Subject: [PATCH 062/146] Add product_name attribute to zwave nodes. (#7071) --- homeassistant/components/zwave/node_entity.py | 4 ++++ tests/components/zwave/test_node_entity.py | 9 +++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/zwave/node_entity.py b/homeassistant/components/zwave/node_entity.py index d0c75dd0b73a46..01c9e39ac5ebb9 100644 --- a/homeassistant/components/zwave/node_entity.py +++ b/homeassistant/components/zwave/node_entity.py @@ -15,6 +15,7 @@ ATTR_AWAKE = 'is_awake' ATTR_READY = 'is_ready' ATTR_FAILED = 'is_failed' +ATTR_PRODUCT_NAME = 'product_name' STAGE_COMPLETE = 'Complete' @@ -79,6 +80,8 @@ def __init__(self, node, network): self.node = node self.node_id = self.node.node_id self._name = node_name(self.node) + self._product_name = '{} {}'.format( + node.manufacturer_name, node.product_name) self.entity_id = "{}.{}_{}".format( DOMAIN, slugify(self._name), self.node_id) self._attributes = {} @@ -160,6 +163,7 @@ def device_state_attributes(self): """Return the device specific state attributes.""" attrs = { ATTR_NODE_ID: self.node_id, + ATTR_PRODUCT_NAME: self._product_name, } attrs.update(self._attributes) if self.battery_level is not None: diff --git a/tests/components/zwave/test_node_entity.py b/tests/components/zwave/test_node_entity.py index 223f8f8c419aa5..0d57a973c312d2 100644 --- a/tests/components/zwave/test_node_entity.py +++ b/tests/components/zwave/test_node_entity.py @@ -41,6 +41,8 @@ def setUp(self): query_stage='Dynamic', is_awake=True, is_ready=False, is_failed=False, is_info_received=True, max_baud_rate=40000, is_zwave_plus=False, capabilities=[], neighbors=[], location=None) + self.node.manufacturer_name = 'Test Manufacturer' + self.node.product_name = 'Test Product' self.entity = node_entity.ZWaveNodeEntity(self.node, self.zwave_network) @@ -79,8 +81,10 @@ def test_network_node_changed_from_another_notification(self): def test_node_changed(self): """Test node_changed function.""" self.maxDiff = None - self.assertEqual({'node_id': self.node.node_id}, - self.entity.device_state_attributes) + self.assertEqual( + {'node_id': self.node.node_id, + 'product_name': 'Test Manufacturer Test Product'}, + self.entity.device_state_attributes) self.node.get_values.return_value = { 1: mock_zwave.MockValue(data=1800) @@ -135,6 +139,7 @@ def test_node_changed(self): self.entity.node_changed() self.assertEqual( {'node_id': self.node.node_id, + 'product_name': 'Test Manufacturer Test Product', 'query_stage': 'Dynamic', 'is_awake': True, 'is_ready': False, From 34cb02177d09f270528577b23a10ee47a93a184c Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Wed, 12 Apr 2017 18:22:23 -0700 Subject: [PATCH 063/146] Bump braviarc version to 0.3.7 (#7078) --- homeassistant/components/media_player/braviatv.py | 4 ++-- requirements_all.txt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/media_player/braviatv.py b/homeassistant/components/media_player/braviatv.py index d6e7261ec4faa2..fbfc207c59ac1c 100644 --- a/homeassistant/components/media_player/braviatv.py +++ b/homeassistant/components/media_player/braviatv.py @@ -21,8 +21,8 @@ import homeassistant.helpers.config_validation as cv REQUIREMENTS = [ - 'https://github.com/aparraga/braviarc/archive/0.3.6.zip' - '#braviarc==0.3.6'] + 'https://github.com/aparraga/braviarc/archive/0.3.7.zip' + '#braviarc==0.3.7'] BRAVIA_CONFIG_FILE = 'bravia.conf' diff --git a/requirements_all.txt b/requirements_all.txt index cbecf913943eca..6a5d5d6343a546 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -251,7 +251,7 @@ https://github.com/TheRealLink/pylgtv/archive/v0.1.4.zip#pylgtv==0.1.4 https://github.com/TheRealLink/pythinkingcleaner/archive/v0.0.2.zip#pythinkingcleaner==0.0.2 # homeassistant.components.media_player.braviatv -https://github.com/aparraga/braviarc/archive/0.3.6.zip#braviarc==0.3.6 +https://github.com/aparraga/braviarc/archive/0.3.7.zip#braviarc==0.3.7 # homeassistant.components.cover.myq https://github.com/arraylabs/pymyq/archive/v0.0.8.zip#pymyq==0.0.8 From 9a9342ec3f0d69e24ec5b6d9fc8c21787de2a34f Mon Sep 17 00:00:00 2001 From: Thibault Cohen Date: Thu, 13 Apr 2017 01:42:48 -0400 Subject: [PATCH 064/146] Fix account balance in fido sensor (#7077) --- homeassistant/components/sensor/fido.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/sensor/fido.py b/homeassistant/components/sensor/fido.py index 70876cca1c2287..5deb00db67b920 100644 --- a/homeassistant/components/sensor/fido.py +++ b/homeassistant/components/sensor/fido.py @@ -153,7 +153,7 @@ def device_state_attributes(self): def update(self): """Get the latest data from Fido and update the state.""" self.fido_data.update() - if self._name == 'balance': + if self.type == 'balance': if self.fido_data.data.get(self.type) is not None: self._state = round(self.fido_data.data[self.type], 2) else: From fa65783f393068cd44da283fc5c6a76bf8a996b3 Mon Sep 17 00:00:00 2001 From: Gianluca Barbaro Date: Thu, 13 Apr 2017 16:38:09 +0200 Subject: [PATCH 065/146] MQTT: Managing binary payloads (#6976) * Managing binary payloads Hello, background: I wrote a HA camera component that gets the image from a binary payload. I'm testing it with Zanzito (https://play.google.com/store/apps/details?id=it.barbaro.zanzito) and it works apparently well: it gets the image and correctly displays it in the front-end. But I had to make the changes I'm proposing here: the message was being blocked because the utf-8 decoding failed. As far as I know, the utf-8 encoding is required for the topic, not for the payload. What I did here was try the utf-8 decoding, but even if unsuccessful, it dispatches the message anyway. Is there anything else I'm missing? thanks Gianluca * Update __init__.py * Update __init__.py * Update __init__.py * git test - ignore * Should work * minor fixes * updated mqtt/services.yaml * added two tests, modified threaded subscribe * removing polymer * requested changes * requested changes - minor fix * security wrap around payload_file_path * services.yaml updated * removed file publishing * minor fix --- homeassistant/components/mqtt/__init__.py | 57 ++++++++++++--------- tests/common.py | 5 +- tests/components/mqtt/test_init.py | 60 ++++++++++------------- 3 files changed, 64 insertions(+), 58 deletions(-) diff --git a/homeassistant/components/mqtt/__init__.py b/homeassistant/components/mqtt/__init__.py index 0e8c666d147f6d..2b6774939daaa6 100644 --- a/homeassistant/components/mqtt/__init__.py +++ b/homeassistant/components/mqtt/__init__.py @@ -201,7 +201,8 @@ def publish_template(hass, topic, payload_template, qos=None, retain=None): @asyncio.coroutine -def async_subscribe(hass, topic, msg_callback, qos=DEFAULT_QOS): +def async_subscribe(hass, topic, msg_callback, qos=DEFAULT_QOS, + encoding='utf-8'): """Subscribe to an MQTT topic.""" @callback def async_mqtt_topic_subscriber(dp_topic, dp_payload, dp_qos): @@ -209,7 +210,21 @@ def async_mqtt_topic_subscriber(dp_topic, dp_payload, dp_qos): if not _match_topic(topic, dp_topic): return - hass.async_run_job(msg_callback, dp_topic, dp_payload, dp_qos) + if encoding is not None: + try: + payload = dp_payload.decode(encoding) + _LOGGER.debug("Received message on %s: %s", + dp_topic, payload) + except (AttributeError, UnicodeDecodeError): + _LOGGER.error("Illegal payload encoding %s from " + "MQTT topic: %s, Payload: %s", + encoding, dp_topic, dp_payload) + return + else: + _LOGGER.debug("Received binary message on %s", dp_topic) + payload = dp_payload + + hass.async_run_job(msg_callback, dp_topic, payload, dp_qos) async_remove = async_dispatcher_connect( hass, SIGNAL_MQTT_MESSAGE_RECEIVED, async_mqtt_topic_subscriber) @@ -218,10 +233,12 @@ def async_mqtt_topic_subscriber(dp_topic, dp_payload, dp_qos): return async_remove -def subscribe(hass, topic, msg_callback, qos=DEFAULT_QOS): +def subscribe(hass, topic, msg_callback, qos=DEFAULT_QOS, + encoding='utf-8'): """Subscribe to an MQTT topic.""" async_remove = run_coroutine_threadsafe( - async_subscribe(hass, topic, msg_callback, qos), + async_subscribe(hass, topic, msg_callback, + qos, encoding), hass.loop ).result() @@ -372,16 +389,16 @@ def async_publish_service(call): payload_template = call.data.get(ATTR_PAYLOAD_TEMPLATE) qos = call.data[ATTR_QOS] retain = call.data[ATTR_RETAIN] - try: - if payload_template is not None: + if payload_template is not None: + try: payload = \ template.Template(payload_template, hass).async_render() - except template.jinja2.TemplateError as exc: - _LOGGER.error( - "Unable to publish to '%s': rendering payload template of " - "'%s' failed because %s", - msg_topic, payload_template, exc) - return + except template.jinja2.TemplateError as exc: + _LOGGER.error( + "Unable to publish to '%s': rendering payload template of " + "'%s' failed because %s", + msg_topic, payload_template, exc) + return yield from hass.data[DATA_MQTT].async_publish( msg_topic, payload, qos, retain) @@ -564,18 +581,10 @@ def _mqtt_on_subscribe(self, _mqttc, _userdata, mid, granted_qos): def _mqtt_on_message(self, _mqttc, _userdata, msg): """Message received callback.""" - try: - payload = msg.payload.decode('utf-8') - except (AttributeError, UnicodeDecodeError): - _LOGGER.error("Illegal utf-8 unicode payload from " - "MQTT topic: %s, Payload: %s", msg.topic, - msg.payload) - else: - _LOGGER.info("Received message on %s: %s", msg.topic, payload) - dispatcher_send( - self.hass, SIGNAL_MQTT_MESSAGE_RECEIVED, msg.topic, payload, - msg.qos - ) + dispatcher_send( + self.hass, SIGNAL_MQTT_MESSAGE_RECEIVED, msg.topic, msg.payload, + msg.qos + ) def _mqtt_on_unsubscribe(self, _mqttc, _userdata, mid, granted_qos): """Unsubscribe successful callback.""" diff --git a/tests/common.py b/tests/common.py index 03a4de235d7c26..a662734487900e 100644 --- a/tests/common.py +++ b/tests/common.py @@ -170,8 +170,11 @@ def mock_service_log(call): # pylint: disable=unnecessary-lambda @ha.callback def async_fire_mqtt_message(hass, topic, payload, qos=0): """Fire the MQTT message.""" + if isinstance(payload, str): + payload = payload.encode('utf-8') async_dispatcher_send( - hass, mqtt.SIGNAL_MQTT_MESSAGE_RECEIVED, topic, payload, qos) + hass, mqtt.SIGNAL_MQTT_MESSAGE_RECEIVED, topic, + payload, qos) def fire_mqtt_message(hass, topic, payload, qos=0): diff --git a/tests/components/mqtt/test_init.py b/tests/components/mqtt/test_init.py index f387c7c0bd7366..0017674e82f548 100644 --- a/tests/components/mqtt/test_init.py +++ b/tests/components/mqtt/test_init.py @@ -209,6 +209,31 @@ def test_subscribe_topic_subtree_wildcard_no_match(self): self.hass.block_till_done() self.assertEqual(0, len(self.calls)) + def test_subscribe_binary_topic(self): + """Test the subscription to a binary topic.""" + mqtt.subscribe(self.hass, 'test-topic', self.record_calls, + 0, None) + + fire_mqtt_message(self.hass, 'test-topic', 0x9a) + + self.hass.block_till_done() + self.assertEqual(1, len(self.calls)) + self.assertEqual('test-topic', self.calls[0][0]) + self.assertEqual(0x9a, self.calls[0][1]) + + def test_receiving_non_utf8_message_gets_logged(self): + """Test receiving a non utf8 encoded message.""" + mqtt.subscribe(self.hass, 'test-topic', self.record_calls) + + with self.assertLogs(level='ERROR') as test_handle: + fire_mqtt_message(self.hass, 'test-topic', 0x9a) + self.hass.block_till_done() + self.assertIn( + "ERROR:homeassistant.components.mqtt:Illegal payload " + "encoding utf-8 from MQTT " + "topic: test-topic, Payload: 154", + test_handle.output[0]) + class TestMQTTCallbacks(unittest.TestCase): """Test the MQTT callbacks.""" @@ -255,7 +280,8 @@ def record(topic, payload, qos): self.assertEqual(1, len(calls)) last_event = calls[0] - self.assertEqual('Hello World!', last_event['payload']) + self.assertEqual(bytearray('Hello World!', 'utf-8'), + last_event['payload']) self.assertEqual(message.topic, last_event['topic']) self.assertEqual(message.qos, last_event['qos']) @@ -298,38 +324,6 @@ def test_invalid_mqtt_topics(self): self.assertRaises(vol.Invalid, mqtt.valid_publish_topic, 'bad+topic') self.assertRaises(vol.Invalid, mqtt.valid_subscribe_topic, 'bad\0one') - def test_receiving_non_utf8_message_gets_logged(self): - """Test receiving a non utf8 encoded message.""" - calls = [] - - @callback - def record(topic, payload, qos): - """Helper to record calls.""" - data = { - 'topic': topic, - 'payload': payload, - 'qos': qos, - } - calls.append(data) - - async_dispatcher_connect( - self.hass, mqtt.SIGNAL_MQTT_MESSAGE_RECEIVED, record) - - payload = 0x9a - topic = 'test_topic' - MQTTMessage = namedtuple('MQTTMessage', ['topic', 'qos', 'payload']) - message = MQTTMessage(topic, 1, payload) - with self.assertLogs(level='ERROR') as test_handle: - self.hass.data['mqtt']._mqtt_on_message( - None, - {'hass': self.hass}, - message) - self.hass.block_till_done() - self.assertIn( - "ERROR:homeassistant.components.mqtt:Illegal utf-8 unicode " - "payload from MQTT topic: %s, Payload: " % topic, - test_handle.output[0]) - @asyncio.coroutine def test_setup_embedded_starts_with_no_config(hass): From 01c7616147a3f72c2405470c118fff696511e5f9 Mon Sep 17 00:00:00 2001 From: Colin O'Dell Date: Thu, 13 Apr 2017 10:39:36 -0400 Subject: [PATCH 066/146] Bump qnapstats library version to 0.2.4 (#7085) --- homeassistant/components/sensor/qnap.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/qnap.py b/homeassistant/components/sensor/qnap.py index b37cb432461702..e57c59e41d6c1f 100644 --- a/homeassistant/components/sensor/qnap.py +++ b/homeassistant/components/sensor/qnap.py @@ -18,7 +18,7 @@ import voluptuous as vol -REQUIREMENTS = ['qnapstats==0.2.3'] +REQUIREMENTS = ['qnapstats==0.2.4'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 6a5d5d6343a546..0fd90e12d34214 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -671,7 +671,7 @@ pywemo==0.4.17 pyzabbix==0.7.4 # homeassistant.components.sensor.qnap -qnapstats==0.2.3 +qnapstats==0.2.4 # homeassistant.components.climate.radiotherm radiotherm==1.2 From 38ad5714cd373ebbcfdbedabbac0707feb6c1453 Mon Sep 17 00:00:00 2001 From: John Arild Berentsen Date: Thu, 13 Apr 2017 16:41:25 +0200 Subject: [PATCH 067/146] Add support fo map data from Neato (#6939) * Responsiveness * Delay was not needed as commands does not return until done. * Add support for cleaning maps and cleaning data * Hound * Docstring * Update requirements * Review changes * External lib now returns the raw data. * debug * Sensor did not refresh * Error handling * Issue warning on connection error * Update requirements * Review changes --- homeassistant/components/camera/neato.py | 65 ++++++++++++++++++ homeassistant/components/neato.py | 14 +++- homeassistant/components/sensor/neato.py | 86 +++++++++++++++++++++--- homeassistant/components/switch/neato.py | 19 +++--- requirements_all.txt | 2 +- 5 files changed, 164 insertions(+), 22 deletions(-) create mode 100644 homeassistant/components/camera/neato.py diff --git a/homeassistant/components/camera/neato.py b/homeassistant/components/camera/neato.py new file mode 100644 index 00000000000000..d6eafc3685916d --- /dev/null +++ b/homeassistant/components/camera/neato.py @@ -0,0 +1,65 @@ +""" +Camera that loads a picture from a local file. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/camera.neato/ +""" +import logging + +from datetime import timedelta +from homeassistant.components.camera import Camera +from homeassistant.components.neato import ( + NEATO_MAP_DATA, NEATO_ROBOTS, NEATO_LOGIN) +from homeassistant.util import Throttle + +_LOGGER = logging.getLogger(__name__) + +DEPENDENCIES = ['neato'] + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup the Camera.""" + dev = [] + for robot in hass.data[NEATO_ROBOTS]: + if 'maps' in robot.traits: + dev.append(NeatoCleaningMap(hass, robot)) + _LOGGER.debug('Adding robots for cleaning maps %s', dev) + add_devices(dev, True) + + +class NeatoCleaningMap(Camera): + """Neato cleaning map for last clean.""" + + def __init__(self, hass, robot): + """Initialize Neato cleaning map.""" + super().__init__() + self.robot = robot + self._robot_name = self.robot.name + ' Cleaning Map' + self._robot_serial = self.robot.serial + self.neato = hass.data[NEATO_LOGIN] + self._image_url = None + self._image = None + + def camera_image(self): + """Return image response.""" + self.update() + return self._image + + @Throttle(timedelta(seconds=10)) + def update(self): + """Check the contents of the map list.""" + self.neato.update_robots() + image_url = None + map_data = self.hass.data[NEATO_MAP_DATA] + image_url = map_data[self._robot_serial]['maps'][0]['url'] + if image_url == self._image_url: + _LOGGER.debug('The map image_url is the same as old') + return + image = self.neato.download_map(image_url) + self._image = image.read() + self._image_url = image_url + + @property + def name(self): + """Return the name of this camera.""" + return self._robot_name diff --git a/homeassistant/components/neato.py b/homeassistant/components/neato.py index e0b36721f745df..7bc4724e18cdb0 100644 --- a/homeassistant/components/neato.py +++ b/homeassistant/components/neato.py @@ -17,12 +17,13 @@ _LOGGER = logging.getLogger(__name__) -REQUIREMENTS = ['https://github.com/jabesq/pybotvac/archive/v0.0.1.zip' - '#pybotvac==0.0.1'] +REQUIREMENTS = ['https://github.com/jabesq/pybotvac/archive/v0.0.3.zip' + '#pybotvac==0.0.3'] DOMAIN = 'neato' NEATO_ROBOTS = 'neato_robots' NEATO_LOGIN = 'neato_login' +NEATO_MAP_DATA = 'neato_map_data' CONFIG_SCHEMA = vol.Schema({ DOMAIN: vol.Schema({ @@ -89,7 +90,7 @@ def setup(hass, config): _LOGGER.debug('Failed to login to Neato API') return False hub.update_robots() - for component in ('sensor', 'switch'): + for component in ('camera', 'sensor', 'switch'): discovery.load_platform(hass, component, DOMAIN, {}, config) return True @@ -108,6 +109,7 @@ def __init__(self, hass, domain_config, neato): domain_config[CONF_USERNAME], domain_config[CONF_PASSWORD]) self._hass.data[NEATO_ROBOTS] = self.my_neato.robots + self._hass.data[NEATO_MAP_DATA] = self.my_neato.maps def login(self): """Login to My Neato.""" @@ -126,3 +128,9 @@ def update_robots(self): _LOGGER.debug('Running HUB.update_robots %s', self._hass.data[NEATO_ROBOTS]) self._hass.data[NEATO_ROBOTS] = self.my_neato.robots + self._hass.data[NEATO_MAP_DATA] = self.my_neato.maps + + def download_map(self, url): + """Download a new map image.""" + map_image_data = self.my_neato.get_map_image(url) + return map_image_data diff --git a/homeassistant/components/sensor/neato.py b/homeassistant/components/sensor/neato.py index ca5cff1d24a0dd..7c33e481069022 100644 --- a/homeassistant/components/sensor/neato.py +++ b/homeassistant/components/sensor/neato.py @@ -8,9 +8,12 @@ import requests from homeassistant.helpers.entity import Entity from homeassistant.components.neato import ( - NEATO_ROBOTS, NEATO_LOGIN, ACTION, ERRORS, MODE, ALERTS) + NEATO_ROBOTS, NEATO_LOGIN, NEATO_MAP_DATA, ACTION, ERRORS, MODE, ALERTS) _LOGGER = logging.getLogger(__name__) + +DEPENDENCIES = ['neato'] + SENSOR_TYPE_STATUS = 'status' SENSOR_TYPE_BATTERY = 'battery' @@ -19,12 +22,17 @@ SENSOR_TYPE_BATTERY: ['Battery'] } +ATTR_CLEAN_START = 'clean_start' +ATTR_CLEAN_STOP = 'clean_stop' +ATTR_CLEAN_AREA = 'clean_area' +ATTR_CLEAN_BATTERY_START = 'battery_level_at_clean_start' +ATTR_CLEAN_BATTERY_END = 'battery_level_at_clean_end' +ATTR_CLEAN_SUSP_COUNT = 'clean_suspension_count' +ATTR_CLEAN_SUSP_TIME = 'clean_suspension_time' + def setup_platform(hass, config, add_devices, discovery_info=None): """Setup the Neato sensor platform.""" - if not hass.data['neato_robots']: - return False - dev = [] for robot in hass.data[NEATO_ROBOTS]: for type_name in SENSOR_TYPES: @@ -42,22 +50,37 @@ def __init__(self, hass, robot, sensor_type): self.robot = robot self.neato = hass.data[NEATO_LOGIN] self._robot_name = self.robot.name + ' ' + SENSOR_TYPES[self.type][0] - self._state = self.robot.state - self._battery_state = None self._status_state = None + try: + self._state = self.robot.state + except (requests.exceptions.ConnectionError, + requests.exceptions.HTTPError) as ex: + self._state = None + _LOGGER.warning('Neato connection error: %s', ex) + self._mapdata = hass.data[NEATO_MAP_DATA] + self.clean_time_start = None + self.clean_time_stop = None + self.clean_area = None + self.clean_battery_start = None + self.clean_battery_end = None + self.clean_suspension_charge_count = None + self.clean_suspension_time = None + self._battery_state = None def update(self): """Update the properties of sensor.""" _LOGGER.debug('Update of sensor') self.neato.update_robots() - if not self._state: - return + self._mapdata = self.hass.data[NEATO_MAP_DATA] try: self._state = self.robot.state - except requests.exceptions.HTTPError as ex: + except (requests.exceptions.ConnectionError, + requests.exceptions.HTTPError) as ex: self._state = None self._status_state = 'Offline' - _LOGGER.debug('Neato connection issue: %s', ex) + _LOGGER.warning('Neato connection error: %s', ex) + return + if not self._state: return _LOGGER.debug('self._state=%s', self._state) if self.type == SENSOR_TYPE_STATUS: @@ -82,6 +105,27 @@ def update(self): self._status_state = ERRORS.get(self._state['error']) if self.type == SENSOR_TYPE_BATTERY: self._battery_state = self._state['details']['charge'] + if self._mapdata is None: + return + self.clean_time_start = ( + (self._mapdata[self.robot.serial]['maps'][0]['start_at'] + .strip('Z')) + .replace('T', ' ')) + self.clean_time_stop = ( + (self._mapdata[self.robot.serial]['maps'][0]['end_at'].strip('Z')) + .replace('T', ' ')) + self.clean_area = ( + self._mapdata[self.robot.serial]['maps'][0]['cleaned_area']) + self.clean_suspension_charge_count = ( + self._mapdata[self.robot.serial]['maps'][0] + ['suspended_cleaning_charging_count']) + self.clean_suspension_time = ( + self._mapdata[self.robot.serial]['maps'][0] + ['time_in_suspended_cleaning']) + self.clean_battery_start = ( + self._mapdata[self.robot.serial]['maps'][0]['run_charge_at_start']) + self.clean_battery_end = ( + self._mapdata[self.robot.serial]['maps'][0]['run_charge_at_end']) @property def unit_of_measurement(self): @@ -109,3 +153,25 @@ def state(self): def name(self): """Return the name of the sensor.""" return self._robot_name + + @property + def device_state_attributes(self): + """Return the device specific attributes.""" + data = {} + if self.type is SENSOR_TYPE_STATUS: + if self.clean_time_start: + data[ATTR_CLEAN_START] = self.clean_time_start + if self.clean_time_stop: + data[ATTR_CLEAN_STOP] = self.clean_time_stop + if self.clean_area: + data[ATTR_CLEAN_AREA] = self.clean_area + if self.clean_suspension_charge_count: + data[ATTR_CLEAN_SUSP_COUNT] = ( + self.clean_suspension_charge_count) + if self.clean_suspension_time: + data[ATTR_CLEAN_SUSP_TIME] = self.clean_suspension_time + if self.clean_battery_start: + data[ATTR_CLEAN_BATTERY_START] = self.clean_battery_start + if self.clean_battery_end: + data[ATTR_CLEAN_BATTERY_END] = self.clean_battery_end + return data diff --git a/homeassistant/components/switch/neato.py b/homeassistant/components/switch/neato.py index 6cd5c5088dc2ed..b6cf6549cae76b 100644 --- a/homeassistant/components/switch/neato.py +++ b/homeassistant/components/switch/neato.py @@ -12,6 +12,8 @@ _LOGGER = logging.getLogger(__name__) +DEPENDENCIES = ['neato'] + SWITCH_TYPE_CLEAN = 'clean' SWITCH_TYPE_SCHEDULE = 'scedule' @@ -23,9 +25,6 @@ def setup_platform(hass, config, add_devices, discovery_info=None): """Setup the Neato switches.""" - if not hass.data[NEATO_ROBOTS]: - return False - dev = [] for robot in hass.data[NEATO_ROBOTS]: for type_name in SWITCH_TYPES: @@ -43,7 +42,12 @@ def __init__(self, hass, robot, switch_type): self.robot = robot self.neato = hass.data[NEATO_LOGIN] self._robot_name = self.robot.name + ' ' + SWITCH_TYPES[self.type][0] - self._state = self.robot.state + try: + self._state = self.robot.state + except (requests.exceptions.ConnectionError, + requests.exceptions.HTTPError) as ex: + _LOGGER.warning('Neato connection error: %s', ex) + self._state = None self._schedule_state = None self._clean_state = None @@ -51,14 +55,13 @@ def update(self): """Update the states of Neato switches.""" _LOGGER.debug('Running switch update') self.neato.update_robots() - if not self._state: - return try: self._state = self.robot.state - except requests.exceptions.HTTPError: + except (requests.exceptions.ConnectionError, + requests.exceptions.HTTPError) as ex: + _LOGGER.warning('Neato connection error: %s', ex) self._state = None return - self._state = self.robot.state _LOGGER.debug('self._state=%s', self._state) if self.type == SWITCH_TYPE_CLEAN: if (self.robot.state['action'] == 1 or diff --git a/requirements_all.txt b/requirements_all.txt index 0fd90e12d34214..defefb66aee685 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -269,7 +269,7 @@ https://github.com/gurumitts/pylutron-caseta/archive/v0.2.5.zip#pylutron-caseta= https://github.com/jabesq/netatmo-api-python/archive/v0.9.1.zip#lnetatmo==0.9.1 # homeassistant.components.neato -https://github.com/jabesq/pybotvac/archive/v0.0.1.zip#pybotvac==0.0.1 +https://github.com/jabesq/pybotvac/archive/v0.0.3.zip#pybotvac==0.0.3 # homeassistant.components.sensor.sabnzbd https://github.com/jamespcole/home-assistant-nzb-clients/archive/616cad59154092599278661af17e2a9f2cf5e2a9.zip#python-sabnzbd==0.1 From c267326891b18ac67d35ef1e3117efba726a9c3a Mon Sep 17 00:00:00 2001 From: Patrik Date: Thu, 13 Apr 2017 19:04:42 +0200 Subject: [PATCH 068/146] Added initial support for IKEA Tradfri Gateway (#7074) * Added initial support for IKEA Tradfri Gateway * Pinned requirement * Fixed lint-errors * Added file to .coveragerc * Trying to fix commit * Fixed requirements_all again * Minor reorder of code * Minor reorder of code * Made the changes suggested by @balloob * Made the changes suggested by @balloob and removed debug * Update tradfri.py --- .coveragerc | 1 + homeassistant/components/light/tradfri.py | 100 ++++++++++++++++++++++ requirements_all.txt | 3 + 3 files changed, 104 insertions(+) create mode 100644 homeassistant/components/light/tradfri.py diff --git a/.coveragerc b/.coveragerc index b2f6a21c84b5b4..2d40ca8b7b3bd9 100644 --- a/.coveragerc +++ b/.coveragerc @@ -232,6 +232,7 @@ omit = homeassistant/components/light/limitlessled.py homeassistant/components/light/osramlightify.py homeassistant/components/light/tikteck.py + homeassistant/components/light/tradfri.py homeassistant/components/light/x10.py homeassistant/components/light/yeelight.py homeassistant/components/light/yeelightsunflower.py diff --git a/homeassistant/components/light/tradfri.py b/homeassistant/components/light/tradfri.py new file mode 100644 index 00000000000000..1b2e42b5b999f6 --- /dev/null +++ b/homeassistant/components/light/tradfri.py @@ -0,0 +1,100 @@ +"""Support for the IKEA Tradfri platform.""" + +import logging + + +import voluptuous as vol + +# Import the device class from the component that you want to support +from homeassistant.components.light import ATTR_BRIGHTNESS, \ + SUPPORT_BRIGHTNESS, Light, PLATFORM_SCHEMA +from homeassistant.const import CONF_HOST, CONF_API_KEY +import homeassistant.helpers.config_validation as cv + + +SUPPORTED_FEATURES = (SUPPORT_BRIGHTNESS) + +# Home Assistant depends on 3rd party packages for API specific code. +REQUIREMENTS = ['pytradfri==0.4'] + +_LOGGER = logging.getLogger(__name__) + +# Validation of the user's configuration +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_HOST): cv.string, + vol.Optional(CONF_API_KEY): cv.string, +}) + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup the IKEA Tradfri Light platform.""" + import pytradfri + + # Assign configuration variables. + # The configuration check takes care they are present. + host = config.get(CONF_HOST) + securitycode = config.get(CONF_API_KEY) + + api = pytradfri.coap_cli.api_factory(host, securitycode) + + gateway = pytradfri.gateway.Gateway(api) + devices = gateway.get_devices() + lights = [dev for dev in devices if dev.has_light_control] + + _LOGGER.debug("IKEA Tradfri Hub | init | Initialization Process Complete") + + add_devices(IKEATradfri(light) for light in lights) + _LOGGER.debug("IKEA Tradfri Hub | get_lights | All Lights Loaded") + + +class IKEATradfri(Light): + """The platform class required by hass.""" + + def __init__(self, light): + """Initialize a Light.""" + self._light = light + + # Caching of LightControl and light object + self._light_control = light.light_control + self._light_data = light.light_control.lights[0] + self._name = light.name + self._brightness = None + + @property + def supported_features(self): + """Flag supported features.""" + return SUPPORTED_FEATURES + + @property + def name(self): + """Return the display name of this light.""" + return self._name + + @property + def is_on(self): + """Return true if light is on.""" + return self._light_data.state + + @property + def brightness(self): + """Brightness of the light (an integer in the range 1-255).""" + return self._light_data.dimmer + + def turn_off(self, **kwargs): + """Instruct the light to turn off.""" + return self._light_control.set_state(False) + + def turn_on(self, **kwargs): + """Instruct the light to turn on.""" + if ATTR_BRIGHTNESS in kwargs: + self._light.light_control.set_dimmer(kwargs.get(ATTR_BRIGHTNESS)) + else: + self._light.light_control.set_state(True) + + def update(self): + """Fetch new state data for this light. + + This is the only method that should fetch new data for Home Assistant. + """ + self._light.update() + self._brightness = self._light_data.dimmer diff --git a/requirements_all.txt b/requirements_all.txt index defefb66aee685..2820d9ad6c5b35 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -652,6 +652,9 @@ python-wink==1.2.3 # homeassistant.components.device_tracker.trackr pytrackr==0.0.5 +# homeassistant.components.light.tradfri +pytradfri==0.4 + # homeassistant.components.device_tracker.unifi pyunifi==2.0 From b6ee2332f467f8bd01e562b5fb35070da6e2e8ca Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 13 Apr 2017 23:45:27 +0300 Subject: [PATCH 069/146] Better thread safety in zwave node_entity (#7087) * Better thread safety * Update node_entity.py --- homeassistant/components/zwave/node_entity.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/zwave/node_entity.py b/homeassistant/components/zwave/node_entity.py index 01c9e39ac5ebb9..5448da3c59c5b9 100644 --- a/homeassistant/components/zwave/node_entity.py +++ b/homeassistant/components/zwave/node_entity.py @@ -110,15 +110,15 @@ def get_node_statistics(self): def node_changed(self): """Update node properties.""" - self._attributes = {} + attributes = {} stats = self.get_node_statistics() - for attr in ATTRIBUTES: value = getattr(self.node, attr) if attr in _REQUIRED_ATTRIBUTES or value: - self._attributes[attr] = value + attributes[attr] = value + for attr in _COMM_ATTRIBUTES: - self._attributes[attr] = stats[attr] + attributes[attr] = stats[attr] if self.node.can_wake_up(): for value in self.node.get_values(COMMAND_CLASS_WAKE_UP).values(): @@ -128,6 +128,7 @@ def node_changed(self): self.wakeup_interval = None self.battery_level = self.node.get_battery_level() + self._attributes = attributes self.maybe_schedule_update() From e5756ba41df64c4f46103abbc9f34c48b50fd54a Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Thu, 13 Apr 2017 22:48:59 -0700 Subject: [PATCH 070/146] Break product name up into manufacturer name and product name --- homeassistant/components/zwave/node_entity.py | 6 ++++-- tests/components/zwave/test_node_entity.py | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/zwave/node_entity.py b/homeassistant/components/zwave/node_entity.py index 5448da3c59c5b9..e43ee735ac7040 100644 --- a/homeassistant/components/zwave/node_entity.py +++ b/homeassistant/components/zwave/node_entity.py @@ -16,6 +16,7 @@ ATTR_READY = 'is_ready' ATTR_FAILED = 'is_failed' ATTR_PRODUCT_NAME = 'product_name' +ATTR_MANUFACTURER_NAME = 'manufacturer_name' STAGE_COMPLETE = 'Complete' @@ -80,8 +81,8 @@ def __init__(self, node, network): self.node = node self.node_id = self.node.node_id self._name = node_name(self.node) - self._product_name = '{} {}'.format( - node.manufacturer_name, node.product_name) + self._product_name = node.product_name + self._manufacturer_name = node.manufacturer_name self.entity_id = "{}.{}_{}".format( DOMAIN, slugify(self._name), self.node_id) self._attributes = {} @@ -164,6 +165,7 @@ def device_state_attributes(self): """Return the device specific state attributes.""" attrs = { ATTR_NODE_ID: self.node_id, + ATTR_MANUFACTURER_NAME: self._manufacturer_name, ATTR_PRODUCT_NAME: self._product_name, } attrs.update(self._attributes) diff --git a/tests/components/zwave/test_node_entity.py b/tests/components/zwave/test_node_entity.py index 0d57a973c312d2..871520d1e6d3cd 100644 --- a/tests/components/zwave/test_node_entity.py +++ b/tests/components/zwave/test_node_entity.py @@ -83,7 +83,8 @@ def test_node_changed(self): self.maxDiff = None self.assertEqual( {'node_id': self.node.node_id, - 'product_name': 'Test Manufacturer Test Product'}, + 'manufacturer_name': 'Test Manufacturer', + 'product_name': 'Test Product'}, self.entity.device_state_attributes) self.node.get_values.return_value = { @@ -139,7 +140,8 @@ def test_node_changed(self): self.entity.node_changed() self.assertEqual( {'node_id': self.node.node_id, - 'product_name': 'Test Manufacturer Test Product', + 'manufacturer_name': 'Test Manufacturer', + 'product_name': 'Test Product', 'query_stage': 'Dynamic', 'is_awake': True, 'is_ready': False, From 46352f6de9c8d5d0288892216b52010c03d390c2 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Fri, 14 Apr 2017 13:08:28 -0400 Subject: [PATCH 071/146] Uber version bump (#7100) --- homeassistant/components/sensor/uber.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/uber.py b/homeassistant/components/sensor/uber.py index 08617e824ec5bc..879025621528a0 100644 --- a/homeassistant/components/sensor/uber.py +++ b/homeassistant/components/sensor/uber.py @@ -14,7 +14,7 @@ from homeassistant.util import Throttle import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['uber_rides==0.2.7'] +REQUIREMENTS = ['uber_rides==0.4.1'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 2820d9ad6c5b35..ffc8267775ad0f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -767,7 +767,7 @@ transmissionrpc==0.11 twilio==5.7.0 # homeassistant.components.sensor.uber -uber_rides==0.2.7 +uber_rides==0.4.1 # homeassistant.components.sensor.ups upsmychoice==1.0.2 From 0ca80cc27e2e6112f944ead9b9ececf1a6d85dbc Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Fri, 14 Apr 2017 13:09:21 -0400 Subject: [PATCH 072/146] No product ids configured should fetch all ids (#7091) --- homeassistant/components/sensor/uber.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/sensor/uber.py b/homeassistant/components/sensor/uber.py index 879025621528a0..2830b8c98e9108 100644 --- a/homeassistant/components/sensor/uber.py +++ b/homeassistant/components/sensor/uber.py @@ -35,7 +35,7 @@ vol.Required(CONF_START_LONGITUDE): cv.longitude, vol.Optional(CONF_END_LATITUDE): cv.latitude, vol.Optional(CONF_END_LONGITUDE): cv.longitude, - vol.Optional(CONF_PRODUCT_IDS, default=[]): + vol.Optional(CONF_PRODUCT_IDS): vol.All(cv.ensure_list, [cv.string]), }) From 60f7a1947f6b0b63d635d227263da2e0edc61ecc Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Fri, 14 Apr 2017 14:31:10 -0700 Subject: [PATCH 073/146] Allow extra keys in zone config --- homeassistant/components/zone.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/zone.py b/homeassistant/components/zone.py index 80f3827a135d07..235fe11934a718 100644 --- a/homeassistant/components/zone.py +++ b/homeassistant/components/zone.py @@ -47,7 +47,7 @@ vol.Optional(CONF_RADIUS, default=DEFAULT_RADIUS): vol.Coerce(float), vol.Optional(CONF_PASSIVE, default=DEFAULT_PASSIVE): cv.boolean, vol.Optional(CONF_ICON): cv.icon, -}) +}, extra=vol.ALLOW_EXTRA) def active_zone(hass, latitude, longitude, radius=0): From 5ffda53805d57a3b4553de7981879347cdc4db6f Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 15 Apr 2017 00:18:39 +0200 Subject: [PATCH 074/146] Upgrade aiohttp to 2.0.7 (#7106) --- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index b21a938a1a1cc8..5314f2aa218072 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -5,6 +5,6 @@ pip>=7.1.0 jinja2>=2.9.5 voluptuous==0.9.3 typing>=3,<4 -aiohttp==2.0.5 +aiohttp==2.0.7 async_timeout==1.2.0 chardet==2.3 diff --git a/requirements_all.txt b/requirements_all.txt index ffc8267775ad0f..af8cb7b585ad82 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -6,7 +6,7 @@ pip>=7.1.0 jinja2>=2.9.5 voluptuous==0.9.3 typing>=3,<4 -aiohttp==2.0.5 +aiohttp==2.0.7 async_timeout==1.2.0 chardet==2.3 diff --git a/setup.py b/setup.py index b9ef099a1adea3..c7a4eaa821c99e 100755 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ 'jinja2>=2.9.5', 'voluptuous==0.9.3', 'typing>=3,<4', - 'aiohttp==2.0.5', + 'aiohttp==2.0.7', 'async_timeout==1.2.0', 'chardet==2.3' ] From cce372ff6642ad451f803308cd9a02a6abcfcade Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 15 Apr 2017 00:26:04 +0200 Subject: [PATCH 075/146] Update file header, add const for defaults, and update log messages (#7110) --- .../components/binary_sensor/flic.py | 70 ++++++++++--------- 1 file changed, 38 insertions(+), 32 deletions(-) diff --git a/homeassistant/components/binary_sensor/flic.py b/homeassistant/components/binary_sensor/flic.py index eedcfb6060e9b9..2079d6a1ce8554 100644 --- a/homeassistant/components/binary_sensor/flic.py +++ b/homeassistant/components/binary_sensor/flic.py @@ -1,4 +1,9 @@ -"""Contains functionality to use flic buttons as a binary sensor.""" +""" +Support to use flic buttons as a binary sensor. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/binary_sensor.flic/ +""" import logging import threading @@ -11,39 +16,40 @@ from homeassistant.components.binary_sensor import ( BinarySensorDevice, PLATFORM_SCHEMA) - REQUIREMENTS = ['https://github.com/soldag/pyflic/archive/0.4.zip#pyflic==0.4'] _LOGGER = logging.getLogger(__name__) DEFAULT_TIMEOUT = 3 -CLICK_TYPE_SINGLE = "single" -CLICK_TYPE_DOUBLE = "double" -CLICK_TYPE_HOLD = "hold" +CLICK_TYPE_SINGLE = 'single' +CLICK_TYPE_DOUBLE = 'double' +CLICK_TYPE_HOLD = 'hold' CLICK_TYPES = [CLICK_TYPE_SINGLE, CLICK_TYPE_DOUBLE, CLICK_TYPE_HOLD] -CONF_IGNORED_CLICK_TYPES = "ignored_click_types" +CONF_IGNORED_CLICK_TYPES = 'ignored_click_types' -EVENT_NAME = "flic_click" -EVENT_DATA_NAME = "button_name" -EVENT_DATA_ADDRESS = "button_address" -EVENT_DATA_TYPE = "click_type" -EVENT_DATA_QUEUED_TIME = "queued_time" +DEFAULT_HOST = 'localhost' +DEFAULT_PORT = 5551 + +EVENT_NAME = 'flic_click' +EVENT_DATA_NAME = 'button_name' +EVENT_DATA_ADDRESS = 'button_address' +EVENT_DATA_TYPE = 'click_type' +EVENT_DATA_QUEUED_TIME = 'queued_time' -# Validation of the user's configuration PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ - vol.Optional(CONF_HOST, default='localhost'): cv.string, - vol.Optional(CONF_PORT, default=5551): cv.port, + vol.Optional(CONF_HOST, default=DEFAULT_HOST): cv.string, + vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_DISCOVERY, default=True): cv.boolean, vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, - vol.Optional(CONF_IGNORED_CLICK_TYPES): vol.All(cv.ensure_list, - [vol.In(CLICK_TYPES)]) + vol.Optional(CONF_IGNORED_CLICK_TYPES): + vol.All(cv.ensure_list, [vol.In(CLICK_TYPES)]) }) def setup_platform(hass, config, add_entities, discovery_info=None): - """Setup the flic platform.""" + """Set up the flic platform.""" import pyflic # Initialize flic client responsible for @@ -55,11 +61,11 @@ def setup_platform(hass, config, add_entities, discovery_info=None): try: client = pyflic.FlicClient(host, port) except ConnectionRefusedError: - _LOGGER.error("Failed to connect to flic server.") + _LOGGER.error("Failed to connect to flic server") return def new_button_callback(address): - """Setup newly verified button as device in home assistant.""" + """Set up newly verified button as device in Home Assistant.""" setup_button(hass, config, add_entities, client, address) client.on_new_verified_button = new_button_callback @@ -74,7 +80,7 @@ def new_button_callback(address): def get_info_callback(items): """Add entities for already verified buttons.""" - addresses = items["bd_addr_of_verified_buttons"] or [] + addresses = items['bd_addr_of_verified_buttons'] or [] for address in addresses: setup_button(hass, config, add_entities, client, address) @@ -83,7 +89,7 @@ def get_info_callback(items): def start_scanning(config, add_entities, client): - """Start a new flic client for scanning & connceting to new buttons.""" + """Start a new flic client for scanning and connecting to new buttons.""" import pyflic scan_wizard = pyflic.ScanWizard() @@ -91,10 +97,10 @@ def start_scanning(config, add_entities, client): def scan_completed_callback(scan_wizard, result, address, name): """Restart scan wizard to constantly check for new buttons.""" if result == pyflic.ScanWizardResult.WizardSuccess: - _LOGGER.info("Found new button (%s)", address) + _LOGGER.info("Found new button %s", address) elif result != pyflic.ScanWizardResult.WizardFailedTimeout: - _LOGGER.warning("Failed to connect to button (%s). Reason: %s", - address, result) + _LOGGER.warning( + "Failed to connect to button %s. Reason: %s", address, result) # Restart scan wizard start_scanning(config, add_entities, client) @@ -108,7 +114,7 @@ def setup_button(hass, config, add_entities, client, address): timeout = config.get(CONF_TIMEOUT) ignored_click_types = config.get(CONF_IGNORED_CLICK_TYPES) button = FlicButton(hass, client, address, timeout, ignored_click_types) - _LOGGER.info("Connected to button (%s)", address) + _LOGGER.info("Connected to button %s", address) add_entities([button]) @@ -161,7 +167,7 @@ def _create_channel(self): @property def name(self): """Return the name of the device.""" - return "flic_%s" % self.address.replace(":", "") + return 'flic_{}'.format(self.address.replace(':', '')) @property def address(self): @@ -181,21 +187,21 @@ def should_poll(self): @property def device_state_attributes(self): """Return device specific state attributes.""" - return {"address": self.address} + return {'address': self.address} def _queued_event_check(self, click_type, time_diff): """Generate a log message and returns true if timeout exceeded.""" time_string = "{:d} {}".format( - time_diff, "second" if time_diff == 1 else "seconds") + time_diff, 'second' if time_diff == 1 else 'seconds') if time_diff > self._timeout: _LOGGER.warning( - "Queued %s dropped for %s. Time in queue was %s.", + "Queued %s dropped for %s. Time in queue was %s", click_type, self.address, time_string) return True else: _LOGGER.info( - "Queued %s allowed for %s. Time in queue was %s.", + "Queued %s allowed for %s. Time in queue was %s", click_type, self.address, time_string) return False @@ -227,8 +233,8 @@ def _on_click(self, channel, click_type, was_queued, time_diff): EVENT_DATA_TYPE: hass_click_type }) - def _connection_status_changed(self, channel, - connection_status, disconnect_reason): + def _connection_status_changed( + self, channel, connection_status, disconnect_reason): """Remove device, if button disconnects.""" import pyflic From b0ffc55cfac5829bbe5f42fbd1bd3f638798d9a4 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 15 Apr 2017 00:28:04 +0200 Subject: [PATCH 076/146] Upgrade speedtest-cli to 1.0.4 (#7105) --- homeassistant/components/sensor/speedtest.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/speedtest.py b/homeassistant/components/sensor/speedtest.py index 76dbbe4ed3955b..5035e2464b31b1 100644 --- a/homeassistant/components/sensor/speedtest.py +++ b/homeassistant/components/sensor/speedtest.py @@ -20,7 +20,7 @@ from homeassistant.helpers.event import track_time_change from homeassistant.helpers.restore_state import async_get_last_state -REQUIREMENTS = ['speedtest-cli==1.0.3'] +REQUIREMENTS = ['speedtest-cli==1.0.4'] _LOGGER = logging.getLogger(__name__) _SPEEDTEST_REGEX = re.compile(r'Ping:\s(\d+\.\d+)\sms[\r\n]+' diff --git a/requirements_all.txt b/requirements_all.txt index af8cb7b585ad82..cdceebcd5fe425 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -728,7 +728,7 @@ snapcast==1.2.2 somecomfort==0.4.1 # homeassistant.components.sensor.speedtest -speedtest-cli==1.0.3 +speedtest-cli==1.0.4 # homeassistant.components.recorder # homeassistant.scripts.db_migrator From c43a3efabd43b7131bab54c181ecb18e700e3ff8 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sat, 15 Apr 2017 00:32:04 +0200 Subject: [PATCH 077/146] Remove globally disabled pylint issue and update docstrings (#7111) --- homeassistant/components/device_tracker/locative.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/device_tracker/locative.py b/homeassistant/components/device_tracker/locative.py index 255440a18e1530..668ee6dd8a0de7 100644 --- a/homeassistant/components/device_tracker/locative.py +++ b/homeassistant/components/device_tracker/locative.py @@ -22,20 +22,20 @@ def setup_scanner(hass, config, see, discovery_info=None): - """Setup an endpoint for the Locative application.""" + """Set up an endpoint for the Locative application.""" hass.http.register_view(LocativeView(see)) return True class LocativeView(HomeAssistantView): - """View to handle locative requests.""" + """View to handle Locative requests.""" url = URL name = 'api:locative' def __init__(self, see): - """Initialize Locative url endpoints.""" + """Initialize Locative URL endpoints.""" self.see = see @asyncio.coroutine @@ -52,7 +52,6 @@ def post(self, request): return res @asyncio.coroutine - # pylint: disable=too-many-return-statements def _handle(self, hass, data): """Handle locative request.""" if 'latitude' not in data or 'longitude' not in data: From 35de3a1dc490408cedd28e3654d3bb17472fadbf Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Sat, 15 Apr 2017 21:11:36 -0400 Subject: [PATCH 078/146] Use third-party lib aioautomatic for automatic (#7126) --- .../components/device_tracker/automatic.py | 177 +++++----- requirements_all.txt | 3 + .../device_tracker/test_automatic.py | 317 +++++------------- 3 files changed, 161 insertions(+), 336 deletions(-) diff --git a/homeassistant/components/device_tracker/automatic.py b/homeassistant/components/device_tracker/automatic.py index 3b4612edf6cd6e..53d49fd38d9427 100644 --- a/homeassistant/components/device_tracker/automatic.py +++ b/homeassistant/components/device_tracker/automatic.py @@ -4,19 +4,20 @@ For more details about this platform, please refer to the documentation at https://home-assistant.io/components/device_tracker.automatic/ """ +import asyncio from datetime import timedelta import logging -import re -import requests import voluptuous as vol from homeassistant.components.device_tracker import ( PLATFORM_SCHEMA, ATTR_ATTRIBUTES) from homeassistant.const import CONF_USERNAME, CONF_PASSWORD +from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv -from homeassistant.helpers.event import track_utc_time_change -from homeassistant.util import datetime as dt_util +from homeassistant.helpers.event import async_track_time_interval + +REQUIREMENTS = ['aioautomatic==0.1.1'] _LOGGER = logging.getLogger(__name__) @@ -24,129 +25,101 @@ CONF_SECRET = 'secret' CONF_DEVICES = 'devices' -SCOPE = 'scope:location scope:vehicle:profile scope:user:profile scope:trip' - -ATTR_ACCESS_TOKEN = 'access_token' -ATTR_EXPIRES_IN = 'expires_in' -ATTR_RESULTS = 'results' -ATTR_VEHICLE = 'vehicle' -ATTR_ENDED_AT = 'ended_at' -ATTR_END_LOCATION = 'end_location' - -URL_AUTHORIZE = 'https://accounts.automatic.com/oauth/access_token/' -URL_VEHICLES = 'https://api.automatic.com/vehicle/' -URL_TRIPS = 'https://api.automatic.com/trip/' - -_VEHICLE_ID_REGEX = re.compile( - (URL_VEHICLES + '(.*)?[/]$').replace('/', r'\/')) +DEFAULT_TIMEOUT = 5 PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_CLIENT_ID): cv.string, vol.Required(CONF_SECRET): cv.string, vol.Required(CONF_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string, - vol.Optional(CONF_DEVICES): vol.All(cv.ensure_list, [cv.string]) + vol.Optional(CONF_DEVICES, default=None): vol.All( + cv.ensure_list, [cv.string]) }) -def setup_scanner(hass, config: dict, see, discovery_info=None): +@asyncio.coroutine +def async_setup_scanner(hass, config, async_see, discovery_info=None): """Validate the configuration and return an Automatic scanner.""" + import aioautomatic + + client = aioautomatic.Client( + client_id=config[CONF_CLIENT_ID], + client_secret=config[CONF_SECRET], + client_session=async_get_clientsession(hass), + request_kwargs={'timeout': DEFAULT_TIMEOUT}) try: - AutomaticDeviceScanner(hass, config, see) - except requests.HTTPError as err: + session = yield from client.create_session_from_password( + config[CONF_USERNAME], config[CONF_PASSWORD]) + data = AutomaticData(hass, session, config[CONF_DEVICES], async_see) + except aioautomatic.exceptions.AutomaticError as err: _LOGGER.error(str(err)) return False + yield from data.update() return True -class AutomaticDeviceScanner(object): - """A class representing an Automatic device.""" +class AutomaticData(object): + """A class representing an Automatic cloud service connection.""" - def __init__(self, hass, config: dict, see) -> None: + def __init__(self, hass, session, devices, async_see): """Initialize the automatic device scanner.""" self.hass = hass - self._devices = config.get(CONF_DEVICES, None) - self._access_token_payload = { - 'username': config.get(CONF_USERNAME), - 'password': config.get(CONF_PASSWORD), - 'client_id': config.get(CONF_CLIENT_ID), - 'client_secret': config.get(CONF_SECRET), - 'grant_type': 'password', - 'scope': SCOPE - } - self._headers = None - self._token_expires = dt_util.now() - self.last_results = {} - self.last_trips = {} - self.see = see - - self._update_info() - - track_utc_time_change(self.hass, self._update_info, - second=range(0, 60, 30)) - - def _update_headers(self): - """Get the access token from automatic.""" - if self._headers is None or self._token_expires <= dt_util.now(): - resp = requests.post( - URL_AUTHORIZE, - data=self._access_token_payload) - - resp.raise_for_status() + self.devices = devices + self.session = session + self.async_see = async_see - json = resp.json() + async_track_time_interval(hass, self.update, timedelta(seconds=30)) - access_token = json[ATTR_ACCESS_TOKEN] - self._token_expires = dt_util.now() + timedelta( - seconds=json[ATTR_EXPIRES_IN]) - self._headers = { - 'Authorization': 'Bearer {}'.format(access_token) - } - - def _update_info(self, now=None) -> None: + @asyncio.coroutine + def update(self, now=None): """Update the device info.""" - _LOGGER.debug('Updating devices %s', now) - self._update_headers() - - response = requests.get(URL_VEHICLES, headers=self._headers) - - response.raise_for_status() - - self.last_results = [item for item in response.json()[ATTR_RESULTS] - if self._devices is None or item[ - 'display_name'] in self._devices] + import aioautomatic - response = requests.get(URL_TRIPS, headers=self._headers) - - if response.status_code == 200: - for trip in response.json()[ATTR_RESULTS]: - vehicle_id = _VEHICLE_ID_REGEX.match( - trip[ATTR_VEHICLE]).group(1) - if vehicle_id not in self.last_trips: - self.last_trips[vehicle_id] = trip - elif self.last_trips[vehicle_id][ATTR_ENDED_AT] < trip[ - ATTR_ENDED_AT]: - self.last_trips[vehicle_id] = trip - - for vehicle in self.last_results: - dev_id = vehicle.get('id') - host_name = vehicle.get('display_name') + _LOGGER.debug('Updating devices %s', now) - attrs = { - 'fuel_level': vehicle.get('fuel_level_percent') - } + try: + vehicles = yield from self.session.get_vehicles() + except aioautomatic.exceptions.AutomaticError as err: + _LOGGER.error(str(err)) + return False + + for vehicle in vehicles: + name = vehicle.display_name + if name is None: + name = ' '.join(filter(None, ( + str(vehicle.year), vehicle.make, vehicle.model))) + + if self.devices is not None and name not in self.devices: + continue + + self.hass.async_add_job(self.update_vehicle(vehicle, name)) + + @asyncio.coroutine + def update_vehicle(self, vehicle, name): + """Updated the specified vehicle's data.""" + import aioautomatic + + kwargs = { + 'dev_id': vehicle.id, + 'host_name': name, + 'mac': vehicle.id, + ATTR_ATTRIBUTES: { + 'fuel_level': vehicle.fuel_level_percent, + } + } - kwargs = { - 'dev_id': dev_id, - 'host_name': host_name, - 'mac': dev_id, - ATTR_ATTRIBUTES: attrs - } + trips = [] + try: + # Get the most recent trip for this vehicle + trips = yield from self.session.get_trips( + vehicle=vehicle.id, limit=1) + except aioautomatic.exceptions.AutomaticError as err: + _LOGGER.error(str(err)) - if dev_id in self.last_trips: - end_location = self.last_trips[dev_id][ATTR_END_LOCATION] - kwargs['gps'] = (end_location['lat'], end_location['lon']) - kwargs['gps_accuracy'] = end_location['accuracy_m'] + if trips: + end_location = trips[0].end_location + kwargs['gps'] = (end_location.lat, end_location.lon) + kwargs['gps_accuracy'] = end_location.accuracy_m - self.see(**kwargs) + yield from self.async_see(**kwargs) diff --git a/requirements_all.txt b/requirements_all.txt index cdceebcd5fe425..1432545bcfd8e7 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -37,6 +37,9 @@ SoCo==0.12 # homeassistant.components.notify.twitter TwitterAPI==2.4.5 +# homeassistant.components.device_tracker.automatic +aioautomatic==0.1.1 + # homeassistant.components.sensor.dnsip aiodns==1.1.1 diff --git a/tests/components/device_tracker/test_automatic.py b/tests/components/device_tracker/test_automatic.py index 8e7d37d87981a5..dd03fd1da57f4b 100644 --- a/tests/components/device_tracker/test_automatic.py +++ b/tests/components/device_tracker/test_automatic.py @@ -1,241 +1,90 @@ """Test the automatic device tracker platform.""" - +import asyncio import logging -import requests -import unittest -from unittest.mock import patch +from unittest.mock import patch, MagicMock +import aioautomatic from homeassistant.components.device_tracker.automatic import ( - URL_AUTHORIZE, URL_VEHICLES, URL_TRIPS, setup_scanner) - -from tests.common import get_test_home_assistant + async_setup_scanner) _LOGGER = logging.getLogger(__name__) -INVALID_USERNAME = 'bob' -VALID_USERNAME = 'jim' -PASSWORD = 'password' -CLIENT_ID = '12345' -CLIENT_SECRET = '54321' -FUEL_LEVEL = 77.2 -LATITUDE = 32.82336 -LONGITUDE = -117.23743 -ACCURACY = 8 -DISPLAY_NAME = 'My Vehicle' - - -def mocked_requests(*args, **kwargs): - """Mock requests.get invocations.""" - class MockResponse: - """Class to represent a mocked response.""" - - def __init__(self, json_data, status_code): - """Initialize the mock response class.""" - self.json_data = json_data - self.status_code = status_code - - def json(self): - """Return the json of the response.""" - return self.json_data - - @property - def content(self): - """Return the content of the response.""" - return self.json() - - def raise_for_status(self): - """Raise an HTTPError if status is not 200.""" - if self.status_code != 200: - raise requests.HTTPError(self.status_code) - - data = kwargs.get('data') - - if data and data.get('username', None) == INVALID_USERNAME: - return MockResponse({ - "error": "invalid_credentials" - }, 401) - elif str(args[0]).startswith(URL_AUTHORIZE): - return MockResponse({ - "user": { - "sid": "sid", - "id": "id" - }, - "token_type": "Bearer", - "access_token": "accesstoken", - "refresh_token": "refreshtoken", - "expires_in": 31521669, - "scope": "" - }, 200) - elif str(args[0]).startswith(URL_VEHICLES): - return MockResponse({ - "_metadata": { - "count": 2, - "next": None, - "previous": None - }, - "results": [ - { - "url": "https://api.automatic.com/vehicle/vid/", - "id": "vid", - "created_at": "2016-03-05T20:05:16.240000Z", - "updated_at": "2016-08-29T01:52:59.597898Z", - "make": "Honda", - "model": "Element", - "year": 2007, - "submodel": "EX", - "display_name": DISPLAY_NAME, - "fuel_grade": "regular", - "fuel_level_percent": FUEL_LEVEL, - "active_dtcs": [] - }] - }, 200) - elif str(args[0]).startswith(URL_TRIPS): - return MockResponse({ - "_metadata": { - "count": 1594, - "next": "https://api.automatic.com/trip/?page=2", - "previous": None - }, - "results": [ - { - "url": "https://api.automatic.com/trip/tid1/", - "id": "tid1", - "driver": "https://api.automatic.com/user/uid/", - "user": "https://api.automatic.com/user/uid/", - "started_at": "2016-08-28T19:37:23.986000Z", - "ended_at": "2016-08-28T19:43:22.500000Z", - "distance_m": 3931.6, - "duration_s": 358.5, - "vehicle": "https://api.automatic.com/vehicle/vid/", - "start_location": { - "lat": 32.87336, - "lon": -117.22743, - "accuracy_m": 10 - }, - "start_address": { - "name": "123 Fake St, Nowhere, NV 12345", - "display_name": "123 Fake St, Nowhere, NV", - "street_number": "Unknown", - "street_name": "Fake St", - "city": "Nowhere", - "state": "NV", - "country": "US" - }, - "end_location": { - "lat": LATITUDE, - "lon": LONGITUDE, - "accuracy_m": ACCURACY - }, - "end_address": { - "name": "321 Fake St, Nowhere, NV 12345", - "display_name": "321 Fake St, Nowhere, NV", - "street_number": "Unknown", - "street_name": "Fake St", - "city": "Nowhere", - "state": "NV", - "country": "US" - }, - "path": "path", - "vehicle_events": [], - "start_timezone": "America/Denver", - "end_timezone": "America/Denver", - "idling_time_s": 0, - "tags": [] - }, - { - "url": "https://api.automatic.com/trip/tid2/", - "id": "tid2", - "driver": "https://api.automatic.com/user/uid/", - "user": "https://api.automatic.com/user/uid/", - "started_at": "2016-08-28T18:48:00.727000Z", - "ended_at": "2016-08-28T18:55:25.800000Z", - "distance_m": 3969.1, - "duration_s": 445.1, - "vehicle": "https://api.automatic.com/vehicle/vid/", - "start_location": { - "lat": 32.87336, - "lon": -117.22743, - "accuracy_m": 11 - }, - "start_address": { - "name": "123 Fake St, Nowhere, NV, USA", - "display_name": "Fake St, Nowhere, NV", - "street_number": "123", - "street_name": "Fake St", - "city": "Nowhere", - "state": "NV", - "country": "US" - }, - "end_location": { - "lat": 32.82336, - "lon": -117.23743, - "accuracy_m": 10 - }, - "end_address": { - "name": "321 Fake St, Nowhere, NV, USA", - "display_name": "Fake St, Nowhere, NV", - "street_number": "Unknown", - "street_name": "Fake St", - "city": "Nowhere", - "state": "NV", - "country": "US" - }, - "path": "path", - "vehicle_events": [], - "start_timezone": "America/Denver", - "end_timezone": "America/Denver", - "idling_time_s": 0, - "tags": [] - } - ] - }, 200) - else: - _LOGGER.debug('UNKNOWN ROUTE') - - -class TestAutomatic(unittest.TestCase): - """Test cases around the automatic device scanner.""" - - def see_mock(self, **kwargs): - """Mock see function.""" - self.assertEqual('vid', kwargs.get('dev_id')) - self.assertEqual(FUEL_LEVEL, - kwargs.get('attributes', {}).get('fuel_level')) - self.assertEqual((LATITUDE, LONGITUDE), kwargs.get('gps')) - self.assertEqual(ACCURACY, kwargs.get('gps_accuracy')) - - def setUp(self): - """Set up test data.""" - self.hass = get_test_home_assistant() - - def tearDown(self): - """Tear down test data.""" - self.hass.stop() - - @patch('requests.get', side_effect=mocked_requests) - @patch('requests.post', side_effect=mocked_requests) - def test_invalid_credentials(self, mock_get, mock_post): - """Test error is raised with invalid credentials.""" - config = { - 'platform': 'automatic', - 'username': INVALID_USERNAME, - 'password': PASSWORD, - 'client_id': CLIENT_ID, - 'secret': CLIENT_SECRET - } - - self.assertFalse(setup_scanner(self.hass, config, self.see_mock)) - - @patch('requests.get', side_effect=mocked_requests) - @patch('requests.post', side_effect=mocked_requests) - def test_valid_credentials(self, mock_get, mock_post): - """Test error is raised with invalid credentials.""" - config = { - 'platform': 'automatic', - 'username': VALID_USERNAME, - 'password': PASSWORD, - 'client_id': CLIENT_ID, - 'secret': CLIENT_SECRET - } - - self.assertTrue(setup_scanner(self.hass, config, self.see_mock)) + +@patch('aioautomatic.Client.create_session_from_password') +def test_invalid_credentials(mock_create_session, hass): + """Test with invalid credentials.""" + @asyncio.coroutine + def get_session(*args, **kwargs): + """Return the test session.""" + raise aioautomatic.exceptions.ForbiddenError() + + mock_create_session.side_effect = get_session + + config = { + 'platform': 'automatic', + 'username': 'bad_username', + 'password': 'bad_password', + 'client_id': 'client_id', + 'secret': 'client_secret', + 'devices': None, + } + result = hass.loop.run_until_complete( + async_setup_scanner(hass, config, None)) + assert not result + + +@patch('aioautomatic.Client.create_session_from_password') +def test_valid_credentials(mock_create_session, hass): + """Test with valid credentials.""" + session = MagicMock() + vehicle = MagicMock() + trip = MagicMock() + mock_see = MagicMock() + + vehicle.id = 'mock_id' + vehicle.display_name = 'mock_display_name' + vehicle.fuel_level_percent = 45.6 + + trip.end_location.lat = 45.567 + trip.end_location.lon = 34.345 + trip.end_location.accuracy_m = 5.6 + + @asyncio.coroutine + def get_session(*args, **kwargs): + """Return the test session.""" + return session + + @asyncio.coroutine + def get_vehicles(*args, **kwargs): + """Return list of test vehicles.""" + return [vehicle] + + @asyncio.coroutine + def get_trips(*args, **kwargs): + """Return list of test trips.""" + return [trip] + + mock_create_session.side_effect = get_session + session.get_vehicles.side_effect = get_vehicles + session.get_trips.side_effect = get_trips + + config = { + 'platform': 'automatic', + 'username': 'bad_username', + 'password': 'bad_password', + 'client_id': 'client_id', + 'secret': 'client_secret', + 'devices': None, + } + result = hass.loop.run_until_complete( + async_setup_scanner(hass, config, mock_see)) + + assert result + assert mock_see.called + assert len(mock_see.mock_calls) == 2 + assert mock_see.mock_calls[0][2]['dev_id'] == 'mock_id' + assert mock_see.mock_calls[0][2]['mac'] == 'mock_id' + assert mock_see.mock_calls[0][2]['host_name'] == 'mock_display_name' + assert mock_see.mock_calls[0][2]['attributes'] == {'fuel_level': 45.6} + assert mock_see.mock_calls[0][2]['gps'] == (45.567, 34.345) + assert mock_see.mock_calls[0][2]['gps_accuracy'] == 5.6 From f7b6f8e8fbec5e3975813ea35cacf511b315a63d Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Sun, 16 Apr 2017 03:32:06 +0200 Subject: [PATCH 079/146] Upgrade chardet to 3.0.2 (#7112) --- homeassistant/package_constraints.txt | 2 +- requirements_all.txt | 2 +- setup.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/package_constraints.txt b/homeassistant/package_constraints.txt index 5314f2aa218072..f2ea6e743c404a 100644 --- a/homeassistant/package_constraints.txt +++ b/homeassistant/package_constraints.txt @@ -7,4 +7,4 @@ voluptuous==0.9.3 typing>=3,<4 aiohttp==2.0.7 async_timeout==1.2.0 -chardet==2.3 +chardet==3.0.2 diff --git a/requirements_all.txt b/requirements_all.txt index 1432545bcfd8e7..116099177acd86 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -8,7 +8,7 @@ voluptuous==0.9.3 typing>=3,<4 aiohttp==2.0.7 async_timeout==1.2.0 -chardet==2.3 +chardet==3.0.2 # homeassistant.components.nuimo_controller --only-binary=all http://github.com/getSenic/nuimo-linux-python/archive/29fc42987f74d8090d0e2382e8f248ff5990b8c9.zip#nuimo==1.0.0 diff --git a/setup.py b/setup.py index c7a4eaa821c99e..05f117652d1e6d 100755 --- a/setup.py +++ b/setup.py @@ -24,7 +24,7 @@ 'typing>=3,<4', 'aiohttp==2.0.7', 'async_timeout==1.2.0', - 'chardet==2.3' + 'chardet==3.0.2' ] setup( From 6cbe28a9cd4d68487c754107a30ac53df507faa8 Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Sun, 16 Apr 2017 04:00:01 +0200 Subject: [PATCH 080/146] Send stderr of ping tracker to devnull (#7096) When pinging an inaccessible device, OS errors like ping: sendto: No route to host can occur. For a ping tracker this is not an error but rather a normal situation. Thus, it makes sense to hide the error. --- homeassistant/components/device_tracker/ping.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/device_tracker/ping.py b/homeassistant/components/device_tracker/ping.py index 7c217b7aabb75f..ee9a4d19d37a93 100644 --- a/homeassistant/components/device_tracker/ping.py +++ b/homeassistant/components/device_tracker/ping.py @@ -45,7 +45,9 @@ def __init__(self, ip_address, dev_id, hass, config): def ping(self): """Send an ICMP echo request and return True if success.""" - pinger = subprocess.Popen(self._ping_cmd, stdout=subprocess.PIPE) + pinger = subprocess.Popen(self._ping_cmd, + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL) try: pinger.communicate() return pinger.returncode == 0 From 9249b6bc332ec45e81e7c8cc7cad7393da2088e3 Mon Sep 17 00:00:00 2001 From: Marcelo Moreira de Mello Date: Sun, 16 Apr 2017 03:05:15 -0400 Subject: [PATCH 081/146] Upgraded Amcrest module to 1.1.9 to support new firmware versions: (#7130) - V2.400.AC01.15.R.20170328 - V2.420.AC00.17.R.20170322 --- homeassistant/components/camera/amcrest.py | 2 +- homeassistant/components/sensor/amcrest.py | 2 +- requirements_all.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/camera/amcrest.py b/homeassistant/components/camera/amcrest.py index a50cdc859a7745..72d3120c77a086 100644 --- a/homeassistant/components/camera/amcrest.py +++ b/homeassistant/components/camera/amcrest.py @@ -18,7 +18,7 @@ from homeassistant.helpers.aiohttp_client import ( async_get_clientsession, async_aiohttp_proxy_web) -REQUIREMENTS = ['amcrest==1.1.8'] +REQUIREMENTS = ['amcrest==1.1.9'] _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/sensor/amcrest.py b/homeassistant/components/sensor/amcrest.py index 2d05372220bc65..40556fbe5ad251 100644 --- a/homeassistant/components/sensor/amcrest.py +++ b/homeassistant/components/sensor/amcrest.py @@ -19,7 +19,7 @@ from requests.exceptions import HTTPError, ConnectTimeout -REQUIREMENTS = ['amcrest==1.1.8'] +REQUIREMENTS = ['amcrest==1.1.9'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 116099177acd86..f82fbaeaaad790 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -55,7 +55,7 @@ alarmdecoder==0.12.1.0 # homeassistant.components.camera.amcrest # homeassistant.components.sensor.amcrest -amcrest==1.1.8 +amcrest==1.1.9 # homeassistant.components.media_player.anthemav anthemav==1.1.8 From 7d761867988a51e2a472be4440e69a2d6a6373a5 Mon Sep 17 00:00:00 2001 From: Gianluca Barbaro Date: Sun, 16 Apr 2017 11:06:57 +0200 Subject: [PATCH 082/146] Mqtt camera (#7092) * first commit * minor fixes * minor fix * async_camera_image + test * minor fix * async calls --- homeassistant/components/camera/mqtt.py | 74 +++++++++++++++++++++++++ tests/components/camera/test_mqtt.py | 28 ++++++++++ 2 files changed, 102 insertions(+) create mode 100755 homeassistant/components/camera/mqtt.py create mode 100644 tests/components/camera/test_mqtt.py diff --git a/homeassistant/components/camera/mqtt.py b/homeassistant/components/camera/mqtt.py new file mode 100755 index 00000000000000..39fbdc7fd9f266 --- /dev/null +++ b/homeassistant/components/camera/mqtt.py @@ -0,0 +1,74 @@ +""" +Camera that loads a picture from an MQTT topic. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/camera.mqtt/ +""" + +import asyncio +import logging + +import voluptuous as vol + +from homeassistant.core import callback +import homeassistant.components.mqtt as mqtt +from homeassistant.const import CONF_NAME +from homeassistant.components.camera import Camera, PLATFORM_SCHEMA +from homeassistant.helpers import config_validation as cv + +_LOGGER = logging.getLogger(__name__) + +CONF_TOPIC = 'topic' + +DEFAULT_NAME = 'MQTT Camera' + +DEPENDENCIES = ['mqtt'] + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_TOPIC): mqtt.valid_subscribe_topic, + vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string +}) + + +@asyncio.coroutine +def async_setup_platform(hass, config, async_add_devices, discovery_info=None): + """Setup the Camera.""" + topic = config[CONF_TOPIC] + + async_add_devices([MqttCamera(config[CONF_NAME], topic)]) + + +class MqttCamera(Camera): + """MQTT camera.""" + + def __init__(self, name, topic): + """Initialize Local File Camera component.""" + super().__init__() + + self._name = name + self._topic = topic + self._qos = 0 + self._last_image = None + + @asyncio.coroutine + def async_camera_image(self): + """Return image response.""" + return self._last_image + + @property + def name(self): + """Return the name of this camera.""" + return self._name + + def async_added_to_hass(self): + """Subscribe mqtt events. + + This method must be run in the event loop and returns a coroutine. + """ + @callback + def message_received(topic, payload, qos): + """A new MQTT message has been received.""" + self._last_image = payload + + return mqtt.async_subscribe( + self.hass, self._topic, message_received, self._qos, None) diff --git a/tests/components/camera/test_mqtt.py b/tests/components/camera/test_mqtt.py new file mode 100644 index 00000000000000..35552ca805ec12 --- /dev/null +++ b/tests/components/camera/test_mqtt.py @@ -0,0 +1,28 @@ +"""The tests for mqtt camera component.""" +import asyncio + +from homeassistant.setup import async_setup_component +import homeassistant.components.mqtt as mqtt + + +@asyncio.coroutine +def test_run_camera_setup(hass, test_client): + """Test that it fetches the given dispatcher data.""" + topic = 'test/camera' + yield from async_setup_component(hass, 'camera', { + 'camera': { + 'platform': 'mqtt', + 'topic': topic, + 'name': 'Test Camera', + }}) + + client = yield from test_client(hass.http.app) + + mqtt.publish(hass, topic, 0xFFD8FF) + yield from hass.async_block_till_done() + + resp = yield from client.get('/api/camera_proxy/camera.test_camera') + + assert resp.status == 200 + body = yield from resp.text() + assert body == '16767231' From 3528705afd2f230b2ec5eacf8a69d1d57caf1cb4 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Sun, 16 Apr 2017 13:27:25 +0200 Subject: [PATCH 083/146] Bump version to 0.43.0.dev0 (#7132) --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index b73f64bfa72f6d..a65b721625cbb4 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -1,7 +1,7 @@ # coding: utf-8 """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 -MINOR_VERSION = 42 +MINOR_VERSION = 43 PATCH_VERSION = '0.dev0' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) From a1208261a8c17aa17be5d6dde928284d2889a9a1 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 16 Apr 2017 11:10:55 -0700 Subject: [PATCH 084/146] Load zwave panel (#7127) * Load Z-Wave panel when component loads * Update frontend * Fix tests --- homeassistant/bootstrap.py | 3 ++- homeassistant/components/frontend/version.py | 15 ++++++++------- .../frontend/www_static/compatibility.js | 2 +- .../frontend/www_static/compatibility.js.gz | Bin 362 -> 360 bytes .../components/frontend/www_static/core.js | 2 +- .../components/frontend/www_static/core.js.gz | Bin 2695 -> 2682 bytes .../frontend/www_static/frontend.html | 16 ++++++++-------- .../frontend/www_static/frontend.html.gz | Bin 139452 -> 139925 bytes .../www_static/home-assistant-polymer | 2 +- .../www_static/panels/ha-panel-config.html | 2 +- .../www_static/panels/ha-panel-config.html.gz | Bin 17039 -> 17135 bytes .../panels/ha-panel-dev-service.html | 2 +- .../panels/ha-panel-dev-service.html.gz | Bin 17902 -> 17941 bytes .../www_static/panels/ha-panel-history.html | 2 +- .../panels/ha-panel-history.html.gz | Bin 11885 -> 11892 bytes .../www_static/panels/ha-panel-logbook.html | 4 ++-- .../panels/ha-panel-logbook.html.gz | Bin 34867 -> 34883 bytes .../www_static/panels/ha-panel-zwave.html | 1 + .../www_static/panels/ha-panel-zwave.html.gz | Bin 0 -> 5936 bytes .../frontend/www_static/service_worker.js | 2 +- .../frontend/www_static/service_worker.js.gz | Bin 2513 -> 2506 bytes homeassistant/components/zwave/__init__.py | 4 ++++ 22 files changed, 32 insertions(+), 25 deletions(-) create mode 100644 homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html create mode 100644 homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html.gz diff --git a/homeassistant/bootstrap.py b/homeassistant/bootstrap.py index 4c586d12ccd2c2..afcd2717e72d61 100644 --- a/homeassistant/bootstrap.py +++ b/homeassistant/bootstrap.py @@ -27,7 +27,8 @@ ERROR_LOG_FILENAME = 'home-assistant.log' FIRST_INIT_COMPONENT = set(( - 'recorder', 'mqtt', 'mqtt_eventstream', 'logger', 'introduction')) + 'recorder', 'mqtt', 'mqtt_eventstream', 'logger', 'introduction', + 'frontend')) def from_config_dict(config: Dict[str, Any], diff --git a/homeassistant/components/frontend/version.py b/homeassistant/components/frontend/version.py index 44563480cdb369..408d40092a022b 100644 --- a/homeassistant/components/frontend/version.py +++ b/homeassistant/components/frontend/version.py @@ -1,20 +1,21 @@ """DO NOT MODIFY. Auto-generated by script/fingerprint_frontend.""" FINGERPRINTS = { - "compatibility.js": "83d9c77748dafa9db49ae77d7f3d8fb0", - "core.js": "5d08475f03adb5969bd31855d5ca0cfd", - "frontend.html": "feaf3e9453eca239f29eb10e7645a84f", + "compatibility.js": "c679589d32e0588becbf104d9907e96a", + "core.js": "4073d1aa7a9367ac39f33f43c34b51c9", + "frontend.html": "1f8de6ac579f877695ccd06a60a8d703", "mdi.html": "989f02c51eba561dc32b9ecc628a84b3", "micromarkdown-js.html": "93b5ec4016f0bba585521cf4d18dec1a", - "panels/ha-panel-config.html": "6dcb246cd356307a638f81c4f89bf9b3", + "panels/ha-panel-config.html": "41395854f8e541c9fee32615e1fc315f", "panels/ha-panel-dev-event.html": "1f169700c2345785855b1d7919d12326", "panels/ha-panel-dev-info.html": "61610e015a411cfc84edd2c4d489e71d", - "panels/ha-panel-dev-service.html": "0fe8e6acdccf2dc3d1ae657b2c7f2df0", + "panels/ha-panel-dev-service.html": "4a8cc058f68f737b8129196e3033ef37", "panels/ha-panel-dev-state.html": "48d37db4a1d6708314ded1d624d0f4d4", "panels/ha-panel-dev-template.html": "6f353392d68574fbc5af188bca44d0ae", - "panels/ha-panel-history.html": "6945cebe5d8075aae560d2c4246b063f", + "panels/ha-panel-history.html": "c136dc6b97bb7c619b33f12232cf129b", "panels/ha-panel-iframe.html": "d920f0aa3c903680f2f8795e2255daab", - "panels/ha-panel-logbook.html": "a1fc2b5d739bedb9d87e4da4cd929a71", + "panels/ha-panel-logbook.html": "5cd70ad9981d846c9bb6f57b0adfe0e3", "panels/ha-panel-map.html": "e3c7a54f90dd4269d7e53cdcd96514c6", + "panels/ha-panel-zwave.html": "c014a55b05832b195339aa1dde98c563", "websocket_test.html": "575de64b431fe11c3785bf96d7813450" } diff --git a/homeassistant/components/frontend/www_static/compatibility.js b/homeassistant/components/frontend/www_static/compatibility.js index c152c50ddfa5ba..178d14688ab5e7 100644 --- a/homeassistant/components/frontend/www_static/compatibility.js +++ b/homeassistant/components/frontend/www_static/compatibility.js @@ -1 +1 @@ -!(function(){"use strict";function e(e,r){var t=arguments;if(void 0===e||null===e)throw new TypeError("Cannot convert first argument to object");for(var n=Object(e),o=1;oGD_t17mM(aA9<5Vrgt?ba^gna{xtiw~5QX>t3WovNiiMIj z)Kl9z9lAvs3^^0G?in2hgn<8E(%@vV-kt8=_k0^}S}cS0$i`z)FuDP+-PV z6Ik?O!82cc!$K9gS;lWDRLB1o2O+)M=l=D9&KzJBuDRcC@3E{3Cx3n>+9+ky^p@zR zM6`6PW%dI@!&iGNgw$#$OXZ@kel2qyy$j_|`YcV{tsoqG{3Ks59~s`EDaqDhAy`?6 z{J}SAYBInjFzLcUnsPi9XJwa1%rik~2^r3hBhzyJm7tr(Rya*-c>!Y)B5;i@llxR6 z$0y{l*~{g^##ZfG?_^IlMBQoE!U1M6^YOlZ09kuC80*}DW|75$i&=1yzx)CHG3ap~ G0ssK6(yn3v literal 362 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 BEJgqT diff --git a/homeassistant/components/frontend/www_static/frontend.html b/homeassistant/components/frontend/www_static/frontend.html index ce38aab68211db..cb89b1a8b6b928 100644 --- a/homeassistant/components/frontend/www_static/frontend.html +++ b/homeassistant/components/frontend/www_static/frontend.html @@ -1,7 +1,7 @@ - \ No newline at end of file +}()); \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/frontend.html.gz b/homeassistant/components/frontend/www_static/frontend.html.gz index f41ff60ac7600e79608fd580e7832c236c02c5d9..90e1acbd1c78ebda78022b47aa20908668eff1a7 100644 GIT binary patch delta 138734 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

LE&|&ucNW zSBh9Ctd{DipjQgp?tOnugy{<1?mw-1sB@9CYS`ea9uz!SvR4b$k*F=^0e8vVz@N6X zZx27|E*fF8P?~~kscaT@9#xq*pGHmV+OG+Nfw2YzQk~Ycb7{)9`r)>z3yW+s5a(K$vczOKa%BycR88?2`9bC$v${D*!4qlK!s(%BcA9_V(17r2X#8SUaC)9ARAG zlaDg))(tP;Hqmmus5AR2UR>E9jJDO|kg&O^$_>Ai9l}r-Aj_w=LUnO@xnM2bZ$xYf z)va?c?YWkaorZs*=QdnsHtxdL`6A2TabZK(h7-{|vA~e3 zCeWOgl%ayG+EgB24)0XL$+iXp|&oj#+^uqCWCW5v(H$|pWoR3c(d7E8m z8^+iMDPd^iz(2hje`;EPYG9O2U%j&A8S%z?&cb z1mRQbZ8v|q+HEIgHrKok+I5@VYP@9n&FZ?IvZTv}1MYF*BgL2EqVq<%#0;f$UBfPery6xm+2%GZyAaKD|MfzqxXx!? z`EaOO>sPU1`=#Cf*KXOxq`S-NDDw5LpJKU(6nTGBF6c_i?M+NX2flI=pRKQk zgG8G{ytpvl5P#JR8{V6^J-MJ@pcZ1{)*wsXgELxdyL_0tV%2v#nR+tgQw8b6I^E+? ze0ZVbHDU%BotF%j<+>7&ytqm%>|*R+J$mq4l?knf;a#nM=J|G4vz{ZXZ+|?`&`8JJ|8{LkyLVHM zWv*dpyTf6e8CPjhr075@ND>vDiOfo|5}SXhv~)hFr;75`W;Zx_^-{bg{Rx^tk;1m) zU8d!`7Zfe3l8+`akf=9Zv8UI5i&lgvV{^G(aRAxkLV85C8uS>%8oA~JSJk7~d-icj zY_;#!z?D?t#^$Ou=8c2-MvsJUSH7-6CUIL>}4mt9+(v4@KH_?U!+>tslSd z^r!9kx3iz{n>47g>kde5i*HNDFbIDm9eSS@t7}3Pf3B`5KeX>74ax26N@%c0JUZmA zFCIUlr}vLfVc(pye0n3ilf~$??0^$Tn%5gBPvv;=PF5whv*X7x4(O)ehq}eOj#WGT zW!1k}u#e}($FWNLz|P-gHKnUW{Md|T1N{t7=*(`1r?oa`WUD+Q&1n3pD6@Zm!q$;4 z;+sEn({`B`jwQtXIUtT}y~^Ul*aX_iY9@L6>VrVZ%8KpXr>wB0Z&jo{%YfxQvaZ>_ zqn;Iu^)hekT;zIFJzaj<;CVB<#_yEcnrncBfl=cd)hm7CAG;f!Y=0UJ<%PGcyl81n zWVi_qXc|*Z5d9cwX8V(kj;Mb?x~>b|OFZg~I+$cNu2Zcqw<%;7MpO7{H$y4vms8yV zVlWi{8?8P%zz8Vp@t>y^NV-<7mUI{FBctadyQ?GK)sb7}*r;-BS2^ZYj@>HvjVkx; zD))Jn`)-v7MwJJ4l?S}a1GmaUqsl|O%0ph|p=wKuWVPsMQ z2!r@iRV~nTkzM97rK;ML*5_A2RETH$la01#Aco?*R;O{E>}_3SHIs~1K{{(R32E)n zVx}+AXcN{K~(!;6te =R%>?^6l9{I@wQB(+t&U>{T-d1 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 ss##Y(k73s z#Za%VhaK(puNK3VKpxTk2!1v_AHg(UkWsL>F2OV ziM4r#ns9#Iu{Ob{lo2-De`qoeD-XK?vD=?Zc$nKXh*1m#7+iyw$+Vj4=x5i=e(rF(7w#uhXOAimX?}7Y)-k~0h!{Sod;wp7?BjvSCU%)}f<@U^MjGi8oJMfstl~AffB1v8uU6#K(9HW|ML9_RWK!~K z=9AKKWVuwL=btkl?Q+k$A=p(=n6kf%WUcL(6$hx>NWL1n); zc#u5!f2-hQ+o#0WS|d6VSo`5X#PJrE3RF%D8VC?t{mLzt@8KqB_erSNytRl4wVNCu zqM>@bLqT^>TT2>Hy}@IiG4ha;JAOhTf)_MwYmchPvjQoAfaGRKu11PgC~t(B7t8sq zwKnu&;KJ5%m?xsWkfEPrh1BVKO5!^*4u;5~e_#gU5qbKaM9j+arq!^dt*8q8DD*ZN zbIDv44N~PllPQjx4Lf{-q^lKcO7L&4_ypbI{2P6D1n9y2_`l0j(=`GzOrd=dr?6zT z(v0;F+lm~PmjzI>b}2+9wAaN}(l1?0wigH8x1C4bIjM^U=o`MC<|}x)njwSO ze*`}4Kri5KDgF{mF9+7`*BPaUZ6w~hE7Ic#7a9#&ul8*OB>Hq}DM_QXCy6DXc_e16 zW;=^Row?<^tXLMzHi?aB)19?Ft~xhhct7*5HA|q4{>-#(e|Zq|QzITX2eI+M0Jt_B zjk#2WBO+IEZexwU+4EUsy^OHYWb7sye$;r_q$VAg3S{#JyM9!Pwk=H@Gyrr&zg#eNS$>Lr`^1=tw!?Q z?o~c7`eOG_izd;Oqbv`sJY%BNsY+nMeHquPgYz5HA8E_v2cg#NI?D~LRU{j8Z7QiS$`VkI=ao}qP$P+Kxd^sG=& z65eQ~6z#r8$1PXh;Sx)$i%-(97_SyNW$*~-`NchwQoltE73uAVK*e_$e*=}@I0*aA zZuU-gnNHiHS9cJ?LzOvue;yVH_obV}VwD&*Y0Mj{+BNkx>>sZ^6(mrAmd)-%;tI)o zK~DB!W-!Le^Vo*sl3xfFjIivIRSb2I56C)nr3>81I|o$sD>~6anrmKC_`4}?@FFYO zw?w+k+Dp~hlB3*|^heuCf5HGV!S9yXa6WxoRLIrsEk(AhSD41*rs*d@IcgaoUkU={Lyq`*f^jU z((0gXHum1&Jod#F^>g}!-RR#>HR_Wl65UO4-ThoNwe*^De|LQUzO;E%w~@Zk z`E07#(PzIG#SF+^2}`wkg56R9MPj(%`kQclDWghvT^!}OSHktN`3inKl-FHnb4<9Y zg$X~rM#JGx&279xj4f~}=d6LNJ1w#T|L`&j-=D@-%DYQ@MD(03{+L80(815m8ee=gZDP@@cdX2_VQZZL zc<%HsiX3Hc!lC*m)c~x)MQ?kRcMhzn1lr0n#dFiAJMk59%Fk$gv0Npp{z&R(UF3D2 z!4(BhRdG&1=Pj{OXUXsgJjv#UMt%@&Xj#5L2f&?DUf=&Rf3^g^DqS@_ZqR40?DY(8 z8o)hdy5cr0)!+iUU8U08GF#YUupMpA(Ztekp=+mIr-}rSywExTlwSN`s4BO^Z_u*x zkHS|*X98GwFZb&mLBg)eR2>{{{-pw-n4=~q0V*y+%uWMd(WfkL`*1P}^t8jfH1a2a z9-Z(l$USvBe~{%OU7ll&ZrhZ+xO?o$bEIO_jx8^Ef>3-bAWl2;aWYz*5%IVcVQ9uS zHr#vjJ^3495mh#@UWHJ0rkg8{Q~6!7pR;&U%Ewy^O{2>(7Q2`A8@VmO? zmM2!fOzWbzVRryaN?aQTD}NfeM~N#;P*vqKuEHMre{h@6As=3i=ov?lJpSwtdW!+8 zha4_fnHa!gAk;@N4Vk()^xqJRzg?1DJr4)j65n)=|#@(_KOhhix z;mWg?&5*Gu^x5=4+dOT`N0xOweM?-cPS9e17jJg&jWtk)x0XjcbCoQyTw8>*$YOSw z9jrZi+-c}_R$i{;gP_FMk3P#&E3hH0oBlc1bSOaiZMb3DrB2789)EG4g! zF>u^kNjRB#Iq4iD{YXe42bBlLv%mzl6DT!~Ym)CmL0sA8S=3q_Hu5*PpAXEB!Jm$r zp}Eo@+GGYty|!Z-~bL;uGc zx>Uwqg@Ni3CHKY{n7{U22l3YpgLuVJzth@Y3CXeC)P=0k^Sey91JLloWKCj?iB@Lk ze?c{=za3vYC>#Ng%41{CcOTdM+lG;LE!{k^0h{uPocNBgRW24X@~1x*gX`cxI2T|# z>wAxeTWuYV$R3ird#|UqE6{8xf;W1Dk^(^Sza74QrO-$a^*IotIFml!mDJ5VFtzb~ zf{xjIMGT=1n6@^m{Iu;_aV=vMw$4W}f8{;2zTq))!*ZnVS7Fou@@wDKJ^y&Z@Lu{IvY3x9s0Z_UEA{k#hix zP;tjrV+0yVckFE(@6qx&X)dberwA>UpQBl5FD@uA`mcB&sQ>>0Vk^q$q`59GW9N$Z3$nX7Gi|Wa za)mrY$=%1_Qxa&+U0gc0m$ER?~3>M2zK+)&+U`=Yke;87_@{9e|DTWhCud=3}r(d$Vze>;4Mnp^T(w&=K z0~+ZsCdH$>!{I@1+ADiSx=O#K@R_9ek*8Pmk)+`$lglI-PkS{QU>l_0bJzH6Ywp0z2cYnBRY*d^d||lC6`J<$RC{dT z=%9dHfE6+vgm(i<2*{Zhn{Sndz11#^yX9SR1{(>a4qq}V-q0Tlc#xHgV)nW|M~9bm z1Du&JN^Z2bNDI6nly8bNRCfFW9YLJw#S6)-(XT_xT+^5$58b+je_l))8GR#aac4o3 zpU5h`-c}1C=uJ7m!Ro5M=mlqog%gw|)Ju$lkXMWLRg!+lwXfAbR-z?(1T$KCdG@TV znlEjXs6kXi6=O8crjxu)+|7$@l~;A~V!q593Iml_4ICA?PhlVIykaq`Wf(UM7zg67 zzH?wM<0{2osNI95aUDU1gbv7+KM(XztL&OpapjtOr^@6BTidUgDCS|$j%55T2_&s9 z>Ji=n{PsppyVQ<=Eu5Q#4^ri@q25OUYHZsKLbir}T+=P)e*y`}!o2dkHKzv^mb-Z~E zsL*=)SVunAh2k{+FY*aPH29T70kMeLXW|5_J>k)k#~*2G-fL+PJu7DsV2TLV7q6FQ z8L^YS$PwQ1e**W#p4^sysm;Mfb2*O=;`RD?^TW$|xAfvqu)Nh7hCxoREd(H0AQw4M zvO<+aU9(E2VBf3`o4Zwn{dKbIcA>Q|ytKvG9R`l*C?q$HLi;jwd#81%E~Ro=Qac`> zlE<%rZEa|rZ|9buh*e1GU}gUN$i}w1cXMY0cJx}K$ljk zr7biFe5f|nIkY#=)JuuN3*1>wO(;-I>xdlHO*#GW<+!sDPQQV-&MB%ul~vvJmuG!^ z0r|DYw$1NHY%WK%Kw?_QjtZ8Cq z$KRlK64W`1M!aT421hWb~{o&p78*RTYSfnY7hvv+bT8Me=-)EBXy_`WHhz&AV16n%M&H&G8 zi2<7)6(R}=g|I;%ibv(Ka?Y6roO8-JH&_r^1+EW&UTTbL(`2;>p44DCvaC*|lfR~0 zL8wg=$bKCtLm}fa43Akml~=U;=>V%Ye^k;IUUg^(Q&OS0BXRb`EaP`0pY&p@bZ}?6 zc}mquw1**A3Mpy#pDsf*o|Vzk^DnQFb(z?(lG$Azm;>zFd5-97Y_~IX22XO=P}@#( z4CMh{h6*zhc#=_6?Otm(>jRqy$yf-BKhjIw6)jW4)oPpK9KJQyovcA=Frlr{B`yp| zf}@kx@ZVAz)xZd=EI4qvdl~^G>4ntLcFHa?;*tQ>-@BI)7XcgsY9^O27Xc#zKxLOy z7XgBQ8X1`kVRcd(2v3aSpm{tz7y(+SZ`<2is8Es?7#hOeRVG8OHhF z*Os2*BEGp3|_wm!?4Aml>we$u4 z$}r>Z3@)m^(Ct)cT3!=kVs>fwY^Vcd+&%)$l*+lfT`@4c#I=IJfMb$~xWa2kW-|Q;no8M6~5g-)k^!Q3pNOC>R>moezv4tdj*yuTHFmamFd$2=GSjlZ@m-;G^8$s3@g<(}~Y;c*`({i(tC_2)fF;-CH1_sFOd{qe+pr)cQT_A9En|-(4yM*&bK#v zbq@K^7BArk_Y6Od!)WvXKLeaX?WdJJFd8H6tGx8iaP>J^o6akpw#YA`&i6e{>VAes zxem7OV~edD8hY3?$!LHX<>V3Scr!m;x~eo=0N7})&VCtXBYs`tBUi`QZ0A6Keh6t- zJaZ_EleC$KB*AZ6kiE$J7#=PZ8p{CI08|3jlrBZ-Z#hRUui#*Bbj5f%E5{U0-tev` zeEE=b7Q?mPB1cymX;fbAUNUK znIiFp_OAp_oP$^`FgqvGQ+1+$#(LHu=KJ;nI_bkS7BscEQ-lWdCy{^u)!Gwk%2F8_u4cxZei%i_0W1GI5)3tZ9bX z+gRAWbDg64+8uFu;WN1j%4g+OJ-$EuQI}U60YrZVrscXbr~Ocg#e80_>aq?sG&n8K zjmCZ+{^*pVkH9T1h3T-8uB&P*bRuNy=5bp>?MJYB3%Kw<3&-FOVNSs#;4SPoY#(ij z1tBAl{)`A8~WXmTUDkNuh}Q;mjgj)a4`NfyPx z^g+O1FOv*jNJ%S~T5ZoZM(;+d#1(I=Xt-9Uaz>C!8;C-|_{gM!<$RCt9mLdX1ZWdz zPx>9JMkFX%q$?UzXy>4do13{+{x7zgxkc+jaWSz_uyMhBp&bzHZH-Z0Vy&z=h_8RD zIs1M|h*s{VUS`GRa%bX&AK_snJpN&pPk$NCG!C#!8N@Jj-EdS@%Fp6wkP=76j#D_{ z+javxgRL>ejr2ZT>s!!s@DIH2+E>PozO}Z;-?nbm`DyRYox5rD^Mf?Hi@}#p@!D@& z<>B35PK*2N!8vlw+eGkKUtnMvM}SCw0EW z&?1{qv5`w~Y-HoNkuP9H<-fvjBi{laRqB~e)n&gOwtSH3eoDdPn7D7&^Gc&C$}~`w zq1QnXp{NUv2_=8-{QkXMR!DA~E#vf>0r}-j7=B{!15P_BXDIXSz?Fip>pp+R3h=06lh67YjHU@tD$Bo~(Gb=pVa?CxV2Ni3Y}Y5$E?9!>srSkGvBK6j68s zqp$jEA%5layt+J@a$vC&xR>D;9~(?o=HSZqorzp6J}fX|0lJ*zr9O!J@mT!Uv-E<| zqUGJyBLA3|>=IfxkeGe5%Eo`DrIL*X!b7SxV#M21B+UC~d5tc0pn5So$v@>^ zymE^iy|Ah>7t71SD}#ysj~Lr|fvq)Ct=ub^&*4z@r)4!o9*{fD8O=|`7M80s`N~}v ztLpYajmo&j8ZyLU<)=Vap9n^@Ir^@lCS#i0DZQf>1)R>i?g0=HK2v`a8wP2XL9XHh z$TPeur?>;`eo-|+2y-_G6S?tZw*%)cvuJFwYZ-rRL>6X%Mqkh*_A&8wMB=|F-*_sL&T36BnJsVY`Q-oR~*J}>c}rD4@{sfO-F zbf87$@GoA|RD#}VC^V3Fu~*N&k$1bC&G~J0Ez86wRh55PcdZ^%OP7c*%6z_M>_AyO zKsZL_VmiN?6>iID0RSM`r$RL@lAy{Aa%XLR!UuIVt(on_T^Ph%)S5u<=X$@b%627mdh;jta#8_LK zb3!iodlne?;~v=^M>uv^TEUpI5BOIwf6UXA{_%hI*^|TPCog|LeE#k)PhO2j z#l5W%EPS**eS}{^bI*{?Vt$ACKRoTQq;a@TThNg}Jli;%q<0t2`Ve(#W?j*E8|hU+ zIcNx9&(!E*zJi6Q3VYSr7oV^ZkLmP{TM=sd_LE5hviihmR+p}u7_dcGQlh-+`WI*6rX`0 zui<9w1M$CrBbz9LNoG0C^6G<<)QBv7CEP)I4B~%z*2rqvw&7dpaQn{`YujL;rt)hEd( z2|kH68**oDN$EH4WXmK@L}C1-VE$UACS;R0T1b!5$5-YA;$G}qvp0(OZ4P4X6uY(CvQ@ z9*odiHKGx=Svsqkq#cfM8MfWY(13Q?MjDCic!OS8n*)Hm5A<@=<_O&`BBhW+Aewhn zd_2W4t20OC>=Itg^FoqotgPFDIh9yTQ zf93uu2_x8Hik5p>9a6!|D0*#J3ZLc^HXRJ?7%3w zUyKWBnQdDBiPnXwU^)zqU)p~oUDZV;0#!=8tWX<-jgzK;H?fWW9*YmAHUn0X~I&)2FE1)MDT)p;( zyo54ZQWKkcr;yX3%Y^~cQIU)Oy20(em^S48_lwWKUsh9QI&)80(%OLF#l?Qb<*kU( zfcBKv!2`jJpU>aJJj!X&L+2xVh4Mo9M*6L^%3uUvW5NOZcXNNmGuQ%m=)O3`s*z^9EWI^=s%CU{j1wYYi!tv8U`6#mQYO znNzzgYS3I13sck<_G@m{XLr19N63`H-6`%`30oKq0wQO%=IyV2-+aMSj#biQ(>md+ z)KzJ47UB$J$rhEwrd0^0HRPJkW#VCclZy40ybHmF8ft%SfqVCUzWYlNU|&lv)ldqX zEbF$gC6}p^fECx)8ejXgmt*c@6+fEgP2Okqz|7KGJmxG`nOZL3N!nU(j$_%Oe0{aB zN?U4-ofSzF(Cz733J_UTw`1y}>-Gqg_@Hs(63(?j3X(Fo z9aXr9D2=hC?jl=NP; zYBhq+vD%eMtq|T}8x&!I($NS7A;uux()S)NsAx@`<19wTU~Ktv@;Xuv&rp3v1n`Wb zGl93*rggb>D`wr@MzJZ(IaKGTCj^mg>F`#bUBQ3N6%6~_>=)~Fm^}LVt_nVq8W{`B=jFZ(tv*LPw9Ss=~0usalX#3>M3GnVE~pw09_ac_I=8@ug9 zFHwK1VVAuYS#cm$WsreJHf@1H^%86Gw{EsMKz3s3J|!W-%Q z1S$ZzxhRmn+)O!;n$lMi4k7J=)8*{TC?TCpA@jda(r%ysVxaNsGmQQ~F0t1G9FgU| zo9l0;jC^Q?lz&b#KAjnmF{vinU(Tq}Hs8S%LuCYAXdN6h~_6%q&?v<8?URs7T3j zgAT5V*_Lf;%PYnT?iTipv%4xebt}NNweI-7MxvQUE(e``V?p2K%&6E&p?K^sV zq5Gsr{o;qhrSNp^>*sf&980HpaDUBohlNSB_8UJ)NZ!5{Je*DJ-}PX6RaG#w>&@qO zfSXSICR|J5a6;%`|Lprg2x;J%x^;g_(<}OKSjzIOEM}4LCo8c6LR&lSu8z2ODsSuR zR-csYoLX8YVOB2_?TI4F2ysePsS_-9d>lzzd|{z4fRaOy9RdhpaUgDObkpJjKx~V& z_kYTt^Dkq!m(a*W<&#Ets=A6Ei5|_ba5DjerLe<+uf-~0fK#wih4__5uDo)|`I&)PD# zYC1`aZILB~ghMyE%j%zmF&RY$WLqtsT|8$k%hmXk7aY2>a{1RxdJf`rh8B)PKDUY6wuLY3_#XgcqdS2O*XO-hgpa$pHc@~4e7@LlUGnhoo}dCf zjk!IkKHVlKB<%ZhA~1CNFZ7pi@a6`nShxk$^4Qz}mI~KbGr+Cbau$SG+o!UzC1X0l zrqrA^wxs73Zm4Le9SLGRc^P!J3GXg$a-|{jI#R-7^-B;zes?BR_Zs74yKb#(i~6=w z#*x{iH;CJ}qlSu_{Rnb;kptD66&B(2m#q7YM@^$aqA{>1#~<|evcPed6b zUu#c5$rinei8)(OH{;I?kZGg_WHhg5#RquZOOi>aDJ(YD7mi-)UA*WryDY${KT-~( zkA0Wi8$4A?Hd2=wA9=v;U#+wz-*Q2BP`<)vpy-=*1$lo>iG(w5E0Q_OFicQPmof;r zuTn9@lVy&Ju8FP2g(bhLOJ0r{`nNJV=Bsh5o~h`@C1K*ST`lsf92?lc_mv8TYN)pO z(^D6GF3Y*EOGB`)%9w#wmWnx!VnP3cqavtHD4=kYMj;CT^$Hu;A+{p7Zr5haTM^q4 zu(xY7#?^ngHSg+UQT1l@#p%(H_ zf)H_0bx49XiGVkXgnS|K|1zreUb~~R=i{=}oS>B| zd!IZlX1{)ETLmgda5wKLW*M`@IbxZbQ2drb#V^i6$_Uk@D;~lYbgeCYL)Q@I(X^E^M}gi+z8N zbE^XCf+x5b_2EU{{05tJ2naSiBDKaiRoacl&;A^MV-5+IaNk~_IU(nNDvA&A=d1*J z;hF5c5C z+wfkmuR+vV6e8(yLng)+7+8uvY}bET43H2z;6F#h<8dLR=Mhb`j&sq-6i0; z2aN0W*v#BK)d3Ko7S1jETzSx?^0(V9h5?uM?V)OE+#g9R<-Go~nDzpO@xh9X3did9 z2p0evc%5(o#s)%wmPi?c!5SzRaI2X4nBzJlO8B^SlH?CjK?Wyp#Ubl;$Ll3KYQt}-nek*a`tonZms(ca@E$te;8~Bs21$N+ zonNta^j7ZmsA9WrdeDD_jn&Ngi67L@W)HHSmmzNQBMuy_=%}pFnq*XOXS8JBscrOtVgp8Dl-5fFujB7|egJOS-02Aa&XcI)lvFU_yOF*RV#>!D31BUUK3phX$z$2ZCD7Qyp zooDU<*5vR1fM)+u?e;J0f51{mpJ2WxO*eq8-7L!D`35EIfLuY7(Sa;Oep+yTU&Zff zBPM$8OT>J>lc|3uUS54kQ;|f;q`6Ef5@jlnc*MP=dd$0Ims-c#!BoU_5ah0^;;j5k zTutS2iUSvhqP9ik1WIa9Hq})TM`z?7oX(aR&W(ONenc6>UuJ7=K7;JChL0n*I2VM) z=@;tHAvRRUGx?S<%NY-h&K02$a+Jyeq#+5(;l7CCbj^R!-PUVk?XIuIPfQgYJHyu) zj31i|u<{rfh<(==JUH4ti=!t(NHO0Ev(*O;7w|Wa7JguYXou2Px&_J1qjdQpfk(2w z6zs?ZS%7es%B3%c9>LiX>bl|!vlMfSveXx4Ni@w_@=Mf`Kg zPfEZaGH!lJ+wZtOu2L;h8>xL5X2X$5cUD!Rt54B8+x1|?KCF!*!wwAG! z^zC?sQA9E9pm=WaE{YG?8nVAsQ~1HtAO@J21^uS-!~x^d^ploQaKLyS#Ygyz*H>rW z8ShZ1Ho3p1Hz7iYlqn7^+N8#KomNOO`D zDE+I6wjiB`1o(?(b?G?P>!87pJ7gu)TB#oZmgoY27YHpj4he;@4zpH(`a3Jp^miGm z!@?cp-oN=+RP%i0@>ZpCkJYW>Cu)J)6Oz?AauwlQGn6;`0;jy3npvt(-Rc{1fEV%{ zJ~V&jDzc+3i{t5oRemFwcdbnE6I!^lr7JjNzH7;j`5Z=;SZigEe_*DvQ885;Tj|i^ zuW0!XOY?MI!qUEjo`A?EgI(R>ZzTWRy+^LMU6(9l)qTE#_t2&uhubwxPb<~%;d1qz z+HICA(X6ned20b}PjcgYBkxs?`q;n2EjNGBUW}Rn@+J;p%V8v#H+c5u=^wA3|9*J# z;@y*fr60e)dG;K6%kVNnVjmso@d$`5Ui@aC3xhRrQr7PdUvX5jO1f@fH8i`93{HlN z79&fDe{CquO|H#VbxMYL^2lY1hO%)Uq~x9RR~Ex7IaY2a&QYb1)qf};msrr5^u>QE zo@_Sy$O37SMH1Y)RIzi6^9ti)$y2s@H1zN~=8TlK;;CaxPqdA zROn?xCXiblViCg-NI`_~h|Q`JY-fRFB#?H_C@nkl2j&$a`OBjH?3x)bR2neaay2%b zkH9BB_fyiqFw*gxGL(|1ktx%#0E>SRVVXuCKgng`paXmwKux`)shYXwguD%*#uzCICbB%7IKvN5g;Q=4Oax z#G=}TMB`ivMbG4wlAuBrYzCYRh*~yR*-gn3?~KM$;V0cI^ed&yQUqvT8N6)dppZ9; z@`L7ueFP1$frRawo9p!io}@j@E8!s%H3JtMlNKmBDvvY2G^Dx>mR?)BdTH0R4<2te zKDpcGVULQO8q-RYt=X_A+>3u)Asq`>{cLGfib%q(W~DwTA=bKcn+WV}QF>CsYob0i zCJS+7F+5R!C9OJhq4MNl)A_!f zMlz{0{%CPLZjOrM^gO!| zc=o6|D8`H9^el_nkAA$rOjp$X(b;j|0|-c*w9yDCjDqUNaKg^}d0(8clCKBFXpzyt`X!+@!1)XT@GUNu z+jl0;92UGk+@8HK*y1wdIY1MHN})}HF8Jm<&2EvVyA((jkB>i*pg-iSQ!hYsIf&{O z6!B2d`{I?S`9+c{Ff#-ZUwIi^LlEMAjrF)`+bl7=r`3NFLux*$irhKba!=HCJ51@$ zN%oBtMF;fwK2lqi0P$nh#7R3gd{LR5Dg}S(^f#;$AU9W}Ro|Jn|k2a?U{mTwd1YkDYt+2ZOwXz&bL{C(R@L@?X@E81@TntuM^+m5r)~M)7IOyVNL_hYkg}k#aj_%03yY!=P=G{AHOmlJc zfPZ04j=;Z~b7Vp-rGy68f{xQ+nRUATceV(07P63;ISYt=4Y_C^(4Ip;|5M!VX(&a@ zR$zY?Ns0+pSKqG`uv?$XwbSrLB*~m#6w#+5T`4j{6-CB z$V)%sItKv_NA?O1x9=7fp*m&!yP+AFMI=UpJ9RKRn$qkFb|uxi$b_?)CD(S8-SF^4 z84AhibV=d+y1VR)uC!`MC_-1a3~|q(3FCjOnj_3kn|NXg7sIe%sd({N#@E3(xoOzq z$S`2x>Memf)E*U!8QCZtnkjL+i{cZ}?z{X0a3=F0}(4 zppUH)e_8jeJg#4q9r!lRa5{VU8Eebi8lu(nrA8aFwh zCth5wIz5|_R`)A`S$bSbjBN2VUt!De$e4aGLyznYJKG?wB(Iehn7TtN(gJ_WZRg*L zFKDshw6sn)ti1NKlU*}&?Fu#b#~Z4VWY}4LNA&IPj(l)?yQU_~xLLN=a+N5}S*IBm zR?muJ^~6+s?`ev-O*j7L#=>cnf=n4~TwDnA23x5K= z#weS;g30;E*)Xw>LF=Z&@=#EXNXBQJe)v@Ywcwex>~mn3`>;grcJUtM-Y%uf%*f|) zZvc=207Rl@dmnSy#}pvPWSiOJnuNzydgEFzTcM>$Rp3mu7WHb5u8pd6sO;aIHAE3* z8&quC%f>Rc^m=X5QMi9kj4Eaw6W?^I`3^ z`^HZChIO_}rl)u`=oagqn%nn;=sMof7t+$uTDA>qg!Y)m$>cTdZ^TEzy`41s`!0W)YmNt>jA`Kt5yQnR zmKZmP9OX6;5MI0lL)3+`!t)veiVjZ+@NuFvzzkruW|g#qG>x?NL`smG5J@lYJXU|~ z71nm%+_aJP@BrZ=u!8WMs7Sf3N|YuUN{#F>pevnZg7UoG=2%$t9Cp;vpng67$$((I7(GmeD(i%JkeCV$ULC z5;E>aTXRwzbh_fm&o=eCQ}-_E>oh3H*j<|Jby*G$fL=ab<`t9CuhCAnsIdTSS6tN7 zI5{wf^t_%TS@6{@Hu))9gPBbp=BLmkPBM7422FAI3SocV{{~f+$mPBMTz3)m8G0Mr zK)idevsTs)BLRsMwM$Mk%)R89-`uF5((IR#mVbX8NUZ~j%Rm|%kU1F>TSHygpVra` z4+a>>Pfsxo*$*MGgrjF+q$xa{kp*Q|qkRz3zUyVx{Q3p52^j#rhJF&tS^#K3m%sHL ziiOg!T|NKCI zJ5D2PM*c3(DsoG%O*7!PVCp@el?}!0iz(czoM&*@%)?MqgDiwQ(eFro9UFuky#kNe*uTTtgv9p}Gs8hGVfiD9fk@ zq~L@>at=&1TqU>)&&paX!;E25qb4du56+t#C_F_b8=yvYwJhOkSw33Gt7R!AB2rr+ z2>OeoB@i-y@E}03MJ;d25|&o2M$jt=U72EQVm7N|UYd60dFz%^_-v#WGu_DT*LS)@ zQ-oiw(;6J8SPcZgM|aenDt48~-f2jAM0Ge&wN@RzE6fbp7fPWjmQLjd z`QvI_JG-xYbiTsZzA ztD=TWo2k4v?4Wdm7d0YpJXctP5DwXTwG%qh%}&7*6W89!^oK=!Mi?w0arSG4t-a&# z^)`%7F~C8PBgw-+^y*eK$L9-DJXb1)Wh>r)gk%Wk_{$P^gzTn^TpGC4k`&N{IWzbM%8qNJ2~jJOF4*k@($jRrR~kASuN;Gw053ETZ3!>guZMdWc7V zYz($%W~e8JlatDLf`D%gl5H}35p=ZO z(5i4X#XD{d#9E-;o|G!>F{v`2ktE!j@=p#2?A@mg2@lAb1b+6TEV|Ku{PIBWVPDv6F^wf z?KnnvJrRJ%Gyspg-pMFej#W=o&bLUc!CiXrXw7<#6~}qwLu)qH1m_y5uDMn4xp3Wd z-K7_ZnBxWEAkXo9YT%rKeBLa`x!Z;pR6b;4x~GnZ7S9GHe$=xP*kBN0m zYV+8HDBcn}D|r&9;Ot{-xUAC;8&eM2cu;jBU8BGpyp6zft)tzUA%?M$${p$NVFKB? zUf8h2UXnQ8+BUxz@YQm$eL~ZTvVXQp{>3gB4?qq-1^k6!WV*Wz6MSzS)9a2i*n}}B zaibaAgVGISvcT(Znkr+3H%$^QxgDm+w~x_jKOlkklTORk(g23bSD;gr8;v_j!nlhh zL|dbAS7zMVUQ_}qM4=ZN7}X(s4U}G7vF#!ql?iD=-`*DdqFa~f@UG7tMt?nLB(wX- z)UM5Ao21z6EeetbQkSQxn+&9jo$aH>mEElq;exqE(<`z-zkSHcq!R$#UJ@J|C56xJ z-8CP^O_qPu&0H|CUl)gwO){x|Ku4#G<~Np%Q=~4sEwFh@P2GkmrM1CVH|8_ zQn$4w2p!rS7q~cdAQ)%8BY$J9*|m){9(!l4OI^~Dad*z)I&?qqxm~Dgu9b{R1emzb z&RmCVbh=4x^Ho+BY#w@(rZ_bf^L$3Jf!pzxs%yCvhKSS5GKHMNw^DYMHyyS09A{-> zp&ebc9YLEjNL-1E9kep~)JHP8p>PHwJd)OHB;5nA@de*C?$13U=zqc-klv>?o>{rP zextTijwFu?_3(gB{JkQ~C(Se|m?i?y&PB$zTvZbKgEu)w3M)vsVn4m={RKsohf%@Q zLY|uQc$)#aQ^S2^42nPIxhCG3!Cb!X@B5-5AMP`Nl=95$F0Om6=41bqR?0oW`B~s2 z`6@>ZJo%diuo9VvE`KAxvKsvg9WeueEV^^g9ho#QUEZ*SSg5%J+sYx!Kf8Wj`#nvSY*P=EC~*ubcGvUs&r(1!1< zvX*qGYeH2OWpI;-CbBj4%O7O3koi5c#_R%OIA8eUCN-=&r^%-$-(cBs;T_`Rs(KC7 z?WsDkEp+jAg;uWSE7pk!zn;lr+KDaLxN{sbtZ^aV2DOcCXk+mRlhP5lA@0z`&iaT# zNKLeaoiT1a(MKJD-YYAIBY4uS%J(-Ri_wk17(waiZhkMwawhx zLm#Yt^8QdFJBjDde}=-SqVZV#C_nHcHqgiq`#xZ;b-KTwv!%Z&^fAX}#6}ncgv-Pf zE?$BUqZcmBI`CuFJdl3g8Cr_%`Jw(s&ctKSS~fKr0)Nd>j>**O3QLpDXY4%OUV8}D zQ*~r%LC8ruU^b-WnQ5NZ^K5gUgHf)!%b~jh@Iv2M6J^dqd2D?YBzLu;#>n}nkb?JU zH@zBBlp8c``y9cbxxODK?1&3V^bd8}@q|e+m9jQD1*~zB~f#XbZ-RJ>x zf`v10Uw;NnwuEchlZ(+~Tj@u6bR$9m>9?gwryoh zxC@jTthORuYY^Re5{ALgTD-hCHe5kqLGGql$8vE)I{`)`p=e}h0ut89;td#5k;iVL zHQEu&PIp7kTWI0q{1WAIySO&JnR9Ei_|X7xM1P7B$=IK*PV-ssH2Xczs$kInI`Rha z|NW!L8-{*#mM<1$e15_FI9SM;6b@(vKUC$V<9W~_GTP-A^R-FGRT_DTj-;djF`oFA+|Zv!GWT_rqkp%Fe_8&1Y$j67CZi%x z2Y-4MsTqL!OH{lC_V;o+xL;6K9S@~&8gBa?@4m zOEmZ5?0*b38EMD+Mhmp>U-yQ?-qCmP@e5FQPYtR{lvLX- zhlA@xJ+IectZif#l?ohE-!Ekaw6>j_V{Sdc*KA$l>33NFdNWMmsFX$tb6Rf5T{aP(KJN__-Fya0S?BmJCO$ z$Fq^}{t>JWX5rycv`9+wl7DkX1f6uQQ}q_%<6+i&BycRQX@R8{kE`)2Ig4k>+1kom zt0kW?B+d)iH!IGOXEDX$A{ibEgU}#9NU{e-*vr2xv=+(4^8@g`A3E(~=lMtAaOjQ- zqYw6tEAgf8Z^#sPNoNTqzy*W@EG#; zL&uG@5H}r1_vi_Qm%8G^dezUaGFV*B5AfVopEVKpkr3QGS50G8Ym9AUd zj8WnL8D7!{aOcJFZ*kb@*!*0zAbe@132Ju?4+rDy%VFGnDXlc|mQDeu!k_1CH~FSk zDAX8Kl z0uWIe*I}H;a8am1UYmmyP#jeW!c|GEw5q~5r9Ane0!73!@P@fWYFm45i z-y(3|61`1E#emswfj&HzYkMoV=(fFCdX=lh<*RQ!Ds<-#sKEGhh6qsC+0PksF!4|P zgABMjL3$HKCB+Ervwy;fY6|@^X_Xe)NU{i{m}6C;yQ$D@hKVMG>y?B|kY+3NOZ3#p zaW-hRrGEqn;@P;Bfsci!t9&v41)mHT*U*S05$Wj=RjhUVZmV(YdBpB|1jK=E9Lg3R zuI`Lvl}#wTRgm_E*&Zdbh6Dn4wk0xEbF#SAqDW_r;%Rd>NF=>%jEdPB>pA&&$5_tB zQQ{YRAZT46Iv)?hZpy(ot9zHLxo{oV5(T=P^bqW>mg) z#7C{km<80dtbtn-G;{fGN_aCkEIb`M&sVe|XKKt70}(-^)gU41C~eNf~u;&ln2ac}bzVQrCTxTvIztcF7$o9_byn8FER4E^gBqVnukdH%GvH9*8os^FVng1iBobV)k|;aDai9{= zOD=x#Q}t#|5h~gxlny8s(M51b#8ph63HuZzH@d8#m%{L7rKGBv>29k9xj?NNM zayA`R@K2HlGh(#qJ+8tA*b1z5L4TYKc|5TLTi|orUVy(R64eNg*^y5V?l7m!pGrSR zBs?|W#0z{AFA{nul7^R2nH0(i&tQ~3F6m_)J*q}kpYPnMuE`g6r#}ZE9dbmVcCo%b8dO@#!v0SYa%J zme!VLLWaALB_(EQuaOxs{kDZ~uFJ;h9V3(OvGJh-uW!CJz^2Hl?Ik7sE`^5?p!4_g z`iH!Lfx?ITTKS*snk?@<)_(A6>FQh%t8JiM~m?&ZIxJDDSUniK~plT7UX`qI-MRLP#&? z;bBxxxP8k5A7@GvEfaA#5i z>kT4|@-=e7djmM%YDvSO=MpcS0pLlfeuF~J zL z-~j2zak*qUkxC%n33>vHI3W@!td&`blFVw9WL9LMuFRS&&8*7O%(@t&$*hSfW<5+{ zwZt@8OLDTVhJU*UV6GT_buXJ^QC!ni(-7@qifmTRVDl`^Cf=s=d{ygX!!j&Y-$ojv zmCOd&oujoRyCd(|lkR=)f(CQcXr@2uf-x5qn$=m1x5-8zb?tO}c?HOvEwU?U5dZuQ zuq~9qpYJZJy!gOBz6S)43vq_-HlZl|`60c`7pOaiAAkG|(@#Ep{QY+{S*0_JU;oH> z=o!2wcx;=gh&6{XRd{qcD51rXlV9J9usA9<98~8vxlo_~5^%>q#c=qinDY{@W7H9u z`1}{^mw$+k`KRoef3vRF(W>K_>D9Zyzi66ee0ccj)2IHYhyAiTKOFw`uYWzfx@ayJ z&=S2vMSrsddH*8zhZw!-G6QhCjQxi^l+)}(>_4KwGG~Be?X8Swk+qdFMZthf5^w?u zV!z@W|LUq&16{E2WB;4MmoO~#{p}<8rjOYF?yp~}(V=&EKU$!pY4|we)#w|l4Ii-t zm2!mT*O3B%_=ZsiabLb9!t|NVuV1K0O^y%G23e+;zflbCBGoJX5xGUx{ z8>(X9rp}_R;%nr9%L3yK9G65aW6);C^a@f*QW;5Vv6q5(y1{1jclE@GDx$xojD6@C zRs&8E&_qbjJckNE7m1%iE=A#FulzHt*F`{@e(Yy>@DM2LAbnh;Xqo8q+gnqq^B>u% zr++E6qD1DvXOy8gmxCmtm=re9Sj_uWRv(Za1(wA>K$q1x8m9dZefoV!Er78>J`(7; zAxd?d{@gL;tb5AjGsx6H5T!K=k5PA-9CA?tU00lEl_HYaXx8R_5V6?hq?*6cX5vL^ zTe)B|MSnY|Xy(OSy9TFd3rpG+x7>CRqkqTVF4I+=-HP`HU6OsvH1Tek65uTfWmpxV zi>g0CwAE1>EdXx{3(v+d2-m>j?VWN?a&0I>;bVj;#!xgOaMw%)wb4~jP5naDCDAy% zJ@h3jSP1r^_@=$2kfBgGdye%53CgwaD2e^%T6>rRoaA~$>S6c~`g4r%hvd5r?SF5% zY1yPC26V6o>miBV+uI?2r^*V8XM9$^?G0>Ro-Vu(Ev7?b-PY}w`bz1*YciIK6a+)1 zxr)@ekcKF4wyE+smcliY9tlVnEfAuA|SaDRPoW)oHc{kVwe_i-6tL-r$ zJjQ%i)(+euk7nL0^huHMP41PI2k?jTwLx6;tw-4EumrA8=#E5%+za?=Y!lfWaN`sM zwWQ&$NCl0rXNxSY$iF%An6qeZignv)PHra`oCJrxpdTKdN6uZxcyPZgVFJ(68iP-? zgtE|njpD$X6!-u;;SY8$CV!AWHMAMUfDASCTvtP9jRL%&`AVn@2XkFbA|D<04*N}3 zHv#Gs?%CRUKVB~{vVtyevHl)nE?qhE=!h%n%^+ie^E1^jnHm|iAEI;39B~>fdIg)H zzEJN%eloAWRkE6-Q>_jF3TlC{WF?B2B^83uWE$5@EIk+jW;uI26MxHbCQuq6tI63E z&^Q_)UC0j>@J}jnF8253?+aG(l9e4!gGF>fr7u~=Jjwb7Zs71ruQ8X7<6JGyp09C?J4g;cwpvpWlHrUP+W_wO3D$FdEHpjiP+bP z)2J;k0c!S34+-lQgMW=m?nIJsw#UuF#w;Ro2j}a^WfVB$L@e&x-J@bc^h%2Rb=T4u z6}{R!j1_|l{6{KH@WJke4A$S6kIDYqS!UlPGhuJk(QJ_~V;>)E1E>;t#y=tCv%#DK z&H*M_@>HBX(zqSQ<%p2(tZ@pxC4V=KHf5nWqOuMf=Hl6CdmfJ%MwQo$MxsB;?&GlMCOEtjLDc zpz^&M`yZJfSbv{~_2f+e3pQ^70CU*Giy%sIQbELM7gG{PZ5@jVQB}Q6lR2ANdQOYS_pnG99ZhfdSMB#~x zM#D?xOgHnIL9?|Q%7b&|^xIgem6d=c@;Q+HXD%WLogdHzXYtiEFe1anjJ!Cx<1Zp{V%Y_-l9Am7)_Jo0`%Cp}2~fsuu!?JB8*!Iqow!Bv)N zhM_&6_J2!%RCJgEq32^OO=!hR7RWDl6~_9=6qYSwNg%Id}A{-bddXH3q)2%bcG zOg4QFM-FR6?m`&Gk3OW4+r_y`Kf-I`XZ@e^nmLP~dj{zZ4Cy(EGHNFAiT#6Y-I&Bn zV&I3Ot#)6jLlER#KY?g)2W|o03EguPvy8p@!heL=KDP=|j28y>+^3u-K}j+m1cvWF zrE$GT(!2D96(x%@!t5xeV>0D^QYG=mjUH{Ul(IB^Gi4JBN6>$Id~*Es?cZJ;t8u++ z(#vInA~8TjpMYZkL@Y&YNy`NaM)dR}=0+-)&KPqfP*3u?Qsy#N&tA@h17VP_t(7ni zlYhb_-K8msqSVCP7GybEDbPYIe~`j#`iDiTyhKW4S*-__!UpeeI?9QFD_r4SzQ(b6yqehP?9t!SUgl8bNGb6?;i*m6eIJ z24KSHBh%fe$@%17N6{9LJsI#-HLkH(Zn(B*QZHC*v84ux>T9=M(7_`Z+qq2FQEwGh zE0cpJQreCfW-hCl_NsAqZg1JMyLHHv2U~gU_&mkFX#Mq?!}iLAn}EEX$8=-WDt{Os z+5zVWUM{c&1hDs*#|1afb7Vv3N;O-=o1}e^Q?qwLX0Vl2<=X3NE~UPS?e*&zajT&C7QJl+K{iX*)e|A@E`3 z0v6-&ZCR&?izGz{`mxWs(-%*}5r1+O_Z%>5VhDlvv?iY<4y+-e$-?EW+Gst=2V^wR zQiT>)4tgO45VW8!3^ZnIA3HIFbbZHmjzzh(p>hKb^Ox+0AM4GG1t7#WG9D`zC$V3x z3UpcOlj~Zf$XyOS&Ee?!QNklCVBhXF?W%9OlkY7FYPTwj3BF3J#Z{j#&nh9@kaA#NN!WnQxAXjuQ~kEJmG2kr@I=} zcTi}4kn0L2m}qTi)Tqct)_8b4AcM;qPmIrLJeh_gAV09Fa@FWQFLS4=fQU238SRK( zK%;>hXAQU}v=g6kX2RwmS|qtZMuGEY97}wpo#|d{nGV}DT-=5I+O*;>Bw-ji*_Rgi zt-yi_{fMF{vTT1|A7ju)lQNJL16*V`{0@(Y5xghVjxxJp z=#BYrX~faZ=;-eB63kBKY&0Y3#N(5`#qlO5CZm30@YH{#DNtFdNllEDnHZv1;H-TV zF|-FhPNEmuD23@Q683^=y)kRTbxRV|%j^{WwOM+0)Azb9RO15LWme&%1YULf``QPJ zvBuVS5XJ-jZ92S}yD<&Em`8IV;2h|lR~jaPrjRL@>=t&ha=-vxBr+5rNkb>7|AH^= zT7=2My}W-66Oj5ul&Sl99F!sk8$UjjtzeQ|B3G_5I^+f+CCQUdS~9>!bK$1eAx7C$ z?y9RB8y)AOimrIcZGvA@67_c1iJ#3i1jQ9WI=H|0%!lOsA3 z_$0rnRMJ*(JUckhoIr@D{Qdn^P=wKpt3|+tH${KTr)Y!YXQS;|$JrT7nG*#(MTs$8 zywFNR2xwCMs7xF%xM^e+oV(ich~k!ZKQEsH}1NlmcSMV}R@Sj6mF z1#Y0zKnG?dTS(gRsV@N8BP>R{z{VxXg)Y}!<47#xXKzXFwDp4^0@6FLgj^!aI&h!z z2Ws(XhM@)LmfVY3*JhG|Lxsjv!8_;)J%g9I2rtC#?%ayF4<6 zl*Nq6_YL!1nTPTX4=$>60ILl3YQ|)6)07m-l8vy(QJ6m|#`%{?5f@)3`AC7wgX}QK z4~o#~?aXW2UedN}uJCZzIf_6-EAysxd(9G51^m9f1+1LwyRixkRW;N}jqu&BQUTO8 zlQB|`uUD7Zag|?QqP8|_spbq|N(O%cCBg@H_a-&9FcH>;K@gPyR;Wb4;4ZP`kt!@l zV3Fm{Qj!GG3jdiUrF6y|RpM;Xop$zkrYo1B6W+5gMOm07e2EHEHiLy2H@~JAG|*an zpogoK_&AyhbyB=-BYWox+nQG2oz)~`b<};|rK6r5Bz$k)t_jcUsrFk zYDS*Q?W$}e__4^@VYV9~%`Y8yjRSOt4T%Z6xWbq-K_aFBjt3(F^VWZ3Jlv!{#v(RW zNo(JNJUaZ>A)i_W^f6w)hD&J#EP!9*s#SiyTJ2@fUUbOu8LA61b(wpTK@LlYJ9_4?i<=oveixNN(fZ8?%858gAWqgN{ zy}g|M)Ub|3IcNw&tQmj%!Elc~7~Pbc1NC#Dx{8{)02ieJ1*u`<#}UR-8sQD0vt z#ZwEFDsIu4yh6{U1%?w{(tJ}?%Hx(|I`)kG$ivqkrv^1(f-*wW*Q;JlDw-GvHM?rW z7eL8o^)OBL(v*KcpkM9aVWHRT_RET!SH%$wO(IUcq z(mR-rgZJ|X@B85x{R7nxzTgyaBmC!j+?PfZw#ZNpur!9LL0xhQI=(|nr=LLc;u{|G z|Kg@0sVRrvB29+0(1RivVlxp+N2iw0T!$tZ+BNXDQJ;U)p<OKX#(t~iMT(Bad>DH9soq#&0Tq7lv7o$Ejx5r+3SMP?6I~{$G?rEimsqE0 zIlv5LlYFZ>Dtpxudf((rO8b&-fzV}{gPB8qcHDo&=nZ+CDfMxpfSvPX;{yCT@s-~B zE_kt#CoW=c*vW7{@&7VF^94OgxIfm?nAkwCb#``U)rzu2uM*y{kGEuD!Ckg->as+u zXYwBMJZ(~$+n>YNsAO8q?Rw}4<>B=3=+UE*COUagknn{59O0irM>vJ8OY@!V@=RXOv8~~7!=~)%r1g7L6d}E}SNnO|4i~`w__S!H0L9v9FWCBi10eyvNJ2Exu?X=In~ z81a>VFpvCmjQ;T4pv>yYK@Z3Qtoz!`z$723)yd(j_YZ>SXbyT9yt;iJP9D5JoW7Eu zuip>x_xpgp-b1-*bPk97{PCF}9>RaK$@!EED8q4}%Wg3z^1r|k@=z&^&kqjBc;Go9 zc1e<;%9A$}oO|{$T?D7jnZhbw@R_>TLaf7s0miRGNtSf9mdnr!v&qF2?j^BF>$T|u zU5k%EZ+1q2j?8d2O`ITYD)SK_%oK`HCBg+JW%fmgYI>@Wbkkk69L|X>a>0K%K*xD@ zAq8g{Ig`giEdooBie~egdBadep8}?lJmx9BIvSu|yp3$BemUUwB2MQ+fm@azeRs)~;7cj1gbsK*&oJ3iCfqq3>Y3z!& z67gOYNkrD4k{2oF42q2|@-K9!P(Aqt2gUpl4T;-Ze6zosW|_5SNi(QSuU{gM&BV^c zsW@w4Mym?<7KIh)4;p{?_G)I}Dg9UVPECJSJzkuDRfg{?><2&Kms%D0uvbO;Y2_xe zsuPjGdl8?N>FJ9118a!>5)tm;OO#>E9UG7&m5Aq*-4fN5lQ}JZQDed;wwIz&EN&Sr zom>uLO}Nm!lRwdQW;&(Ux3?{+INHu08ln&F;l>c{2NUrE5SV|h=s5LXXbygeKDl=& z3nWz-wjUvM%8=ot-C7HwwJDc@7yJ8Pqr}=4gIj{@N@s4E9Wjdx!hh!D$=(2;>f6pk z3g9;Lk@VQELP@aik$5Jw1-?~O$-A-yev7>UuBWj>Hf+RS(gdE&=$&fBeq|1RUoG>f(GN3oQ;72JUEzQ z2&?tl?b5{9Np94NrtH8LAQ@`#1Dr_+m78J7w89m2NPfaU9fUyXPW}~69}uk@NpsX3 zeZz3Q2Oijvh`K!`94ix^c91K$8*%p~C{VAHOAK|4RB3-L--Y=D(Mfz&#@B0n zAzTv?wL*HzuVO!olR35Z;cA|yK+&4j*2XQRqXF;hE6WGBq_@JVny znd|`^0#2K{owN|(&f|>!08R=D`P?)>FW}+>WtxA+OSSgw`oC9cL-i&Pr&I<1W|K!+ zaBA*aoX;W1NL>_9NCxKskbXA#ddlK%m7x;gtf!`c-sRb7a&DMxNN4i3XisW3-KfN%VzHU?2nFz=6`42FAIkXi z5*mNG_tB3T{g?v*@7F*iAaBI!G~#V2R)qPD*F+n9ZlhXYr|Vs z=UM@NbEW(wUg0?(jm`qm9J|51= zA_GHR%G}J%g)<+VM<`u#uFC`mj4E>Y2Udvf=m|ah&cz45`7XIysl8fE9|apfPmXuvVBKd< z^Od4aX~8Y|TYx2_YxpM|UBSNz&LDchegSHFDs})L+WFpG$&GoTc4Zblg%WgMu~B_U zE?`CGuoxn!`UDxv&Sx+aECpJ%a+H6NYB|Z!;}T;3rxAlwUW}cnnugm0ywG~hNSM)ysfV1d~ z-sr_&_DUhXQTG779i2@GL(a9CbHN%W?@J4|RL6~+(1J}!=3=wQJa<94?5EMhwJfyYO|YLvq2Fm0 zS&p4Y6Ffft2`9K7b-qN-fX#nsR9NnChd0Dbn2t@FY3Np;$1APVxh=W)L8m(uPbTEP z>I%FQ^FSL+)D9aS`Iog8L>w2zZ|s=ildhoQRNN3Jh@x+_#8xr8-8Zc)_Jpf>EOPpD zBGGX}UTiR8foUZznT5^4VwGdyu#cO7)(zaW3Gdk*>}^732c`A?Ujl!<*@if4cB!>0 z@bbDN8g8QTnO*L%`Ta+^+yR<$o7bt)?ry0x7u7kloFu~zOdgf}6E;QN(M>6LJ&|!V z)1>5!F%m!Y-AYx%;!T^(O?X$Nn2***h49T{bZVK2vP@|v%04%li58p8L~~&#nsYNz z21qqb$Tk2TwUd&aY=VC|453p^=lqmylv;n%P~rlEvhT1JmSQDWX3{n!R)a7NiLJ48 z7!q5hbVFh~peuXm5f6&eenRL%$^h2v=0hHmf}9vHv^z zI1Z%B4ZbRnM57w}LqCR}Bh*?v=op@H9HrWL3ZZIgsQh~0; zr2DU89t_l|0j7U0^E$)PqsdCNTUo?en$?~(x@2`*l7TZ=}&-RYA z3Fh`)(nw8fPkByk6HZ2bC`p{tRx{UZHUE*Fs=2+&t{Q)4@Qn}wpkOir#?OC?}kH05@JC6*Wd7IEj8D*CDG!sDp&o{s3?E!y8>@g#BHZ!>8$I`bF9*nnIVL5oc z1!1%qO9x+y42EM}Ev8+t+AlT*7%+oQ{_WB$P`A9S>%MlR7aHf0RG)s#`VX}P8A zn1KO9=H57#RCs~08YSmvT@crGl_>}##K^-m0TI2oXF=$wB&Q)Qw=&YV4?Amuhm)RY z(1L%>?X9X4_*KTqCwk$o^aE!e*)ZaMi8AhqLi?bA57;#DVH~-du9TI#Gu0??+1V$@ z3IZYP@Wb3!zBBOIeM@QB@L==!-f_hCVyD>PrmLoBX zO3mE0*}|~iatxn`9RMSIuoTwWYN2k^V`m}GfI-`v)04@O8v={Z34spKv--1KvvEm; zi8#hh`~2(9bRC}8;zm{9v)emxRKR~(^evZ-8!K?PYGOxi4qBvd@yaT9V{BiXvP#Tw z5o_qo_EIbMgyXrfn_K~|3f-P{vf7q2w9azMM_LEPg`9&RrCd(;+*Fq#><~WKHV}Mz z`7CgR#e4ew>$k^RIJ~E)z@IQbtf!(?R8dzMe)&7@+-B7|{ZMzK^plvsaA582zi z%Dn$4{g}R+Rr#_Jd7i{-=rmTu<-ols3Ub@Vn`GvnwCe^fzvGtcJi^xf?kfDpH(RhK zds{Z!WNBOz|FgDP_|5D@71FaNbLuV2H!Vq_3Vh&r*J#G3Cpz)OMh^hGsMo;ZaU(`4 zNdE3ovJzsHyu5Ri{K4t7kJ5ki$iIngN?II^=Jwo}VM{*Nxc&5Z6z=XOk+x4wIBsGx z>#6f|Bz7J!F-iaDr~f?p`_rF(c_HEP9N&v7#Q`(ogKpQr4vS-4qP=|GO(}2mqOS(O z(VzZq^H*2ypFMl+azEHM_f2l~%`1AdgZ&KMw49$P?YsrW?xu~pr z1>6qEJGRmm(6vO$cm-LJ5S;$;xF6Q;l8$Rg?mygJpVGW}ryx)#Qk+YsS=$+#AjWMH zo!JJ6>F{~(UNBeG5-IiU3cjK(Dkt#obOPwHoY!328#m~jSC@LaSA}Xhrh+;Ie(2Exz!wkJTV8P zU$&X9A7EUz=wen#`SSJ-*+U|2$X%SLw^y=N0}Ild2k-y(7Wp#wrt4cu4yxR&x3H4# zV9d*95GqxG$k@)c{LY+zet-@} z**H@p0%O=oc)Mh3g-ZtG5Im2B1d#&yZVcww9UHO;qY6D|M%>*yfDH@$Q-z^o1Dtqc zy_Q~qpK4NC`5WD`X4_&{azsF(wcYWyGsD-Cvb@K@4WpHW(N({`$j=&pNK3SdFaVfc z60Y1Yl`Y}Zg+zbcTz4mt_7*|5B_4DN1Cyo*yspCRhT9nIaXpFzY zVs!AJa9(Au;>cxN?-A4;I>$H4%O_5|d706EfHBK$eD!~%>5-y8+lb8YZi%7AMSb?< z*%cWTJ=17@wLD$RQ;9XzvR2HGOjhMH<^%hBpDgnEqu$^f75UsO(HHMDDh|4s zlbp(2A`ySMi{tK07Vkq|*B?|ZmSQ6F4S{y`HC17H(6to&Y(s#hi$rQ24m~87B%o_9 zR8=W@J3*jAKymo?~=N4DjmT^ieGew~^N(Ndo1OYI5Kgyi`& zRML81-E>+xGfT&)6&;RJf%3+4V!fE$YXP1?L%4qc#-wZKG*!qM*Mlrq=S7{3_9<>1 zbp>&0dNcv3_>RLP|MTSo8iz!`Bn;-lwW=K8_I}V2=TpiH0{ZU=2iBF~@TaaN4 zLcEUkwV-{Ce9eS)8YIa|vI%Y#x=OkNZv;rpgvP9`EIrz!I~VzOafj+$Mt8RO`iR=r z<}unuMV7PLGrofa(=tM|3Mw6t21Qq~UG;x)qh<~4w^P|9v5!~OsoZU-**eT#S}KBl zD<;JT?N=chP;c4-{5btYD9n0z-O85`j7#|m1;aAFQBaf$z=<$cQ{AnnS%occvFu!? zqm(H$Qos$TkNI7K2%&qe%(X;~lCBz$tD9a{h2f=$LAi$lQ;lC`Z^On?3@IX&N?Cu0 zd~G=FrMTFs&{^NIQZbq%aSko`W5_ugAb#G2ZIYIZ0!Zu31fVE&y~M~u8Wk|glXUFL zh_jY*5x;#@UyR3JF&m`1iyp6q2R}=*_s>a)928w+Yw7p2#5sRo}tZUL7*z%zRRRB)fb1c*HAg)67 zC53}0WWpiNm812FRP(JePV^c@D2ibR7n$$KMdrJ4k>rN3n~}uqt&AjhRFr?{{q=>p zlYBd{(h~>w7OtIw9OGJYUz$?brHOZTs#X~q&UyV5dIcm@#csI{))$8~V-9<=M0)++ z8;lU$3zmf^4wbsBE!tJ0`B5_p)k5|ii|ANEd-)=S1m64Tk8)%ZHe*u`tMe0Dj3bA* zt05^1KM0J=J^`4sM9@}yb>?E`rL z$Omb}7jd@=!=0FQrUF*gyuMk=60@4?Fd0mFJQ8dJ-7wv~30INcP_)|;BxuKbCq7>D zbnohk0h)RRR^uwBto+?JtilhTQ@cc92a1{;yvv0@dD&3a(J00|R|BGFVv;qc7=vSj0__v>R00 zUE0)%cw9vP=_|A;3~ttu+k$rutM~Y@CXK@<>DGh-{2;%W3+e&tkRP+^P|)3 zBK??`RUJ=w$^NUXEabp{zUTQE-HHi$GRK2Ay11BI8gt!GSa~#&2L1lfUq{B*R40yq zsLIP{)G-;O=gb34pO;6M0Y-p%xQ|NQ`^Fq38=hU)2Tagfu03sO{Z*ZLu#x$!@rCoX zCD0=Oj0X|^{S{p&HNvUVWI7Tn__8XC=YaG8*%j|*Rk>LFoEA`jp`zChp)>eXIr{)p z6mD9q%YR|y))Qx{x{d*QSlY{)^@y!!ZRG@0cf}ln;dxS$;Vfi=a4#q9%P!LT8JzfR z&iWCPK+Is5_@!7_WdL(6&{7S^Xr`#PCzKn=~(awRFr*S9tB7;|O=8HI7W7S=Ry4nvA%A#1-R@l~Fa~q2|Ov3KeIK zRQe(j_-al*Li%tuRM+nSkDz+`)5Rk2u`c?+4tc1!g`mn04oXt^D2z517%>h7g3ohA zo2U3j@Cq<5LOqMpTBrsp#XmaFeSxuB^)YJ_fZB!#?%}3o&8E3}5-?R?l&i&@`*dQU zMe%7+2?)r4QA&Q!96!;0&7`Bp#{p*?oY#W%{ ztl}y9y=Mja#FDNIVN~3;BD%(&lrp!J^ZZX2ne>+B=!N838>(NHa8>@nHlDx!`Dbi~ zRl0vW4Q>fNmHojs5SMOlVjXp2D1B39M=o8)yDhzcvxU2_zO$M8ZGf|>yYE4FGdpdA z`%uU2Fvk|ktICr5d?PRMszZv(hkPlcQAlW*6hP*&fj|Y;3t|?A;;fdJzy*KGU#gAWcecIzS)<%g>;SODB z`g7fX#A3*WHpxQB0x={Z5!%Nn97q!ErvKun7eBvvb$s&b_460PUmX^N`=De5`N(Iu z3zxj=!`fG8i}DjN(ImjN5`(Ji)jB9q-*o4uFv@}zCb7}iiLa+|xdQ!2m&)z!B2=Jf9p= zs|fdmm7Z%^3*Jc5Yx-Jd#M6H@(|=VhrB``vH8CXVK4y$@EI>9afHRXV9l5e)gU*Y8 zy>MOZvOj*q_X>W)%bxgE&oh1%0JR`jdWyva%+R|m=POj@npE)? zYb1WZe|U;95g1`qAaQ$Wls@#IJZ>`JbkimS))nFZNqkY(&5dw-9-pD}{PkZr1;-*z zR9+nOgeMPf#8HUxbl4?@RcLYUu5*!p&*xdOhRIRqkLUSEnv~fJ43j75nLa)#plrbJ ziwX5a)|1DFqPNF~&?x+?O>_&7Zpb>!<#h=(B0Aggm zhGkf!*R4E5bnH@>+jtNeGQbQe!CnoP{zN_f;urZB_f?o`=-8LriF z`Ly9Ab-XuNMA0`C^Z8Nmi2vE zF0!=XgF_-dT>u=tUNv<-=OjmGQFiaYE}o@JI9O)sA2=+u)r<`Gsx&KWWHBoDFF45o zqxB2eLnR^WF{>s&_D?W~mA1Wq%rM-C#XPOE3T=4eiO*GxIDEVjF(1UKWUCc<#_mO) z1q~|yH3cNn3$T>XpE65V#w;n>ik!7hjnE2w(dXx?gF&MxVA$q~wy)MIYB`+mum^xL zh;;6-Bb1k#^zo%`Dwzb(nm4bx$n5RY9}@P)lr|0V(ydnO{C9lKrvY&V_D)aY)|a-3 z0Vg7i=TGn)XY*$l=v$*bSeDBdW}eqb`_0GNJc2L|I;Q3Ho0tEH0VWpvwkzCpgS><* zu5WHcm4TI($H{0Xp zr%iWD@>W~zK*+}REH>DH4a~e(?IE?#pK?25;_Ll=&YW5Jgeg6`>x5mnf0N6X!-)Yi z3dco|eaa%I<@{QfiUBrVw`ER|I}~q9H*FK4Y{zuT-(~_(nKCpAx%dDolVt&>!+M%50+YF<%5+Wch{R7gowu%W~ zzwNXxdY6-m0U>|0be{F{;&2y zgM}J=_NDpHI7}D;b!jY7jS);T66{Kq$~Ym%+e(4F;ip zJUL``l}BT89LU2hl*zb;^QM&5!6LR zmBnJ-((7|(#O3a zCg3mp(a|)k>ujAjJJg!xNxh-f6?VP;O9MysJgWq3EXy2q2ingmyqxdB%$sxx3FZ0u zBGcYg+D|E>PWvgvfE#LGJwGubHt}z6*st~4*Tl|z3H-^#l2uQqzGtly6f)%7SY&=( zq?dpBOqJjXvVhiANg{5uFDCXjI#b0=X*m`u%3euC_7d}pl2P1C%);4e;(dm%v6O=$ z!Sck2I4ihV6yCWOPKNqdaw{xAJVB3}?Lz*E*o9|oyRZxiU67zfsY{Qsf>^dKjKR{J z1Mjhxag;bVEYEX@v3OmO)Q47~=n*imRl0xfF@X*4|H(;NXiUm8p5Zf?Bx#fa8|~Td zkH7O7(0QkKKdzhm^wrCspB}$_{p#e|FWcJlp;|M%sKx3NE4odW2cX20if=l35* z{l7kn`j4Vv=tt;WQdK*C`SXjDpWnq_4+iT<>WZ|;1b!QJJt=N{In>`9%_l*2>^gtm zz#_)LqB*^IZo(HSU0w{A^uPI4Q9sk>JoKTlQ_AysYd2I zR(aaHNb6;}gm2^&R_N1Se{LtNpYk)sp4kbBij;_zU^j`%XJ?iB$LBZ6XL^4GXCzj~ zYwB1@C&jx8W}r-wWSe#^L9}xj;urEJl+~Efv;7Vv3-ZqBrAAG?ZMmQ$F(IGoYjIiM&C>vo3KnoyZ)m+_I)u ze?0dPqb2qxA!-8>F#jF0j=lzp4@v?RnVr>79-kAPm{xdqV1*trAy0oE<19VM`T1LK zI9NRL;QxA$en)B%bKuW84uzUHq~;Fov2=(Lj8P%WTLI%u%vQalSixxF4+|EE=O=C` zMv83IV*$dE$?ILfHL#$ofN|9%U*V1jb}q+R=NwHzd*bPWf5)~S-{{jt-T<4iOlMhK zlxXhAMkvc=i$%Vy^BR9x*(-J>;?4Kv=(N1*F~ypg%LgE3WU;k2KW{9hOJuUCye0?X z6$|L*1MuanFu?0_k;#21U=vlr-XcBC7Co3!+SoOaJO2)t^H$;zWgWOn@nFQ+dXxuM zBoG^HoE&c^T({T7z_ z_9OV24xN`5v&Cwj?Q+bY$YBGV7ame7iO+dC%!5QkK-NCd1TH07+)3K8qugYxP{bkY zpd|u|1rhb%4HhXV%AXLpe?Zs{seQh^)U-HUy9g+RbU?80Ce038*jmlDWg$BB80}*0FA`M>9tJu zxuXJO|8{A5(HaB=5)puF<>(-5WjUo^s#7Tk+aUeA0|%_bdzZwmL&#+xs11GWAb8qE zVn=j_zpH<6ZnGHf4y?byrUSW2toLz>JpgO*eNK;;$ic6c9-a1>DT78?J&U>WWS4vZ zF0s=R2t^?xz_&5sxdGZinyp)UVCdWHu+2ds(9=*;-ladT2jejq)DeZ2(3_Bk!&&oA zOAgFZ;h!OjaEcVZ=qqw$s}w;ix~m+)F;T|9_H%zWPwTedp#>i3i~*37NBbfOZhLgo~Xs6rL_>w7hkm5^_LW8|z5NHM;^bdJgy)-Dqu6 zS?hl6zYlZX#gp?Ric2O)hbPLOt*=qJ+5F}Vl7YV_w(i@3`8=)mI}fG3b$0t0v}s>)?AdtgU-NYYAIn%tZ{ZfAq~g zx!OB0vpe#zn^{+fsL7Nde7C&v2Ks)ql`<@Si;b!n9e`_B+@ix0nyL+)BWrJ%dPsl1 zt08E|V{Iq#PLfVRWbdw9%fzIJ?sfIu(%K6 za4R8KU1I1&VMXnX{N?QIY@~@bE%AS>-qVDMOs5eSD)P_JkT~w;ml*gWEsUz>eZw0t z6GP(`YORR8eprF%6xgiRfip^m#@OYB6gl+NS|^oBsF67@rl+*Q&G-{0qw>L|xITKx-2x+Ib z53EeRy2M*?`zsM)#WkyRn$FL&82D;8#E;jfzmbsdP%9<`phkaxQV+3)QK1rYdd^f8JcBS6^2Zw~v3gB6A&P;eY>_ib zbd9}2qdqZ|kjA3!@J_8W*{R+fPqJDQ+u-Hc5bP_uX--j^3pusE5dBnM<9&92*V=fn z_>;*5|4gTkwIgO8U^RI8VXR~Kad$y<7vPyLC18y#KMZ;CJWm(pd8dE)NzB=*XKtD) zYEl9?vy_y>F&~`z#>S3tCfvFc2mMQvFZwNDKt9^qQdc{TW4qKdd7ma2+B0gg!O))X zv%ssuYd~MZL#+jh$MI6|%y+N|=m^m_H-sP~47#y>AFiLdYNbU0PmYaXWWSLfVMnY*6PwjCK zgZYVL!gXY+Cn9!&pwZ@`Dwq~0kn(sq&JKg2R^&j`i?atZRVKnXKeBg>?C-XAp6-KG zUs5TlGP`H*WlT1;m{Zw=d7#E<@p^L1^=GICo?vMz+IB@^j4sfGc?1Iifan9Y{47ly zARM|aOx2S6)82oPJ`=@vBo;WAax_4@0tek}IcVCEN%@Ny#WSHPVlz~tfYK##*oZjV zi3l456$qe#+rb4d4wg^$AXq-&_^?3|FbF5*(O>EeMljct+&#F6{oTjcAwOxaf@F)% z%kq4Y^&tDY_i!)}+9`d~%E{4RL+G_;<0{jd;Eh!J;l+P|2;;c?IyUmq9&6+(rE(o@ zN$pbSOdSQI{@}Yh9DRl+9HU`6uRU>Wx3*}NNA=ju7~AJ*(6w%)0K9d^SSlJ=>vgxP zyBq^IciRGwUP+HD#9?@hKO1e#Y_$;AfEcrX27_?qO8b;A7QGo!SPJY~6WDsdSTqR7 z>B@@UBRqdzjuqI}rmW#^cBoFRCKvJUJaj1_>72tgn}VaSyH85?wrO?-N&@6>^xB@H zi4$)+fry@_JE6$P6>Uh(quA&Jc+Sdm&d)41yPm;}Bo;ZULl5OdXkS~Pf14&7{pmg2 za~Z|eA_Pmm-+emSqIIsUnZ0dk(Pw*u<^SCE{k(tOtp8g~OU8-yTKjo3`0}O`KMg}q zS|o8p72yZr^TWfIJ zS4iy0#%1b%`^Z|Tqerk%5AR;*&I|DMQ8a)hi2C1!>%ZQmKQ_e8>*cPq{_ic|v^yB> z20ks@!R8Nv%PwHD3wYcGEOrHl`+~t;wtv@cZ&_Bi7y)19wJu@bV+_<6q=I{am&BO? zKM3lzP=}4*s&|(QngJ*Qp_eq80Wk+-nU0|)FX5MLngLS>@-g_@#zL2u#+m^^1+D5P zKg*X4n*ket-IZFm6WgWkX#VA7rwu-mt(?iKdXjZK1)%ADJ3!)g3p4F%)aFR7b{{(1 zb#l+H*4=EjCrT05`}O87c9=sad+qE<22h-vtvJM;Mo#1%p|sP~ijX=G>%XwVN;umV z{A$W8yfYk2@DL!=JK!wY=Fx?r@qSFzhmUrze&`*4$rdU#g1a`+nk?6E>|Tw2HqS|m z>_&evKWh2n!K8H`ZfPaGRSTJ(*5v|l9eDwgc76k4_a}_~Z25X0A4Q*7jjHv#>+&h# zACtlLhu_s63LsfWeWqU9pI7PmxuavPI@vwyl}KFCU*<*FJ>2i^w^iQ*>m*dOXuAhG zIBxWR62%*31HxmaVKK+awZ!hOrfkXlE(pOmo?9lq?(=T|t`9&>c7PCr{jaqJbsc*= z^|bMK8G#9ty&-zya+=|8)JbZq?^rWy3zQexm0gGnwIXX#9I~!%O%<8}ze(ZOotDCM zO7>_+aO0!o5b~D+%0|TuJ{0AtV^8^-GwjfR!jnA$``#T+I-Bo3aP+;g`&xTudScAh z#yZ~(E(O-ninZ{to+(jM8wb@zx~!jUE!-01sA1@6(UENoq?cpV6@C*ik8IjfBSM00 zA}@u;N*WovfDrX%3ECC4#1&2foIQY_eD2+|1s$-7Zgd}Xcj`{hg;7fzoVBp|8F80? zTJlX0FR@Jza%>OVx0JR{PaIp^A^8i2{YR~rDM}QV^_F&b-hGPS=DN0a-hI{r-!iFE zZ{Ai8=#GU#>n=luwd{nlHLmow1(CgJ$h?beVw#5ltR{Ycs1W=&3d7Uy7My$Hzk%cF zu_{q-D(HRvXr7&i9@|@8pHi9^rAUUa&~qWj+ml!{(HtQvM!9*eE>Qj{w^EI)~FNN8cnx%Z9^%4dGMGU z6SjPhaGthznk~+3S}WXgIHPyeW-z5u<&A@2Ud!Cia&bs;f^qxX49YGS$Zjol?AyaR zK9ofG->|h^My8to|DCs|;mzlM)Li@V$O0grX{fW;Aq-54U#P`g2V(IeZ;9^+L<>h= zetDVAbD@LC-x%0|j66XcN1md8*CCh7I6~X4iNVWDJ$1p_N?#;j*v?4QJb-=oJ!WiA z=PhBvT^towf@kz34)`s~>W9lzy&_C|w*T@0G|d&s@K4sUWi!|b7o4=nhMv-+lYWIRM$offa7 zWnS!1YPVNuw=?8cUF8`@fLXWyUt`PfVrzhg4nK35*EX97&f#`GX=|_O;ttrUu(~F8 zDt>7U_i0t7*T&?!eCkfuZp#Y9HV*3wcGEEH&dw~>x(aS zpjN%rXZJh3I6=}Hdtke=A?X)6$Hzd<^y8wuB)7ElY*x_$fD20?U-gm5@k^y;fwao_7~=Cmlx(d+~Gl6 zx=|6V7Qs==@`4P1Uv%JUEdlco%O=aPGrdPUA*=15mmjpT)|9N-GaHTV6*s#ehcs>+ z)Q()+(gAR9VXGX@jNuV;6E)8}FDN_M8}QhCj2`F+W&1qCD5o9Y(?s!?#*zfK9h3aT7Gz{bG;gxaaGWMM7G4O2qKu+{n7B#{9%Q8jLUPCh|4Z)5 zN9_6jKJNvI8)7D|5>=inkbL5iYy|rX%+Vmi|7&$EO|W5=6WT4z2@$B(6o%Iw2CObL*`0%ZSTM5QRhDD_XP1mQI;ALv80 zJB+k89f0tEDKSqu1Vfhba^7&SGFZPMP87EhfdzW}Ao(oHNmGoR0>6NJP$&qgW zj};+S0E&Jdp7S(*zSyF*mq1kIewnN-(2Vh)Un*`tHI64Xo)6upad`BucCAmQ3eDa;o z;7IfPr5EW6OqM5s1jDNyL$IL$ps3c4vVx^!NtfbbaozTUP?+;u$hd?edqJXapp}~Y zf@7V3X}^>r}|+ysN%j$M|y#Uxv%**us}(gx4Y5lU)Iun#st21s9E52!3C z-^o;HKkBx;c`q}Jc+)2h+-_+CL{^YK9^BsU<@FC_R}rLPNLd5z5QxSxN*pl+SPHd3 zGnf`hv$EP{%B;JZZ$enuMFW(C%Xi%*o36uu{%<8;{htsE;7Hk!rz) zFFax{Sp;uj1sF%l)`EBt6kEoQ!}~aq=GL4uqi-&TlN^|V&UIc(AvGqVlUycihJUSz z7S-4S$6X-*)5SG^Pg6ru zUAFb&*`~27=mMB{u1H`)m7%$%K@KkxnA=?~fLdf`w0!~UZ+TLq^_ z!dZEF3C*$)D{jANr{(;5XsTj=4=p_c5ip zI);+i1%-CtnS3W$mS!#}9i-|@Vpg@ek$yjRZB;)K2OP*e8g zx`%U-G94ZK%SK_>HIC7SVeRcOF6WU({{9^Ux$g74L6_!kN1OV8G0yhA53(BgHYr5+ zDQ3g@Q;so@AOG(;#{c2R>oXsaKLV0`oBpipW;a;*l$`>N|KX4OH|}G6&_Bozx%iiD ztjow|QAXVWw~K@1?SRBRC#T*;m7RTIAZGf3jqtYu|KxO$;_7lR$2DSFnY8FnHakdu ze3;%FxWvAG9)xFqM~MOO<2$FQaNm={KN5gwwAhno6@o&lMhF7k;B z?>&3^_Brf-06L2KWeFhmEXCMe5d*SD!A+)MEM12isQ__B0kG2A8+aWP>ib^)t&5(m zK`o5Jr2#$#?O@U|VK0sr(j?!qVg~myI6&JCEnNwig{VDjBlvA%F3~L-dQ!h0^9sOv z^LD+dL@Uhsf5SS*G;e)O9C_8Dn>(>+ zEb~&?VF-C8@(NV8jT6E00WA!&>QQvC6J(T7s{Z8 z7q;DhYHUe#{o!?_ZHRrB>2PEyIcO2^wh{ta7gu0&kzABn`^Mp?rJ0-vz2-hx8A7( zuIbMpn6tSUm~e+W7+6=UvDfrr%d^G)KJx`;uWirmty7B-pV_I(nE$0{k9~{t)Y?&5 z`ing7jb$vOHGrXQ63m;hUke>y64U9g!z4e(b5>r3W?`RhM3JSnXk=T=0etCAL zC2-I8d&3dn;sDpaOa@V&3`Y55R9`C2n+uoTsR0;&06UT&97tdFkg(<6&2h~070q<_ zyVv$p)nba)sVNM@z(gi*v|cTQD+CN#FYaS??JV*e(@D;Eco%U*b7RKa;z73n>fnGZ zEVuO5BUpB+hp+jr?Tg1?zBu0U*ttsle`E_dwwd=M{Ih3bUKJ>A!>vO?m3ekqA__e& zJw9ZAYR`LG*KmT;qKUj}Rm6`^D~vKU&qNQru>WM4FCWUPs0)*dnpg+>@OnLDEPAUP z!xPPoTj$5D%Dfc*tFhB6tIJh2%WAJFJq#2}nvvPO|9G|7eJYO^xnM2b% zji-uz=7sHTo2ql!jY@YN(M7gcx+YtHz-eBt3b-#kK-wM_)HZd?LBX5l$9$f>R8Yu& zPd`)tC7mvhSUNJM)n@{5dV$7_6on9{Z$@bD>E{q4Esf?G`F}o-!H>>{{NwoGA zvXxA0FGy#sZ-?wds&RTj=-vF6*ZDr`C7vp3y}(jM&y%+(l*K(PI~ zzp`DphyIqKui^l?lL#>=`d{SDb2Zd|d3FYu&>QZoCg>V(AJ(lYaUmk&bs}oR{l6RR zDdydI>yUhx6T=)#$FgKKWQKR+rhyCAQJk!5dN-xYxj$u0iL}-!P?w`!&t$b}vhRozL#I zEKCuC6D21IRIJBKYO$-oV0^YpaTTi6WYJ}eYJ}>%z6<34dCJkTVHPSWS&RX0GV1AM|8yg7S)8jEq?=r(J zuq6iO9f%bPo_4>FllzW3GtVWDw7orTqG9MA;*JeMeO8ALysQR3q7lAL(1`vt zZ$9O9<~=yH_jR>IIX2ssjnnQNA8!JNbe5%17I(=TGT`lkCf@7c84PEC&1dZS>pS#} zi2O5l{oPJozp1j1dAX{|Jn?fb`8PXt|0=s`K6lp-k9O+%7@B@ve9kE!eYbnZo5_ni z_I&hcx79}cN0-KD?EBI1=ngQ>;-A-_bJYh&U++Bm&kEoVzjJh~5MEYn#dn&j=pP^) z8We-Vou<>gn}n~L6igC-^&Ly6>!UhHn4ihZl?X18zU$b5fdwv-@eXS*Tfi!5O){EF zwMpipFce@cwzOMk74T4OX=ql)U^mrE>#|TidaS<#pvJs+UwH@KPW5GvJN20@^BR~; zy;H5*7d!OITNugu>;Dpet=)iD-HYvNJY6nNkek|lQ$-ElhYrMlU+Hu#=k8F3a9-@h z)v*y=iXucI1ZrU1{ee=s`bw!YpAgCWRmcYwu{9~g&9g%*SeDr@+pS>x=pKzz;eTjE zOZ_U|r6pe8J+eA$7|IP8RlTV_PIuQt`rLRr86NX5&M2$)*^9;-jNPD(RXeD5SY^DY`2LO+8Cp-0`4JY9Gj zbv0R>b7e2?0mJTdx0;f`O?@*9aBP(_PPxuiEMy=g6rbhx!V z(T#9IYtBJ`b7QPUDG*O%_+0hqn=f_uyjqsm|E?CT149f${b>5UloK;UG-@S)iaXEZ zRkaA{X+NJGQc8V@8+xMe`N`>de_5Ox{>YhrLJVEAU!A_n&1XO{WIp#E-jh9&QHeFu z=Z_20nx(7Yci*YSe$r=)vC(s`3Zx+eY}{{)M|WC(bAnGAp1!Z;GM%CP8uoO=f5$^P z@4W88ogilQ|FQQj>TM%Qn&_)Q=xQ}l0%=mV+%D3P#^pJKH`|<&qdNm9lp`;0P&pU16b_sQq&QKeX6U z8dRRes>M!O8;gm=;>RIwl5U>bCg5tk6jgzLWB0+C^5~Irbiu#ZZbl)@9P5mqd)Qma*=I~s?#1P2;IQ%N19&(5=Ht*I=H~JZZU&$_NT`Vj?dAJ#^zcPn#~)3 zomkr(RX?muH&qL;m}4X~UtmRC2?MlM+^q!06?ti>n4P?L_#7(3^ck!Z-CJtGIc-E? z%L;{NAvY8A`KTyJTP05c{+)zZ^L)I-+mJFLyiAMvB0EtRB{a0<;^K4x)0uY6--{|+ zobwoU3VvBbpj8A>ui6Q%KIY55xIfx|ROyb+J}og4C8mNHCzhQqeY#mHZ!#nk2y8$gcVAGArJ|0rD8_0`DWJ+dEWw?@*nrTYnE{bPd}?R;G|mmae>i@s{4# zXlLYasaZm`DkT=B34xL=vQMe=UErqpL+qkCFTokPpd;*c?-#4hq$O>DFuVc`$!3Xb zIvbb5w$s`c_#J(j&rsh!DUW(tGB0P>c&{BWayj^QFFbzpmoSR6L0O=eN@927J9gaX zI7(`(KgKIs65_2b+$%AjF4aMQZZC2A@pBHzt>tXwK7{a%<-FysKMf5 z7REagMUhp)A}R1bNB5$XqgLiu8EkLUe7?IoTV(0#gnj7Q$!>uJ0q=Njt+SaxtlHFJ zPmM%me2_hiIO!#a^ zI&A<`h`nYzPBt4uQIbf*$q?}D`G*cwesY`{y!6gpwPjeQ2GX?NIFb6S>)Dl1+R)c* z^Fh0IX6JO2?Ip0Q(G@e0VmpH>a*4wyOlH_fn?tTu0@d<5;ID9u!aNSYr3a}x+H~{DS0b-H{D^Awb4<7D zHhD(0AZK|GkK1;_eh8D*@}u^)^;vIEqB`yFvTcpV`;gBVbw^u&t3v1mMfaZ7;Y1Hp z@!zVlSia6btl$hOAQ+Q7{kXSaiQF@GQ#=YYYyvM!uPJX}ilY|SIH0i#XestrVMR~i z75=(f2ceRxO!i=>q z5l58wk*1fO20fwfs_q*opMzEQAJ?*+VjFMX!zJf%G~)@l%0N>%(6=rgKOdh&9MLw7 z(3-$~L2T1y{w7_H@33YfRUf8WctWRakH%;8SF7?0s_m_RIGQ)B;50oGCmZ=8!QCP6 zrSU4382U1iIFnWN&%{ewKDF8n3FJ%gN_pL#{%!oX2Y>tH-;Vya`?ta0lE3x;7N4Ob z-ZYH%!YQ%V?w}t{Y^SsmC+#_aJZ{i@Ttt% z2r+l`L_L0ghE2;ukOqJJqp0zZe+=N{44uW>XkG=J@pH7wRO1#RTzayC{wzo|L+DU0 zS>Te0e(jFHBsKR5KXsDM68^e7o593z#4erB8N5s{kJgi1nLQ+TMziBk?^qZ!VsU+w zH5h}*@Z+1VO&pUZf(G&64dW*76#PLHcK~9xM)8DyLAJ|EL9kZ0?+H;72Srr+<%`UL zO7uz1FEBrs^9;SsVDzwZ#BmVhizTh&% zvY5@W8;I6fcSUwYPb{BoKykgq#hQzN(M4PU9 zXCnPBsuRr@2ev56RmvR&#v%@%PSqbZwl%g0U0zq0P|p*QotqBFB zF5lu~M$%F%jMVsOOcvj?EslTMh+D$L87{Jai*$C|C(f+C4V|9jkM#Tc{Q2{MwTx%- z2Y;_%^*<6lN{qE>ZS=}lDU>C`ar;2$N%*a>x>+k5JaE;G&@`gZ-0yxz;Hv?epP-jL ztOE=<_YUK~@Q}zu0#6kb<`%@A7Z%k;gY_Y2@y7|Nk?n$aAiV0C$%G1`CEtVMfWiEK zSG3@eCOn0blELOHl-6-hjl%F!k0xfBkJ&9gFd>FUss)geEkr)3REALO7GrTt6!D%~ zynz^bwc4l{4@%;h;F(I-U(B=@wT2wqAhkB$e%Stc8k#zhFb>aGc?O%*Eg4wCZ&aki zf6%vbTAokQmHC>1^~2Zf>Uu$r8JCEE@ofAQCC!z!O&WLggO zjpuSLqv4~@-`J1Z6NmE*ZK$R+B;nb_*70j|+l)=<*W|;@S*5R-40~6b5K;V;h#P_O z94-7SEoV=!T1TJNGmU-WG4^`d5p3DZMGl9pIE==pXG%rm%tgP>r#>>mapDENb==2 z)_I5R*b3ij6Y%Z%_#P)V(uALX3Z5-RgvF-Fgla|mlxV7Ve*XQGSJwyw#xMn5L#F4K6bO#LUGZrVMU5;G zx7HSB^DOgK`kB>^`Y-u^%Z;P9iA6F!8BWzIBR}} zMYlqYCm9IIHzpo^hWhwym8EchK>Nr2gP06$V{Y~pqA6b(vjcJX1OCkoBlizr$gW{F zAe!Dd6#WR-6AIGz9Bs#8cMyXQn4nTL;tL?sm>&%5$}bH&C&pBz0g9NO3t zclq;)wSMXhHra~nXfHIF3v`Ua7;8))l3#4@v?`fC( zy8#-1M8SRbt3&iU$2Tt;ltT>6Zp@;GMXb zs@$yqN-x>}y8=4ZUSB!$JO|_)?G{S-7h;|Easg^9r4iCNkBoLurCDV?0fH8z^1R4a zKb^dJos^Bw6pE3k0#u@Fz2o_#BuZx(SPXlA;ft5AU!J_g>mH#5J_z?3o;NoG?(*r; zpIw$^Wycx86kMzuPfk2tT37+k%}=UxX>^y$&At;z>rc=6;a)nJagq|Q@Rv{wybi!9F`-K|4|ier8X+|L7U^VOX)(|>aCNBs`M?D%j4z)e?w z({LT2hD-Va^>3s%&_AH7!~_Em)kTZL=KqDBv4fsfZFI+aW70cps(ZNhRrJFTSdmNk zV^Ym|b!&w7*a}ERgUgv_Uyj(?x`V=zh+?d-gf@}=v@eu@_$?sG9(B}ZVhLF%?v6%{Qba;|HV}&q0fqHZ zdnssaWSCy88JgAk@KuUG>0Dpy`zStCmPaMrekksp%#@jWA~e{Cv8!+Unfy~_*7l$x z={4Ua(UwOo=CA_3M)M7hQ(Yxy^g63#)>u+p)QYFoQGYZp4y&WlSnCR$)G;!Dt`&Ip zDqXfjovmPNhOh1m6gN&u3AX_=6+k(jETT2rf?=0|-6$PDigi2U@x!>`1U4SV{Q5tB z1c#;MPQl5Qt8ssS*jTVXI^bq{E2yNpF2lXes@x&az99$Q~dAMl0%$B>DmJP%L zHm4O-k2=gSMZ@9BFd&-KkqfSfjK&<@4tf=2Ps*pmqpNZGbTm9VAK%6m$=#PPz5KK~ zgQ1``bzH?_O9iQa;Nk&e0XH$oB{m!4X@T-s_0D5cI@nNBmI2eUh;OmjtXRP-qaaKy z9*n@qcF7>StCmTmkHJM&|3ykNNO%uwizZmNLi^SSAhY&f?Oh2@A<%x!Xua)1tCYM% z$!PP#RV^ni7TuuwS|WB(y6{}M*wM8eNWr>WX($PBBIGxJF@CAC6nv4dHtv)`jF~w&UWymYrMwJ;3%dp zJq|f|491{oQ;7@X%f z=%2<*)v&F91C?|pzsibhp<08}&8qy2=Wq5GMTLNchcXEW;5YEMJeq5z*}R_zeovZ3hnCeHhMvzRDx)FklXoV;%`IOBN1#So%FL zpf?<7WqCAm7HpizIVn%dW&1^Thev7T6q2Pu$?hX=%>_s{1tFn z_%8XA#|2ue1_a?x%C~e={SRaVodYFqsB$B9##K`LQx0R73o}WdDR%nkel(OBI*hM}phW;&XDxpvI|-BhxzP zMUr~sPC_iy=dQv^#Zd*aMp{R31=UY;I@7HSQBP|WqmZc-rdVfJr1vtckEVN43FN2F zH+o2zYN{VQN)FwJL=VV+S-T(^3Ycm;@pf5%(IDIZWw@h@qmnm65c&4r{WG6wkNJq{AU!SHVy79Bue|`3E@2Bs7di&Sui??r{9si7h z#{Jq5v;@->Cp`SPd4_A(Qs~Y&+M58k23jm|h$=KZrGrFscs_ohurjC`+0OY_Izh94 zXN9m$iJ?_JZPAX5=w;oK9;+tD5bfA0K_2Mn2(E9pev3D^y4PA6S&=3HYCx60;2WIN zpR1g*G)+GzicQ;=S$;WYX~6@yNLPk42T7J{%6? z$MC-&;D4k2;qc747#X*%tF)e7l51u!>|Md3f0R8q1Qc{}c@u@oWCd*$Uh^QEy#}J9 zI5SMpr(RVv|Ulo@ zfBpRX`ukqp-;ee(bYmjg;N}ENWG{+~M4_ZJr~*#SGES3WzZ4x~GWx8@uV{W9&yzgX z)Z4;5QmgDbS@ny_^&v>rkydRo95+^(Bsppewai)XIxgchhDsvgJt0fHS`p%pE zfxaUgp258$cpSYk1V^3bJaibaR2gp@e;1JG%NJakC)rMtaFwQ-xhyTxo%@*YY>|G- zFEH$0e20qz1{CWOTu$i;jzTk5PdHZY-S%E?Ds*#ETS$)PsOJ3gWr$oR9aq%NS6Ne{ zBs@y3e+NBkes$U14UK(u#|n>TWNxWvtgDZWwO;BM8zb(SMi`ztws6!on^x7if4f%#9O4Wim1&rG@Vq{P{Bgw3KQd>32G?j673afqRp=Hkja#zBbwU_yM z-Q#{pdXj>5psh1e;;J@1M^H)SNmIRwSBasllhl*>=I-teWJmRIg*w(E8BU6)E1~T# z_V%JOS)CSW5GqQZmhelLDWA?h#em#<$0wOrvNAP3Q6L!sbKl9*F#FgRumLp=llCxBfUpi=sOV>`|!w zE>_uX|6n-&!+DDTnBQR+82=%o|C{&%2af+R+<)@q#RwCbKsxCUpZ)Oaf6=7h_Hj7sTq9~Je|Rz+YArQ^0_xq4CcgN;<3H?=@Slm_qJI2` zKkwr|*lPjbr>B0H<3E)834_;|0DuAe|G{WqK};HZu?Zq(0F-)!DUTn2`0!XweQN0uYbiZAe^)Y5uJ8oUlFrZ5 zKkq-DNEl1T6N!Hd;yr1AxP-)qPbN(`wUB!7XyS((g|sJsmTN{sn?zeq^8kueHho^VwwY zR6UuT8E;Jch%I|LfAaR2veOL$rcTNtf*z7CYO&~ZNOa!7xG3wMf>(`Vvyg5vZD%!u z-}<(x$gu_QLK5MgpyhgZ(wd4GB$^9Bq-3v2-`4Pm$@G3Gj0=Kzz4vRTdb~Vk2e~t8 z6p9a#8YJz2{QNG<1&H3Ai1JG);arsYH{j;1hY3MHcnks(f0?$E+DjKFf39P%sy2S# zmq7P1&UBd8EE~B=Bm2*WXD+fB$9o3|g7%0~Ey)BsVEY@ray~Fpx;{?W^%KAZnWE!M zG)YA;?lqYjR*-><5o9!99kszgTVcqtolio8WNy&WDm5xIic$`)n>4fSMH{rX-3kj< zG%9ZOQE1G>e{A#G6_@-*@C#<;I#L}X6hG_6>uw>RCo!Tepyr&Jl2xafMD4@hXPh#} z0-ncS&s->-?^sPR&#RiyQMh78e0OkDoB|Qo=?TszFa!#UgL6`T)I2G&!S!kpyN*>I zEc68xF}cf-REB$mM8UKJqyveWOe%vaE_0faQOS~_e{AIAo2{eR>YC|TV(VVb9-Dc0 z6jGzl(_82!1Xu?u9rd0@is9rjl2Mm5Yq5-XDbc%^$u1?PHnqh$WAFj!)aMCTAwfS*~hREsf$7+{aijr=kmqd;w@~Wa0;bDoMqm$*jxH# zHT&1>)-K1s>Lvb~*Ox!S>1__oV7WhQU)HhFTSaq@`c3i+5^$#f38{};+Lho%cJ(qr zuL+Iu#=W-cTG9m0S__97Nb!Dcs7`0j=T^2De--E)B)~du9=s?kSR&q0fH(>^zq&HU zUwDM-`4acjmoIng*!|4*2&@tTw9E-&G=fSzciG9K0iHJFG8sJyGWJX!WsTA ze{Na+5(7i&Ei6@Vk`#&YhIR9-#cB~xiJa)_GR2z%ou*9_#=+ph2lSwrYR+RuQGxZ; zd~G#-!MHCi-tdA)Ln9W6p=%S>Ti4IHuR7hXLJm?E)AViDyxs&Q7i|$XNy5z-`%R z!B^!NcW^VWaDw+_4=(pTk!kqQ4JXalaz9JNo!xF_z%EU`C^&l9A@M(?R1wiQ*t$kD zb~F`|Kz1MNtNWOnmVszVhqL?KsTEaQO{xx&*Sr%~`C^J;fBHcE)!iM;x_@cCfAB%O zd6pizEd897g?tHqca1kvh5V+Srotja1R0UDf1Ve4bs5qL%c$cOOMsmPE*@~1N5o{0 zA;OHdPFYGv1y&zJ!Vbe{J6;*C^!KmqCawIA`N@DTh~>&t}DAed&FGk1M|LzmwC(qIDZ^2f$ap!m}~c^aiDmAXYLdZk6F&9 zWmnY$m7eFC2ALO!Z2vI0@B|>eEfQ(izOh?CxMk|!26EqQPnGwb4d;5qrsmgkv!*Kl z2Z$Q$s>>M9g~ zLtlJ4-Y@JGU@D8tgq;s2ILE zCL!&PVatl4NI<<^Jomwf2w_zaTnz|Zy7xZ03(p1SOXflmu1jJ4R#=7bVyWUSO;U+WBH0@!;zv!A>J5w})NrG;>m2%tN z41IRO<$#lyZUI7;YG__e20{k;7{>X095T<_a2;*RNJdi)`Q~I?$aAggjk#VHbIemD z5{Itc(v{h==J-*TAlory>vYD%34eDFks3wue7nli8?$m@rq&;MTEXfMMP?X4)fO7C zhChw3VAWqFy?MWg9z1#cC_9K3hYyEGkoM-yn_wP};V1rj`SN8P$WLenWqgbSsw#@} zWax8>7O@P_AD!8}E$BbCUwE2qG)P2tMn0EuXalQ+3d`MHZux~jj(XbgWq&4*;<}g8 z+$xYCyb#hBkz+wZb@hythMLg3Ra6G`=FAtJulQGdVVHX!5E5ZHQg zQvSaso{&SjNRk@;qfDZ?*m5uU{#vut@>{D{{|qBy-FWTbbsZPu z0ls{3zUxwpd>Jsd3w2H3OY(a`wDR-Yt%g0P!<0%@j~ z=|5*NL{~g(5vVKdnIVEJU6r_3pex4W2%!<%{fiK8N(Y#vOVJe7Ak#|_d^%$^q%X?P z>v(5`Fd7~(*{i)U;MNsEZQ#o0N4>@ptbV;ffMkR%jd+RxWg*J(DQrftkn9W*EXVd_ zSS6VW;Kiw(YJWB1G_-Qr975r3$pWOnB}GGHuGv&%FLQ9*q3z`?E@4uRx8aM{!Ef0+ zEp-#wjOe(Q=gDihbceGAYJsxmx*7gI0_TxD7)l&yEx+5hW~bC~}EVTgiw#S+sWGY4m^*t zkPxT<3D2)l0eX5mjA6HgOV$XkRWOdspZe`NV^c+F-jJ61)8KfV)6LP3_=L7oYNfJQxjz4-h~60oU3M zW)(EN$`%$#6TUfKW*GwVG`Rq8*00q?{%lH;O$sKm+NSPY0-Ip&rwVs=1X#)#} z!~#L4RBQ|#&a}XU%aGB15B#gK!N{EV#tzr4Q-9jLBIF917r=vHf!ayj-{w#$iC_}m z-O;X*!8v7~t=9-vQ^Ri#pEJ*1(M=g=HN`Fsm(bGZay7SutRbW%w4p$40^wX^W_VdJ zkDD{KP!n;7Zlt*8?pPrl80NtXXm53eaU2ZN=Jc6Gb#J5YH;`WDn6vfC6P&NKdv zi?MIe+A=$QZh=@fC&=cEe4?~wWRtV0=W>i2ca~3>idMOhv#0Sg4pi;5rRW*0<(5Ua z#yiQo?BeCkQavdI{P6`Y)^KvkD#Z3ygMaM0wqR`vJ6RH7-n#Mol&SAxnNjC#!k>?< zTCB{RyGfX${qYooAcnNq6M0|0@b4)Mu=$;d69}L2b(s}pm12AZnlCPprP^m<;^4^S z_LOYdrcbsLUw347N4mY);V#B)8Pe*unDy+voB_ko&b7)A{U9`fugSwQww7>@*?-_- z@t!$<_CmI{Fk0ZCfrH8{EcC5RR?3&>E>+_HXaF`=%2(d5mD1?7RH_y8POlmr1SY8l zUeXY(#ftP|kzy^!c#|L0ms#NqnnoU6w@k#UZbzVNIKQydVCR#M;i!8LpJB3Re7L+3 z=7A6Y3^!nTPFfzmPOCbQ6J(6Oss_TWlCDjGm*Ld`7Jr152jN-b75e1e@n8P(@}0Bw z-fz=YT)$s*DIwklksb^-N4&I##To?iF2!=(Ag=3<;>5x`Y#~Zad!hx1c|@_BSv`G_ zqKoW~rI2^Dl#=}FLWVKX@`gdRnrVoV&nfK~lYU(>r%)c9fC6jfm54sTVON;~g{tDZ z6Q;uOpnsK`!OiX`2b^8^j4&ptZ@Sk)7S)q+mj%BCb}QS2Jf#_p=phpH0Wj7~{h^H@ z;*Y`y_@4)#vk$eiXkOE`R>=_Qm4z+5hwG$7lF|&p#(&o6NIi zfWdq)5R{Il=6aFl86k|C_1t=RbK5A|_2W=J98MBbKq^2Mqmc!Y-Gl@5XgF*r)*Wod zD2C4w_i3&x+Ky4EBYcii#skySnMS=Vp~5pW+KnYXz}>x_G3!6DQg1=XS1qG)2o4HLhFuYl&vHMF9Y4c7x!-M<2V-sHub z^ybcWLg3XJ70@@Lw?8@ng8SPL{2yPPJvgg#iWf2g?HtXT3-owO14egsI`ACXQsAH=JuL=>r(sb)n1<;BWuIT zwz;!SOH5nFX!CG%s@Bfgx!%S#s!IX6UsJmiYg_ij(WoWo?g$ z4}Z%7l{DoUX-W9v0pFxMn7$IzWdXy(CgGIldjY>x=mznXw7&51TKo1Z`$S>r)YrGg z34VVNNd;T!vtq7QhM&<$-XZcBUr@Ck>hozIBY_`2{jf6Oi%bsiomKh1S^I5UhgE@$JiB(vB)Md_^w!%IDOyTYvXh6om#eA4$z46`%6Co;F$ z7x@``Q`Om$sXDSHmcGjA)d&7VztS7}mEM2gFaBC|dP;x1VIS4{2A3x|KeDI?yaey6 zI!I_Q^KKXa37kVI?9REo@NzCMkaGo4@sVP3+@FOk%l*0J%+ir}mX7?h)Op%zb}KdR zqCTH>gwlA2nUpuWu6ST2X&4(~8c;}yTeP!YW#^e_KW=d{42?)D*RpOP(`}3ZR;yk5*<3#tRQ$}VmLbl1w!{w53ROSIIQ<7Wmo*|ale%n!K=27^H; zqIoEK_x9Ej%7gdL^>BjB0>EPm{rQDi9`<-ZPS#I9-y!Eq+`?rHlQ6%c(9Lz$C-Lhu ztJctnN10PIzwxCN1fvIEF8F_!ihtthguFINiYZbB;zoTpkW>t&*$td8=6Htd8ENT_ znI_N!9ijXkd!a%Km|cmy)HLw)_u-+jGVkuTFm(&Y{SJ(3CDk2c1cQ(=Z2R8j$-JCh z6Dk1n59DtA2vzn8*PuaVL{VXuTXE=W)&kO?EpH})gub4jC%}NLReygvdGk66^MVHp zJIQY9FqTatlosTx;Ar(D;k)#5E0NGuVAi6MG+$411LEPq{zUU;|bI!ou#MbXx_35Vq6)=d!&Crr!0i!Y1Pa=&4@*+kH0$VV25Ju_w z%J(FY1P*m^MPl)k|A2qCE1n098uUE1%0p2(vfbSs5s&y(QH0cJzu@FQVWEw)qkL>; zOOxuT9vhh_qL+CgJ?(nDLii@)Sfw}UlketCeL1Q9MUwUl8K~-L@zmw-QBSKWe(JkpEuV_Y{i8i$hlo1jwTP4MVj6F>ce)o3WpCTRMNPkiY${N%u9nJ?TCM z;Er_mTY0{Ak`=Y8i2^V5w|k_w*&EvL?8k+P(a#VBVK6`JwD7rqJY$ zVmZZowU)Ow^45PwUU{CasT!S=k<&qK4|TRHDj@Mg?Owav&bFsv{iqtl;{ScmkdVHV zs|RwDt8aUQgYWGIg$B>8IkRfkYuT!1>W)_Pq`7^zE0JTgzFB!|)beJO7g%m8L=DNU zKIir9vgg4Sg$<9#N@Lb;cNlX!Bt3D+QRS2tb@q_}NuYm521h!f%%n2(WrkZIS@RpY z;l%CB`?4Ucy4Y>a=!lhpwcwegH=`-87yQQ%f9%Pg&TsUq*c2Zb-`CkvN%T8p&M#%v z^R7*?-oyj`g9cY1j8ht{C#w1M#%VsgNAo!LvEGE!yuPPrYEKu7xm;Zk@Rwt_;{s0j zKRY910kVIx80(P$>fksH#(okPiMu^aJSQH{{4x(2=838;d&a;KCGE5hjjcY@N8iz_ z@-QLXfq01`-{BV1`eUmN+ z$Grx+v^HahlOj?>8>Re)qqu4e&iyoJ){ee)aY!PF6zIzHMGl0$%Vww$s*;|Z1vh=R z4Mz{^iH;Kq3-Dg`z2~H$ttz^GwR61ux%`}%CqRadsHruNHmvEmP9tKyXK7p;bJrGU z0%?CcG*(!=AsP#CB(;F1YE~)%pBm-&dM(R$1h;m(H_(5vV2#}ru^^BJ(IkVZl;OB* zvnx{PVXaq9jm8E8+#OV-LK{>6vSO}UN~NeTM)E6L1iR^Te@vYtv9`-J)IqBG@AbxF zeT8qBCvGX#YtPc6FLiE*@td)|()+x9($jzT5bH8zW6kAsBUZN-y4$n=^eHX+zTRVh zpo={Mayjr_&D5e z&%&+``1Hg5Ch*UOnw)H5xWj*{hfL|EM1Gp@@v?CmHk(0)XHE_J?Uu?Tyuqa5&ewk^ z+Vu7zmj9fU5pVJO6G_d2Ow*-EAtooGW|0&|YbJyk?&4SN)}5S6m5Nxc&#W6St)^RD zgIhFaQJbK&@Az?tEgD_W8dL}kE#ONHH=KdnnpaF&GYuK71NNlDBaop{x2hc>Afchh zb~3CXhw;uRBNo~H7ORmx=%>T8B=LW41y0V9nKQkSuX_!W)SxJhH#(8&T?i5Agoe^q zqX{8>nhT*pJB&P%Dm9_j+CtI=$x>V79DZdybmJw)b2C6om|V>*VL#yR^~TN8F5%TE8rM!%;>3I(cgmQD9jkv3eJ z4fZE3oHqQ&HV4h|Sbuz_PZ?noFZ-V_^E!j$qnVw3~n31~&N^#DN)H z{Li}2m#n_cHKc>vf!)YMZzD2X_g0v>q^*GKb$*n4_jxLN*}Y0AI`wtx6SVzlyQS z|6+_a27}R)D#+3*W33L@Jr%JGFD^V(XvJ~CG77QKOUt~7nrVOX4F>VYbS2{`kyH$I zd2R}Dzu6ry)>c^0av{6Zv0f{GrzOc)2Dagka3k%5bbicMRfB&FvYGT~TW3v@oO{z| zihG|zW|cR67TRXaJ)Pjo#N%1f7T?e6vl|U-k=@vtc+9WZVwW8XEDR^UFqdq3qaN^+ zfr9$D2VZ#CSLr;zuEq!V5nfI|7qLGK(Rq5Hxs!dRGx65TOOsFWcALq!*^}0TTB@WD z4W`(O;FIB%SOkByY|b8`C(0GlT@p!Wd$=*PJnP{ngp*Qa=&Q6R*&w7(Mw@(>f+bMO zCY$T9B*JK7lv0zeM#9!&r(8c{&+(DTHBOEIWG0!FyR%lMO9cS1TNdxUX~1G0&4PUuV6PFh1>qD-4R z%tN)sJXU)Q{q0PLK>TkwaRp&jqRm*Z|L9s(S^YSL{bKv9q=LpcSlG9(t+%6Y)iw<8!+CG;=YtskH*!YRNK~BpueM8bm2M6KmEC=V zlV%ezhSFg(Pk!>XM*{!~S&Kk!RZs9Z4$xjBV1^cf<#2}H^l`wZcN~aQd>p8Y1*CFC zQDlEd6EJij5+Xp{^_zhJR6o$bB1l(x+Gn#DttGCrb{~Hm4?z0-n_X)LPmo`K;U7(K z0_fG;fF+O?f(AH6sqiSwehbI{maqmi7B)A{3vbvZxB$=FT2tu7n6^H+a2^(x2Z^c9 zCH%b&n|#nHSjUO{rod6$mf1qU$ND?(VEcct7g~lu2sM?|0o;)d^p`+m=Rsw*!l5vG zz^iMV4=oZ5Tw`9Fz%KR&B~il1?3ND(HSn+5ErZi2%08jc_s=o>Bt08hDDd8}4$bHk zzQ?U5kcwxc(JfF?37m>pPehn#?$qg|Q{d?1;^XZrR7!Y@w*g>u#2n~|U|_EhoA7@X z6n^^DDXSr=bD3+7wP}pMzftsEe_JeWEo=f1yf<9c*G?-%ZcK|t)CH}6ijzqjLZ{4X z&*+r>${_dIYL(s^o%>{3U<-rG)3fz@Eg6oHFSscUnVx;pb~UuW6x$w7+9-@eX6M3( zgdgVdv&ngpZh1RnM%ET*bx(2KX)}Kc&tiPPk`Bwz(-rVz9EuqPvcMvW12bSQ|Cp1N zH)IP*XNPk;Sf)S+{y~u0AYSuqwxS6HlS~BJ46c`y5&lD-O}HRvxzN~@|8$Jf*wVwj zCl=`yv$WAn2lu4q5r$38?p;q`uSXlPu^uNb&f^N9WrdNe=Il*}1gZ)69L9f{vV`?# zO3{ycL#Cqq94c=dait?UQvM`l{o7*(*1GUCVDcJ}1X#u^S-$ABG|`T9cwaxxK{U2G zZZ<*gQ~ou`V{mL`Y#2f(ANEXHe0nUev-%|^qlqSgT=2tz2hF{hWs4Wt2RPr)5T!s> z8*0X#qBe35(}!xTqZ!ET#|D2(dS3S+{E0P)D7iSuT8n((Z9(v&ATYxd4e3;OjvNh# z%x0Z*q}b76`|=OMagaQk=N-2F2vBX7oVp&G{ckJB_ss@=D-8#>nG7xI0* zC;o;yO4}!^mQI|t$BDDv=)_qo@6Ec|dy{_rcPoeHu~{3gnzhGAQwo2==fvO++%|lE z3XRO3>Vq-8iT$I*bMaJQ-A&T>C8Rf^z-LdoAv|<^MBEMp@#uv@Q1tomf`8-li!se* zfhfvdQLG_gR?;RS0TCLTuKv_3HNf*5o?CgRt0yw`>gxiS@Sn%v{p%% z>G-|LWi?(CX9`u!$Ju{Bj|5vSr%T-r%$f0%w!vgj9-GEi7k42{&cB=vyl zXHMi7Vd=-V6>V=4mpISVF-`slXbz1oUCcI25Jc~X+>2(_P*M9F)V+}PEKP22dD5#r zZf|_nR@zinvgGv_Fm`)!P?+;w$k>Epn<4SzA^P7XT4S1HmgRp&u+iXN4o4R@J2z&N z;XD+qAWav;MhfL=Ok5xA0~sv(V)Y=4dUoK$o?8-2e30i~9k$4JSuW@=_$sstr;a1CwdCs+NaG>p0u zB3#GBT?4n*h2wQ$c3Z$}*P6cQH(Lj%9oH=N5Ib+_!O{~9pgt(d&#;zgFfjU}o{c^G zjizVX*nYoj`wEk0L;HC3ZPoMWP3-RSfJ#0mQ#g?*3h=C|6+BG#vxl&tX7r zOW5gR{oCjCc6x=8HMNiDX)#^E-An&=d3}|`f$3KNR?^Z1qvqtUV1zH6ulmX?3~AY; zKWvziyueE`wB<)C1hK? z_R!CER$M=uN5P**qfw>{FSfrZ$Il6<6~=}CQXC_o6HUG@EFIHJr@Wy9lxwv2Bs+Rlqn@ery7G;0g z`!(qL-ra2#QO(EgZeeabtm+n3&F%63nW$>|R1q)3j>#AKcQKnA~FvAK}XfPgR8G>LyP#$NjjmU?g=#Y6Q!AivDDy1QNoXd z?s-qW`TOY6`hrFPbi`}Qi;2_ne0qPCrFeV8Q3z;DwP=T4hQv=e#1|7e}^ zLAI_;1v9(MW*?Dtr>EHX2_-&fAFU-zPq!8-qs|UezM`TT9Obgf;jB4|^*&9prsn{nU=XjRCbec}VW>&DG@0AGms zOwt*?3ZtC_s5lyp2M4Mi>k{OtWT#0&cXzEMs*5fLQ@CrlCF8|d(f}<}f5;@*MyzTg z<15?h+KlS0tit#BEQ`B~a1icsy)rJqzt;IeHK5&!v-mVrJ9U2?%H1pu_1kc)t}t8|_)hsAR^5D-{gf@1XardC zk&u13(|(QXwU0ba7TPGCF?8Y+jbIik#-D_+@kv{EY^h4S=0+jomKEJNV74@_W4pF- zsu<(F(tYL72|0giA2%g!cj8YrV$Q+MLk{0^8c9&wR;ozn$0{N|Z6{8fFL&~9#y9)O zbsy@)=6FxyG4n!?%ny3M?9<^__DL$Rmqi6FwXIY%*7l=eru72;w&ZT&AV(RYYVSaUShql!E1Ji(A zBt1UIOBQI7zn1=C_IUrv{uB6GU4OXBYqx;#7=JWc-iU{*C3BAD4L(wC<@C3KFNPo} zUegVJul&SO}f;!LGxWT|<3BR7h$P_$HH`cnyi;vUm z)dDZgm#gf&Nr9s0rRp>8F`OE>nCvx^2T+(;c|tD3tj(#^`* zNQc{SbPAK~f{g^oUr?=PO^omt!uIc}$;-3Fyt17q)qB2w293#5Sb_fC9acNY=cE-Q zMH|;;4FuEK$EVyIv*NSRaLME)@Q3gx=AUv~k3#J_IuwgqLuVofgiS`-L$1PErFn%{ zW983j&J9>%ISFJs#435d$ngxI!l<*!8?aYGZw1038l=EUOBW!=+BZ#8&nia2V-2T# zR*4K!ZM1BE_XyrbbEL1krdOs;2heBDSZyqiLVm59k3;^~v5{Ln z%NZ3ldnT@9gIy+RPGj%&yhd9jZO7b{MN^M)gD&)3^b+hbhztc=xm7GRBa0g(c+Dw| z(*ot5&RF&@U&8lU9jIZ$=M_%7&ped7bnx@+gex9@L`P3^oODUf?hlfYOyFI=i96XX zI6aIT&o_E5Mj1D=Rt>KiCC2b3JHy5ki6NyLcN-5VR?QT@2pJa6GAEWW(F7r@sdO#p^hH3zoi~`^{!kIMIAY1X*_ARNG%!z}2t7>Q2%n zY~Ojk$mmrURw($0BFl&OyN2G2^4N8qQ7UJDUcI_rEN-=oegoaM4xrh-PW5~EEveo} zqsUFiOx8vG#JadWF^roGOqUR(bjqGD$||!NN*}v&RMxPOrId5tfvFwm1J?A-=7e6E zZ(g{Kb+T)??->Z!?r;BgCVOrcagHP}MZO+3i+Bg>P|~y%Sq9;4BV=Zkrx4ky;WQ?H z&midG#r4?Fv2vE3vb4N`i5IXYvJ>NI<7_#qY(roC<&9OaRd27(SY34Vb$sgXEOEo) zdlq>|tC2<8yvXY3dcmIQ#}qXV?-q6Ih28p%mEJL$SGBCPi3RC%(6MDK0WsIvP9sohHTem1wnhY%qIO?nx3jgwzDt7V)rpE!g612 zS|n-yCz}?P)hu6Nl!oFW^jO&9W9wUyr7T+5e?KD~QFljMq*9U6X07AN_LY`@Nm9Da zPFSB0Ux?ow4(SXb)j3egDqd3pKT)zD`YB8*F5Y21z+}u~jnB3xT~3m7X^=F%V=0^{ z{;QQL%F}_YZ)G=yYv;E=_o+F)(N2l7YSvZ_65HJfiH>m01g4=b^9ZHQ=(zT;G2BE( zb}DJeCrwY>bYUH%>OhN}Z)Y8U(|Xi1$Gf9>1|I$N)h-UTjUv{jG9LT%QFOF#8GA)U zTOjd@n6iD9XZ=haOk#(Y9YjB)XFU-}^Ibt?7i%+j=e7iI)bB_uAEwoyHr&aBr(>z;@ z*O8{G)>nMr>>!FsORYaSi7Gu6S=~`JvBo!7WgQbXYQR+uoeso^HoWY9B!<)NWxkmA zXX$EwXNFHgr+F=PjNZL{`fX(#x>&zN1*{6papDERVpL%xxT*i#N9eXGK4;-C>kK97 zqR?{WXahgQvD0&rp_i$Dl)0$jf7$lx7WM6^_u5|BNZf0K<)2N2N%t{_^2h^2Ox=q@ z3uBViBuo`lX7(Mi9*yd(&GfuP;CRHZIz5Y1Q?}I{%#-0Hf0_;!S#eQcPV&7ywnCOk z#-?m_nx5uoXOnVww;C+3tIJ*)t+}*UqPPC-oLZ05IFHMCmF$dvFsL;erSQfMhtXY? zWT(S3Naa8~z=r&y=-olZ#tNcQthzCF3u&E<)(kADNbG%+bL~ZW1;^eVAz7??DKH{^ zDrlRezzB@N4fLgFaRIA-do6hcYXJ6<@Z;9&)sdZlep{qh`RqB9RTk!#M_d1H;GK1G z_~z}qm;K|PU%l;rySqPe{td|NF^KF52pjZdP?x_hL1v$)6@sa#`}ry+0hSB+IvV%N zM1Z@%%xEPfic3NWc#czdcemuAV)V18CAB{~U8W2o7(@KI!75vUQ@EeM89jKaweszzYcqv^F`8(R>K^&)QO`sr(u>YtD)dZB7QpWEwa9^G=+8((2)>T7SNDJ!@j#gRCB7tYBcQXi_>@+6Je=ulRaVty zny=I-vkU=$SxzCV=?~i3=;4v}Hu_5#m#_lJdiK}W>^6F0GMg;G%x#OAbeVkQZ=#kS z9uN6hK`6>sCBi!)AQjx7-{22I1CQzZ^-_NQ6?W6Qyq;YWCL(@5!C!<4$x|@exA=~z z?06EDHM*K&o`~VOdjjYU)&mNs`MK5{8_ z1G&TqqXk(?wO}DbHq+awHZ%IUAoogi?6^9)T)`^3z$;s?F%338)&@w~455Efz}}Pk z5S8{cz7=frtbQXVr|LmXP{ZQoa zz1_iQ5rv*39N{OS#)doT>f*y#<;Cg{{QcH{15wQyNsM3mu(pkVtc|09)MLM5of-CU zKWCqN;r?8Jw9Z%Q=f7Y~G6EeWXngtGF>?ZLW^ioI87D~sgrb5Eaj#CO9d;Xej~f#= z7K*v>ak*Khz_sH7C4jzw6h|>1N>Q1XhX*ws5k#pm-V7S>H5@?FmFx&2-E9a3f=Yg0)n{%?fDSosDAo{Yn`jI2dpmXVQT z)YA2QL)W|MPZms3|2sb^X6NTX8hhP;^WH!{kUFV=#Xe@s47p0hdck<``7*CF2JPQ! z^rnaBQ~83y0gJ&0om*QcJ?oOh!yQu8vimf&uNtBkPu07?=qcIU$=(J=&oNEwePFTz zQ#E!3O}u%6mnO;$QZ;442<^UW+4qNj|ATE`Ts2y^dT4z~UABlmiz$}e+014tkOQi^ESjc)>bZ!p|QSZ zvA<)v4#hXO><^!{%~w40vK{SrFz{1L%*K~qmRFVa&O~qcr*&+|ctajTr2Kg{J{#}u z3Ljaf6+L2?Juj)IB3v7Hb_A)LjrNpWu%q&)#;m&B)D5dLd!5!sB5BI$f1hR<_ye_G zO@G8cfBL&W{3pC$vx{HX=W02P$U{Od!m+WQ#l}W_7EQ#1+wSgY*YZ0dYu#)TQc!cC9hENkOCGN1Tcy@RtV*+Y24R_GZd?G|TX(8FDB zlEWbV+{+@kI1Uk!<){<2=jUC>T}R_@*mu=mf9!vxR-Uiz_&20ci8dP}Yrp)@K%zF` z7>yOHjge@pT`*Dy`fGP?Hd8z1_%t7^;KFzT|NC&p-u>l&0U|t`-Lsx#WZdd^&R|MoPn%qgXi=&ZLikO@97}xQ zf8Dww>$w2?{)Xf_l#Se_z1vm0#OSJ>EfqBXS9v|ni$z{w)M3Xkc9Spitej_4M0HJT zCy*+?d|?*t*h*HL_^3IjLo1LBzZ+pS&HB0b?-DwTM`I_hso|$9j0qV~!>9{yuy@rKDn3|RJQ7l&vqV^ zC}{FCX_D99s5leY%9dCou}Nyo&axuR4_UH?(b&feUT40}Mb}uAcq1BpUcJF*NG=A_ zl*FXrg^YNZrX!D79-5Jy zX;C*9?k0XWx^|zQGKOf1Ez3DdPZvi-Yd_hDRlwKZz}cPx88)qHLNa@Z_q4Ct^HEP@ z3{uv8!gx>Hkafvfl(;p2!f4{`xTD$r`JSe<4hLqP4c>v2=RWR%RPd|)1F4pO!lRXc z&`y6&-uLPnj@aouo2&7{9fvkv+FqKDECB|#G%usLs6c(k8po6H1a^y{E`tjA@zE4X zbzy~4Z?dXNFT^9u$Ly9ZI*>yCP_Ih#Y$vl$-+i=Ub3+;xN)-HpE^ilEZi{Q4ar!r| zdy>hU5SD;Ema)eT?Ht{8@8P|#AxZx5SYjef>-r>T5QvpT3 zv-UMSttcsKBt?jL3cFehOqI2tbj*oN+L+ZiX>QCd&srOEvU7U3Y%RjzECL<-&Uea< zx%JJU6A_J>tm{EjzIFW5v-i_CFJBx#o4!AJcJlK5_%vKHfe+(wiIOmfKdy_91s;E` z&NcwYYq|;GV-n)=P-!J%p2TNVB3rVvSkyDkgiWaiX3lgT^eDsQl-rXcfdj+$21vGk zr51$IL^i?G^J>a-UST3voze(dDC_i%r|UB*8SW&#(QelMEESn0HC<;gb#o;NwX!+(~?5O{Xw1x3w*+F|T^2Rwbe+`j){2S`qDo zuITmpGQiPqxTh#?1Rkh-b4io=%`1;Ls=<+caUMGtK*PJ#+&j#Lmc#znU%r26h>RX} zk-r!|`paS-9ZFM(aJh6Jxyu~u9qkyrV}xinc4U%gM2yWb2A4JZtm)be(&I|w<4!%^ zsf=RA#_8*FkbU{Gqx$@w-&ULwS`3N}g6+u=nE@M4-ZyaHAVr>PyGSu&JaWe)eiY7P zyaj~v`9afXwmw0qUHV8q&yIi9qrI$8>;>)b8T@q5^G<7A`L#Ms3F}l96qzz%lGWgz z(xoga>}(Q@Q?myneaCqG`0|A?*_P5cUrhoy`#8XrBRJ@aFKcKcjK4B$G49@&=ApU$WuV-xKGk`Qi%0Yo)`HsfpI zE)JDfy()qUu|nS{^y7x(^Q3-yE&RA^=Er?~TA!&9L(>X&B6fLz3rvEE+;3anX57b5 zTysG(I+)R1@k=+0sijmoeB{-aB;>An-wlMGXmDQ6uB%?O@j18R&$-oq{hxD91x*%L z9iMeshJWsZZfpDi9jhv>(>@ek-3qm>)YUe=FMhp*GB4xZ_-R=WC~*;F^6_e04k zgBO?n+F!3d<4pc$aC_Bt@y{Kx%_?Ai9D2Kg<*T>K5ku_-Dg*)`vgSXWx8i#b@Y8CU z7F>@kVAS#N2nUVQ&_rf`l_9vxr>tM+S6P4<4fuyJl)?N+l_e$R61rRA}lRqR9c zK}=a1cEiw^4xNnbNV{fG16$U@JD{qeIpGJmtq-%K(~!305Lyp^&&H?pUqWCC&(^Uf z;C{5DicIB?Le}8`E&-hCAY`S9k!?kp)43Wk;U+6afmOqF(;YBunSB|WL-I?Cm}YfX z82f7mr?L%t5(Zrnv2cbD(;vam$e^j z*bvke%RDVG_m?mC;)F4n8v}gMGvhb66NKKA=d6pOK!ZQvR!&Jsrm0~&Xf&O~CiNCz zKih)()DEbRiR7agP{(=o8$)47oRetWs~m(MbWhfhe0th{uYoL`z;z??4b_guG4W?m zE3l^`&XYS>%9GPG>7Q}b!!zybWjed;*_9WD~|D2A((XFK_}*nCNS)O9FjObubPD zrG&)BdWRpWONh#*vBuiMGw!Zo)~$V_1~ee?9_YC1aLGR}@ zyH+^m@KniS{7@FD`zka&Sk8ScCLDhT1D18#l(F7*wx}{J8Ll$2iDl%Hvy>>N*PFR@ zy`zFX=mdSiGtjXZ>)y^VidR;I9D(zJIT?NkzffC6M|K>)ShnV9NAjdN&CZb2e0LXn zHz>-_y{Mmac!l}X$Jry{Ymzgd5@I5p1lY8B0J9}8=ivlZ2dlj#JYqvKRo8#=a4%y} zbZKJV#GftmUig=nCtz&x_R26J$r0X~( z&X|Wi5*pUS0yduG_ix!m>_vOw5s2LsmlxhVDpIZD^ScbcE*wg#CS+SUh3}E5mW6idj@}1JX zZBFQb$t;CsH$CHV6VvOuT$^hz>}0FDx)VVe#^Odf`A46$R^!n`1$tzSx%iisB|4(a zO-yRn|3W&S0LCLoi+Rvfl|Dj<2-xfN6mDvMfKUq2oxuejiE=nmu_qLDvv(NrSr0!3 z{opY)98F}`&hwj>XbA!y0q2*82?8N0m-`)IO1T4#g;WYB0!}KkNA|*&VjC^S;nijN z`6nhR@-YajUS&|*)tAu;0wsS_Ibq1wyy`F5Dr~3n#hF0~dZ`plHfKbjXORT)N{PF& zNts2S7fsLWimfLb1`!pJZXX{lZj6^PTCoqKn;+}*WXfARLsv*VxN zPyc#+^3(L^x6_}F-=DmF_iyrrt)2a46ealf)~;HCGx<*Kx_K*EMK#5wl!ps2JJEl}O-+q9p)3QlW^lwP zudd)Ex8+e+K_DB!ycwcAKW6e%=#VhQAd3L#8k*-#Dr2E3uLtOcY4{jEdg4S5C!{Yu zSotcOLsj_1oL`-w|0MNYXm8UW@Slxm+y6obSjSI=J-ulkk?*048%-Eh%f=t3j!B^M2Vo{^jvobOILNhsBuCSDdR7G4=7nO!j>9*_7VkoqI>}i z{@4HbpMF~4tZh2`?C1nNgX<{%9h5T)vNsW%T=cX@7s;OZ z!knAJpUSH&cqX35!_w4N-_Pl%BXx~3zT=%@Om8)Acj}(W!!>kn1E>W!j7wOr(N52)uGxqk$DIR+ZYPe*6?SlIr8q&Z5X zk&rg_MNrG?&;SbF0*v*B$9EW^HFqKI+B_IrYN`%HSE&OP?faKQyVPez`34+1j=>T!&*zGs&d5CS59NsII%TcMp0TY}(Vz>VQ>m7JHe zYgAfm3)8Bs%UKCm5(H377dVCeIWYy7FvvOD|MOr7|BTvmMyxZ8%ijBP__M|=o#^la z4)!&}kkj)FfQeT*EWH@{a?xsgv)-_2>1-DE7ML>Ot8cjyejUu$Wk4?j9N6$4Y~#Lfp~|6n`1suEJ}8E$QMedmh4A<(P2Ximgnm0iHuX2pJ-r#Y;$gAi`BMFmrg>Aul_ zz9~1(Ec#52?}VEXIu@B79AO9B#O!wzBxiQ|L`S~U*(3ep~XM}5gT4AH( zUqF`fDnormx%iZM2(je?*ano;mZ7RSCLyV`(9DzC3$Q$#A-j!K_=*NPP^6;KJ;(=D z6Bygt0HYyqdg-b1dG;aQB2HmPHy-wXO}uy@UI#yU_C=F@(sUWMmB< zZGV3_j3gbS^~CPvfW%WYde_*WRx(=Z56ADbmZUX6z!1@}g9Ds|3(W z0i?LJ-0_!45GI#pG*bKt6DCrB;2kz0c3M7BVz%OTQFlTTc`-H ze8HpQsOA!(pEVwQ#caTLWW^llPh~yp8qcLdaKl3uRb2Q+KCo!&;^0ZdRW|x$mmYm5 zye$XUtHl&IHVY`x(>q?k8yLBvi@XSlnsNhmyXqJRZZR}$nk(Qy_OruCWj8s!)5C~$ z>&@%(B6xdUw{%0tNZf>fNNj5ZOs7<~w1kJ|bVP>m91cdQ2AXLGs%C3ac!;Oez&NHV zIzhm4=IVIQ;T22@pkrt?pH6AuXOt$o2?~hnR!^0N{m4Hf#-~?AmH?LekTQNr4 zS38XTTW6-sVZHna4`;&#EHC`&vI+yfuBs0{3Emz!8G-Ggo{P$VLkX#vIUQ`Fl2q`Y z--ZT^f>{DX3EA7GBKt(Br9=g(!4(za=eMDP!l>O`EnE_WC~+!I_)kTM_T}5qg0CLv zTMP2t2l+z3FqbTP8et?I)1RCg_Ml%%J&}LmpE8aG>p{5dRaxa}?b{3{`ti$@Wwj!y++Sd`(00NQ~uIl$P; zs1|u9yhnTbNimufySqE(B&s3TGQ~3@H+$YtE-w0gEX#fGv2!FTy%Ldm;@X95gbn7Y|?9ciQ~o!nX-M| zdT3Ng7HqAp@0{dz4U6I0-p6Z+p=x29wxwsW{ViHuKZM<%W-;N(uccB}pV^=5cSMl( zkdfIA^Ll(m`B{_&OZkuMY;_yZzmrh2p$(q=8I5RvLzV=*sNtGb;rWWKuk2uDSEOLc zQ`nT5=rW5}`VgY>3+Q20Xr5TF@bk~~wZ{_UU``=#-m{$|;{H#tHdKhb!lQx?<)c-< z`kXWWro0jx!<%%eJ!|!|`9(`M=1s*~3mCb0K3Alw+oX5Icu~&WWqOfSbg{)sJeS8D zt_|mZ>0*Ibeg2tZwGzwvT#30dFP8S5QlzOEO``lKrq8FNB$lE zps5or82Hf`5b?yP)vg*dJHcPl&3=8$*3G(wSke$^*zigsw>++RR)sAdAN|J>eJD*Y z8s}82jQPVQELzjB_Xe|cS%FYRcNRnNwTovt z2Qt|6O?0Q1DH#GK19*5xmr)r48UeSLY#9O>e~M*SyQ0#zJ;RqzulFiFBCKP9Hrbq! z4Jq!m*X&u}7nS2-1~+l`bn1`DQIyY9xbiIC7I1&Tg`Mu1P09wy{_MIgUm<2_vqD1K zxYex53fS1BaTfg5MQkBbUyLk!7}AnSwa=X6!{!hh$v{yoU6V4f{k*$nj_ ze{pbKWx>BQ&oxLZpz(Ab^8Ji`X01$TX@TU^&S>F|3nm^8h0#3!05{RmgJFx7B^5Q2 z#KpQWJsXW~pA`jND$%Ne{IQ;WN^_9(d;!x(So0gZ2^^4DEMx^TxI7Os3Ioo3J>arB zk=K6IYGe^%NNZrTVRYnS-=9t{vw#cpe{B%{X|LY<6T%t5xBL@oXvo%7?$gS$-n{I;iwZZl4Nj*TFB{2 z8xxO!z-b8&)@WVc3+;_5R28t1YpH;pCL8LoS8qf7xbZrZ%@ZbunQh74W?HMi1Hpxk z8F(64lI&XxIuOx&C*gW*XJ1NY5y99Y6Gec~SMU$K+!ke@NoJqv>T&Uh3lyyWls0YV z*%nN*TBz1-4YugwgtaK7g|sBB`R9|s^g}dn)`n`i6en9=6SqNvfbQfu8u;Gr_kh`Z>k1z~b zLs3BiTNXMH;eK>oioP4r$Z4w%)0Cr4syLOSQw~>eN?n4SMx9HtgM|K^J@z8mk)%l| zJ3$|o?U}l1{&?J`p*9vLeB)ka=Y4ztf(ho;4}bGC@g%NgKYZ$&q|Rbl`IMi&k{j`@ z-lTb9V_JDMZTK8%I&}#r1c90w$}Hk#L5A=ZFAXw>u09dDP_6J@*j37^v@Xf&bR$oh zlf5g5Jg>R&het!~_RUyCTiCVJ#4i>ely1WIXwT$I55r7`v8cLNU%9m`qIi*(RpNLV zp?|3b#-dY>qElBfy*%^SjvO9c(PZus?c0S z>SMOZY8W1RWh>10HC{V`-}VZauq|5NFvg3we2IfqpL#0%Nwl5IVNLVxlwQ-+7R;P* zo#>Cx?FtFGNPKIAIMp=5GP8E`ZBT~9DRSxVzZ#l4jwgG%ATM8f z3D<*MY4U2+5G%`dc27XJb2v5c2&^ZJ)x_(AKM{NqC&Tf~V>e&8a003?7VZJNZ86xG zpJ1i!g@i|!&mLUO^M1IeitmMF_a4SY>{RbBF7p==>3;1Iw^)b{I^w25w&+U6gx=Zu z%x`}bJB16#L@Ny?>tGDu4UBDq-;NZXf(`MkNpum*^ANgTu|Z)%%|?a&Z9ZuraGI`0 z7Oz^d=5or)*$&0LW?!(CIxe*+WQ7?`3)3(Hi|bV&pslsgEO=3*w{sz}#?MnN=NSx4 znlu1tk+~FJp?l5cBLtV00lwf?Snlp>=|_Jd220H5uwez^UN8OfMN5o8^z@iuEv3)T z8;f%m1p*_W+=KlGSVt}{`M^FG(c0_cyLvJT|B1S!`hv=C2=2Vn>jTBB$EE}GF44y| z7Z3@h>qpGp^`OQF5}@61yo*8J2j!BvX~0GO@}&IVtz1oO!!Qi}D5F6p5R99YVrg#7o)k|oO@A!XaCZDL2VYRQu0_rA{dRj%!3rd!aoZ3mBWfoao{ z0ubt$`Hqq<1kb=%nAV7fZpfv^E>Ekc5=pvn!q3`+mWYGI*a8k50X|hblDz3p@?IX0 zH(Vy^QGtsQJF@ZCdVl*k20$A6DJ*}jwTg!JQN1{L#5$!e3y(W>&<54$%W51j^!!Q* zj#`^a^iGL#{MEZ#K5<$558IUnsnOdL1pB@Yhi0-&W2cpaMZ@yRGeV2y1CUY{myF1( z^)3JSjyM=ZK4@?zbN#-}$$grwgb#!v wEH-S8mkCWJYXpPq9qCM@kc%1=ovXB0Qq9C5C8xG delta 138207 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�xMgBp)n?^D7t9LI8^}4Y~j8TlNhYghvG*^RAA_tl9`E)v*9Y60mUH(Rr38F<(5ln$wOo08EsX+^Rooxwrg}8c zO>38^Tly(htBUM=BSx5!y#SKZHH^@_b3x(K%0A)|KTYY=e@vGlF7N@7DLHV28vZ3a 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

  • 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 diff --git a/homeassistant/components/frontend/www_static/home-assistant-polymer b/homeassistant/components/frontend/www_static/home-assistant-polymer index abbdc6f055524c..10d09a9408fccf 160000 --- a/homeassistant/components/frontend/www_static/home-assistant-polymer +++ b/homeassistant/components/frontend/www_static/home-assistant-polymer @@ -1 +1 @@ -Subproject commit abbdc6f055524c5d3ed0bb50e35400fed40d573f +Subproject commit 10d09a9408fccf03e989e071ac626e6a06bd125a diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-config.html b/homeassistant/components/frontend/www_static/panels/ha-panel-config.html index 62a9e31885b07e..0dd41d2581b18b 100644 --- a/homeassistant/components/frontend/www_static/panels/ha-panel-config.html +++ b/homeassistant/components/frontend/www_static/panels/ha-panel-config.html @@ -1,4 +1,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-dev-service.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-dev-service.html.gz index c094f8d9fb0fe662c7cee283ca8ec842dfd41a80..408f974b4e50d04807b0c383b7157606b8e73b63 100644 GIT binary patch literal 17941 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 \ No newline at end of file + \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-history.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-history.html.gz index 4d7d1ec9bad4e30fc9190db079a57acc271691a8..d7f2133ac54375cd2f9e0b9465e4d01f85c0eaa4 100644 GIT binary patch delta 11572 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 delta 11550 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 \ No newline at end of file + \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-logbook.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-logbook.html.gz index 728de3ce443a1e49a2582588f5ede6a44dcf7993..23c8ae4b59490d28a524a45c9ed1c6647ef4a52d 100644 GIT binary patch delta 34369 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 R@$zDN_+N`Pw#EYY0RTTxqJ01W delta 34307 zcmV(%K;pl{kOH%i0)HQi2na4=&sYKjXkjgIVQyt?Eo^URVsCG2E@*UZYyiZ)YkS*9 zk}&%H{0a&?(Euh$k#d~Lf`Yk@FFQG#*gm$iv$G6G4@5RaOela0fVLHp?{7a<)%Qk& zk~5io=VB3kzf{+)tEw;7&CTZN#hPWyrx!P@$$E=*R@JOYgCU@4b#hndzvjjD zhpf70O>)=VZdvl?>hEmP#2>TGjwP#Iv1szL2&21-HM^?lHS4@S9O6~pd|x!Bug<5u zSeBm-aZ$ec$f`}Y6@|VllNkXi0mPF-0c9tfN({rysB1ym)zf8a8P&T$gnd z#d2bs65x>i**+IAf_z0?4lnci-G?9OJE(A_1L%ZuoU;`10R^~d!32xbuX{@KCJ*MS zIwb-83F_I>L>R`{(x7TKf!qUJ^ylTxcGs}w`{s7T#L6x6ic#g5s@iBG^`!0hf4mRx z7V$=$a|!Dk6lKAJ^!~xr+f8;mg~R_LzhULB3EjB?4298Qcm?h7N>QTIBf^ob^^g+? zBR;-GS=3FHD(pzYl^Ke__c?$8XAzb2c+&8WuRj&^J!g=;J2)Y~VC=Y@z{K zfO>!r6Ce4D^Ac44s{H((%5;`jCHMg4aM|*^+vHBthRtmfAb*|S8U49q?t?ya4OCrwZK=5#=>!H!l4?9=X$C!f1!FOixw@u z$qT-`TVyl<6NZo}(&F(b+V4kLMl7mbNHoq%9boON>%8Dlp$axbo(u?CHdonA$rA63 z#$vuo?LyyCx-3P2)+&QUMGoq~&yr2U5x1I9E$ZRErQQran$*)&Y?n7qhn{z8K)XsL z=)14-cSgT;D_u8H-`C-Hf1MNP2iwnqz&I{z)U{5y?EZzKtxdg+-8`ROMzvXDjc_2H@kp$Q6>re{7|HcC?x{@sU>3 zT%%rx0{Zw6!4Ft6g5*O?Vyebuk)kwM<)7Iyi0`EdDWLOe$*KXQSP(`>Bp7Y&R75b8 zI5AeagYlHBe0d24UYFHPwn0o!nH~-(irGEo1*03qh4<{nK-@W*Xt-q1=LfwnPIWBk zOCy;0KHe;NHt229`&FW(xsw-JZ4c`r)$|a{)sp6%{zmC<0}0zYt~4B zLdM57kYlX-V(?L%nWgv`2Xe6SrZ1-v#n;Yq2!g7q;HtX-r+}0Cf)5lBW}S*LSA+WE zni8tPbri*$3mQG7Y*IdtY_Pdl(RVgjMNxbog98oKgo5IGe|Z~dabp(MFj)^cchSm4 z*xU?=d7(T&bBZPP@|@0*J3T#l=$V^%aOI>Knyl4Ob5{F(c>fu-j~A?^-I~c~J-j`A zh@&q=1vJC_==q*B3Xs-<9~I{ZlV5 zTJwcSYO&aWL~_U|08La=0Q*@nPnsE<12$L-ggC3FEGg!2{DYFnf6y;u&Rfk^^Fa$B zAaT+~%mX-?P<;+3?0S$5#0iVJi1)v6x~y%UP$$+2e>-Wcy%!C4osiDMX&u1sGiRKu z2ON|K6Smg8I0O|b4Q!ATY6D`xAppJw1vopOICCiY{_ytfg~1lfl+OX0AXEx%5_G{g zCq8zIG~H4lRXjfJi5TFowN?P1%W|GpQe`W9*LI!KsH~KiGFV27L@sjZ5D zOR;L=q@AjqBM1eVlUou=9UPU-uIjLe9*NApN-HrsdXIs#!Kq@fZA^tcTlOy$-ABu%3

    oifX$?k4k5a` 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

    \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html.gz new file mode 100644 index 0000000000000000000000000000000000000000..711692041f33c43684ea86836c5ca13555b77fdc GIT binary patch literal 5936 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 UFyPl+6tKJh7lu8x`ePOV07HZA1ONa4 literal 2513 zcmV;?2`=^@iwFp%Hse?V19N3^c4=c}Uw3bEYh`jSYI6XkSZj0Jx)J>=3a8g0YlLzlMilg29Jfrgd$ZEvg6wR?_H3TELxItJDrR}2qbnFXU{$WYu&)8 z(RD7gHC5|U=)5XN4e0mkB@+vfpX#Eq!MUwLuj_II-gmfZY{%0JDDBOH!3RsWI{ac? z7x&Kn@uekPk3NFN8T@Q(OIhh$<${?XudblfFIiD=CcfL?YUftvHGEh%i|yLRa;6!O6)$oU1^Kg>6mPDxb9G-FOSVETW0%ZLr+i zCFn&Z&#VvcKVDew0+@ulIWy?~y&K!N*2}8Yh~@YKH*1|)Y_%%-jZVHbRcX1uu2D#x z|EHZhvwj0sLp`!i^}XZrO5U9P8D|W>nM{v z%HoVmN|41e63iD$c5(@BB}2=zlq;cBmc*&ZWWaGBQOXiAkh?)>tbi#BSr}0ay?|ya z$bch{lQ@i68mbK}K^iA$G#BXHIF=z*5XB<$1s9ZJWDcY+Wj+qGfXE<5c~X!t6%5f1(~mxy)XrYLP!!nA(;r2h|)On2~s0LMxpGV2|I`Rx?puLjR_z zRE~%L;d(y|Xv8H;P%D^iA#sGEwTQD=r~yRzlFgyPN>j_PON54f#kjwL`YWIJ)-W0d zDUn2wltvOc#o{nPQ!vRxOc>jhb`9J_UR7dxZ^jsV*g5277X~!o5zBbOBuiuJhv>eT zhg4D(kStVKExx#Ik$K0KFteKL@uupGujqJeo!Si)%Bx|XV})u<*o(axuMrhiddqU$ zd|qOVVyp9k)hJP8jeN_n&|+*d$U7ne!-SFHG^KHt19CH$B@G%=>|o9b82 zOr8C7{ss%;wCiiI{$V*UJxnr-5~X_$mRhjK#5p;!AEr-d+HtW1sXn$f)pqV(Q2;B? zp+S%um>uk?YV?CK3FHggGIiO?ar(uFx?1LqdEHdS6=26<-Z^LZEGlk0kDD+(Xu>us zZSCG}+6Te@%sTX@bR1U< zT#z>(P~qnV(z8J3fPCchT-m0(gT9w@I#Zwd(;*qOvo(CW^<7gf;b0%!@2zdAT+?E$ zUbh651BU)F_Mx;6k=bU@^N%=QgH4~d5h>?*)82nGvrOl%@&Yv<`cQk=r`0zH81)RZ zF*MlKU;1C1w*Nn>>sytV8&%yHO?wm*3)U=J47$+&x)b}BizkfcqS{caY0-F#+J-&p zo&g3rJu?QnB|Zp-`h(}(HgObH*Bv82WTayWK(KVa_V;ZSp&Qn%Y0Z9gX=-l%jh3*Scmm z9<~-s`w^Pn6)V=znB*}4uxz6M-Hb4p2x{T%06d3(uZ{0Z_ZC5uxZj)=&6(Ap9f>U@gUEdSUm<5c&oM9jc$p2kKR0RpxyBRI=cCuuRfy>JNlXh?hyi* zYsi3(o13HYQI|~r52hSB)0YSNQ9k8-bHsO?t=R79ir@SZphS_IP5_@QU;YHDmMKG= z&vyzV62gNU(xG?&^BYj6us^#jgS&mMcBBmPulDJo}sT>|n2gBu53 zx9qsb1US=Yc;2^4Y|!S02g9vktvWf`D@XRF^}B7qcxHE9)g4>qcP3XAcl|;0>vdIs zhZ_5;yCo}gWn`HXK1Q+g=RaXXHrRRFl5BIIIk^wB-)=TLx(!#GD~&Grq3_Qdag$XZ+OtrCZt~)Yh+SsXTjO%m-o+ycw;8%uXMK4 zE%T34f3vucXTsBtgToZYA*5A6Bhq+37xIJ^83hdn*H%tiTI%|Kc$8Q9!c8xIv%*F@zccQ2; zx$jMPs2!Lz?&;w?_|7q_c5-f?zFOw~iixtv<{Cr4y0#8od$t{$%ce*b3_5>W{$ Date: Sun, 16 Apr 2017 20:35:52 +0200 Subject: [PATCH 085/146] IKEA Tradfri Gateway: added support for RGB (#7115) * After rebase and all fixes * Added color_rgb_to_hex to util.color * Added test_color_rgb_to_hex * Changed reference to color_rgb_to_hex * Bumped to pytradfri 0.5, having support for retry * Bumped to pytradfri 0.5, having support for retry * Bumped to pytradfri 0.5, having support for retry * Bumped to pytradfri 0.5, having support for retry * Rolled back to 0.4 * Rolled back to 0.4 --- homeassistant/components/light/tradfri.py | 42 ++++++++++++++++------- homeassistant/util/color.py | 5 +++ tests/util/test_color.py | 5 +++ 3 files changed, 39 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/light/tradfri.py b/homeassistant/components/light/tradfri.py index 1b2e42b5b999f6..4a2641dc338405 100644 --- a/homeassistant/components/light/tradfri.py +++ b/homeassistant/components/light/tradfri.py @@ -5,16 +5,16 @@ import voluptuous as vol -# Import the device class from the component that you want to support -from homeassistant.components.light import ATTR_BRIGHTNESS, \ - SUPPORT_BRIGHTNESS, Light, PLATFORM_SCHEMA -from homeassistant.const import CONF_HOST, CONF_API_KEY +import homeassistant.util.color as color_util +from homeassistant.components.light import ( + ATTR_BRIGHTNESS, ATTR_RGB_COLOR, Light, + PLATFORM_SCHEMA, SUPPORT_BRIGHTNESS, SUPPORT_RGB_COLOR) +from homeassistant.const import CONF_API_KEY, CONF_HOST import homeassistant.helpers.config_validation as cv +SUPPORTED_FEATURES = (SUPPORT_BRIGHTNESS | SUPPORT_RGB_COLOR) -SUPPORTED_FEATURES = (SUPPORT_BRIGHTNESS) - -# Home Assistant depends on 3rd party packages for API specific code. +# https://github.com/ggravlingen/pytradfri REQUIREMENTS = ['pytradfri==0.4'] _LOGGER = logging.getLogger(__name__) @@ -31,7 +31,6 @@ def setup_platform(hass, config, add_devices, discovery_info=None): import pytradfri # Assign configuration variables. - # The configuration check takes care they are present. host = config.get(CONF_HOST) securitycode = config.get(CONF_API_KEY) @@ -58,7 +57,9 @@ def __init__(self, light): self._light_control = light.light_control self._light_data = light.light_control.lights[0] self._name = light.name + self._brightness = None + self._rgb_color = None @property def supported_features(self): @@ -80,21 +81,36 @@ def brightness(self): """Brightness of the light (an integer in the range 1-255).""" return self._light_data.dimmer + @property + def rgb_color(self): + """RGB color of the light.""" + return self._rgb_color + def turn_off(self, **kwargs): """Instruct the light to turn off.""" return self._light_control.set_state(False) def turn_on(self, **kwargs): - """Instruct the light to turn on.""" + """ + Instruct the light to turn on. + + After adding "self._light_data.hexcolor is not None" + for ATTR_RGB_COLOR, this also supports Philips Hue bulbs. + """ if ATTR_BRIGHTNESS in kwargs: self._light.light_control.set_dimmer(kwargs.get(ATTR_BRIGHTNESS)) + if ATTR_RGB_COLOR in kwargs and self._light_data.hex_color is not None: + self._light.light_control.set_hex_color( + color_util.color_rgb_to_hex(*kwargs[ATTR_RGB_COLOR])) else: self._light.light_control.set_state(True) def update(self): - """Fetch new state data for this light. - - This is the only method that should fetch new data for Home Assistant. - """ + """Fetch new state data for this light.""" self._light.update() self._brightness = self._light_data.dimmer + + # Handle Hue lights paired with the gatway + if self._light_data.hex_color is not None: + self._rgb_color = color_util.rgb_hex_to_rgb_list( + self._light_data.hex_color) diff --git a/homeassistant/util/color.py b/homeassistant/util/color.py index 52d7a9f63aae98..26a05bbc0bc9e1 100644 --- a/homeassistant/util/color.py +++ b/homeassistant/util/color.py @@ -305,6 +305,11 @@ def color_rgbw_to_rgb(r, g, b, w): return _match_max_scale((r, g, b, w), rgb) +def color_rgb_to_hex(r, g, b): + """Return a RGB color from a hex color string.""" + return '{0:02x}{1:02x}{2:02x}'.format(r, g, b) + + def rgb_hex_to_rgb_list(hex_string): """Return an RGB color value list from a hex color string.""" return [int(hex_string[i:i + len(hex_string) // 3], 16) diff --git a/tests/util/test_color.py b/tests/util/test_color.py index d7560d4f7bf2a5..97e5d0b7927c54 100644 --- a/tests/util/test_color.py +++ b/tests/util/test_color.py @@ -173,6 +173,11 @@ def test_color_rgbw_to_rgb(self): self.assertEqual((127, 127, 127), color_util.color_rgbw_to_rgb(0, 0, 0, 127)) + def test_color_rgb_to_hex(self): + """Test color_rgb_to_hex.""" + self.assertEqual('000000', + color_util.color_rgb_to_hex(0, 0, 0)) + class ColorTemperatureMiredToKelvinTests(unittest.TestCase): """Test color_temperature_mired_to_kelvin.""" From 951af6c76de58329e6419c6e202b59a03dc8d07a Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sun, 16 Apr 2017 14:37:39 -0700 Subject: [PATCH 086/146] Make Tradfri discoverable (#7128) * Make Tradfri discoverable * Fix lint errors * Fix bugs and clean up calls to light_control * Add more color util tests * Add coap client to dockerfile --- .coveragerc | 3 + Dockerfile | 1 + homeassistant/components/configurator.py | 2 +- homeassistant/components/discovery.py | 2 + homeassistant/components/light/tradfri.py | 57 +++------ homeassistant/components/tradfri.py | 141 +++++++++++++++++++++ requirements_all.txt | 2 +- tests/util/test_color.py | 5 +- virtualization/Docker/scripts/coap_client | 14 ++ virtualization/Docker/scripts/openalpr | 2 +- virtualization/Docker/setup_docker_prereqs | 5 + 11 files changed, 188 insertions(+), 46 deletions(-) create mode 100644 homeassistant/components/tradfri.py create mode 100755 virtualization/Docker/scripts/coap_client diff --git a/.coveragerc b/.coveragerc index 2d40ca8b7b3bd9..ae489fd5926387 100644 --- a/.coveragerc +++ b/.coveragerc @@ -97,6 +97,9 @@ omit = homeassistant/components/*/thinkingcleaner.py + homeassistant/components/tradfri.py + homeassistant/components/*/tradfri.py + homeassistant/components/twilio.py homeassistant/components/notify/twilio_sms.py homeassistant/components/notify/twilio_call.py diff --git a/Dockerfile b/Dockerfile index cd219b2408475b..579229d154a610 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,6 +8,7 @@ MAINTAINER Paulus Schoutsen #ENV INSTALL_OPENZWAVE no #ENV INSTALL_LIBCEC no #ENV INSTALL_PHANTOMJS no +#ENV INSTALL_COAP_CLIENT no VOLUME /config diff --git a/homeassistant/components/configurator.py b/homeassistant/components/configurator.py index d912f9914b5872..3376815b9d5d00 100644 --- a/homeassistant/components/configurator.py +++ b/homeassistant/components/configurator.py @@ -180,7 +180,7 @@ def handle_service_call(self, call): # field validation goes here? - callback(call.data.get(ATTR_FIELDS, {})) + self.hass.async_add_job(callback, call.data.get(ATTR_FIELDS, {})) def _generate_unique_id(self): """Generate a unique configurator ID.""" diff --git a/homeassistant/components/discovery.py b/homeassistant/components/discovery.py index 08190ed10024d2..7a18148e51721a 100644 --- a/homeassistant/components/discovery.py +++ b/homeassistant/components/discovery.py @@ -28,11 +28,13 @@ SERVICE_NETGEAR = 'netgear_router' SERVICE_WEMO = 'belkin_wemo' SERVICE_HASS_IOS_APP = 'hass_ios' +SERVICE_IKEA_TRADFRI = 'ikea_tradfri' SERVICE_HANDLERS = { SERVICE_HASS_IOS_APP: ('ios', None), SERVICE_NETGEAR: ('device_tracker', None), SERVICE_WEMO: ('wemo', None), + SERVICE_IKEA_TRADFRI: ('tradfri', None), 'philips_hue': ('light', 'hue'), 'google_cast': ('media_player', 'cast'), 'panasonic_viera': ('media_player', 'panasonic_viera'), diff --git a/homeassistant/components/light/tradfri.py b/homeassistant/components/light/tradfri.py index 4a2641dc338405..277824f4c64218 100644 --- a/homeassistant/components/light/tradfri.py +++ b/homeassistant/components/light/tradfri.py @@ -1,52 +1,29 @@ """Support for the IKEA Tradfri platform.""" -import logging - - -import voluptuous as vol - -import homeassistant.util.color as color_util +from homeassistant.components.tradfri import KEY_GATEWAY from homeassistant.components.light import ( - ATTR_BRIGHTNESS, ATTR_RGB_COLOR, Light, - PLATFORM_SCHEMA, SUPPORT_BRIGHTNESS, SUPPORT_RGB_COLOR) -from homeassistant.const import CONF_API_KEY, CONF_HOST -import homeassistant.helpers.config_validation as cv + ATTR_BRIGHTNESS, SUPPORT_BRIGHTNESS, Light, ATTR_RGB_COLOR, + SUPPORT_RGB_COLOR, PLATFORM_SCHEMA as LIGHT_PLATFORM_SCHEMA) +from homeassistant.util import color as color_util +DEPENDENCIES = ['tradfri'] SUPPORTED_FEATURES = (SUPPORT_BRIGHTNESS | SUPPORT_RGB_COLOR) - -# https://github.com/ggravlingen/pytradfri -REQUIREMENTS = ['pytradfri==0.4'] - -_LOGGER = logging.getLogger(__name__) - -# Validation of the user's configuration -PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ - vol.Required(CONF_HOST): cv.string, - vol.Optional(CONF_API_KEY): cv.string, -}) +PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA def setup_platform(hass, config, add_devices, discovery_info=None): """Setup the IKEA Tradfri Light platform.""" - import pytradfri - - # Assign configuration variables. - host = config.get(CONF_HOST) - securitycode = config.get(CONF_API_KEY) + if discovery_info is None: + return - api = pytradfri.coap_cli.api_factory(host, securitycode) - - gateway = pytradfri.gateway.Gateway(api) + gateway_id = discovery_info['gateway'] + gateway = hass.data[KEY_GATEWAY][gateway_id] devices = gateway.get_devices() lights = [dev for dev in devices if dev.has_light_control] + add_devices(Tradfri(light) for light in lights) - _LOGGER.debug("IKEA Tradfri Hub | init | Initialization Process Complete") - - add_devices(IKEATradfri(light) for light in lights) - _LOGGER.debug("IKEA Tradfri Hub | get_lights | All Lights Loaded") - -class IKEATradfri(Light): +class Tradfri(Light): """The platform class required by hass.""" def __init__(self, light): @@ -57,8 +34,6 @@ def __init__(self, light): self._light_control = light.light_control self._light_data = light.light_control.lights[0] self._name = light.name - - self._brightness = None self._rgb_color = None @property @@ -98,17 +73,17 @@ def turn_on(self, **kwargs): for ATTR_RGB_COLOR, this also supports Philips Hue bulbs. """ if ATTR_BRIGHTNESS in kwargs: - self._light.light_control.set_dimmer(kwargs.get(ATTR_BRIGHTNESS)) + self._light_control.set_dimmer(kwargs[ATTR_BRIGHTNESS]) + else: + self._light_control.set_state(True) + if ATTR_RGB_COLOR in kwargs and self._light_data.hex_color is not None: self._light.light_control.set_hex_color( color_util.color_rgb_to_hex(*kwargs[ATTR_RGB_COLOR])) - else: - self._light.light_control.set_state(True) def update(self): """Fetch new state data for this light.""" self._light.update() - self._brightness = self._light_data.dimmer # Handle Hue lights paired with the gatway if self._light_data.hex_color is not None: diff --git a/homeassistant/components/tradfri.py b/homeassistant/components/tradfri.py new file mode 100644 index 00000000000000..264ac9f42c61af --- /dev/null +++ b/homeassistant/components/tradfri.py @@ -0,0 +1,141 @@ +""" +Support for Ikea Tradfri. + +For more details about this component, please refer to the documentation at +https://home-assistant.io/components/ikea_tradfri/ +""" +import asyncio +import json +import logging +import os + +import voluptuous as vol + +import homeassistant.helpers.config_validation as cv +from homeassistant.helpers import discovery +from homeassistant.const import CONF_HOST, CONF_API_KEY +from homeassistant.loader import get_component +from homeassistant.components.discovery import SERVICE_IKEA_TRADFRI + +DOMAIN = 'tradfri' +CONFIG_FILE = 'tradfri.conf' +KEY_CONFIG = 'tradfri_configuring' +KEY_GATEWAY = 'tradfri_gateway' +REQUIREMENTS = ['pytradfri==0.4'] + +CONFIG_SCHEMA = vol.Schema({ + DOMAIN: vol.Schema({ + vol.Inclusive(CONF_HOST, 'gateway'): cv.string, + vol.Inclusive(CONF_API_KEY, 'gateway'): cv.string, + }) +}, extra=vol.ALLOW_EXTRA) + +_LOGGER = logging.getLogger(__name__) + + +def request_configuration(hass, config, host): + """Request configuration steps from the user.""" + configurator = get_component('configurator') + hass.data.setdefault(KEY_CONFIG, {}) + instance = hass.data[KEY_CONFIG].get(host) + + # Configuration already in progress + if instance: + return + + @asyncio.coroutine + def configuration_callback(callback_data): + """Called when config is submitted.""" + res = yield from _setup_gateway(hass, config, host, + callback_data.get('key')) + if not res: + hass.async_add_job(configurator.notify_errors, instance, + "Unable to connect.") + return + + def success(): + """Set up was successful.""" + conf = _read_config(hass) + conf[host] = {'key': callback_data.get('key')} + _write_config(hass, conf) + hass.async_add_job(configurator.request_done, instance) + + hass.async_add_job(success) + + instance = configurator.request_config( + hass, "IKEA TrĂĄdfri", configuration_callback, + description='Please enter the security code written at the bottom of ' + 'your IKEA TrĂĄdfri Gateway.', + submit_caption="Confirm", + fields=[{'id': 'key', 'name': 'Security Code', 'type': 'password'}] + ) + + +@asyncio.coroutine +def async_setup(hass, config): + """Setup Tradfri.""" + conf = config.get(DOMAIN, {}) + host = conf.get(CONF_HOST) + key = conf.get(CONF_API_KEY) + + @asyncio.coroutine + def gateway_discovered(service, info): + """Called when a gateway is discovered.""" + keys = yield from hass.async_add_job(_read_config, hass) + host = info['host'] + + if host in keys: + yield from _setup_gateway(hass, config, host, keys[host]['key']) + else: + hass.async_add_job(request_configuration, hass, config, host) + + discovery.async_listen(hass, SERVICE_IKEA_TRADFRI, gateway_discovered) + + if host is None: + return True + + return (yield from _setup_gateway(hass, config, host, key)) + + +@asyncio.coroutine +def _setup_gateway(hass, hass_config, host, key): + """Create a gateway.""" + from pytradfri import cli_api_factory, Gateway, RequestError + + try: + api = cli_api_factory(host, key) + except RequestError: + return False + + gateway = Gateway(api) + gateway_id = gateway.get_gateway_info().id + hass.data.setdefault(KEY_GATEWAY, {}) + gateways = hass.data[KEY_GATEWAY] + + # Check if already set up + if gateway_id in gateways: + return True + + gateways[gateway_id] = gateway + hass.async_add_job(discovery.async_load_platform( + hass, 'light', DOMAIN, {'gateway': gateway_id}, hass_config)) + return True + + +def _read_config(hass): + """Read tradfri config.""" + path = hass.config.path(CONFIG_FILE) + + if not os.path.isfile(path): + return {} + + with open(path) as f_handle: + # Guard against empty file + return json.loads(f_handle.read() or '{}') + + +def _write_config(hass, config): + """Write tradfri config.""" + data = json.dumps(config) + with open(hass.config.path(CONFIG_FILE), 'w', encoding='utf-8') as outfile: + outfile.write(data) diff --git a/requirements_all.txt b/requirements_all.txt index f82fbaeaaad790..d8a07866d2c813 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -655,7 +655,7 @@ python-wink==1.2.3 # homeassistant.components.device_tracker.trackr pytrackr==0.0.5 -# homeassistant.components.light.tradfri +# homeassistant.components.tradfri pytradfri==0.4 # homeassistant.components.device_tracker.unifi diff --git a/tests/util/test_color.py b/tests/util/test_color.py index 97e5d0b7927c54..bf2f4e5832f48b 100644 --- a/tests/util/test_color.py +++ b/tests/util/test_color.py @@ -175,8 +175,9 @@ def test_color_rgbw_to_rgb(self): def test_color_rgb_to_hex(self): """Test color_rgb_to_hex.""" - self.assertEqual('000000', - color_util.color_rgb_to_hex(0, 0, 0)) + assert color_util.color_rgb_to_hex(255, 255, 255) == 'ffffff' + assert color_util.color_rgb_to_hex(0, 0, 0) == '000000' + assert color_util.color_rgb_to_hex(51, 153, 255) == '3399ff' class ColorTemperatureMiredToKelvinTests(unittest.TestCase): diff --git a/virtualization/Docker/scripts/coap_client b/virtualization/Docker/scripts/coap_client new file mode 100755 index 00000000000000..bbc5ba0a2c2de8 --- /dev/null +++ b/virtualization/Docker/scripts/coap_client @@ -0,0 +1,14 @@ +#!/bin/sh +# Installs a modified coap client with support for dtls for use with IKEA Tradfri + +# Stop on errors +set -e + +apt-get install -y --no-install-recommends git autoconf automake libtool + +git clone --depth 1 --recursive -b dtls https://github.com/home-assistant/libcoap.git +cd libcoap +./autogen.sh +./configure --disable-documentation --disable-shared +make +make install diff --git a/virtualization/Docker/scripts/openalpr b/virtualization/Docker/scripts/openalpr index ffecc864914604..b8fe8d44338d66 100755 --- a/virtualization/Docker/scripts/openalpr +++ b/virtualization/Docker/scripts/openalpr @@ -12,7 +12,7 @@ PACKAGES=( apt-get install -y --no-install-recommends ${PACKAGES[@]} # Clone the latest code from GitHub -git clone https://github.com/openalpr/openalpr.git /usr/local/src/openalpr +git clone --depth 1 https://github.com/openalpr/openalpr.git /usr/local/src/openalpr # Setup the build directory cd /usr/local/src/openalpr/src diff --git a/virtualization/Docker/setup_docker_prereqs b/virtualization/Docker/setup_docker_prereqs index f2238e43876b2a..69f76e927e2742 100755 --- a/virtualization/Docker/setup_docker_prereqs +++ b/virtualization/Docker/setup_docker_prereqs @@ -10,6 +10,7 @@ INSTALL_FFMPEG="${INSTALL_FFMPEG:-yes}" INSTALL_OPENZWAVE="${INSTALL_OPENZWAVE:-yes}" INSTALL_LIBCEC="${INSTALL_LIBCEC:-yes}" INSTALL_PHANTOMJS="${INSTALL_PHANTOMJS:-yes}" +INSTALL_COAP_CLIENT="${INSTALL_COAP_CLIENT:-yes}" # Required debian packages for running hass or components PACKAGES=( @@ -62,6 +63,10 @@ if [ "$INSTALL_PHANTOMJS" == "yes" ]; then virtualization/Docker/scripts/phantomjs fi +if [ "$INSTALL_COAP_CLIENT" == "yes" ]; then + virtualization/Docker/scripts/coap_client +fi + # Remove packages apt-get remove -y --purge ${PACKAGES_DEV[@]} apt-get -y --purge autoremove From 58dfc1d1b1dcaca08662b558b32ff9adc045ca2a Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Sun, 16 Apr 2017 14:53:03 -0700 Subject: [PATCH 087/146] Make version number optional and a string to fix identify issue introduced in iOS 1.0.1 (#7141) --- homeassistant/components/ios.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/ios.py b/homeassistant/components/ios.py index 22f8b832b3d467..c5ffc34864c0e9 100644 --- a/homeassistant/components/ios.py +++ b/homeassistant/components/ios.py @@ -138,7 +138,7 @@ IDENTIFY_APP_SCHEMA = vol.Schema({ vol.Required(ATTR_APP_BUNDLE_IDENTIFER): cv.string, vol.Required(ATTR_APP_BUILD_NUMBER): cv.positive_int, - vol.Required(ATTR_APP_VERSION_NUMBER): cv.positive_int + vol.Optional(ATTR_APP_VERSION_NUMBER): cv.string }, extra=vol.ALLOW_EXTRA) IDENTIFY_APP_SCHEMA_CONTAINER = vol.All(dict, IDENTIFY_APP_SCHEMA) From 409fd62a7c755e30432da1de213aaa16aa2d4c69 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Sun, 16 Apr 2017 18:06:59 -0400 Subject: [PATCH 088/146] Fix for zwave RGB setting (#7137) --- homeassistant/components/light/zwave.py | 16 +++++----- tests/components/light/test_zwave.py | 42 ++++++++++++------------- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/homeassistant/components/light/zwave.py b/homeassistant/components/light/zwave.py index 45660474fde704..ce85276cae9359 100644 --- a/homeassistant/components/light/zwave.py +++ b/homeassistant/components/light/zwave.py @@ -310,25 +310,25 @@ def turn_on(self, **kwargs): if self._zw098: if kwargs[ATTR_COLOR_TEMP] > TEMP_MID_HASS: self._ct = TEMP_WARM_HASS - rgbw = b'#000000ff00' + rgbw = '#000000ff00' else: self._ct = TEMP_COLD_HASS - rgbw = b'#00000000ff' + rgbw = '#00000000ff' elif ATTR_RGB_COLOR in kwargs: self._rgb = kwargs[ATTR_RGB_COLOR] if (not self._zw098 and ( self._color_channels & COLOR_CHANNEL_WARM_WHITE or self._color_channels & COLOR_CHANNEL_COLD_WHITE)): - rgbw = b'#' + rgbw = '#' for colorval in color_rgb_to_rgbw(*self._rgb): - rgbw += format(colorval, '02x').encode('utf-8') - rgbw += b'00' + rgbw += format(colorval, '02x') + rgbw += '00' else: - rgbw = b'#' + rgbw = '#' for colorval in self._rgb: - rgbw += format(colorval, '02x').encode('utf-8') - rgbw += b'0000' + rgbw += format(colorval, '02x') + rgbw += '0000' if rgbw and self.values.color: self.values.color.data = rgbw diff --git a/tests/components/light/test_zwave.py b/tests/components/light/test_zwave.py index 0afe9ec8f6ac00..9629744bc16aac 100644 --- a/tests/components/light/test_zwave.py +++ b/tests/components/light/test_zwave.py @@ -207,36 +207,36 @@ def test_set_rgb_color(mock_openzwave): """Test setting zwave light color.""" node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts RGB only color_channels = MockValue(data=0x1c, node=node) values = MockLightValues(primary=value, color=color, color_channels=color_channels) device = zwave.get_device(node=node, values=values, node_config={}) - assert color.data == b'#0000000000' + assert color.data == '#0000000000' device.turn_on(**{ATTR_RGB_COLOR: (200, 150, 100)}) - assert color.data == b'#c896640000' + assert color.data == '#c896640000' def test_set_rgbw_color(mock_openzwave): """Test setting zwave light color.""" node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts RGBW color_channels = MockValue(data=0x1d, node=node) values = MockLightValues(primary=value, color=color, color_channels=color_channels) device = zwave.get_device(node=node, values=values, node_config={}) - assert color.data == b'#0000000000' + assert color.data == '#0000000000' device.turn_on(**{ATTR_RGB_COLOR: (200, 150, 100)}) - assert color.data == b'#c86400c800' + assert color.data == '#c86400c800' def test_zw098_set_color_temp(mock_openzwave): @@ -244,29 +244,29 @@ def test_zw098_set_color_temp(mock_openzwave): node = MockNode(manufacturer_id='0086', product_id='0062', command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts RGB, warm white, cold white color_channels = MockValue(data=0x1f, node=node) values = MockLightValues(primary=value, color=color, color_channels=color_channels) device = zwave.get_device(node=node, values=values, node_config={}) - assert color.data == b'#0000000000' + assert color.data == '#0000000000' device.turn_on(**{ATTR_COLOR_TEMP: 200}) - assert color.data == b'#00000000ff' + assert color.data == '#00000000ff' device.turn_on(**{ATTR_COLOR_TEMP: 400}) - assert color.data == b'#000000ff00' + assert color.data == '#000000ff00' def test_rgb_not_supported(mock_openzwave): """Test value changed for rgb lights.""" node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts color temperature only color_channels = MockValue(data=0x01, node=node) values = MockLightValues(primary=value, color=color, @@ -290,7 +290,7 @@ def test_no_color_channels_value(mock_openzwave): """Test value changed for rgb lights.""" node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) values = MockLightValues(primary=value, color=color) device = zwave.get_device(node=node, values=values, node_config={}) @@ -301,7 +301,7 @@ def test_rgb_value_changed(mock_openzwave): """Test value changed for rgb lights.""" node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts RGB only color_channels = MockValue(data=0x1c, node=node) values = MockLightValues(primary=value, color=color, @@ -310,7 +310,7 @@ def test_rgb_value_changed(mock_openzwave): assert device.rgb_color == [0, 0, 0] - color.data = b'#c896640000' + color.data = '#c896640000' value_changed(color) assert device.rgb_color == [200, 150, 100] @@ -320,7 +320,7 @@ def test_rgbww_value_changed(mock_openzwave): """Test value changed for rgb lights.""" node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts RGB, Warm White color_channels = MockValue(data=0x1d, node=node) values = MockLightValues(primary=value, color=color, @@ -329,7 +329,7 @@ def test_rgbww_value_changed(mock_openzwave): assert device.rgb_color == [0, 0, 0] - color.data = b'#c86400c800' + color.data = '#c86400c800' value_changed(color) assert device.rgb_color == [200, 150, 100] @@ -339,7 +339,7 @@ def test_rgbcw_value_changed(mock_openzwave): """Test value changed for rgb lights.""" node = MockNode(command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts RGB, Cold White color_channels = MockValue(data=0x1e, node=node) values = MockLightValues(primary=value, color=color, @@ -348,7 +348,7 @@ def test_rgbcw_value_changed(mock_openzwave): assert device.rgb_color == [0, 0, 0] - color.data = b'#c86400c800' + color.data = '#c86400c800' value_changed(color) assert device.rgb_color == [200, 150, 100] @@ -359,7 +359,7 @@ def test_ct_value_changed(mock_openzwave): node = MockNode(manufacturer_id='0086', product_id='0062', command_classes=[const.COMMAND_CLASS_SWITCH_COLOR]) value = MockValue(data=0, node=node) - color = MockValue(data=b'#0000000000', node=node) + color = MockValue(data='#0000000000', node=node) # Suppoorts RGB, Cold White color_channels = MockValue(data=0x1f, node=node) values = MockLightValues(primary=value, color=color, @@ -368,12 +368,12 @@ def test_ct_value_changed(mock_openzwave): assert device.color_temp == zwave.TEMP_MID_HASS - color.data = b'#000000ff00' + color.data = '#000000ff00' value_changed(color) assert device.color_temp == zwave.TEMP_WARM_HASS - color.data = b'#00000000ff' + color.data = '#00000000ff' value_changed(color) assert device.color_temp == zwave.TEMP_COLD_HASS From 1ce2b6357a456d88a3a7ad835afb2e8c69dc4569 Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Sun, 16 Apr 2017 15:27:03 -0700 Subject: [PATCH 089/146] Replace rollershutter with cover in demo (#7140) --- homeassistant/components/demo.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/demo.py b/homeassistant/components/demo.py index e03cb72ea4466d..6212567f3d7f05 100644 --- a/homeassistant/components/demo.py +++ b/homeassistant/components/demo.py @@ -159,13 +159,13 @@ def async_setup(hass, config): tasks2.append(group.Group.async_create_group(hass, 'living room', [ lights[1], switches[0], 'input_select.living_room_preset', - 'rollershutter.living_room_window', media_players[1], + 'cover.living_room_window', media_players[1], 'scene.romantic_lights'])) tasks2.append(group.Group.async_create_group(hass, 'bedroom', [ lights[0], switches[1], media_players[0], 'input_slider.noise_allowance'])) tasks2.append(group.Group.async_create_group(hass, 'kitchen', [ - lights[2], 'rollershutter.kitchen_window', 'lock.kitchen_door'])) + lights[2], 'cover.kitchen_window', 'lock.kitchen_door'])) tasks2.append(group.Group.async_create_group(hass, 'doors', [ 'lock.front_door', 'lock.kitchen_door', 'garage_door.right_garage_door', 'garage_door.left_garage_door'])) @@ -176,8 +176,8 @@ def async_setup(hass, config): 'device_tracker.demo_paulus'])) tasks2.append(group.Group.async_create_group(hass, 'downstairs', [ 'group.living_room', 'group.kitchen', - 'scene.romantic_lights', 'rollershutter.kitchen_window', - 'rollershutter.living_room_window', 'group.doors', + 'scene.romantic_lights', 'cover.kitchen_window', + 'cover.living_room_window', 'group.doors', 'thermostat.ecobee', ], view=True)) From 37f959eb02cc83e423ded42252726cd2d2f88110 Mon Sep 17 00:00:00 2001 From: Adam Mills Date: Sun, 16 Apr 2017 18:45:40 -0400 Subject: [PATCH 090/146] Add debug logging to automation initial state (#7068) --- homeassistant/components/automation/__init__.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/automation/__init__.py b/homeassistant/components/automation/__init__.py index 66c7c763cc9863..5c3d944aad4518 100644 --- a/homeassistant/components/automation/__init__.py +++ b/homeassistant/components/automation/__init__.py @@ -263,15 +263,23 @@ def is_on(self) -> bool: @asyncio.coroutine def async_added_to_hass(self) -> None: """Startup with initial state or previous state.""" - enable_automation = DEFAULT_INITIAL_STATE - if self._initial_state is not None: enable_automation = self._initial_state + _LOGGER.debug("Automation %s initial state %s from config " + "initial_state", self.entity_id, enable_automation) else: state = yield from async_get_last_state(self.hass, self.entity_id) if state: enable_automation = state.state == STATE_ON self._last_triggered = state.attributes.get('last_triggered') + _LOGGER.debug("Automation %s initial state %s from recorder " + "last state %s", self.entity_id, + enable_automation, state) + else: + enable_automation = DEFAULT_INITIAL_STATE + _LOGGER.debug("Automation %s initial state %s from default " + "initial state", self.entity_id, + enable_automation) if not enable_automation: return From 5fa8037231d30937144d8f3b3006a58f69210f8b Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Mon, 17 Apr 2017 01:36:15 +0200 Subject: [PATCH 091/146] Always return True/False from is_state and is_state_attr (#7138) * Always return True/False from is_state and is_state_attr These functions are documented to always return True/False but the short-circuit evaluation would return None if the entity_id did not exist. * Reword into a single statement --- homeassistant/core.py | 5 +++-- tests/helpers/test_template.py | 10 ++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/homeassistant/core.py b/homeassistant/core.py index 320e857ac9e537..a467cf28e5171f 100644 --- a/homeassistant/core.py +++ b/homeassistant/core.py @@ -648,7 +648,7 @@ def is_state(self, entity_id, state): Async friendly. """ state_obj = self.get(entity_id) - return state_obj and state_obj.state == state + return state_obj is not None and state_obj.state == state def is_state_attr(self, entity_id, name, value): """Test if entity exists and has a state attribute set to value. @@ -656,7 +656,8 @@ def is_state_attr(self, entity_id, name, value): Async friendly. """ state_obj = self.get(entity_id) - return state_obj and state_obj.attributes.get(name, None) == value + return state_obj is not None and \ + state_obj.attributes.get(name, None) == value def remove(self, entity_id): """Remove the state of an entity. diff --git a/tests/helpers/test_template.py b/tests/helpers/test_template.py index b6951172c64dce..71075124f32e5e 100644 --- a/tests/helpers/test_template.py +++ b/tests/helpers/test_template.py @@ -314,6 +314,11 @@ def test_is_state(self): """, self.hass) self.assertEqual('yes', tpl.render()) + tpl = template.Template(""" +{{ is_state("test.noobject", "available") }} + """, self.hass) + self.assertEqual('False', tpl.render()) + def test_is_state_attr(self): """Test is_state_attr method.""" self.hass.states.set('test.object', 'available', {'mode': 'on'}) @@ -322,6 +327,11 @@ def test_is_state_attr(self): """, self.hass) self.assertEqual('yes', tpl.render()) + tpl = template.Template(""" +{{ is_state_attr("test.noobject", "mode", "on") }} + """, self.hass) + self.assertEqual('False', tpl.render()) + def test_states_function(self): """Test using states as a function.""" self.hass.states.set('test.object', 'available') From 103377bdb05bc7b67f6f05cfc9e8828607f84a7f Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Mon, 17 Apr 2017 01:40:12 +0200 Subject: [PATCH 092/146] Add LIFX Cloud scene support (#7124) This uses the LIFX HTTP API to list and activate the scenes that are stored in the LIFX cloud by the native LIFX smartphone apps. --- .coveragerc | 1 + homeassistant/components/scene/lifx_cloud.py | 97 ++++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 homeassistant/components/scene/lifx_cloud.py diff --git a/.coveragerc b/.coveragerc index ae489fd5926387..43aa685fcc48af 100644 --- a/.coveragerc +++ b/.coveragerc @@ -321,6 +321,7 @@ omit = homeassistant/components/remote/harmony.py homeassistant/components/remote/itach.py homeassistant/components/scene/hunterdouglas_powerview.py + homeassistant/components/scene/lifx_cloud.py homeassistant/components/sensor/amcrest.py homeassistant/components/sensor/arest.py homeassistant/components/sensor/arwn.py diff --git a/homeassistant/components/scene/lifx_cloud.py b/homeassistant/components/scene/lifx_cloud.py new file mode 100644 index 00000000000000..f600510d4066d3 --- /dev/null +++ b/homeassistant/components/scene/lifx_cloud.py @@ -0,0 +1,97 @@ +""" +Support for LIFX Cloud scenes. + +For more details about this component, please refer to the documentation at +https://home-assistant.io/components/scene.lifx_cloud/ +""" +import asyncio +import logging + +import voluptuous as vol + +import aiohttp +import async_timeout + +from homeassistant.components.scene import Scene +from homeassistant.const import (CONF_PLATFORM, CONF_TOKEN, CONF_TIMEOUT) +import homeassistant.helpers.config_validation as cv +from homeassistant.helpers.aiohttp_client import (async_get_clientsession) + +_LOGGER = logging.getLogger(__name__) + +LIFX_API_URL = 'https://api.lifx.com/v1/{0}' +DEFAULT_TIMEOUT = 10 + +PLATFORM_SCHEMA = vol.Schema({ + vol.Required(CONF_PLATFORM): 'lifx_cloud', + vol.Required(CONF_TOKEN): cv.string, + vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, +}) + + +# pylint: disable=unused-argument +@asyncio.coroutine +def async_setup_platform(hass, config, async_add_devices, discovery_info=None): + """Setup the scenes stored in the LIFX Cloud.""" + token = config.get(CONF_TOKEN) + timeout = config.get(CONF_TIMEOUT) + + headers = { + "Authorization": "Bearer %s" % token, + } + + url = LIFX_API_URL.format('scenes') + + try: + httpsession = async_get_clientsession(hass) + with async_timeout.timeout(timeout, loop=hass.loop): + scenes_resp = yield from httpsession.get(url, headers=headers) + + except (asyncio.TimeoutError, aiohttp.ClientError): + _LOGGER.exception("Error on %s", url) + return False + + status = scenes_resp.status + if status == 200: + data = yield from scenes_resp.json() + devices = [] + for scene in data: + devices.append(LifxCloudScene(hass, headers, timeout, scene)) + async_add_devices(devices) + return True + elif status == 401: + _LOGGER.error("Unauthorized (bad token?) on %s", url) + return False + else: + _LOGGER.error("HTTP error %d on %s", scenes_resp.status, url) + return False + + +class LifxCloudScene(Scene): + """Representation of a LIFX Cloud scene.""" + + def __init__(self, hass, headers, timeout, scene_data): + """Initialize the scene.""" + self.hass = hass + self._headers = headers + self._timeout = timeout + self._name = scene_data["name"] + self._uuid = scene_data["uuid"] + + @property + def name(self): + """Return the name of the scene.""" + return self._name + + @asyncio.coroutine + def async_activate(self): + """Activate the scene.""" + url = LIFX_API_URL.format('scenes/scene_id:%s/activate' % self._uuid) + + try: + httpsession = async_get_clientsession(self.hass) + with async_timeout.timeout(self._timeout, loop=self.hass.loop): + yield from httpsession.put(url, headers=self._headers) + + except (asyncio.TimeoutError, aiohttp.ClientError): + _LOGGER.exception("Error on %s", url) From d4b05a6a852678b4291f400da7a33cdd49b639bd Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Mon, 17 Apr 2017 02:40:22 +0200 Subject: [PATCH 093/146] Fix LIFX lights with disappearing names (#7119) * Cache the name of LIFX lights After #7031 the LIFX device will change during an unregister/register transition. This has the user-visible effect of the new device missing a friendly name until the next poll. We now cache the name internally and it will then transfer to the new device when it registers. * Allow LIFX logging even without an available device This will allow us to set the device to None when it unregisters. * Calculate LIFX availability from the existence of a device This has become possible because the device is no longer needed to provide the name of the light when it is unavailable. We just have to forget the device when it unregisters. --- homeassistant/components/light/lifx.py | 34 ++++++++++++-------------- 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/homeassistant/components/light/lifx.py b/homeassistant/components/light/lifx.py index da09601c1bb01b..945c163435b36e 100644 --- a/homeassistant/components/light/lifx.py +++ b/homeassistant/components/light/lifx.py @@ -82,9 +82,8 @@ def register(self, device): """Callback for newly detected bulb.""" if device.mac_addr in self.entities: entity = self.entities[device.mac_addr] - _LOGGER.debug("%s register AGAIN", entity.ipaddr) - entity.available = True entity.device = device + _LOGGER.debug("%s register AGAIN", entity.who) self.hass.async_add_job(entity.async_update_ha_state()) else: _LOGGER.debug("%s register NEW", device.ip_addr) @@ -94,7 +93,7 @@ def register(self, device): def ready(self, device, msg): """Callback that adds the device once all data is retrieved.""" entity = LIFXLight(device) - _LOGGER.debug("%s register READY", entity.ipaddr) + _LOGGER.debug("%s register READY", entity.who) self.entities[device.mac_addr] = entity self.async_add_devices([entity]) @@ -103,8 +102,8 @@ def unregister(self, device): """Callback for disappearing bulb.""" if device.mac_addr in self.entities: entity = self.entities[device.mac_addr] - _LOGGER.debug("%s unregister", entity.ipaddr) - entity.available = False + _LOGGER.debug("%s unregister", entity.who) + entity.device = None entity.updated_event.set() self.hass.async_add_job(entity.async_update_ha_state()) @@ -129,29 +128,27 @@ def __init__(self, device): self.updated_event = asyncio.Event() self.blocker = None self.postponed_update = None - self._available = True + self._name = device.label self.set_power(device.power_level) self.set_color(*device.color) @property def available(self): """Return the availability of the device.""" - return self._available - - @available.setter - def available(self, value): - """Set the availability of the device.""" - self._available = value + return self.device is not None @property def name(self): """Return the name of the device.""" - return self.device.label + return self._name @property - def ipaddr(self): - """Return the IP address of the device.""" - return self.device.ip_addr[0] + def who(self): + """Return a string identifying the device.""" + if self.device: + return self.device.ip_addr[0] + else: + return "(%s)" % self.name @property def rgb_color(self): @@ -247,7 +244,7 @@ def async_turn_on(self, **kwargs): hsbk = [hue, saturation, brightness, kelvin] _LOGGER.debug("turn_on: %s (%d) %d %d %d %d %d", - self.ipaddr, self._power, fade, *hsbk) + self.who, self._power, fade, *hsbk) if self._power == 0: if changed_color: @@ -282,12 +279,13 @@ def got_color(self, device, msg): """Callback that gets current power/color status.""" self.set_power(device.power_level) self.set_color(*device.color) + self._name = device.label self.updated_event.set() @asyncio.coroutine def async_update(self): """Update bulb status (if it is available).""" - _LOGGER.debug("%s async_update", self.ipaddr) + _LOGGER.debug("%s async_update", self.who) if self.available and self.blocker is None: self.updated_event.clear() self.device.get_color(self.got_color) From 9ed4ed2e475d70dbc84851bf910b747cd551d008 Mon Sep 17 00:00:00 2001 From: thecynic Date: Mon, 17 Apr 2017 14:04:44 -0700 Subject: [PATCH 094/146] lutron: fix typo that prevented callback registration (#7148) --- homeassistant/components/lutron.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/lutron.py b/homeassistant/components/lutron.py index d5e889027d1aab..3bd1682bc41662 100644 --- a/homeassistant/components/lutron.py +++ b/homeassistant/components/lutron.py @@ -58,7 +58,7 @@ def __init__(self, area_name, lutron_device, controller): self._area_name = area_name @asyncio.coroutine - def async_add_to_hass(self): + def async_added_to_hass(self): """Register callbacks.""" self.hass.async_add_job( self._controller.subscribe, self._lutron_device, From cec39077ba781d95dd695e306378d1250389fe91 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Tue, 18 Apr 2017 00:25:50 +0200 Subject: [PATCH 095/146] Fix HassIO timeout bug (#7155) * Fix HassIO timeout bug * fix lint * Add long polling timeout to stop event --- homeassistant/components/hassio.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/hassio.py b/homeassistant/components/hassio.py index 154be0917bbe40..25da7a67f4b19e 100644 --- a/homeassistant/components/hassio.py +++ b/homeassistant/components/hassio.py @@ -131,7 +131,8 @@ def async_service_handler(service): elif service.service == SERVICE_ADDON_START: yield from hassio.send_command("/addons/{}/start".format(addon)) elif service.service == SERVICE_ADDON_STOP: - yield from hassio.send_command("/addons/{}/stop".format(addon)) + yield from hassio.send_command( + "/addons/{}/stop".format(addon), timeout=LONG_TASK_TIMEOUT) elif service.service == SERVICE_ADDON_UPDATE: yield from hassio.send_command( "/addons/{}/update".format(addon), payload=version, @@ -168,8 +169,10 @@ def is_connected(self): @asyncio.coroutine def send_command(self, cmd, payload=None, timeout=DEFAULT_TIMEOUT): """Send request to API.""" - answer = yield from self.send_raw(cmd, payload=payload) - if answer['result'] == 'ok': + answer = yield from self.send_raw( + cmd, payload=payload, timeout=timeout + ) + if answer and answer['result'] == 'ok': return answer['data'] if answer['data'] else True _LOGGER.error("%s return error %s.", cmd, answer['message']) From 919bb08d02ec30ae3cca0e68b1c7eb0104fb1f25 Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Mon, 17 Apr 2017 22:51:06 -0700 Subject: [PATCH 096/146] Fix iOS icon calculation to return mdi:battery for levels above 95 --- homeassistant/components/sensor/ios.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/sensor/ios.py b/homeassistant/components/sensor/ios.py index ba963e44b6ce65..5f5f4ba0cf096a 100644 --- a/homeassistant/components/sensor/ios.py +++ b/homeassistant/components/sensor/ios.py @@ -96,7 +96,7 @@ def icon(self): elif battery_state == ios.ATTR_BATTERY_STATE_UNPLUGGED: if rounded_level < 10: returning_icon = "{}-outline".format(DEFAULT_ICON) - elif battery_level == 100: + elif battery_level > 95: returning_icon = DEFAULT_ICON else: returning_icon = "{}-{}".format(DEFAULT_ICON, From b7141901f63bfe3f0826e8c12b704bdae8469c82 Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Mon, 17 Apr 2017 22:58:04 -0700 Subject: [PATCH 097/146] Change iOS sensor unique ID to use the device ID --- homeassistant/components/sensor/ios.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/sensor/ios.py b/homeassistant/components/sensor/ios.py index 5f5f4ba0cf096a..35f03d7a1c1545 100644 --- a/homeassistant/components/sensor/ios.py +++ b/homeassistant/components/sensor/ios.py @@ -56,7 +56,8 @@ def state(self): @property def unique_id(self): """Return the unique ID of this sensor.""" - return "sensor_ios_battery_{}_{}".format(self.type, self._device_name) + device_id = self._device[ios.ATTR_DEVICE_ID] + return "sensor_ios_battery_{}_{}".format(self.type, device_id) @property def unit_of_measurement(self): From 9c0171ec5ee5300a5f7bc05f3ba5fe9550ecfbb5 Mon Sep 17 00:00:00 2001 From: Robbie Trencheny Date: Mon, 17 Apr 2017 23:31:50 -0700 Subject: [PATCH 098/146] Track device last identify time --- homeassistant/components/ios.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/ios.py b/homeassistant/components/ios.py index c5ffc34864c0e9..bac5bb59d96310 100644 --- a/homeassistant/components/ios.py +++ b/homeassistant/components/ios.py @@ -8,6 +8,7 @@ import os import json import logging +import datetime import voluptuous as vol from voluptuous.humanize import humanize_error @@ -20,6 +21,8 @@ from homeassistant.components.http import HomeAssistantView +from homeassistant.remote import JSONEncoder + from homeassistant.const import (HTTP_INTERNAL_SERVER_ERROR, HTTP_BAD_REQUEST) @@ -55,6 +58,8 @@ BEHAVIORS = [ATTR_DEFAULT_BEHAVIOR, ATTR_TEXT_INPUT_BEHAVIOR] +ATTR_LAST_SEEN_AT = "lastSeenAt" + ATTR_DEVICE = "device" ATTR_PUSH_TOKEN = "pushToken" ATTR_APP = "app" @@ -192,7 +197,7 @@ def _save_config(filename, config): """Save configuration.""" try: with open(filename, "w") as fdesc: - fdesc.write(json.dumps(config)) + fdesc.write(json.dumps(config, cls=JSONEncoder)) except (IOError, TypeError) as error: _LOGGER.error("Saving config file failed: %s", error) return False @@ -285,7 +290,7 @@ def post(self, request): try: req_data = yield from request.json() except ValueError: - return self.json_message('Invalid JSON', HTTP_BAD_REQUEST) + return self.json_message("Invalid JSON", HTTP_BAD_REQUEST) try: data = IDENTIFY_SCHEMA(req_data) @@ -293,6 +298,8 @@ def post(self, request): return self.json_message(humanize_error(request.json, ex), HTTP_BAD_REQUEST) + data[ATTR_LAST_SEEN_AT] = datetime.datetime.now() + name = data.get(ATTR_DEVICE_ID) CONFIG_FILE[ATTR_DEVICES][name] = data From 43799b8fee5cf5a8094d65999712049b67a41380 Mon Sep 17 00:00:00 2001 From: Kevin Date: Tue, 18 Apr 2017 11:46:18 +0200 Subject: [PATCH 099/146] small fix for random effect in order to use the whole rgb range. So 255 is not excluded anymore. (#7156) --- homeassistant/components/light/flux_led.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/light/flux_led.py b/homeassistant/components/light/flux_led.py index f599d788994bfd..f39ef3881a6ba9 100644 --- a/homeassistant/components/light/flux_led.py +++ b/homeassistant/components/light/flux_led.py @@ -216,9 +216,9 @@ def turn_on(self, **kwargs): (red, green, blue) = self._bulb.getRgb() self._bulb.setRgb(red, green, blue, brightness=brightness) elif effect == EFFECT_RANDOM: - self._bulb.setRgb(random.randrange(0, 255), - random.randrange(0, 255), - random.randrange(0, 255)) + self._bulb.setRgb(random.randint(0, 255), + random.randint(0, 255), + random.randint(0, 255)) elif effect == EFFECT_COLORLOOP: self._bulb.setPresetPattern(0x25, 50) elif effect == EFFECT_RED_FADE: From 226066eafd02063acbc04ea758568d3cd255b0f4 Mon Sep 17 00:00:00 2001 From: Mike Megally Date: Tue, 18 Apr 2017 02:50:43 -0700 Subject: [PATCH 100/146] exposed content_type in rest_command (#7101) * exposed content_type in rest_command, which allows for manually specifying the content_type for more-strict api endpoints * fixed up column length Length was 86 chars, and it needed to be 79 * double import of HTTP_HEADER_CONTENT_TYPE Removed the accidental double-import of HTTP_HEADER_CONTENT_TYPE * moved rest_command-specific config value into component * if no content_type, default to None * unit test * newline * unused CONTENT_TYPE_TEXT_PLAIN * removed the http-agnostic abstraction hass provided in favor of aiohttps hdrs constant --- homeassistant/components/rest_command.py | 12 +++++++++++- tests/components/test_rest_command.py | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/rest_command.py b/homeassistant/components/rest_command.py index 7084339ab420c7..5bf629ed37f7f0 100644 --- a/homeassistant/components/rest_command.py +++ b/homeassistant/components/rest_command.py @@ -8,6 +8,7 @@ import logging import aiohttp +from aiohttp import hdrs import async_timeout import voluptuous as vol @@ -31,6 +32,8 @@ 'delete', ] +CONF_CONTENT_TYPE = 'content_type' + COMMAND_SCHEMA = vol.Schema({ vol.Required(CONF_URL): cv.template, vol.Optional(CONF_METHOD, default=DEFAULT_METHOD): @@ -39,6 +42,7 @@ vol.Inclusive(CONF_PASSWORD, 'authentication'): cv.string, vol.Optional(CONF_PAYLOAD): cv.template, vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): vol.Coerce(int), + vol.Optional(CONF_CONTENT_TYPE): cv.string }) CONFIG_SCHEMA = vol.Schema({ @@ -72,6 +76,11 @@ def async_register_rest_command(name, command_config): template_payload = command_config[CONF_PAYLOAD] template_payload.hass = hass + headers = None + if CONF_CONTENT_TYPE in command_config: + content_type = command_config[CONF_CONTENT_TYPE] + headers = {hdrs.CONTENT_TYPE: content_type} + @asyncio.coroutine def async_service_handler(service): """Execute a shell command service.""" @@ -86,7 +95,8 @@ def async_service_handler(service): request = yield from getattr(websession, method)( template_url.async_render(variables=service.data), data=payload, - auth=auth + auth=auth, + headers=headers ) if request.status < 400: diff --git a/tests/components/test_rest_command.py b/tests/components/test_rest_command.py index 0648a30c922506..9dbea53cd6480d 100644 --- a/tests/components/test_rest_command.py +++ b/tests/components/test_rest_command.py @@ -221,3 +221,22 @@ def test_rest_command_put(self, aioclient_mock): assert len(aioclient_mock.mock_calls) == 1 assert aioclient_mock.mock_calls[0][2] == b'data' + + def test_rest_command_content_type(self, aioclient_mock): + """Call a rest command with a content type.""" + data = { + 'payload': 'item', + 'content_type': 'text/plain' + } + self.config[rc.DOMAIN]['post_test'].update(data) + + with assert_setup_component(4): + setup_component(self.hass, rc.DOMAIN, self.config) + + aioclient_mock.post(self.url, content=b'success') + + self.hass.services.call(rc.DOMAIN, 'post_test', {}) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 1 + assert aioclient_mock.mock_calls[0][2] == b'item' From 1925748f614240d8db23abf6cd387f208cbeae9e Mon Sep 17 00:00:00 2001 From: Greg Dowling Date: Tue, 18 Apr 2017 11:01:23 +0100 Subject: [PATCH 101/146] Add vera power meter. (#7134) * Add vera power meter. * Use W for power. --- homeassistant/components/sensor/vera.py | 6 ++++++ homeassistant/components/vera.py | 7 ++++++- requirements_all.txt | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/vera.py b/homeassistant/components/sensor/vera.py index 81f69001f82c6d..e0fa16d790737c 100644 --- a/homeassistant/components/sensor/vera.py +++ b/homeassistant/components/sensor/vera.py @@ -10,6 +10,7 @@ TEMP_CELSIUS, TEMP_FAHRENHEIT) from homeassistant.helpers.entity import Entity from homeassistant.components.sensor import ENTITY_ID_FORMAT +from homeassistant.util import convert from homeassistant.components.vera import ( VERA_CONTROLLER, VERA_DEVICES, VeraDevice) @@ -49,6 +50,8 @@ def unit_of_measurement(self): return 'lux' elif self.vera_device.category == "Humidity Sensor": return '%' + elif self.vera_device.category == "Power meter": + return 'watts' def update(self): """Update the state.""" @@ -67,6 +70,9 @@ def update(self): self.current_value = self.vera_device.light elif self.vera_device.category == "Humidity Sensor": self.current_value = self.vera_device.humidity + elif self.vera_device.category == "Power meter": + power = convert(self.vera_device.power, float, 0) + self.current_value = int(round(power, 0)) elif self.vera_device.category == "Sensor": tripped = self.vera_device.is_tripped self.current_value = 'Tripped' if tripped else 'Not Tripped' diff --git a/homeassistant/components/vera.py b/homeassistant/components/vera.py index 555a800708c9d5..9d7494147e0466 100644 --- a/homeassistant/components/vera.py +++ b/homeassistant/components/vera.py @@ -20,7 +20,7 @@ EVENT_HOMEASSISTANT_STOP) from homeassistant.helpers.entity import Entity -REQUIREMENTS = ['pyvera==0.2.25'] +REQUIREMENTS = ['pyvera==0.2.26'] _LOGGER = logging.getLogger(__name__) @@ -35,6 +35,7 @@ VERA_ID_FORMAT = '{}_{}' ATTR_CURRENT_POWER_W = "current_power_w" +ATTR_CURRENT_ENERGY_KWH = "current_energy_kwh" VERA_DEVICES = defaultdict(list) @@ -181,6 +182,10 @@ def device_state_attributes(self): if power: attr[ATTR_CURRENT_POWER_W] = convert(power, float, 0.0) + energy = self.vera_device.energy + if energy: + attr[ATTR_CURRENT_ENERGY_KWH] = convert(energy, float, 0.0) + attr['Vera Device Id'] = self.vera_device.vera_device_id return attr diff --git a/requirements_all.txt b/requirements_all.txt index d8a07866d2c813..a509529a5f3f8f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -665,7 +665,7 @@ pyunifi==2.0 # pyuserinput==0.1.11 # homeassistant.components.vera -pyvera==0.2.25 +pyvera==0.2.26 # homeassistant.components.notify.html5 pywebpush==0.6.1 From 15d8f8b8279f077c71c910f93e413435cfc0726e Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Tue, 18 Apr 2017 17:26:59 +0200 Subject: [PATCH 102/146] Add support for tradfri color temp (#7153) * Add support for tradfri color temp * Only return rgb_color if supported features indicate support. * Return color_temp if supported features indicate support and dict with allowed color temperatures exist for manufacturer. * Add manufacturer specific supported features, with default. * Color temperature is set from a dict of allowed pairs per manufacturer, where kelvin is mapped to hex_color. When a user sets a color temperature, the closest matching temperature is selected and set. * Clean up --- homeassistant/components/light/tradfri.py | 50 +++++++++++++++++++++-- 1 file changed, 46 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/light/tradfri.py b/homeassistant/components/light/tradfri.py index 277824f4c64218..9626b0984858da 100644 --- a/homeassistant/components/light/tradfri.py +++ b/homeassistant/components/light/tradfri.py @@ -1,14 +1,25 @@ """Support for the IKEA Tradfri platform.""" +import logging -from homeassistant.components.tradfri import KEY_GATEWAY from homeassistant.components.light import ( - ATTR_BRIGHTNESS, SUPPORT_BRIGHTNESS, Light, ATTR_RGB_COLOR, - SUPPORT_RGB_COLOR, PLATFORM_SCHEMA as LIGHT_PLATFORM_SCHEMA) + ATTR_BRIGHTNESS, ATTR_COLOR_TEMP, ATTR_RGB_COLOR, SUPPORT_BRIGHTNESS, + SUPPORT_COLOR_TEMP, SUPPORT_RGB_COLOR, Light) +from homeassistant.components.light import \ + PLATFORM_SCHEMA as LIGHT_PLATFORM_SCHEMA +from homeassistant.components.tradfri import KEY_GATEWAY from homeassistant.util import color as color_util +from homeassistant.util import slugify + +_LOGGER = logging.getLogger(__name__) DEPENDENCIES = ['tradfri'] SUPPORTED_FEATURES = (SUPPORT_BRIGHTNESS | SUPPORT_RGB_COLOR) +SUPPORTED_FEATURES_IKEA = (SUPPORT_BRIGHTNESS | SUPPORT_COLOR_TEMP) PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA +IKEA = 'ikea_of_sweden' + +ALLOWED_TEMPERATURES = {IKEA: {2200: 'efd275', 2700: 'f1e0b5', 4000: 'f5faf6'}} +ALLOWED_FEATURES = {IKEA: SUPPORTED_FEATURES_IKEA} def setup_platform(hass, config, add_devices, discovery_info=None): @@ -35,10 +46,16 @@ def __init__(self, light): self._light_data = light.light_control.lights[0] self._name = light.name self._rgb_color = None + self._ok_temps = ALLOWED_TEMPERATURES.get( + slugify(self._light.device_info.manufacturer)) @property def supported_features(self): """Flag supported features.""" + features = ALLOWED_FEATURES.get( + slugify(self._light.device_info.manufacturer)) + if features: + return features return SUPPORTED_FEATURES @property @@ -56,10 +73,27 @@ def brightness(self): """Brightness of the light (an integer in the range 1-255).""" return self._light_data.dimmer + @property + def color_temp(self): + """Return the CT color value in mireds.""" + if not self.supported_features & SUPPORT_COLOR_TEMP or \ + not self._ok_temps: + return + kelvin = next(( + kelvin for kelvin, hex_color in self._ok_temps.items() + if hex_color == self._light_data.hex_color), None) + if kelvin is None: + _LOGGER.error( + 'unexpected color temperature found %s', + self._light_data.hex_color) + return + return color_util.color_temperature_kelvin_to_mired(kelvin) + @property def rgb_color(self): """RGB color of the light.""" - return self._rgb_color + if self.supported_features & SUPPORT_RGB_COLOR: + return self._rgb_color def turn_off(self, **kwargs): """Instruct the light to turn off.""" @@ -81,6 +115,14 @@ def turn_on(self, **kwargs): self._light.light_control.set_hex_color( color_util.color_rgb_to_hex(*kwargs[ATTR_RGB_COLOR])) + elif ATTR_COLOR_TEMP in kwargs and \ + self._light_data.hex_color is not None and self._ok_temps: + kelvin = color_util.color_temperature_mired_to_kelvin( + kwargs[ATTR_COLOR_TEMP]) + # find closest allowed kelvin temp from user input + kelvin = min(self._ok_temps.keys(), key=lambda x: abs(x-kelvin)) + self._light_control.set_hex_color(self._ok_temps[kelvin]) + def update(self): """Fetch new state data for this light.""" self._light.update() From 5574686d740ba719a342cac583632f8b1a40f08b Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 18 Apr 2017 08:55:51 -0700 Subject: [PATCH 103/146] Disable MQTT camera test (#7164) --- tests/components/camera/test_mqtt.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/components/camera/test_mqtt.py b/tests/components/camera/test_mqtt.py index 35552ca805ec12..b79f7245f2896f 100644 --- a/tests/components/camera/test_mqtt.py +++ b/tests/components/camera/test_mqtt.py @@ -1,10 +1,13 @@ """The tests for mqtt camera component.""" import asyncio +import pytest + from homeassistant.setup import async_setup_component import homeassistant.components.mqtt as mqtt +@pytest.mark.skip @asyncio.coroutine def test_run_camera_setup(hass, test_client): """Test that it fetches the given dispatcher data.""" From c7a11277ac57001442aa72145117c032e01fb093 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Tue, 18 Apr 2017 18:03:56 +0200 Subject: [PATCH 104/146] myStrom WiFi bulbs (#7161) * Add initial support for myStrom WiFi bulbs * Upgrade python-mystrom to 0.3.8 * Add myStrom light * Fix lint issue --- .coveragerc | 3 +- homeassistant/components/light/mystrom.py | 121 +++++++++++++++++++++ homeassistant/components/switch/mystrom.py | 2 +- requirements_all.txt | 3 +- 4 files changed, 126 insertions(+), 3 deletions(-) create mode 100644 homeassistant/components/light/mystrom.py diff --git a/.coveragerc b/.coveragerc index 43aa685fcc48af..4c3d883cae47f8 100644 --- a/.coveragerc +++ b/.coveragerc @@ -233,13 +233,14 @@ omit = homeassistant/components/light/lifx.py homeassistant/components/light/lifx_legacy.py homeassistant/components/light/limitlessled.py + homeassistant/components/light/mystrom.py homeassistant/components/light/osramlightify.py + homeassistant/components/light/piglow.py homeassistant/components/light/tikteck.py homeassistant/components/light/tradfri.py homeassistant/components/light/x10.py homeassistant/components/light/yeelight.py homeassistant/components/light/yeelightsunflower.py - homeassistant/components/light/piglow.py homeassistant/components/light/zengge.py homeassistant/components/lirc.py homeassistant/components/lock/nuki.py diff --git a/homeassistant/components/light/mystrom.py b/homeassistant/components/light/mystrom.py new file mode 100644 index 00000000000000..e29535d60e6300 --- /dev/null +++ b/homeassistant/components/light/mystrom.py @@ -0,0 +1,121 @@ +""" +Support for myStrom Wifi bulbs. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/light.mystrom/ +""" +import logging + +import voluptuous as vol + +from homeassistant.components.light import ( + Light, PLATFORM_SCHEMA, ATTR_BRIGHTNESS, SUPPORT_BRIGHTNESS) +from homeassistant.const import CONF_HOST, CONF_MAC, CONF_NAME, STATE_UNKNOWN +import homeassistant.helpers.config_validation as cv + +REQUIREMENTS = ['python-mystrom==0.3.8'] + +_LOGGER = logging.getLogger(__name__) + +DEFAULT_NAME = 'myStrom bulb' + +SUPPORT_MYSTROM = (SUPPORT_BRIGHTNESS) + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_HOST): cv.string, + vol.Required(CONF_MAC): cv.string, + vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, +}) + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Set up the myStrom Light platform.""" + from pymystrom import MyStromBulb + from pymystrom.exceptions import MyStromConnectionError + + host = config.get(CONF_HOST) + mac = config.get(CONF_MAC) + name = config.get(CONF_NAME) + + bulb = MyStromBulb(host, mac) + try: + if bulb.get_status()['type'] != 'rgblamp': + _LOGGER.error("Device %s (%s) is not a myStrom bulb", host, mac) + return False + except MyStromConnectionError: + _LOGGER.warning("myStrom bulb not online") + + add_devices([MyStromLight(bulb, name)], True) + + +class MyStromLight(Light): + """Representation of the myStrom WiFi Bulb.""" + + def __init__(self, bulb, name): + """Initialize the light.""" + self._bulb = bulb + self._name = name + self._state = None + self._available = False + self._brightness = 0 + self._rgb_color = [0, 0, 0] + + @property + def name(self): + """Return the display name of this light.""" + return self._name + + @property + def supported_features(self): + """Flag supported features.""" + return SUPPORT_MYSTROM + + @property + def brightness(self): + """Brightness of the light.""" + return self._brightness + + @property + def available(self) -> bool: + """Return True if entity is available.""" + return self._available + + @property + def is_on(self): + """Return true if light is on.""" + return self._state['on'] if self._state is not None else STATE_UNKNOWN + + def turn_on(self, **kwargs): + """Turn on the light.""" + from pymystrom.exceptions import MyStromConnectionError + + brightness = kwargs.get(ATTR_BRIGHTNESS, 255) + + try: + if not self.is_on: + self._bulb.set_on() + if brightness is not None: + self._bulb.set_color_hsv(0, 0, round(brightness * 100 / 255)) + except MyStromConnectionError: + _LOGGER.warning("myStrom bulb not online") + + def turn_off(self, **kwargs): + """Turn off the bulb.""" + from pymystrom.exceptions import MyStromConnectionError + + try: + self._bulb.set_off() + except MyStromConnectionError: + _LOGGER.warning("myStrom bulb not online") + + def update(self): + """Fetch new state data for this light.""" + from pymystrom.exceptions import MyStromConnectionError + + try: + self._state = self._bulb.get_status() + self._brightness = int(self._bulb.get_brightness()) * 255 / 100 + self._available = True + except MyStromConnectionError: + _LOGGER.warning("myStrom bulb not online") + self._available = False diff --git a/homeassistant/components/switch/mystrom.py b/homeassistant/components/switch/mystrom.py index 515900dd2df5ad..e813da43dfae8f 100644 --- a/homeassistant/components/switch/mystrom.py +++ b/homeassistant/components/switch/mystrom.py @@ -12,7 +12,7 @@ from homeassistant.const import (CONF_NAME, CONF_HOST) import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['python-mystrom==0.3.6'] +REQUIREMENTS = ['python-mystrom==0.3.8'] DEFAULT_NAME = 'myStrom Switch' diff --git a/requirements_all.txt b/requirements_all.txt index a509529a5f3f8f..8a6f550d1f9a03 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -623,8 +623,9 @@ python-hpilo==3.9 # homeassistant.components.media_player.mpd python-mpd2==0.5.5 +# homeassistant.components.light.mystrom # homeassistant.components.switch.mystrom -python-mystrom==0.3.6 +python-mystrom==0.3.8 # homeassistant.components.nest python-nest==3.1.0 From de71fee0a095ea043c66be92ad8bd6685b7fc74f Mon Sep 17 00:00:00 2001 From: Thibault Cohen Date: Tue, 18 Apr 2017 12:09:06 -0400 Subject: [PATCH 105/146] Fix #7026 adding a new wol parameter (#7144) --- homeassistant/components/switch/wake_on_lan.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/switch/wake_on_lan.py b/homeassistant/components/switch/wake_on_lan.py index c86a4674bb6e67..4413da191d3284 100644 --- a/homeassistant/components/switch/wake_on_lan.py +++ b/homeassistant/components/switch/wake_on_lan.py @@ -21,6 +21,7 @@ CONF_MAC_ADDRESS = 'mac_address' CONF_OFF_ACTION = 'turn_off' +CONF_BROADCAST_ADDRESS = 'broadcast_address' DEFAULT_NAME = 'Wake on LAN' DEFAULT_PING_TIMEOUT = 1 @@ -28,6 +29,7 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_MAC_ADDRESS): cv.string, vol.Optional(CONF_HOST): cv.string, + vol.Optional(CONF_BROADCAST_ADDRESS): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_OFF_ACTION): cv.SCRIPT_SCHEMA, }) @@ -38,21 +40,25 @@ def setup_platform(hass, config, add_devices, discovery_info=None): name = config.get(CONF_NAME) host = config.get(CONF_HOST) mac_address = config.get(CONF_MAC_ADDRESS) + broadcast_address = config.get(CONF_BROADCAST_ADDRESS) off_action = config.get(CONF_OFF_ACTION) - add_devices([WOLSwitch(hass, name, host, mac_address, off_action)]) + add_devices([WOLSwitch(hass, name, host, mac_address, + off_action, broadcast_address)]) class WOLSwitch(SwitchDevice): """Representation of a wake on lan switch.""" - def __init__(self, hass, name, host, mac_address, off_action): + def __init__(self, hass, name, host, mac_address, + off_action, broadcast_address): """Initialize the WOL switch.""" from wakeonlan import wol self._hass = hass self._name = name self._host = host self._mac_address = mac_address + self._broadcast_address = broadcast_address self._off_script = Script(hass, off_action) if off_action else None self._state = False self._wol = wol @@ -75,9 +81,9 @@ def name(self): def turn_on(self): """Turn the device on.""" - if self._host: + if self._broadcast_address: self._wol.send_magic_packet(self._mac_address, - ip_address=self._host) + ip_address=self._broadcast_address) else: self._wol.send_magic_packet(self._mac_address) From bbad15f85307c5e5a9b4f630602a62e0b04a1f7f Mon Sep 17 00:00:00 2001 From: Greg Dowling Date: Tue, 18 Apr 2017 17:11:08 +0100 Subject: [PATCH 106/146] Add subscription update for Wemo switches, fix bug in Insight switches, fix wemo motion bug, fix wemo discovery (#7135) * Fix wemo discovery. * Bump wemo version, add subscription_update for basic switch, fix bug with turning insight switches off. * Fix missed callback change for wemo motion. * Regress netdisco changes. --- homeassistant/components/binary_sensor/wemo.py | 18 ++++++++++++------ homeassistant/components/wemo.py | 2 +- requirements_all.txt | 2 +- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/binary_sensor/wemo.py b/homeassistant/components/binary_sensor/wemo.py index 07deea02f6e249..7f44370510e1aa 100644 --- a/homeassistant/components/binary_sensor/wemo.py +++ b/homeassistant/components/binary_sensor/wemo.py @@ -40,12 +40,14 @@ def __init__(self, device): wemo.SUBSCRIPTION_REGISTRY.register(self.wemo) wemo.SUBSCRIPTION_REGISTRY.on(self.wemo, None, self._update_callback) - def _update_callback(self, _device, _params): - """Called by the wemo device callback to update state.""" + def _update_callback(self, _device, _type, _params): + """Called by the Wemo device callback to update state.""" _LOGGER.info( 'Subscription update for %s', _device) - self.update() + updated = self.wemo.subscription_update(_type, _params) + self._update(force_update=(not updated)) + if not hasattr(self, 'hass'): return self.schedule_update_ha_state() @@ -72,7 +74,11 @@ def is_on(self): def update(self): """Update WeMo state.""" + self._update(force_update=True) + + def _update(self, force_update=True): try: - self._state = self.wemo.get_state(True) - except AttributeError: - _LOGGER.warning('Could not update status for %s', self.name) + self._state = self.wemo.get_state(force_update) + except AttributeError as err: + _LOGGER.warning('Could not update status for %s (%s)', + self.name, err) diff --git a/homeassistant/components/wemo.py b/homeassistant/components/wemo.py index 20c9f6eeca2674..d9fa0bc7f56f20 100644 --- a/homeassistant/components/wemo.py +++ b/homeassistant/components/wemo.py @@ -14,7 +14,7 @@ from homeassistant.const import EVENT_HOMEASSISTANT_STOP -REQUIREMENTS = ['pywemo==0.4.17'] +REQUIREMENTS = ['pywemo==0.4.18'] DOMAIN = 'wemo' diff --git a/requirements_all.txt b/requirements_all.txt index 8a6f550d1f9a03..7ae864fd84ecf4 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -672,7 +672,7 @@ pyvera==0.2.26 pywebpush==0.6.1 # homeassistant.components.wemo -pywemo==0.4.17 +pywemo==0.4.18 # homeassistant.components.zabbix pyzabbix==0.7.4 From d007269eccd48c9133e5cef90bf02f9001e79561 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C3=ABl=20Arnauts?= Date: Tue, 18 Apr 2017 22:03:06 +0200 Subject: [PATCH 107/146] Update neato.py (#7166) Fix leftover copy/paste error in comment of neato.py --- homeassistant/components/neato.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/neato.py b/homeassistant/components/neato.py index 7bc4724e18cdb0..67716c6a2e54b9 100644 --- a/homeassistant/components/neato.py +++ b/homeassistant/components/neato.py @@ -81,7 +81,7 @@ def setup(hass, config): - """Setup the Verisure component.""" + """Setup the Neato component.""" from pybotvac import Account hass.data[NEATO_LOGIN] = NeatoHub(hass, config[DOMAIN], Account) From 1e758ed0301e1d99b367d5a60901a4b1f7d675e9 Mon Sep 17 00:00:00 2001 From: Erik Eriksson Date: Wed, 19 Apr 2017 00:20:52 +0200 Subject: [PATCH 108/146] Keep track of already added players (#7149) --- .../components/media_player/squeezebox.py | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/media_player/squeezebox.py b/homeassistant/components/media_player/squeezebox.py index eec8eeb8177742..40c48f55215218 100644 --- a/homeassistant/components/media_player/squeezebox.py +++ b/homeassistant/components/media_player/squeezebox.py @@ -29,8 +29,6 @@ DEFAULT_PORT = 9000 TIMEOUT = 10 -KNOWN_DEVICES = [] - SUPPORT_SQUEEZEBOX = SUPPORT_PAUSE | SUPPORT_VOLUME_SET | \ SUPPORT_VOLUME_MUTE | SUPPORT_PREVIOUS_TRACK | SUPPORT_NEXT_TRACK | \ SUPPORT_SEEK | SUPPORT_TURN_ON | SUPPORT_TURN_OFF | SUPPORT_PLAY_MEDIA | \ @@ -71,18 +69,8 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): host, port, error) return False - # Combine it with port to allow multiple servers at the same host - key = "{}:{}".format(ipaddr, port) - - # Only add a media server once - if key in KNOWN_DEVICES: - return False - KNOWN_DEVICES.append(key) - _LOGGER.debug("Creating LMS object for %s", ipaddr) lms = LogitechMediaServer(hass, host, port, username, password) - if lms is False: - return False players = yield from lms.create_players() async_add_devices(players) @@ -173,6 +161,11 @@ def name(self): """Return the name of the device.""" return self._name + @property + def unique_id(self): + """Return an unique ID.""" + return self._id + @property def state(self): """Return the state of the device.""" From e4bbbe20dd2b4f8891f94a104b1cd954114999ee Mon Sep 17 00:00:00 2001 From: Mitesh Patel Date: Tue, 18 Apr 2017 17:24:58 -0500 Subject: [PATCH 109/146] Fix id zone mismatch (#7165) * Fixes issue with id mismatch when multiple devices are connected to the lutron bridge * Updates labels * removes no longer needed config values. * removes no longer needed imports --- .../components/light/lutron_caseta.py | 2 +- homeassistant/components/lutron_caseta.py | 20 ++++++++----------- requirements_all.txt | 2 +- 3 files changed, 10 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/light/lutron_caseta.py b/homeassistant/components/light/lutron_caseta.py index e77501e8ce4d38..705886855b0088 100644 --- a/homeassistant/components/light/lutron_caseta.py +++ b/homeassistant/components/light/lutron_caseta.py @@ -42,7 +42,7 @@ def brightness(self): def turn_on(self, **kwargs): """Turn the light on.""" - if ATTR_BRIGHTNESS in kwargs and self._device_type == "WallDimmer": + if ATTR_BRIGHTNESS in kwargs: brightness = kwargs[ATTR_BRIGHTNESS] else: brightness = 255 diff --git a/homeassistant/components/lutron_caseta.py b/homeassistant/components/lutron_caseta.py index 5519240bc4938d..1e19083e959192 100644 --- a/homeassistant/components/lutron_caseta.py +++ b/homeassistant/components/lutron_caseta.py @@ -10,15 +10,13 @@ import voluptuous as vol import homeassistant.helpers.config_validation as cv -from homeassistant.const import (CONF_HOST, - CONF_USERNAME, - CONF_PASSWORD) +from homeassistant.const import CONF_HOST from homeassistant.helpers import discovery from homeassistant.helpers.entity import Entity REQUIREMENTS = ['https://github.com/gurumitts/' - 'pylutron-caseta/archive/v0.2.5.zip#' - 'pylutron-caseta==v0.2.5'] + 'pylutron-caseta/archive/v0.2.6.zip#' + 'pylutron-caseta==v0.2.6'] _LOGGER = logging.getLogger(__name__) @@ -28,9 +26,7 @@ CONFIG_SCHEMA = vol.Schema({ DOMAIN: vol.Schema({ - vol.Required(CONF_HOST): cv.string, - vol.Required(CONF_USERNAME): cv.string, - vol.Required(CONF_PASSWORD): cv.string + vol.Required(CONF_HOST): cv.string }) }, extra=vol.ALLOW_EXTRA) @@ -41,9 +37,7 @@ def setup(hass, base_config): config = base_config.get(DOMAIN) hass.data[LUTRON_CASETA_SMARTBRIDGE] = Smartbridge( - hostname=config[CONF_HOST], - username=config[CONF_USERNAME], - password=config[CONF_PASSWORD] + hostname=config[CONF_HOST] ) if not hass.data[LUTRON_CASETA_SMARTBRIDGE].is_connected(): _LOGGER.error("Unable to connect to Lutron smartbridge at %s", @@ -71,6 +65,7 @@ def __init__(self, device, bridge): self._device_id = device["device_id"] self._device_type = device["type"] self._device_name = device["name"] + self._device_zone = device["zone"] self._state = None self._smartbridge = bridge @@ -93,7 +88,8 @@ def name(self): @property def device_state_attributes(self): """Return the state attributes.""" - attr = {'Lutron Integration ID': self._device_id} + attr = {'Device ID': self._device_id, + 'Zone ID': self._device_zone} return attr @property diff --git a/requirements_all.txt b/requirements_all.txt index 7ae864fd84ecf4..4583058cdff1c4 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -266,7 +266,7 @@ https://github.com/bah2830/python-roku/archive/3.1.3.zip#roku==3.1.3 https://github.com/bashwork/pymodbus/archive/d7fc4f1cc975631e0a9011390e8017f64b612661.zip#pymodbus==1.2.0 # homeassistant.components.lutron_caseta -https://github.com/gurumitts/pylutron-caseta/archive/v0.2.5.zip#pylutron-caseta==v0.2.5 +https://github.com/gurumitts/pylutron-caseta/archive/v0.2.6.zip#pylutron-caseta==v0.2.6 # homeassistant.components.netatmo https://github.com/jabesq/netatmo-api-python/archive/v0.9.1.zip#lnetatmo==0.9.1 From 4becfb66e3dede68f11471b8df7edf2ccab6d712 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 18 Apr 2017 20:11:18 -0700 Subject: [PATCH 110/146] Upgrade pytradfri to 1.0 (#7163) --- homeassistant/components/tradfri.py | 6 +++--- requirements_all.txt | 2 +- virtualization/Docker/scripts/coap_client | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/tradfri.py b/homeassistant/components/tradfri.py index 264ac9f42c61af..098b178874281a 100644 --- a/homeassistant/components/tradfri.py +++ b/homeassistant/components/tradfri.py @@ -21,7 +21,7 @@ CONFIG_FILE = 'tradfri.conf' KEY_CONFIG = 'tradfri_configuring' KEY_GATEWAY = 'tradfri_gateway' -REQUIREMENTS = ['pytradfri==0.4'] +REQUIREMENTS = ['pytradfri==1.0'] CONFIG_SCHEMA = vol.Schema({ DOMAIN: vol.Schema({ @@ -100,10 +100,10 @@ def gateway_discovered(service, info): @asyncio.coroutine def _setup_gateway(hass, hass_config, host, key): """Create a gateway.""" - from pytradfri import cli_api_factory, Gateway, RequestError + from pytradfri import cli_api_factory, Gateway, RequestError, retry_timeout try: - api = cli_api_factory(host, key) + api = retry_timeout(cli_api_factory(host, key)) except RequestError: return False diff --git a/requirements_all.txt b/requirements_all.txt index 4583058cdff1c4..519616f4a7edc0 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -657,7 +657,7 @@ python-wink==1.2.3 pytrackr==0.0.5 # homeassistant.components.tradfri -pytradfri==0.4 +pytradfri==1.0 # homeassistant.components.device_tracker.unifi pyunifi==2.0 diff --git a/virtualization/Docker/scripts/coap_client b/virtualization/Docker/scripts/coap_client index bbc5ba0a2c2de8..fa16d14c0cba68 100755 --- a/virtualization/Docker/scripts/coap_client +++ b/virtualization/Docker/scripts/coap_client @@ -9,6 +9,6 @@ apt-get install -y --no-install-recommends git autoconf automake libtool git clone --depth 1 --recursive -b dtls https://github.com/home-assistant/libcoap.git cd libcoap ./autogen.sh -./configure --disable-documentation --disable-shared +./configure --disable-documentation --disable-shared --without-debug CFLAGS="-D COAP_DEBUG_FD=stderr" make make install From e5feeec7a41636886f97f3be94f4364b52b11a67 Mon Sep 17 00:00:00 2001 From: Johan Bloemberg Date: Wed, 19 Apr 2017 05:24:44 +0200 Subject: [PATCH 111/146] Value of 0 should not be considered `unknown`. (#7139) * Value of 0 should not be considered `unknown`. * Reflect disconnect state in entity states. * Due to adding unknown state on disconnect, the amount of reconnects can sometimes be more. Test for at least 2 reconnect attempts. --- homeassistant/components/sensor/dsmr.py | 7 ++++++- tests/components/sensor/test_dsmr.py | 6 +++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/sensor/dsmr.py b/homeassistant/components/sensor/dsmr.py index b9c3f82cdc5919..84669a57000be9 100644 --- a/homeassistant/components/sensor/dsmr.py +++ b/homeassistant/components/sensor/dsmr.py @@ -153,10 +153,15 @@ def connect_and_reconnect(): yield from protocol.wait_closed() if hass.state != CoreState.stopping: + # unexpected disconnect if transport: # remove listerer stop_listerer() + # reflect disconnect state in devices state by setting an + # empty telegram resulting in `unkown` states + update_entities_telegram({}) + # throttle reconnect attempts yield from asyncio.sleep(config[CONF_RECONNECT_INTERVAL], loop=hass.loop) @@ -207,7 +212,7 @@ def state(self): if self._obis == obis.ELECTRICITY_ACTIVE_TARIFF: return self.translate_tariff(value) else: - if value: + if value is not None: return value else: return STATE_UNKNOWN diff --git a/tests/components/sensor/test_dsmr.py b/tests/components/sensor/test_dsmr.py index a09f16b00fd4cc..59e66ca82b6b06 100644 --- a/tests/components/sensor/test_dsmr.py +++ b/tests/components/sensor/test_dsmr.py @@ -56,7 +56,7 @@ def test_default_setup(hass, mock_connection_factory): telegram = { CURRENT_ELECTRICITY_USAGE: CosemObject([ - {'value': Decimal('0.1'), 'unit': 'kWh'} + {'value': Decimal('0.0'), 'unit': 'kWh'} ]), ELECTRICITY_ACTIVE_TARIFF: CosemObject([ {'value': '0001', 'unit': ''} @@ -82,7 +82,7 @@ def test_default_setup(hass, mock_connection_factory): # ensure entities have new state value after incoming telegram power_consumption = hass.states.get('sensor.power_consumption') - assert power_consumption.state == '0.1' + assert power_consumption.state == '0.0' assert power_consumption.attributes.get('unit_of_measurement') is 'kWh' # tariff should be translated in human readable and have no unit @@ -199,5 +199,5 @@ def wait_closed(): # wait for sleep to resolve yield from hass.async_block_till_done() - assert connection_factory.call_count == 2, \ + assert connection_factory.call_count >= 2, \ 'connecting not retried' From ce9bb0e84ce926cbef7d785b52cc0521112838ae Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Tue, 18 Apr 2017 20:58:25 -0700 Subject: [PATCH 112/146] Upgrade netdisco (#7171) --- homeassistant/components/discovery.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/discovery.py b/homeassistant/components/discovery.py index 7a18148e51721a..ed766fc3997503 100644 --- a/homeassistant/components/discovery.py +++ b/homeassistant/components/discovery.py @@ -20,7 +20,7 @@ from homeassistant.helpers.discovery import async_load_platform, async_discover import homeassistant.util.dt as dt_util -REQUIREMENTS = ['netdisco==1.0.0rc2'] +REQUIREMENTS = ['netdisco==1.0.0rc3'] DOMAIN = 'discovery' diff --git a/requirements_all.txt b/requirements_all.txt index 519616f4a7edc0..baee6d80f92c8b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -399,7 +399,7 @@ mutagen==1.36.2 myusps==1.0.5 # homeassistant.components.discovery -netdisco==1.0.0rc2 +netdisco==1.0.0rc3 # homeassistant.components.sensor.neurio_energy neurio==0.3.1 From 5179832f6f0fc4032bbcc17693781cb0095c5b4b Mon Sep 17 00:00:00 2001 From: Alessandro Mogavero Date: Wed, 19 Apr 2017 07:19:27 +0100 Subject: [PATCH 113/146] Added new services to platform kodi (#6426) * added new service * fixed basic test in kodi platform * Added new method async_get_albums * Added new methods in module kodi * added method find_song in kodi module * method add_song_to_playlist made async * Added media type to method async_play_media * added methods async_clear_playlist and play_song * methods play_song and find_song made async * added new service play_song * Improved kodi._find now it find for whole words only * added possibility to specify artist in kodi.async_find_artist * added kodi.async_find_album * added new optional input to play_song service * In async_play_song added handling of no song found * default artist value changed to '' * async_add_song_to_playlist now can also search for musinc * added service add_song_to_playlist * Added new service add_album_to_playlist * added services to switch shuffle mode * added service add_all_albums_to_playlist * handled error in async_unset_shuffle and async_set_shuffle * Added abstract methods to media_player * _server substituted with server property * style made consistent with requirements * Fixed issue with pylint * Services moved to kodi platform * service play_song removed * removed service unset_shuffle * all add services merged into one * removed service get_artists * added kodi_ to service names * Fixed some style issues * Removed changes in media_player __init__ * Implemented requested changes * Fixed pylint problem --- homeassistant/components/media_player/kodi.py | 191 +++++++++++++++++- 1 file changed, 190 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/media_player/kodi.py b/homeassistant/components/media_player/kodi.py index a137a332f7e6b7..e10886d6916227 100644 --- a/homeassistant/components/media_player/kodi.py +++ b/homeassistant/components/media_player/kodi.py @@ -8,6 +8,7 @@ from functools import wraps import logging import urllib +import re import aiohttp import voluptuous as vol @@ -17,7 +18,7 @@ SUPPORT_PLAY_MEDIA, SUPPORT_VOLUME_MUTE, SUPPORT_VOLUME_SET, SUPPORT_STOP, SUPPORT_TURN_OFF, SUPPORT_PLAY, SUPPORT_VOLUME_STEP, MediaPlayerDevice, PLATFORM_SCHEMA, MEDIA_TYPE_MUSIC, MEDIA_TYPE_TVSHOW, MEDIA_TYPE_VIDEO, - MEDIA_TYPE_PLAYLIST) + MEDIA_TYPE_PLAYLIST, MEDIA_PLAYER_SCHEMA, DOMAIN) from homeassistant.const import ( STATE_IDLE, STATE_OFF, STATE_PAUSED, STATE_PLAYING, CONF_HOST, CONF_NAME, CONF_PORT, CONF_SSL, CONF_PROXY_SSL, CONF_USERNAME, CONF_PASSWORD, @@ -76,6 +77,34 @@ cv.boolean, }) +SERVICE_ADD_MEDIA = 'kodi_add_to_playlist' +SERVICE_SET_SHUFFLE = 'kodi_set_shuffle' + +ATTR_MEDIA_TYPE = 'media_type' +ATTR_MEDIA_NAME = 'media_name' +ATTR_MEDIA_ARTIST_NAME = 'artist_name' +ATTR_MEDIA_ID = 'media_id' + +MEDIA_PLAYER_SET_SHUFFLE_SCHEMA = MEDIA_PLAYER_SCHEMA.extend({ + vol.Required('shuffle_on'): cv.boolean, +}) + +MEDIA_PLAYER_ADD_MEDIA_SCHEMA = MEDIA_PLAYER_SCHEMA.extend({ + vol.Required(ATTR_MEDIA_TYPE): cv.string, + vol.Optional(ATTR_MEDIA_ID): cv.string, + vol.Optional(ATTR_MEDIA_NAME): cv.string, + vol.Optional(ATTR_MEDIA_ARTIST_NAME): cv.string, +}) + +SERVICE_TO_METHOD = { + SERVICE_ADD_MEDIA: { + 'method': 'async_add_media_to_playlist', + 'schema': MEDIA_PLAYER_ADD_MEDIA_SCHEMA}, + SERVICE_SET_SHUFFLE: { + 'method': 'async_set_shuffle', + 'schema': MEDIA_PLAYER_SET_SHUFFLE_SCHEMA}, +} + @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): @@ -103,6 +132,33 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): async_add_devices([entity], update_before_add=True) + @asyncio.coroutine + def async_service_handler(service): + """Map services to methods on MediaPlayerDevice.""" + method = SERVICE_TO_METHOD.get(service.service) + if not method: + return + + params = {key: value for key, value in service.data.items() + if key != 'entity_id'} + + yield from getattr(entity, method['method'])(**params) + + update_tasks = [] + if entity.should_poll: + update_coro = entity.async_update_ha_state(True) + update_tasks.append(update_coro) + + if update_tasks: + yield from asyncio.wait(update_tasks, loop=hass.loop) + + for service in SERVICE_TO_METHOD: + schema = SERVICE_TO_METHOD[service].get( + 'schema', MEDIA_PLAYER_SCHEMA) + hass.services.async_register( + DOMAIN, service, async_service_handler, + description=None, schema=schema) + def cmd(func): """Decorator to catch command exceptions.""" @@ -593,6 +649,139 @@ def async_play_media(self, media_type, media_id, **kwargs): if media_type == "CHANNEL": return self.server.Player.Open( {"item": {"channelid": int(media_id)}}) + elif media_type == "PLAYLIST": + return self.server.Player.Open( + {"item": {"playlistid": int(media_id)}}) else: return self.server.Player.Open( {"item": {"file": str(media_id)}}) + + @asyncio.coroutine + def async_set_shuffle(self, shuffle_on): + """Set shuffle mode, for the first player.""" + if len(self._players) < 1: + raise RuntimeError("Error: No active player.") + yield from self.server.Player.SetShuffle( + {"playerid": self._players[0]['playerid'], "shuffle": shuffle_on}) + + @asyncio.coroutine + def async_add_media_to_playlist( + self, media_type, media_id=None, media_name='', artist_name=''): + """Add a media to default playlist (i.e. playlistid=0). + + First the media type must be selected, then + the media can be specified in terms of id or + name and optionally artist name. + All the albums of an artist can be added with + media_name="ALL" + """ + if media_type == "SONG": + if media_id is None: + media_id = yield from self.async_find_song( + media_name, artist_name) + + yield from self.server.Playlist.Add( + {"playlistid": 0, "item": {"songid": int(media_id)}}) + + elif media_type == "ALBUM": + if media_id is None: + if media_name == "ALL": + yield from self.async_add_all_albums(artist_name) + return + + media_id = yield from self.async_find_album( + media_name, artist_name) + + yield from self.server.Playlist.Add( + {"playlistid": 0, "item": {"albumid": int(media_id)}}) + else: + raise RuntimeError("Unrecognized media type.") + + @asyncio.coroutine + def async_add_all_albums(self, artist_name): + """Add all albums of an artist to default playlist (i.e. playlistid=0). + + The artist is specified in terms of name. + """ + artist_id = yield from self.async_find_artist(artist_name) + + albums = yield from self.async_get_albums(artist_id) + + for alb in albums['albums']: + yield from self.server.Playlist.Add( + {"playlistid": 0, "item": {"albumid": int(alb['albumid'])}}) + + @asyncio.coroutine + def async_clear_playlist(self): + """Clear default playlist (i.e. playlistid=0).""" + return self.server.Playlist.Clear({"playlistid": 0}) + + @asyncio.coroutine + def async_get_artists(self): + """Get artists list.""" + return (yield from self.server.AudioLibrary.GetArtists()) + + @asyncio.coroutine + def async_get_albums(self, artist_id=None): + """Get albums list.""" + if artist_id is None: + return (yield from self.server.AudioLibrary.GetAlbums()) + else: + return (yield from self.server.AudioLibrary.GetAlbums( + {"filter": {"artistid": int(artist_id)}})) + + @asyncio.coroutine + def async_find_artist(self, artist_name): + """Find artist by name.""" + artists = yield from self.async_get_artists() + out = self._find( + artist_name, [a['artist'] for a in artists['artists']]) + return artists['artists'][out[0][0]]['artistid'] + + @asyncio.coroutine + def async_get_songs(self, artist_id=None): + """Get songs list.""" + if artist_id is None: + return (yield from self.server.AudioLibrary.GetSongs()) + else: + return (yield from self.server.AudioLibrary.GetSongs( + {"filter": {"artistid": int(artist_id)}})) + + @asyncio.coroutine + def async_find_song(self, song_name, artist_name=''): + """Find song by name and optionally artist name.""" + artist_id = None + if artist_name != '': + artist_id = yield from self.async_find_artist(artist_name) + + songs = yield from self.async_get_songs(artist_id) + if songs['limits']['total'] == 0: + return None + + out = self._find(song_name, [a['label'] for a in songs['songs']]) + return songs['songs'][out[0][0]]['songid'] + + @asyncio.coroutine + def async_find_album(self, album_name, artist_name=''): + """Find album by name and optionally artist name.""" + artist_id = None + if artist_name != '': + artist_id = yield from self.async_find_artist(artist_name) + + albums = yield from self.async_get_albums(artist_id) + out = self._find(album_name, [a['label'] for a in albums['albums']]) + return albums['albums'][out[0][0]]['albumid'] + + @staticmethod + def _find(key_word, words): + key_word = key_word.split(' ') + patt = [re.compile( + '(^| )' + k + '( |$)', re.IGNORECASE) for k in key_word] + + out = [[i, 0] for i in range(len(words))] + for i in range(len(words)): + mtc = [p.search(words[i]) for p in patt] + rate = [m is not None for m in mtc].count(True) + out[i][1] = rate + + return sorted(out, key=lambda out: out[1], reverse=True) From a41d0aced7d729ad5923ee4be1ac25b954948d5c Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 19 Apr 2017 12:48:15 +0200 Subject: [PATCH 114/146] Supress trackback and upgrade PyMata to 2.14 (#7176) --- homeassistant/components/arduino.py | 46 +++++++++++++++-------------- requirements_all.txt | 2 +- 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/homeassistant/components/arduino.py b/homeassistant/components/arduino.py index 239c80523df40c..8625685c057dfe 100644 --- a/homeassistant/components/arduino.py +++ b/homeassistant/components/arduino.py @@ -13,7 +13,7 @@ from homeassistant.const import CONF_PORT import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['PyMata==2.13'] +REQUIREMENTS = ['PyMata==2.14'] _LOGGER = logging.getLogger(__name__) @@ -29,18 +29,25 @@ def setup(hass, config): - """Setup the Arduino component.""" + """Set up the Arduino component.""" import serial + + port = config[DOMAIN][CONF_PORT] + global BOARD try: - BOARD = ArduinoBoard(config[DOMAIN][CONF_PORT]) + BOARD = ArduinoBoard(port) except (serial.serialutil.SerialException, FileNotFoundError): - _LOGGER.exception("Your port is not accessible.") + _LOGGER.error("Your port %s is not accessible", port) return False - if BOARD.get_firmata()[1] <= 2: - _LOGGER.error("The StandardFirmata sketch should be 2.2 or newer.") - return False + try: + if BOARD.get_firmata()[1] <= 2: + _LOGGER.error("The StandardFirmata sketch should be 2.2 or newer") + return False + except IndexError: + _LOGGER.warning("The version of the StandardFirmata sketch was not" + "detected. This may lead to side effects") def stop_arduino(event): """Stop the Arduino service.""" @@ -67,25 +74,20 @@ def __init__(self, port): def set_mode(self, pin, direction, mode): """Set the mode and the direction of a given pin.""" if mode == 'analog' and direction == 'in': - self._board.set_pin_mode(pin, - self._board.INPUT, - self._board.ANALOG) + self._board.set_pin_mode( + pin, self._board.INPUT, self._board.ANALOG) elif mode == 'analog' and direction == 'out': - self._board.set_pin_mode(pin, - self._board.OUTPUT, - self._board.ANALOG) + self._board.set_pin_mode( + pin, self._board.OUTPUT, self._board.ANALOG) elif mode == 'digital' and direction == 'in': - self._board.set_pin_mode(pin, - self._board.INPUT, - self._board.DIGITAL) + self._board.set_pin_mode( + pin, self._board.INPUT, self._board.DIGITAL) elif mode == 'digital' and direction == 'out': - self._board.set_pin_mode(pin, - self._board.OUTPUT, - self._board.DIGITAL) + self._board.set_pin_mode( + pin, self._board.OUTPUT, self._board.DIGITAL) elif mode == 'pwm': - self._board.set_pin_mode(pin, - self._board.OUTPUT, - self._board.PWM) + self._board.set_pin_mode( + pin, self._board.OUTPUT, self._board.PWM) def get_analog_inputs(self): """Get the values from the pins.""" diff --git a/requirements_all.txt b/requirements_all.txt index baee6d80f92c8b..32d95676c2719d 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -26,7 +26,7 @@ PyJWT==1.4.2 PyMVGLive==1.1.3 # homeassistant.components.arduino -PyMata==2.13 +PyMata==2.14 # homeassistant.components.rpi_gpio # RPi.GPIO==0.6.1 From 8ba41563c940b8695ecaacc321b8f07c9ad6637c Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 19 Apr 2017 14:09:00 +0200 Subject: [PATCH 115/146] Disable invalid-sequence-index (#7177) --- homeassistant/helpers/__init__.py | 1 + homeassistant/util/color.py | 6 +++++- homeassistant/util/dt.py | 3 ++- homeassistant/util/location.py | 3 +-- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/homeassistant/helpers/__init__.py b/homeassistant/helpers/__init__.py index 0fc75a476f6b6c..47a7627b5ce3a0 100644 --- a/homeassistant/helpers/__init__.py +++ b/homeassistant/helpers/__init__.py @@ -14,6 +14,7 @@ ConfigType = Dict[str, Any] +# pylint: disable=invalid-sequence-index def config_per_platform(config: ConfigType, domain: str) -> Iterable[Tuple[Any, Any]]: """Generator to break a component config into different platforms. diff --git a/homeassistant/util/color.py b/homeassistant/util/color.py index 26a05bbc0bc9e1..57d88c5328d0a1 100644 --- a/homeassistant/util/color.py +++ b/homeassistant/util/color.py @@ -183,7 +183,7 @@ def color_name_to_rgb(color_name): # Taken from: # http://www.developers.meethue.com/documentation/color-conversions-rgb-xy # License: Code is given as is. Use at your own risk and discretion. -# pylint: disable=invalid-name +# pylint: disable=invalid-name, invalid-sequence-index def color_RGB_to_xy(iR: int, iG: int, iB: int) -> Tuple[float, float, int]: """Convert from RGB color to XY color.""" if iR + iG + iB == 0: @@ -219,6 +219,7 @@ def color_RGB_to_xy(iR: int, iG: int, iB: int) -> Tuple[float, float, int]: # Converted to Python from Obj-C, original source from: # http://www.developers.meethue.com/documentation/color-conversions-rgb-xy +# pylint: disable=invalid-sequence-index def color_xy_brightness_to_RGB(vX: float, vY: float, ibrightness: int) -> Tuple[int, int, int]: """Convert from XYZ to RGB.""" @@ -259,18 +260,21 @@ def color_xy_brightness_to_RGB(vX: float, vY: float, return (ir, ig, ib) +# pylint: disable=invalid-sequence-index def color_RGB_to_hsv(iR: int, iG: int, iB: int) -> Tuple[int, int, int]: """Convert an rgb color to its hsv representation.""" fHSV = colorsys.rgb_to_hsv(iR/255.0, iG/255.0, iB/255.0) return (int(fHSV[0]*65536), int(fHSV[1]*255), int(fHSV[2]*255)) +# pylint: disable=invalid-sequence-index def color_xy_brightness_to_hsv(vX: float, vY: float, ibrightness: int) -> Tuple[int, int, int]: """Convert an xy brightness color to its hsv representation.""" return color_RGB_to_hsv(*color_xy_brightness_to_RGB(vX, vY, ibrightness)) +# pylint: disable=invalid-sequence-index def _match_max_scale(input_colors: Tuple[int, ...], output_colors: Tuple[int, ...]) -> Tuple[int, ...]: """Match the maximum value of the output to the input.""" diff --git a/homeassistant/util/dt.py b/homeassistant/util/dt.py index 52e85081599928..5e8b3382fb1e2c 100644 --- a/homeassistant/util/dt.py +++ b/homeassistant/util/dt.py @@ -1,4 +1,4 @@ -"""Provides helper methods to handle the time in HA.""" +"""Helper methods to handle the time in Home Assistant.""" import datetime as dt import re @@ -184,6 +184,7 @@ def formatn(number: int, unit: str) -> str: elif number > 1: return "%d %ss" % (number, unit) + # pylint: disable=invalid-sequence-index def q_n_r(first: int, second: int) -> Tuple[int, int]: """Return quotient and remaining.""" return first // second, first % second diff --git a/homeassistant/util/location.py b/homeassistant/util/location.py index 950f2f99fedc5b..c7bc42052979eb 100644 --- a/homeassistant/util/location.py +++ b/homeassistant/util/location.py @@ -9,7 +9,6 @@ import requests - ELEVATION_URL = 'http://maps.googleapis.com/maps/api/elevation/json' FREEGEO_API = 'https://freegeoip.io/json/' IP_API = 'http://ip-api.com/json' @@ -83,7 +82,7 @@ def elevation(latitude, longitude): # Author: https://github.com/maurycyp # Source: https://github.com/maurycyp/vincenty # License: https://github.com/maurycyp/vincenty/blob/master/LICENSE -# pylint: disable=invalid-name, unused-variable +# pylint: disable=invalid-name, unused-variable, invalid-sequence-index def vincenty(point1: Tuple[float, float], point2: Tuple[float, float], miles: bool=False) -> Optional[float]: """ From 921760f8c1a48cd97509bcb4302b5ec5ad3f5132 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Wed, 19 Apr 2017 14:34:23 +0200 Subject: [PATCH 116/146] Upgrade mypy to 0.501 (was renamed from mypy-lang) (#7117) --- requirements_test.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements_test.txt b/requirements_test.txt index 2d8ebe6a238fbb..c2c5cf65f1b4d6 100644 --- a/requirements_test.txt +++ b/requirements_test.txt @@ -3,7 +3,7 @@ # new version flake8==3.3 pylint==1.6.5 -mypy-lang==0.4.5 +mypy==0.501 pydocstyle==1.1.1 coveralls>=1.1 pytest>=2.9.2 From 2f4b2ddc0a175871ae0c11e8628ccd0d11a2ed3c Mon Sep 17 00:00:00 2001 From: Sytone Date: Wed, 19 Apr 2017 09:08:48 -0700 Subject: [PATCH 117/146] Add condition for API failure (#7181) * Add condition for API failure If you are not running the latest ve3rsion of ZM this will cause exceptions to fire. This fix handles a response from ZM but a non successful attempt. This resolves the issue https://github.com/home-assistant/home-assistant/issues/7178 * Fixed houndci-bot issues --- homeassistant/components/camera/zoneminder.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/homeassistant/components/camera/zoneminder.py b/homeassistant/components/camera/zoneminder.py index be38d468f2de48..e419564a887162 100644 --- a/homeassistant/components/camera/zoneminder.py +++ b/homeassistant/components/camera/zoneminder.py @@ -101,11 +101,17 @@ def update(self): status_response = zoneminder.get_state( 'api/monitors/alarm/id:%i/command:status.json' % self._monitor_id ) + if not status_response: _LOGGER.warning('Could not get status for monitor %i', self._monitor_id) return + if status_response['success'] is False: + _LOGGER.warning('Alarm status API call failed for monitor %i', + self._monitor_id) + return + self._is_recording = status_response['status'] == ZM_STATE_ALARM @property From 90baa2ce4d7171b236d364d30c3288df6f3b88aa Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 19 Apr 2017 09:15:18 -0700 Subject: [PATCH 118/146] Add history to component priority list (#7173) --- homeassistant/bootstrap.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/bootstrap.py b/homeassistant/bootstrap.py index afcd2717e72d61..7f8c586fd80595 100644 --- a/homeassistant/bootstrap.py +++ b/homeassistant/bootstrap.py @@ -28,7 +28,7 @@ ERROR_LOG_FILENAME = 'home-assistant.log' FIRST_INIT_COMPONENT = set(( 'recorder', 'mqtt', 'mqtt_eventstream', 'logger', 'introduction', - 'frontend')) + 'frontend', 'history')) def from_config_dict(config: Dict[str, Any], From 1a635fede3b5ae6c6de3bb01328f7ac0e1b94d02 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 19 Apr 2017 09:15:39 -0700 Subject: [PATCH 119/146] Tweak Tradfri (#7172) --- homeassistant/components/light/tradfri.py | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/homeassistant/components/light/tradfri.py b/homeassistant/components/light/tradfri.py index 9626b0984858da..542f8dae8ef2e4 100644 --- a/homeassistant/components/light/tradfri.py +++ b/homeassistant/components/light/tradfri.py @@ -46,17 +46,15 @@ def __init__(self, light): self._light_data = light.light_control.lights[0] self._name = light.name self._rgb_color = None + self._features = ALLOWED_FEATURES.get( + slugify(self._light.device_info.manufacturer), SUPPORTED_FEATURES) self._ok_temps = ALLOWED_TEMPERATURES.get( slugify(self._light.device_info.manufacturer)) @property def supported_features(self): """Flag supported features.""" - features = ALLOWED_FEATURES.get( - slugify(self._light.device_info.manufacturer)) - if features: - return features - return SUPPORTED_FEATURES + return self._features @property def name(self): @@ -92,8 +90,7 @@ def color_temp(self): @property def rgb_color(self): """RGB color of the light.""" - if self.supported_features & SUPPORT_RGB_COLOR: - return self._rgb_color + return self._rgb_color def turn_off(self, **kwargs): """Instruct the light to turn off.""" From 9b43b39370cce5aa724c70b7982a853d839890f6 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 19 Apr 2017 09:23:44 -0700 Subject: [PATCH 120/146] Update frontend --- homeassistant/components/frontend/version.py | 26 +++++++++--------- .../frontend/www_static/compatibility.js | 2 +- .../frontend/www_static/compatibility.js.gz | Bin 360 -> 362 bytes .../components/frontend/www_static/core.js | 2 +- .../components/frontend/www_static/core.js.gz | Bin 2682 -> 2695 bytes .../frontend/www_static/frontend.html | 23 ++++++++++------ .../frontend/www_static/frontend.html.gz | Bin 139925 -> 140243 bytes .../www_static/home-assistant-polymer | 2 +- .../components/frontend/www_static/mdi.html | 2 +- .../frontend/www_static/mdi.html.gz | Bin 194700 -> 197240 bytes .../www_static/panels/ha-panel-config.html | 2 +- .../www_static/panels/ha-panel-config.html.gz | Bin 17135 -> 17179 bytes .../www_static/panels/ha-panel-dev-event.html | 2 +- .../panels/ha-panel-dev-event.html.gz | Bin 2720 -> 2728 bytes .../panels/ha-panel-dev-info.html.gz | Bin 1195 -> 1195 bytes .../panels/ha-panel-dev-service.html | 2 +- .../panels/ha-panel-dev-service.html.gz | Bin 17941 -> 17945 bytes .../www_static/panels/ha-panel-dev-state.html | 2 +- .../panels/ha-panel-dev-state.html.gz | Bin 2934 -> 2941 bytes .../panels/ha-panel-dev-template.html | 2 +- .../panels/ha-panel-dev-template.html.gz | Bin 7350 -> 7357 bytes .../www_static/panels/ha-panel-history.html | 2 +- .../panels/ha-panel-history.html.gz | Bin 11892 -> 11893 bytes .../www_static/panels/ha-panel-logbook.html | 4 +-- .../panels/ha-panel-logbook.html.gz | Bin 34883 -> 34871 bytes .../www_static/panels/ha-panel-map.html | 8 +++--- .../www_static/panels/ha-panel-map.html.gz | Bin 44162 -> 44154 bytes .../www_static/panels/ha-panel-zwave.html | 2 +- .../www_static/panels/ha-panel-zwave.html.gz | Bin 5936 -> 5961 bytes .../frontend/www_static/service_worker.js | 2 +- .../frontend/www_static/service_worker.js.gz | Bin 2506 -> 2514 bytes 31 files changed, 46 insertions(+), 39 deletions(-) diff --git a/homeassistant/components/frontend/version.py b/homeassistant/components/frontend/version.py index 408d40092a022b..c060256408a94e 100644 --- a/homeassistant/components/frontend/version.py +++ b/homeassistant/components/frontend/version.py @@ -1,21 +1,21 @@ """DO NOT MODIFY. Auto-generated by script/fingerprint_frontend.""" FINGERPRINTS = { - "compatibility.js": "c679589d32e0588becbf104d9907e96a", - "core.js": "4073d1aa7a9367ac39f33f43c34b51c9", - "frontend.html": "1f8de6ac579f877695ccd06a60a8d703", - "mdi.html": "989f02c51eba561dc32b9ecc628a84b3", + "compatibility.js": "83d9c77748dafa9db49ae77d7f3d8fb0", + "core.js": "5d08475f03adb5969bd31855d5ca0cfd", + "frontend.html": "32bdf1e9eb7b2d73682a65cfc5ded063", + "mdi.html": "d86ee142ae2476f49384bfe866a2885e", "micromarkdown-js.html": "93b5ec4016f0bba585521cf4d18dec1a", - "panels/ha-panel-config.html": "41395854f8e541c9fee32615e1fc315f", - "panels/ha-panel-dev-event.html": "1f169700c2345785855b1d7919d12326", + "panels/ha-panel-config.html": "0b42cb4e709ce35ad2666ffeca6f9b14", + "panels/ha-panel-dev-event.html": "2db9c218065ef0f61d8d08db8093cad2", "panels/ha-panel-dev-info.html": "61610e015a411cfc84edd2c4d489e71d", - "panels/ha-panel-dev-service.html": "4a8cc058f68f737b8129196e3033ef37", - "panels/ha-panel-dev-state.html": "48d37db4a1d6708314ded1d624d0f4d4", - "panels/ha-panel-dev-template.html": "6f353392d68574fbc5af188bca44d0ae", - "panels/ha-panel-history.html": "c136dc6b97bb7c619b33f12232cf129b", + "panels/ha-panel-dev-service.html": "415552027cb083badeff5f16080410ed", + "panels/ha-panel-dev-state.html": "d70314913b8923d750932367b1099750", + "panels/ha-panel-dev-template.html": "567fbf86735e1b891e40c2f4060fec9b", + "panels/ha-panel-history.html": "be115906882752d220199abbaddc53e5", "panels/ha-panel-iframe.html": "d920f0aa3c903680f2f8795e2255daab", - "panels/ha-panel-logbook.html": "5cd70ad9981d846c9bb6f57b0adfe0e3", - "panels/ha-panel-map.html": "e3c7a54f90dd4269d7e53cdcd96514c6", - "panels/ha-panel-zwave.html": "c014a55b05832b195339aa1dde98c563", + "panels/ha-panel-logbook.html": "bf29de0c586a598113c6cc09ead12b00", + "panels/ha-panel-map.html": "31c592c239636f91e07c7ac232a5ebc4", + "panels/ha-panel-zwave.html": "f52d0c001f48e0c7b33a172f3a71b547", "websocket_test.html": "575de64b431fe11c3785bf96d7813450" } diff --git a/homeassistant/components/frontend/www_static/compatibility.js b/homeassistant/components/frontend/www_static/compatibility.js index 178d14688ab5e7..c152c50ddfa5ba 100644 --- a/homeassistant/components/frontend/www_static/compatibility.js +++ b/homeassistant/components/frontend/www_static/compatibility.js @@ -1 +1 @@ -!(function(){"use strict";function e(e,r){var t=arguments;if(void 0===e||null===e)throw new TypeError("Cannot convert first argument to object");for(var n=Object(e),o=1;ok^!5QX>t3X>tSg@s_n z_0)EzLpQ|WgmZA~o}lngrF;B z9(-SxegQZJCRar$ONrZRXTx}?VIbh1P~h-bGL7q>2(IfwgV*a+?!gCy44h)?;yzXA z%M-Gmt@OBIADVuum-GD_t17mM(aA9<5Vrgt?ba^gna{xtiw~5QX>t3WovNiiMIj z)Kl9z9lAvs3^^0G?in2hgn<8E(%@vV-kt8=_k0^}S}cS0$i`z)FuDP+-PV z6Ik?O!82cc!$K9gS;lWDRLB1o2O+)M=l=D9&KzJBuDRcC@3E{3Cx3n>+9+ky^p@zR zM6`6PW%dI@!&iGNgw$#$OXZ@kel2qyy$j_|`YcV{tsoqG{3Ks59~s`EDaqDhAy`?6 z{J}SAYBInjFzLcUnsPi9XJwa1%rik~2^r3hBhzyJm7tr(Rya*-c>!Y)B5;i@llxR6 z$0y{l*~{g^##ZfG?_^IlMBQoE!U1M6^YOlZ09kuC80*}DW|75$i&=1yzx)CHG3ap~ G0ssK6(yn3v diff --git a/homeassistant/components/frontend/www_static/core.js b/homeassistant/components/frontend/www_static/core.js index 7e0557be497a98..df563364eaa6fc 100644 --- a/homeassistant/components/frontend/www_static/core.js +++ b/homeassistant/components/frontend/www_static/core.js @@ -1 +1 @@ -!(function(){"use strict";function e(e){return{type:"auth",api_password:e}}function t(){return{type:"get_states"}}function n(){return{type:"get_config"}}function i(){return{type:"get_services"}}function r(){return{type:"get_panels"}}function s(e,t,n){var i={type:"call_service",domain:e,service:t};return n&&(i.service_data=n),i}function o(e){var t={type:"subscribe_events"};return e&&(t.event_type=e),t}function c(e){return{type:"unsubscribe_events",subscription:e}}function u(){return{type:"ping"}}function a(e,t){return{type:"result",success:!1,error:{code:e,message:t}}}function f(t,n){function i(r,s,o){var c=new WebSocket(t),u=!1,a=function(){if(u)return void o(C);if(0===r)return void o(O);var e=r===-1?-1:r-1;setTimeout((function(){return i(e,s,o)}),1e3)},f=function(t){switch(JSON.parse(t.data).type){case"auth_required":"authToken"in n?c.send(JSON.stringify(e(n.authToken))):(u=!0,c.close());break;case"auth_invalid":u=!0,c.close();break;case"auth_ok":c.removeEventListener("message",f),c.removeEventListener("close",a),s(c)}};c.addEventListener("message",f),c.addEventListener("close",a)}return new Promise(function(e,t){return i(n.setupRetry||0,e,t)})}function d(e){return e.result}function v(e,t){return void 0===t&&(t={}),f(e,t).then((function(n){var i=new j(e,t);return i.setSocket(n),i}))}function h(e,t){return e._subscribeConfig?e._subscribeConfig(t):new Promise(function(n,i){var r=null,s=null,o=[],c=null;t&&o.push(t);var u=function(e){r=Object.assign({},r,e);for(var t=0;txiA7PEDfW!qFGKJ54P0_}F_7ocaEjx=PB zMJ9*H;#AJX!X{IL+(2za+~y~S2-lH>Rf{Zhfom?=ZWE~!6_&Jdv|3eM9iF65k&r&{ za>UpBpkRF>M+hh|^UKRQr`bJgyeet@{{+0kGn?5>i<|Kb@)b=n74Fc=b3@?iB}mI3 z>c}SnuMJ5Rjuh9rbW#)4%o1kV+77%~9f_9)vo88W=vMxq8YEYR6e5)QYQ?kSPa009 zJT|`rJVxrR^K6MsjI-yBx1v@=c>C}ZV(lRSi-mM|doDPzV4fG#$Acp<#Gbkkb)j9X5^EtfC3ZIbdpmF-x3f9 z*v6>>j@a_FP9@=)UkrK82>z6Dq+Kxa*i6vIC^Jzb7@^{B44%i2oxgOdW9rz>Is>^U$+?Z2=9y&5>(zl8lf=zpdX(tZdOVz z0}nY>b{dTULx+&BbE0}(e`JLW_D1YD?5MDo!+>b!&bd>&^=y?!2__X%XO}MFPE~m* zSP=HA1C$$^k}#jhmSmIu8EPz2WR(>Ej0uJmStV=x!$9`HRFphBe91T#U_8ZtF=`t{ z>gR}tbWnvWR~s`kKA63WxdxC)zqd*(4i*dKVv}O78;o9!C3PiI8XSG7sdY+shP zl(_TaPel29Ugz(q%HP9W4uDV81)rF}Cr0p@zX5#G8hqxjfsa6_AY07hWh55{C=7V_ z_iF(~kcZ+}lxGK`Jbhb~KecK=l3gnoOU2r@j_253@H|A{ral{6^fNnJcXelmA*-=) zf5_2Cn}`_5sk(s}Jq;+e$_~t!3~L4WRg(rMlmwei?F0@(3A{D{U@;On3zg<;2fg|U zXD)Q%I0A71XG1~TVhxchyBlg_i*-h9;z7OBy`h53U@bAk=9sE*NsW0hHFjovXAY5J z+Rvr=35hQ)*x3GG?SsgNCOTF2>ZM2$kOPL}Ed@7I*t(TwAm>r6Rd|U5g;!y4fd>zC zfA^OcwLu3Efy~!Zw zZ8+wa;cxtB_&dMuG$eW{GA~!F5WnbWY6|Qu)TaJ6Ls%|7MKbx4ARBui3o8n+QK=a= zed>4Y+yQ42x`r^rGsM1R1z(FUHyjxA9uPxZnqaLZm&7pajacOS;M!ZORHt--(6pFg z-#v(&axgK=3=w&(^@$pRW6k-1+-z_~*{=7*X3fo5ORd4{TDLt?9f<;o=>wxc78bfk zoschfvr;*IiAn1riXXW}K2$PD&$=25p#&Er<6NkMX_cC&BeN~i)lSD73z-Le%AA5C z_rN4ZE2^_90@`~HlpSx`mMXaV9>Xeg0(D9kVxy6)iXerRPv^X~LJoLf;12Kl@`49C zo(js`-rCN%n%zbW#^E`)+`PKzYBQ>f#(^HSSPU{Ly}l}gwaZF(Nd~x;{pB0@sbl<# zM)(cf#4&E&9`#jj@*p?5-7XK?@-hncSD04Uk8e|9S%v}oud<4G= z15CY83*q;bB!_m3F^yCH?ibQkVNxU7geXms(p>#_Cb9nQ?<;H|a?2Xr)*M~Jzrm>3 zrF2!_5VZo>j-SEn=Oc{D-3|f5u`6BEU+N|`oQ30{u%0y-U2Hp>d~(4%u_wkv~JzYR}!D{ zmU$<+7~)eNk6QELX*x6Urw10sOCKB{wYOfUa^d*F*d}MVQ1*pF6?mO zOjo9jFjI4LS_n?fj&dXSCwCC4B$T%@X{Mbb`<@N}ed(rFPEJG?7t5*j3=Uir+jSt{ zHO~hAIX03qw4vj`E6^Oh0c*;E7XiD_Z5{yhffg0_pazna??`|D8tJ9?BygDj0|x`? zo)c!!IlhHO2jL|!kI-LcRCqi5t~%aa0sI%--PQN+v&)Y+H@Ek*%iEiqtIK=;meb&u zn?FBZfB7`~`0xAA{w0sm3p6y!_BXt9qvl(3)z^X6MW-O(%U#^BySAzH3o&;^dU z#WA&Lr5TxiL@pQQ*Rp-`uP*Z~kym#*Rn&OY8y{SEbXCo?v&>vsRky@HQuPSRyk15d zv51h#XjHE2cMo($?X-fUUgfnIdet?x>%6b-qqoJ(&&(;J$YsIb{s)XF0cVFG0015g BEja)H literal 2682 zcmV-=3WfC_iwFo->GD_t17mM;WiD!S0IgYDZ`(Q&e&1h_>cJp4tQwz#eUT~z-84Au zqD_h>d-`A)h9Zq^HV);bXy;@d|M#7tZq&t21MEX$i5w1xbNOb5dc)=$l^B^R#&_N( zhm+iBnHVpu#!r9&-)S%#t#;;V4S^SL%+eF_TF%ySoS@B3#D`RxPrefiObx-8R-IGAe14c(tmydLqppVyOZU zj;v`(%MP2aLe^5XR2!2jIy4&c&B_qh1ofK-Z^i<&&UCO#vJ_Ay z4>%exNF@%ZIkPHtjHX2{vO*C_q~P)72i)Cc$vqfmxY$IO65ec{1Jt$A2Yn&(O7%DAz zP#md+oIf#O%C8AI=K;gxpNYgzRvB)?d3dKGz7Lxnq}s+Si5s*Ddvw{o7bL!hhinU% zt{PiYZA`|Q6o5o8?E7A4cPe_c9z$+Ju?e;Y2G@@Wfi&^kuY{T8(`c7M1GXMUg@jd_2RoF;U})pd_64CTkyKQ7z~V||_?MuzQKWtzXh;WDxMIednTx^9 zT+B6~OZwe4m`1pRz^2|q1#Aj|t;BPnFfkM9qdd|)&15=_WR;Days<7&&tg^|MWN0H zYGPbgh$0P-yI+xKdMP68uhN<$CchS>OG$5sVx|sn%X%O;esvp*$^fq5!tqruVOb}#gwlS z-b%t5RcM$R;|dev8WT*732}`HY-17Xm`~?K&{wrh!hBzrt(2TM#ZOE*dS2(~xXRJP zTn>Ow+y$S6z$ZcQnZE*jvKoBmFM*Fns32R+l4YzG7AP!O_xD3b+7uvhB)anh(Ve|6 zx*uBg9m#Ao!!oe8sposH^`D05+tjCHhkoWp>8|d!FjNf|<#!wO%_b5Ca;Isa#b5?T z!>JCu*i7mK_GQ!bp_{myx``Tw5_OHxfaON$Ep)b7d+5y%ICE|ahtU}SI2&o&7Hfq} zyB$s&Q=BtmV-EVQ=?xWJ25W{PHpf(jOKPlxskJi~J9~&cFk++ZBcy?H;NtQBYo9qo z6TOk{>ZMFmPy>b&Ed@7ISi6;GAm@?1Rbc4@1y*5jjRy}+fA{BSRus$D{W}hG?>fvc z`-*Diyw-`g5*|mR(q9Vye8Exbv!gD)Pz!B3L*wAry~!fxbu<V*8Tn~BQl3rtjZadIyl@}V+8 z`OZ~W1SPOo8Rt?LOslj+U6*T-u68=!Sjar!Q}z@TwFf3KQc;~%;&1OcP-?tpTdLaX z`w6GC3FRBQ;2MooRrpA(b~@*+6>`7>LpHqY^D`dkcp514dTTrDYHsT=7>8%Var5c| ztIen`6bJgyVlk++^!lpwHH??;k`8by+saq)lgIcK&F(9>>0{iwed&wb)In}^TU{Qu zCv9j)VHAk1~uP`chCSBDxM6CdJ<7e<%`3R$Ow?lw% z?5fuGl%`1yr_neptmh1dSbe9cFVm<{Pa`~go~^bJD4~IpMN4vH&PxZm2b(>y(^#~|$+3z0bLww5PQ9C|7O=l+l z^udIS(gz1f-L2P|T6n>JP$?H(s4c#FSQ}!>a5Hpk7k;>CrYq4#n5n%PEd-}VN3xjx zEY5roGx+Ic6QM#JqQNUkD$B7-y zgZt|BWAUl;p?WWl@;MEj_B?#VN+f&qKYjRd6MYl)+s)1Fo2TBpcrD*O z!d(HC9(uIvPvf&1?~6}GSWtoehFgDhW>oe8xty18 z%l64{7!MqgS2rfp)OgezA6$2IRn4@s%wAJfH^V \ No newline at end of file +}()); \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/frontend.html.gz b/homeassistant/components/frontend/www_static/frontend.html.gz index 90e1acbd1c78ebda78022b47aa20908668eff1a7..3b5d1597428325a6a9c511cf029b8f0912bf3606 100644 GIT binary patch delta 138333 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%0A_Kg^r5&=1Yi`A^gBD+Ti4r>tIvifioQM!B^w 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 L?>aN1O1%gGz7WL{ delta 137873 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
    LMd=?;CVSf8d6h} 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

    q31SSW;X7^*ZCsL-*IJhph^Mp3ax#6 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 T;pVDJ$OHFx;ldX50JsPMC$tR! diff --git a/homeassistant/components/frontend/www_static/home-assistant-polymer b/homeassistant/components/frontend/www_static/home-assistant-polymer index 10d09a9408fccf..5469c425e76953 160000 --- a/homeassistant/components/frontend/www_static/home-assistant-polymer +++ b/homeassistant/components/frontend/www_static/home-assistant-polymer @@ -1 +1 @@ -Subproject commit 10d09a9408fccf03e989e071ac626e6a06bd125a +Subproject commit 5469c425e7695352a8402edd1fa6d36f95f0e083 diff --git a/homeassistant/components/frontend/www_static/mdi.html b/homeassistant/components/frontend/www_static/mdi.html index afb3f013acfca5..8a4662d482fab6 100644 --- a/homeassistant/components/frontend/www_static/mdi.html +++ b/homeassistant/components/frontend/www_static/mdi.html @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/mdi.html.gz b/homeassistant/components/frontend/www_static/mdi.html.gz index 638f13140e4bdc1d4d3df02c5aa0193a959c0130..78f55cb811ff9790e1f3dcf44cd6abd83cc786dd 100644 GIT binary patch delta 191974 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%0DII?vl1{R!j(m#;rd>WDdpsZ8MWd$es=UnhBxf#J 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 D<@Nyt delta 189485 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

    g^T)qH?Z#x4|06y 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

    VC1>kS~694>9fEa{zuFvo9_^Z!HLT+b< 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%0A^k_Xe_$-6GUhpCXl%df>j@Rb%mP(e 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⁢W*=5P-WQb29 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 diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-config.html b/homeassistant/components/frontend/www_static/panels/ha-panel-config.html index 0dd41d2581b18b..bbe911e4959b01 100644 --- a/homeassistant/components/frontend/www_static/panels/ha-panel-config.html +++ b/homeassistant/components/frontend/www_static/panels/ha-panel-config.html @@ -1,4 +1,4 @@ -

    \ No newline at end of file + \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-dev-event.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-dev-event.html.gz index 4af3bed93ba641e0242eda70f26f59814a27ab04..3d3ac6f70aa8bf72dbe07752d7827aa4bfd91e8f 100644 GIT binary patch delta 2631 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 Whc(aqa6Q&PbpHqH!|}@R9smF(bu8Zi diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-dev-info.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-dev-info.html.gz index c35637c53a865c05b16de0f20e998da0e90c4d06..50b91dba1161c95bfc7ae582306ef79d976670cb 100644 GIT binary patch delta 16 XcmZ3@xtfz*zMF&NOyBp7>`PbxE|mq_ delta 16 XcmZ3@xtfz*zMF$1%YEra_9ZL;D5C`6 diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-dev-service.html b/homeassistant/components/frontend/www_static/panels/ha-panel-dev-service.html index 06ae2da147f2ec..887d95325d63c1 100644 --- a/homeassistant/components/frontend/www_static/panels/ha-panel-dev-service.html +++ b/homeassistant/components/frontend/www_static/panels/ha-panel-dev-service.html @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-dev-service.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-dev-service.html.gz index 408f974b4e50d04807b0c383b7157606b8e73b63..5ac8c8c977cbe25dfbb26d0e17e5dd893832d6c0 100644 GIT binary patch delta 15233 zcmV-{JATBKi~*U90S6z82nfuM_pt}M3V#m|ld)vq+%XPm(cWE$PQ4+PRjjs+c+!Ir zk~&n;m2(aO|CzUo4@)>omK9a3Ca^$f>?jxnNA08~Drta$%Q!jAmtwn+`+$+pBR(k$ zdc{<|Lkqn%Vrp#4iiQcZYOq97DA;HK;RIkfINFDt9vw}wwN%)Ke}}=L`PM7N^nZbA zXA!_HBKZEXSk-^d%6VZ}mQ72Ju5=hW)ihZ}$s1S%WhY_lXv7J94=9P!d9r=Lc)gHw zO8TkxfB>~{W7vG;K@S82Y4*76#q=Z);#^x=&r*rSni{v7~4n{q<>gFa=gcR zAy@3=y7ymTW&$uss%3KS{5{O<%74!G?(7i;6I)fJqs2GFDU70=LUQs9}J zpprp;khRrj$t=By0#Yi|cZTJ@%psjXB%7g?MC4A=_Nhy!+&pvw)OdVjCRb%QN{Y@p^H5vH6jL`dDCWA0!~r_;;MF- zAT0(;;fSs{?8X)Yp$^L^ha@vDi0oq`)apLbE_h91OpWHM&L+j1BkLA0#yIxK&UD8a zZK#{@oEuCoBGn;s&j&dSwgymZc`>q+z<~_U=XsshZ2{%^SPFLCc7JA?W|@_z=jWH2 zWCqmu0{0eko@5;8U16Vjpa(`wEx$D^FQYv|PTKk3ldMN*$r2 zX)E4%7zs6!mNGS)Lv^P{9+h|&Ag{=d(%=|4JhO&Lz_l6@O`6k1VxsFqya4?aOZSt& znBaF`m?Pq_URF5{J%1tPM8l1z3epVdP)5A65`=|-lUwXG1ppc5h>Y?AyfBvPBeJ2* zq3dF8Bn^E^C9I5nk{8)(gOjRevI5diGO5v^gflkPIiM8k%r$YIpNrg+WBPG=;yCwBE*+&Pa zwxXM`O7h!cv(Jf26gp~5hkfN5_%u)q587b;JKi11K@Pi(=RLoMRlLSlb+sBnoem6? zd1@CrId;qF7=24`8YXf&({cN$*@u;-5fAV2|1I=otI^rzRN@`>Xp7+3njKw-XJq*; z%&rE>YCy|-qJNEgyD56(Xr+4nVTIa9w@W&{goSA4>LG~9)!aY!-`4nCwj*2LNB?9u z?6VZe(G1>XpV<4ly3HGgtbj^qf-wjx@_P#oQd~;l&9Mt$2V_AlBWf40B?ENhM4!}G zc!;FHjT|)htkrCCdcvGt!>MEQCOyB1S796HWc487B7cf&?IYT#K`ODoB$*baIN^h? zb*oEt1FJJ`?P9>Ngq8r=rlqKV#)fblR>gIW+dRRqUl^_ln`4LGmCyxAtsRiftKtqN zteRSgFq4~biMz_DD5U3U+ogA+vpx;k0A5E?&4zij(H18sc^lgU_D(E`cZ)C|7%{oi zshWnq&3|2Lq|AH6cEL(>4OB66*;gQw@*Rw}ZLAI~QYRxorH!jjpQNvfZV?CJPEEg7 z>IT{1cw2+2UIhT4T=UaWENpHX%y0@gZBN*=Jvxd?+a})?J#R0h%Bh2IgwU=#1a%gd zd`)v0B!Peij(7|oAHy6Mgz-xs-n^3Xw3UH<$$!NrOjU`^M(S3FfXv$pcWX#hQoU8f zObeSF@{-8{4tA=+@a27Q`jM6I_V2y>EKBtP-V#(@wt)DE|5p}XAd8`gg%wc^} zZE$|Ef_LwT4-Z{9MpHL8y{=H}180GqwG(?_(HfUm_JB?JI&h`~TUW|@n_yMKMgzT` zcYoM`(`h(h{Kt@eMp2+iHO%Yc=X*F6)%{T9!ycOndgV}(?H{v-as6cEF%9#=Ls<7z z`~CQ6;k`PgyCT{ylk))IurVxMR^O1iMV^DhLtY_o=x?a<&qo*0nf^6VACV3mavEwN zB~ZGK5Vc_*&lDn?`4H92i>PJ-QC+9AZGVXB+CWs-e4?}NjMdOL457yTjW#u2mYc<+ zG)NX$~H{5VfX)BHq!PIEvh)FJdlP$hS( z1|~n%KeWB8B^j)@u53*!t0A`vsGLG)6-Q@)wD_6F(woS2&DSr=2CIe*;9%vjAAejk znjZg+yeVd^`T7{JCwvM4;#l3FeZE|NfP)B}x8I*1y`TDSU)`Cv?o3?u4^~&)T?hTl z{=NcW%d_HRos~^S<@>z{i|VE?&+^r~#NkO#J^VfV23_@fuVh{3WsbuDiD=$Yp-Vid zz{h^9-mu%Me$aAMdC10fV#4`DV}F+}+ip((v0^Lse13<@)24$E!4yQ?6#d|is~eWq zNhp}iym`y+)#@Gy6RFl~^Fj!=))w>+jW?mT2^7G-NZMEMmK0+W#Eq6x_amX z2Hcv|1Pfv2$#|3A1?V-G;ewnw1DmKzJNhD`%{B`nevWKa8&v>s3xj{HT7Nh^SZ%<4 z<^p+N6zfMZXJ%W&YYOk^xm|U&g#KGiSuh|7Z4%Uc<}1|>9(jW)i_N)BJVep6T}@x5 znDtge0q2%R_&#eFA1i?)@Wa<@i{2Wlgq+;A(%KprMf@ic??&^@t*g~C3_d{ipsfac zh(l=+^qgd1T{Yfv=Ygm8(SH-x?IIGcQm>m=x6AgyH!+j^w$T}RQwpRj@TW%3^X9$$ zjW&E*b&ZSxG+nas(&ybL2dx_6K{tB zj16ewa~)p~>1>-P8?lf>7a;BM5ZPs*g7`7y<`$6>cT60vuwdo%;3wzagACMZYnUOFxJMxc$?S}6nD52Z0V-9h(-dEHB`EfVABIYv+5EIMSg zZQuqV8LsV~Qx|$jDu3Qkj15-GKAQ&}*;W1`HV&1>W_`L{VYKkP$jTqt>zfisAGYKd z6dC@>mzR)tOI14pB1-~uF6>=#iE#~b?)>zD^S9HdOt_=^A6VPM9D}@h?2#m6~eXl%zx8Zb14`gf)oDGNaS+V z$d&j{jsH|2u2d(|1ATgQR7Iswqn%e5QGERWzd9baz?t#yvsy%}kR#0_(}4`r$|#B^ zwcbjueMs=Cg(o_KU#zc%F$;GFQ>F5d{_%43$vCpxG$F=E=@_3~8`+YtnvT0!Kk?+$IpzOtc=pv$`$x^0C023|nu+&fY* zgo$(t*~iw4l|{W{yP@MQK9nKq8rGKn-hGA_SNJszD}PRq63v^vVNC;z{BEmXF>icl zoCh(8P;1kT^KdCz`#`QlQs@P_Bc|9)+AQ% zq(q^A@{=YO9v#Hic-^vFEl8EPPlwXy6K3HVdY^crE>sD_kciHcVHO=A56<-4N8WCc zlgaPV9riY$FhgJM3mdxMSU+Hsb%Q$)lb#kF5eDGuRc&c!+zh@(fS#sZTq2Xp794-V zJ0C~M6FkEg8Dhv^HUrffhbqZ`xzn+cfY|4M`|$29r}v?O7BHTeffF={H3Y~o_zAj4 ziMAS0J6sYOTtn9b(b@nQ*dXr0M-jxBXT%3Aax9HCmY4?J5DfE`m2FG?9v?Elo-!+{#`VCL zCB|DA3#!SlDCkRIL7WlKPivbK7^kP`1G^5X(ccIbgi`2YPNXE?s7COxi0)BnFj6kgzuAFI#(m$!2uiH#oMQrwq*u>!hz z`>Pfw(|cKX#d-s78qtUqtr^QOd%f*;w4pDaqP)V!=3F=7@d8XR#@l~&UbOuec=;73 zXaiQj6sENRpt^95OGQqFq?7Ws%5NL-k~GEMl043_xcV&6tSG2mjxj@#UbfZEjdBW< zg9UWUvf576+vSTb`sdjBU5WSjUN`Ug?Rg+$>gKPZ9^fk|)dJ!(9vJiEpK4(ul#&Um zRPadrkUj&HEm*OJXYGG#@4~n}+(UTiLhw8OJMNzGCiX?5=Ve(z6Oe*F*?{<--vO_i@vwB_(j#t%Yr*&Lm7vfX zLsGuuxYoHc*^i1*g5XzYE3QOozIemj%^{tGBW7km@n%J#+G?vf;5P{C4KZ$=#wMG&&xIEPj{V&VDfqO=H znvBnS$DMtaah8nSWGs5#Zwo)a`}TzBrSS9+?CWgce+c%E6(FVPUemcn?zDE^yj6t{!)* ztE5Fik$r!dj1P&hPY;B80SH0V2UqIYU_W(B*L;KyRKN_s;@xQ%h#I+}2Z%&Q@P@|tWhweMLO;wyJ4rEE?!GfWSRMhvlC?El0e+X!`UCd#p=5vCLDHt5`VI$y3X;W_;A}g_5bCDifvWk@ z%Fc(Wq+%^SIADh7q1XiBTR@Iw#1(eCdEQ=3d-&R1lylfviJbCCangRWlt+{8{HIMN z&QL>VvzmN`LarL#!V?*K3~{1{=7NTiVNc+I7Q|d$iq|rF4$>H#&CoSl_VZrM@E(7Z zQl~miW;TY7SuIbnuU{vIHG%MeDK&xC)v>ZvGxRjk#oiYeNuYXs;`H+}o?%A@uvFO=j$ z6F}N<4-U14Cv^m-V$(T+BL53nODEj3HN!sCxQBeLpjQkuiVZo-I?>(-cRHrU8%8hM zFVLPT23npTwv32d)K<&)b+ycH+-LI0Uq#Oic@V%oEkEhb*9i9ZEO?r^>0*ETJ2l7( z?EN$i7Tz~p&%fNVd7cf>kTie+Fjfw-ay|&%-_-g1B8mpQ!Bh1J%jq}k z?p2tLCzsx2A*cNbe|IKNUG+s$$i$DS!>6`{$!#64CpBiKLgbKk_3W zgG@sKbnpj;&ygn+6ZKPSWYUt@C7{6R$+6j8_eKgQ0;eZ(x+llouYI2AIB>%}?07~1 z9}sxV=2Q4N_{%gp8@zb`muT?r!yx?I{3tq(FhBs{jPvouY5K#|eFA@k065-ZQUzdp zzj$c!SyoUe8K24WyU}P9XN}ifh)t5U5D?q*o+1>HvNLP;6qDId5+U%3ZaZ4o$L#^U z`;DuHx3dN~y`?Bbv0~l&dnC2WyX$N8a_xx=V?J@`+9vkninU+ob0+2nl_mIEyC6j-uxIgnJwA8@5@4KAc zV=xCd+KT^^Op75$TW~Nn)X+GjjUia7T`HVR+07P%y98I*z*L$BQW`9@+{WX z^0E)zDFVcy%L-tMNZ(KXvOi|CPiRok(&-?)XZ0`D{bbBP)m-c9zFP^2hhG3mgKr94 zBq#o3)q*HzUygs$cIwDX!G#jBkN6h&8!+KUv|;X%XhlGQ``V4np~$w@C@feXHdIl&S#?N%f7;%d4ewXBs72M$Xrt?&J8COpXHS66u;i5TrN6 zx^Jtw3MU0XBMv)W(lM9AIt1R49qFsj(G(o=+r0c$TT6cl0??VB-1X;})%25^cy@yH z9a>X(EJpOYkdaJxWi4Z)J&IU$F0#$BgX|+j1l&}Vdy=&MgOF~z^AN=@2*IFI3+Q~$ zGud?>AJLyj0fjX^Bc0~=ht#t`aeFet!TR!!+NaFO9*7M2tTHglbLc7SKS9wSJjojq zMR-@q9*2LqOw^2LnJB%xGHn^XT*E=tx>J{up8CcX@-0f~$nL6^E=3C2s<3<((!eULT*O5tq^{Nqr* z(C}jLQpPUQTWc!&T^gdJrK!>y0Ve|3kZX6$2v&bmXLHnP9rO)&T>`jOBa3wwc!Z1WJ-8hcm_V~M4*1BV?Mx2Gcwsgye=5Z6P*@<3@a}InXt8@L7=ceAbXETO0C`e^6}?XlDnX83vz)N&huJG^|5*8hzx&9 zjWpLMX!J4m9ne%CJRc;_h#dmLm+N04io47A+XxdxX6{$cy5c8W#{X_YXu6|1!iIC^1=hM8TVN#@ieIjvcedT0dBw&Am-*S14;Y*rRZ zgUBUGQ-=t7$P)8#{;5ZvY<&E5>SKR3Wl6rRA@@k3U0ZY%>lenu05?FTrukXu4s|iq zzV;lX@G4=_4{`4?+ZB~ncSn!OZ|%{k7-3+>)J|1qd5qB4u=j9eUthmvY>pmU6JwoK z)i^&xc$=sM^7YWy+>Lk<1G^C~Fh)utM(gMZBwvmSu(^bf9ZttvBQ^y}elE#XJ=LUn*)d z`46}=b4fdYc5UCof13JaBzM2unkT7`(02@g4(_rSOQ(Sz4k8-Ln1?~vN%io%Z+yx> z71T+Ry@#B^dg%)~4Ujyj1W&Lep< zmPY4+HxY#f&xpAE^%_{U7gPEs^IKM}fJ=?X-$zqT@r%OIOEJHgDd6AH<70S!LC9Cc1vFbCj3eFd6zT{Y=yY2(vhBnj zI%y(XnMy-Ub3apf>QGC09P@@aV&!A*@#&UDHMGi=KAy5Co{qx3xzxyFQ^lu#hSIQa z^^-+(+;AsLoQr?gxu%hieRk6qazP~GZ2OP{m!*3INH2*9ztuEPt&hb%7)3r=;5RVX z?QdnUdn$^>SGo44Y$z0}MZ~-zEs-io0bYbsYxYJ%}U&7%)PwM;& zc*_8CN;}BQK|!W4z_Wpr3O*pcXLC8k zz8KObQX%K@8ioKzQ7niV%rM5_jij7nrl)__9AQ*FaVB(6O0HMH=hVd3VZkFA`A}3= zoN$D}A=Q5^CYuBH z$vXrh7v{XZNEweiWDeF|u>bABdd8~n2W}xU0NTK@J8J(%P&p@LWX>W_?O(&#!7otjw!^3~VGdYP7(zH1%CZ4rEUtA#fR~;T! z+p8l2&rd-_63C7N^^rcO96_|&Yl-!zm@6Lu3FL)i^8~vzT#ceG7HSC$etF^+ks?m1 zx!@WF&dUpYEJF{aWi}8T;X4;o68<*Yg(JNbwjd*Q*)5PK^tPGOn}~f5>A;`~Upi7+ z(yM>jK5fk?c4?l^K%aIV%V*tBb)!b|Ps(3KFE1I_7b@4hy4*w)O*QC&W}sDHs#o-} zW}dXp>Sn-v+Jkdq4^NnS(tKr&h%+N{N30GXuc0GJF35@U@ zF1YYZi^5$(u$khCQ2jbX^qYZZ*8nBXHn4xI2;i)Tpyeb`kN6u)2XG4BWKY91sJH|` zKAg&zcCHHO3$BO?_C?Ea;vO;}fQYwT zQ8%yO)5SObY*wsI)U`lq7i{K?|LoL9ntz({W;9RQhS(@zK`&f$oTse87M&$Zih6(A zm@M4Sye}GwS8@tK{zVt+y5P7TWcBmnB9;eP1iAb*pMOTdnBS2I7y2Uss2GmarHcjE z6k-RtSBctq_6)U5E;>TJQ{3=j?a}d+_c?MJ6J0#1G41tsoV)i;h*RJE&O8tq+8$mU zo+sX-9xohU0f#CqMf9K$w4GxjYO`i<|FZ{3OFA?!{@B=h(%RuP9*6ri0@} z+$e^~CXh%1F-FM(_&iszvQJmu$Qw9X1tpv@=toImo+FNW=FvpO4Dj-ca-h(6oC}ns zy;jLB9RZ-@u$vQ6*4%p6Qk0AXdfbG(_zXp|u}iv6>$*VwcqE>o9^t!Lu}yzXb?0A) z{}q|j?OWdfT0im;Y1ns{{L7pkKr#HCI&TxZcHBRUzA9(q$q1LPvjj_m?6CxU2Aw|D zox^r1i#(pIp0OUG2Cjd42OtPI3MWxO*8+!&ZyKOG$Neou9VBUU_k@#>9?L%d?sRnK z+sM%c9!F9kfmrgQ$bnk?g2aC;8uGh1&qfk3)cQQFc^yu)*0c>st>K^1>RcBU+T&bD zgJY|>3V+nKhz^IkS;bu|e?SW3{-q`uObstF^A3L3>o?ZG;2itLpTK56+j>+P9#w7; zZ(K(?5O1{wTG+iF<&s$fd#tz-M|IMc;TyPE6OdJBZP5 z2F2YKZfnsbKkUC%p&x}L=btqsK?(EVX~FSAFDBkA+r6lks)$ zpOe6vP8a^tk-VSxv2r9y;}tkrs556-SGps;DMyS)OGg-#bnj1luN&6+WCZ`5I$8)G zz01Rf#-jtj?a8=p(m`N6@@YVj;>hR39K&9OBTBs&R=V&$uB^{bSn|yEWt+5JOu3zI z9)2&6$fFPRFd~25nEE+Mn=RL#pYr+zc}`~oBEX{0*9xWF!^7qzT}-3qXb(>!>B{4? zB!g@`?e#f1PNlYXkmTR<;eQv{?}{GpH&EO0s~t9EdWAkaMk*KWERAE9lt0%tqX)|(9|N(Y5C z2qNu~CHOS2mx{+#`~t8np}OXU0Ims4UE9h*uG8 zl+MV~#|pd#LkEx$gQK^d{s-pVH_EX)N=I+(AE$pfLUI8`*4`tIwq8ucX=>`EKz+%e-ES`@#JGt(n zi4T8aVYxq7O&eE6&El*epH20iL^RCEe?`XZ&-}VVzsD9cRk_i{l*j(V&~pp^KGxgp z7QiLAT7k?{y6JqKoOCo}D5Y@R{Y(=ecEDIwXO&7r)v#6~kE_GO3>w5gLlMxX2`iwN zSQ%A%LU8e)%CIx#L?o+vV`R9ZqYZKnOj3V4c-`8;5x)&}{T3=J$fx4ZP4*eXa`{2G~w;@lR2tTgyh?sB$qy^b@aMZIlsQkD}tpK0Y@q z<TlXsjf^oIAI?o6|=N=ho>9}dnW?I8C^hU zq@RiOx7VF{83tSZ`bFP5%w;RAuOXYWJ-mIm z%U_eqn4|qGw(tQXqqxMtUngv`;+d)&FLn6fL-l)Cimi&0;B7wr!CR<4a&CZ%Q_Q zeg!+;7gBL!yt}5ys+dqXL#gY=w>^k~aN}KEqCR;3p(~rJkis%WQ-Ob?iLtz|v!#3O z(S4T*8f`I5Ax1s_u*hKB;M_QwB?VsP`SLAl-Uq38C`NBJV@>m(k?+TwRZGEj-^oak zfb+Z_OR5I|$hXu9k6->u0fzYvnB)`th0UsZ-tgzM`75Y>2)7I4HnsE?Ix%L2G~CM;Q}Vi!CQg4yDTIvY7!CzG#|X^9)_S=wZ!x@2;hz?7qFX z+j~bYB2A4qanC|6#L3cxxxA4e_f!5^UaT{ZQgjwvV;%swjGi0B0&3iNG@P(VBd87O zac3jYpdD=jqCxL7q`TY1sCecPH~kt7aZ^9$XGtq8x)W*I;GR`4GVVNCJp_O zKFwYJ8`A0(18oJz0WyrG$cO}_;C4+{oRSt$go8rp=f>6S#f)VvCMADUvzyI!T z0eC>NF%wh7AEA$+e0f0jmNYV0+k{*fU_b&Zt+#)?D==A$spC9IRtIC3;7&dMe_gO~&6s{qgs(u(PUwe7+>hI={{8hoohn z+k`Tr>HPxQNuUFi?kglP_L5JjxJqO&`DK$g_E64+oOcnc4E|;UEt7b);UeON0iK|} zwGMwDj4`K4Y3;mN`=-HX(7lGxJu)C4CXlca4CJpgI6tSm;o>`tE-r!r>{^>G)4+bq z1K_{AhHk#DpwH@SY*l-v8JmRWSsGwPfW2SBM~f!Z%ypwoE3mS_)`zi&HQWpd48VD zfy;r=%+$7tb@*EL@Em6R3nYY8kCq-6Au(#pg38u!s;;}LBAHjp>7^f`bLp#cdVX#^ zaD%gfbk8dlYTNgG!oqlBq8A72uLSIi?k|jIDl{mwGyvYmAB0{&m+SPR8o-he=@6 zlh4U*%!vBNK!i*D9IC>m>l#B-C54SxN3m~MW|Pm&N}gtO3278t!1uC8fw{7%dJfuK zl>P*pzR;_eOWdgcTrgH31gV&!z-E7UPfA;S^rih|yf3d)`gaII_`P}U5j<`JMw~Pr zT)LFE?!=2I;(0;4o>o?WWUEa_Q)yGzU4f^qcGus1yy{Z7gb%H{7GY-~eC&U^_G2Ib?|ysC3L@Z-z)yXVe!d<`oQ5i7Kf1K-s?6Sr zDf4I*@3EaAw)I=+&ZY3^<0CWf_QX}nT_id&vsPb1men%hHy5FW?3s?I6{?lytZ1{p zQj{6nx-+S}0^}9sK3}(IOlRTkLP5V|$&Xc=6(V$VDqi8V_kEjqFCu@gyN!ij&*a{| z&8U6*>MyN!5f7EU|KjD zQsFL8rFeJFxOHG`{jq-}%meMdOGPddHv0CyZS5lj7RKmBz(>7JXfJmwky4| zg$o90!g}1oIj6-*r@sXEqo}0tHLic<_je=pMV(TK7YN5c zjOOe{*EX3M8+!uF45Yp!htGt&5f7VN7MENT zb@Baj-Iss1D`$3yE^t7Uw0ZeNN%0aAErDJZeT~r<7%zn2l`^21IIrQWpI^Os_4ecC z+jlQtkv}r`l#oU}y$O;|#q%M3j3vy)c~?Yl116vy1RW6ZuA6QQdc)c*U*H5$Z{zd%6V;)(hjd8>!*K5ghh2giM3<4J2EX`9}pUO46Z$E^=qHULxVZ7=SJ2g_C&8S{?mWp z`{5tQKac-;_}!nN;`kXffj==78{$8B8e~F=e^%LJN*aGlzbSdl|Kq=T`ZH@F$9yiw zG_PZOMRqdzUu0h%vIDz zdGt(X^mMeaD%Uqx8Ml+i!*73xrj{|9ziv+^?_>bzk-ei)XGX`$6i4Slbi_Ch8F11X4--CIee7eK12gv^P_bx~zx)h{bDJ^h5=WNa_)vxkP~^Ri?+7iP`p zluL!V2`#e{Vi@a;Evf=z{8E2=tF}rgECbAe#)B!piUcf?mz0fJ;wSkQP~Yh7fRxhX z>3}u3X>`DyP^j?(N>W|}JSPp>dc`y!4&0sR$Qz@%U(`4`rXQy#5^A}+3>t-=uk+71 zrel!@>;SI#AV+rxB7=0dyW5LkfSfw?3usX~dPwU%UlaMZOBz(y*CKx@Tjnj@2Nh!K z0A1)g_>e0HH7$5XG6bVP2hEd)4tsp{pcaMF`3-iE*8nNc0hRZ9l~8H+d6_|i>0|Lq zB!(QMJC6)=7U&2eGGM=8U6fNq|euhmR7CArG~H)vBH4! zEL=qxLa?-!Z`yx*!=IOX?MV}`Y!FK7Mqw&~HWfh?xo85XTKC8h=TB@?RSM^;m$a{t zaa&<~{!Nq~-3h-|0rDd5S>J+unG2cWI;N|R1hL)EllTSx0O{NBTSm)d>U6zMWt&*% zEBdsyvCTd77u0x$-a?YL^cL_?5VI_fNGBb}OrgFvRnmWr-fs0%WYtxa#U6*ED^>+Z zr@qlSF0WHqz}>-+w)76s(Z6rgsN*%3*BUFLLQGy_>=WtwEr)6`P5 zEHc1cCE$OrIlD_xJ(kayYYy!+C{UhKq^<--AADy^IN46}5+;@v%CX&>cU%3#m$4ZN z>a$jk=HG)jGlV`-_qR4g9dbWMXM3(;_zo}2Z!lmN%@&qqttkkep`JnaMTg^@pvML@ z4)6_9ow{nk3DI?hEKc4QEZPh+iJcnQm$jy@zzcr`W_G<+Xqy*--mMaovRx!IZl3^@ z5@~MgLRUe~>PDrxR_WVl?VHK;9%Rdeo)((WzX>L6AX_ZNWYh_UFxiAp9H`er1>y(_ zo9gaCQnMSpB#F#jS9Cyk`BY*HnBXb{8V%b62WlnxjFK1_&dTC1VoDdl(qJKCOyT1V z{3d_a;n=Lry}@rY+&5f(?Ck@G%0{|M8=W6_m~{6Awf;#M@Y1zl6`7 z-D__8;+P`mcZzR@4l>#L;JU7E;Zvz)hroZ@8Fj^B4qV=DAXEk~#dfIM24Y@3y$R)@ z`6tas$+`O0+3olD_(5)o-K7LQtIv4A`!V}A_R;N}BNoIS85~cm>j7@TApExv@7~4( z?zWm0k=uB;Q)Y9rd2t4%wgQ9esmaw@-thBFdnVFlOG*NuL$-zcKj3qx)4Ld-a(aIW zTh5aQK$jFSv=#isVE1gGA!a!9V}o7Y(wWxRwjqfQoiROeAiw9B^dW5<`eldbh10p5 z#oJ0BEYuxjcUfK_pZb&~?C*fM;=%i@2F4JW(}uT7%)UIWU0s|8UR#7efN9&ssj3I# zSWwDKeQ8D7tIrv#dHDA+Rkep&vn7AaTK#rW*DEPh^l=2D|2aT>%|OmnIp|M8f@V!S zIj2H;zP6ZH&QpT%!OC13t^po=0gh>j`XI-U!xX_XsO{5)H7|>1h*m(n?Rzks_VzRF zf(G{sL@$h)J6 zTKBw&v6gQ8AB@5wu6~3!XS~^d79A+)b$&Ax-8QPOHFVQOpq3&0@IhK8T}jU`cucjL zQYlEX$`D@Ska%8S46pG)@&)DvpO@HpbLLDyp_rMh24&C2^eZa;_ZuLruP*yOC%Ktb_tCOs delta 15246 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 diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-dev-state.html b/homeassistant/components/frontend/www_static/panels/ha-panel-dev-state.html index 1cc4b362708960..37227fb4d52a9d 100644 --- a/homeassistant/components/frontend/www_static/panels/ha-panel-dev-state.html +++ b/homeassistant/components/frontend/www_static/panels/ha-panel-dev-state.html @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-dev-state.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-dev-state.html.gz index b9dea8501feb273dc23b08bcc948ca65df4bb823..bc975d427c00727e76625e465ac7535d38397bdc 100644 GIT binary patch delta 2940 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

    \ No newline at end of file + \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-dev-template.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-dev-template.html.gz index d663a6833245fbd2f4da0bb2ff3dbb87d66d2659..6ec343e910fc291ec2ccbaac54b9d5b6ad474eab 100644 GIT binary patch delta 7244 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 a9H#2qF0%ZGM#l6Hll&hHmb7S}WB>p#$`*D2 delta 7262 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 k|0*?>_sG9c z=V)=*s?X&OC^%8d1nNrDEbXWgd9z$CETo(=Yu5+>P;xFUqq2gmjJ5g}S+D7#o7-An zC;L`uVO7Gf_C@yQ;p%iV$^@oIN~9#Qwumrhii+v}1=P>IPRu-AUK+ z-JmK|$!J&(gC|q%BDeBtFxk3$SnGL5A4bGU%@@#%3#4ks&PcV)5hvhjv(m|^UB@)r zd$<|qrp3%O;HNf^2FO?;I_LOrSw!|`m$%)K;E}}h#;SkP4Bwc6It$dDO5P3=H3%56 zuS`bYpL4!zg`RpZzN*-cnSk87G?*$fvwJt7JLTQ7|2E=@rlYBUNsy^Y*joP7y%2j5 zT*lxqWw3rE>}H_Vti86izd;ISYo2ZrMkG`nx{a2yJNcyVKf#FMY&Jh>s+LN;GlQwx z1GzB-&kuhP;ic1n=j*%OkR?C}o2Wi>qCQ8`06Otj-m?OC z27JgQF0Kdbf&&VE8!N>diNpHaqK-xNZXhpZJsW?s8x{=q_=NWY- z5)FTN%@8~f=IGvZHYIco%rWNtC(nL~pE%X30Ba%`Y3G)UrBmiB=KO$vUY8}ujjM3V zHJkGVpF1!mSyn>VmP0V~rzab5Tv87G=`0Hd%gIuRbvPRRg7k-La31nuUR;5_pO+(; zoYfjoj$B85mfF3XrEzxco;HQjyI(qIg>HX>u0mE#b|vt`jJH9o#U1i|1WLz&ry>UJ z?qJwxWZfH8BWtcBY^l90Im!*yz3n=c2c}7ZyHzcS&0AN-=o#~^T7cDjYE)6B;Ji?X zK{`SRffh=2w6K8~C_qc0eo`8tm5Qbr=@d9)MLwrM9yt{St1gMvs%uTWuUpu=Ewz8O zFvCPH8y^LbO5cCnq~_!P!^mD})q%Y=w4hyE&%bQH8Gt7RYs+OxpNw~*X?)HuMG?=h z!5dk}n-o6-@5sDN--)xt`8jjsf4yiijNc{9RSbF>$b)ZoKWB*jKlz4c_bi7wi@?Bv z;c!ZxruSF_#iH-HR~WB>qVri&1ipVxES&AuA@1dV_P(>*k=P%pEsr9rCL>xUN|rz; zNm0O_Icc7+VWP#jxd>$?X949z5wo8pX>cmC5{ju2j-&b-kue}t3ZMurf^ul927ppy zISDK@5SskWE~wr~8ckHSV~G0`=fS}v^8#B8&D?G!i2g#+b~{j&<0^tR+`xb0eVH#V zS1c|!g*+VFRn1;V@rQpgj)Jv9)d#`VwCg=bY%c~~pAcbZuD;fc*JDHT&CyF` \ No newline at end of file + \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-history.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-history.html.gz index d7f2133ac54375cd2f9e0b9465e4d01f85c0eaa4..50006b9bb42d9689b8cf1da11ae94ad694e45aa1 100644 GIT binary patch delta 47 zcmV+~0MP&RT=iTBABzYG%#Qc52XrP72yY6Gzdcb{!*Fn~(FwK8 delta 46 zcmV+}0MY;TT=ZNAABzYGR_XGw2XrP6<8MzC!Y~}yYxKW?joE{ \ No newline at end of file + \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-logbook.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-logbook.html.gz index 23c8ae4b59490d28a524a45c9ed1c6647ef4a52d..49588c57be3aabdf067c6ae10bae4ed96e1c9f64 100644 GIT binary patch delta 34661 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 diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-map.html b/homeassistant/components/frontend/www_static/panels/ha-panel-map.html index 013f27cf9b9f98..dbc34a1744827b 100644 --- a/homeassistant/components/frontend/www_static/panels/ha-panel-map.html +++ b/homeassistant/components/frontend/www_static/panels/ha-panel-map.html @@ -1,8 +1,8 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html.gz b/homeassistant/components/frontend/www_static/panels/ha-panel-zwave.html.gz index 711692041f33c43684ea86836c5ca13555b77fdc..5696f89a83274e933a50303ffa28316d59c56f41 100644 GIT binary patch delta 5944 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 literal 2506 zcmV;*2{rZ~iwFo->GD_t19N3^c4=c}Uw3bEYh`jSYI6XkSo?FE$`$@s6sFgK8X=Yi z7OZMA_okUPZC;bd@@NOC~>!un(@C~k8*9*)7DtEJC?}H^@9e=TI z$~*7w^wtWlM(@Dj3Vyb=rK(M#3(4&t&n}@dPkC7iF2A|p8}CLJ4ZK;mi|y(S@Ah4o zpnvccHyr=kl@r)C-|+dvbzJhz^$ITF&Ofpx_p&u)*b&W!r z;y>Nmh4UNm2AYv`Ztgr^)av@;AMakj3M_M~Ia<*N?UFa6RRhv82Q}zoKKt~^nK-_~ zV;vL9vP=t-0ZCGw(2z<=7!f4r;C%M+L)~;{smY30P_`2Vmt(Lo9}`W|oQ0u`Xq>Pt z$&y46#d4A>645B_P(VF2XNeRn6*3e|5Qx&4q>`tKs0DZ?bwX{H%v zA|nwxlLDebK~uKTgjz{PNSvdZoQ8lVrHV-)EaM68`GF?G4eH4hWlF@HsFZ~nC9who zBaLDeYV>QPM`DC{66Lw#5l^|NlXb%kaSeVp(R%=7{q(hm#P@&S+2uKCIkdeQlcb{L=IA>QO2`a z+zSRSAyO(Nf=47`njmjLF#?()cwr}aV>KGxPMTWOrk=d*e#XDmr3#GEC<=kkrOX74 z(-h^9m?NrD#5q?)gem=*s29b2VFp=DAdFaYNQ7a`NKADYLPP|*5uus!&t$y>RjikT zFb#x4OjyWBE+Z|IEKNe>0At7~l>IYdZ(+VJc{4~u0%(TGmI%Rhf{CxWK<*0+WQHV? zyV45V7$%xu+J`a8qwn}HSXFbB6B8sR6&XT=25|;a7NUm&@{kb1l9O@*{15ksaYPfL zI76*q-2#CX4I+U=Nu}O{s95qjwAg7H^<|0B@GqG6*U)?s^T8TU<0vDFNRrXS5|^iO zgr?ZSl_L3frCournO9d>-rF(e9!?HL)u#c{EaACeT=6WWVT|ERMNAdd5y@kXeERHn zP39F}!pv!}#+$A)zNF)^bMCfK>Y#ynfgP%AVNVWLf>zep=^e-Oi+P1PilfdO-k?N- zJ@O^TMvJ{|_G$9_+AP0JKKq!9f5nb(`}6hlO2PNp{SadtzwLh2%=Xz2Z(m?Toc41K z_CIXrRe(iiQK9sp#a0XMn0RMr?)~!l%y>RdAoaVhr@G#qFH7LnTWAra7G_6hss`g= zO#=1Ab!=aD3S55jrm2@jYhSl@c?mdi*mvFq{+6|Hy@x}X*&D((DqZ8>Y{mzy-u;tr zRlYzVZCYqyG1u${u8eEF!U>*_c+Q!97p`@Ox~lov;lIt zcYEu~pvCb-F3xA$$0yF2V?%omm8=zfc>Db6hHU8UxifQ)y{SCUmwO>7+Bc~1;{xef zB6C1JhuV!=3(F;@q!kIKI0-%-sz!z_-5wV$z2yEYCiU%32;tpu8%P45msYpajO3me)hWg z|D>+3by00p_0MS9gPd6KcF|$br~a3n+;@CDVYKh-4Yk@1jhCoxemj@4=2^RGwOwb8gYE=>)7b3FpE)Nn(Pr~s8UM5WgSgox$rX%tlM)Sylb|(TD==NK&`iL>?>1#LmCkSAVtCvWueFpU0+#HQh zhGhDGFy+LVzBPNx1M|{uQitUfC_{|>yN|uG41n`#^%b!5iF=Zbow8Ht@v-eI{ zjGLYnL4Oh+K*ZcWSxepfJ?O%Z<^gYNW)Gv#6Mt&36;-o?DFOL{$&C;FwCwq(1bEX& zc;0s^9MI;L2m7vIuR1$BXh-fR=XckA^2qI{s$0G)Zf&h9Z-;~Cm#ez@1`W)DPzmsK+#r z4bK4Q(RZHRwNrD4^3^f-S1gnRHdmPX^_6q%+OwP3d_G00VA6%t>Mxrya$23Adq`@I z(@2HWh}DPHz*Yxc%XMpqe7+$(54ttio8pd*88+2EcB;K?lY98aH9xMh`@ul;_Ji@m UFyPl+6tKJh7lu8x`ePOV07HZA1ONa4 From 632256fae2ca8605cf97fd882ec0febaed8cad1b Mon Sep 17 00:00:00 2001 From: Gianluca Barbaro Date: Wed, 19 Apr 2017 18:26:44 +0200 Subject: [PATCH 121/146] Mqtt camera test (#7175) * mock mqtt * minor fix * minor fix * minor fix --- tests/components/camera/test_mqtt.py | 58 ++++++++++++++++++---------- 1 file changed, 37 insertions(+), 21 deletions(-) diff --git a/tests/components/camera/test_mqtt.py b/tests/components/camera/test_mqtt.py index b79f7245f2896f..802d29a510ac6e 100644 --- a/tests/components/camera/test_mqtt.py +++ b/tests/components/camera/test_mqtt.py @@ -1,31 +1,47 @@ """The tests for mqtt camera component.""" import asyncio - -import pytest +import unittest from homeassistant.setup import async_setup_component -import homeassistant.components.mqtt as mqtt +from tests.common import ( + get_test_home_assistant, mock_mqtt_component, get_test_instance_port) + +import requests + +SERVER_PORT = get_test_instance_port() +HTTP_BASE_URL = 'http://127.0.0.1:{}'.format(SERVER_PORT) + + +class TestComponentsMQTTCamera(unittest.TestCase): + """Test MQTT camera platform.""" + + def setUp(self): # pylint: disable=invalid-name + """Setup things to be run when tests are started.""" + self.hass = get_test_home_assistant() + self.mock_mqtt = mock_mqtt_component(self.hass) -@pytest.mark.skip -@asyncio.coroutine -def test_run_camera_setup(hass, test_client): - """Test that it fetches the given dispatcher data.""" - topic = 'test/camera' - yield from async_setup_component(hass, 'camera', { - 'camera': { - 'platform': 'mqtt', - 'topic': topic, - 'name': 'Test Camera', - }}) + def tearDown(self): # pylint: disable=invalid-name + """Stop everything that was started.""" + self.hass.stop() - client = yield from test_client(hass.http.app) + @asyncio.coroutine + def test_run_camera_setup(self): + """Test that it fetches the given payload.""" + topic = 'test/camera' + yield from async_setup_component(self.hass, 'camera', { + 'camera': { + 'platform': 'mqtt', + 'topic': topic, + 'name': 'Test Camera', + }}) - mqtt.publish(hass, topic, 0xFFD8FF) - yield from hass.async_block_till_done() + self.mock_mqtt.publish(self.hass, topic, 0xFFD8FF) + yield from self.hass.async_block_till_done() - resp = yield from client.get('/api/camera_proxy/camera.test_camera') + resp = requests.get(HTTP_BASE_URL + + '/api/camera_proxy/camera.test_camera') - assert resp.status == 200 - body = yield from resp.text() - assert body == '16767231' + assert resp.status_code == 200 + body = yield from resp.text + assert body == '16767231' From b985e4ef0b1964aa4d22a939c1eb70d82bd1b16a Mon Sep 17 00:00:00 2001 From: Henrik Nicolaisen Date: Thu, 20 Apr 2017 01:36:11 +0200 Subject: [PATCH 122/146] updated pylgtv module to fix problems with timeouts (#7184) --- homeassistant/components/media_player/webostv.py | 4 +--- homeassistant/components/notify/webostv.py | 3 +-- requirements_all.txt | 8 ++++---- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/homeassistant/components/media_player/webostv.py b/homeassistant/components/media_player/webostv.py index fe029af163ed16..7fa4fd697c5079 100644 --- a/homeassistant/components/media_player/webostv.py +++ b/homeassistant/components/media_player/webostv.py @@ -24,9 +24,7 @@ from homeassistant.loader import get_component import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['https://github.com/TheRealLink/pylgtv' - '/archive/v0.1.4.zip' - '#pylgtv==0.1.4', +REQUIREMENTS = ['pylgtv==0.1.5', 'websockets==3.2', 'wakeonlan==0.2.2'] diff --git a/homeassistant/components/notify/webostv.py b/homeassistant/components/notify/webostv.py index e82971e0064e81..50788b8cccf8bc 100644 --- a/homeassistant/components/notify/webostv.py +++ b/homeassistant/components/notify/webostv.py @@ -14,8 +14,7 @@ ATTR_DATA, BaseNotificationService, PLATFORM_SCHEMA) from homeassistant.const import (CONF_FILENAME, CONF_HOST, CONF_ICON) -REQUIREMENTS = ['https://github.com/TheRealLink/pylgtv/archive/v0.1.4.zip' - '#pylgtv==0.1.4'] +REQUIREMENTS = ['pylgtv==0.1.5'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 32d95676c2719d..7ab7178cbfa8b4 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -245,10 +245,6 @@ holidays==0.8.1 # homeassistant.components.switch.dlink https://github.com/LinuxChristian/pyW215/archive/v0.4.zip#pyW215==0.4 -# homeassistant.components.media_player.webostv -# homeassistant.components.notify.webostv -https://github.com/TheRealLink/pylgtv/archive/v0.1.4.zip#pylgtv==0.1.4 - # homeassistant.components.sensor.thinkingcleaner # homeassistant.components.switch.thinkingcleaner https://github.com/TheRealLink/pythinkingcleaner/archive/v0.0.2.zip#pythinkingcleaner==0.0.2 @@ -560,6 +556,10 @@ pykwb==0.0.8 # homeassistant.components.sensor.lastfm pylast==1.8.0 +# homeassistant.components.media_player.webostv +# homeassistant.components.notify.webostv +pylgtv==0.1.5 + # homeassistant.components.litejet pylitejet==0.1 From 76d21548204bad0181953cd40848926e69b7ada3 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 19 Apr 2017 21:25:45 -0700 Subject: [PATCH 123/146] Fix wemo discovery (#7183) * Fix wemo discovery * Fix key --- homeassistant/components/binary_sensor/wemo.py | 4 ++-- homeassistant/components/light/wemo.py | 4 ++-- homeassistant/components/switch/wemo.py | 4 ++-- homeassistant/components/wemo.py | 9 +++++++-- 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/binary_sensor/wemo.py b/homeassistant/components/binary_sensor/wemo.py index 7f44370510e1aa..58bd411d7580a7 100644 --- a/homeassistant/components/binary_sensor/wemo.py +++ b/homeassistant/components/binary_sensor/wemo.py @@ -20,8 +20,8 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): import pywemo.discovery as discovery if discovery_info is not None: - location = discovery_info[2] - mac = discovery_info[3] + location = discovery_info['ssdp_description'] + mac = discovery_info['mac_address'] device = discovery.device_from_description(location, mac) if device: diff --git a/homeassistant/components/light/wemo.py b/homeassistant/components/light/wemo.py index 41143246931616..02106511fe2c8d 100644 --- a/homeassistant/components/light/wemo.py +++ b/homeassistant/components/light/wemo.py @@ -30,8 +30,8 @@ def setup_platform(hass, config, add_devices, discovery_info=None): import pywemo.discovery as discovery if discovery_info is not None: - location = discovery_info[2] - mac = discovery_info[3] + location = discovery_info['ssdp_description'] + mac = discovery_info['mac_address'] device = discovery.device_from_description(location, mac) if device: diff --git a/homeassistant/components/switch/wemo.py b/homeassistant/components/switch/wemo.py index 0e40c3eff3bcac..c92523ad7052a0 100644 --- a/homeassistant/components/switch/wemo.py +++ b/homeassistant/components/switch/wemo.py @@ -36,8 +36,8 @@ def setup_platform(hass, config, add_devices_callback, discovery_info=None): import pywemo.discovery as discovery if discovery_info is not None: - location = discovery_info[2] - mac = discovery_info[3] + location = discovery_info['ssdp_description'] + mac = discovery_info['mac_address'] device = discovery.device_from_description(location, mac) if device: diff --git a/homeassistant/components/wemo.py b/homeassistant/components/wemo.py index d9fa0bc7f56f20..a4b6674af74dbb 100644 --- a/homeassistant/components/wemo.py +++ b/homeassistant/components/wemo.py @@ -96,7 +96,12 @@ def discovery_dispatch(service, discovery_info): if device is None: device = pywemo.discovery.device_from_description(url, None) - discovery_info = (device.name, device.model_name, url, device.mac, - device.serialnumber) + discovery_info = { + 'model_name': device.model_name, + 'serial': device.serialnumber, + 'mac_address': device.mac, + 'ssdp_description': url, + } + discovery.discover(hass, SERVICE_WEMO, discovery_info) return True From 931fce82392af6834539017f3c9c62065eb44f5a Mon Sep 17 00:00:00 2001 From: Charles Blonde Date: Thu, 20 Apr 2017 06:52:37 +0200 Subject: [PATCH 124/146] Add Bose soundtouch discovery support and upgrade libsoundtouch library (#7005) * Add Bose soundtouch discovery support and upgrade libsoundtouch library * Remove DEVICE global variable * Update netdisco to lastest version --- homeassistant/components/discovery.py | 1 + .../components/media_player/services.yaml | 25 +- .../components/media_player/soundtouch.py | 290 ++++++++---------- requirements_all.txt | 2 +- .../media_player/test_soundtouch.py | 265 ++++++++++------ 5 files changed, 325 insertions(+), 258 deletions(-) diff --git a/homeassistant/components/discovery.py b/homeassistant/components/discovery.py index ed766fc3997503..ea8710158d1686 100644 --- a/homeassistant/components/discovery.py +++ b/homeassistant/components/discovery.py @@ -50,6 +50,7 @@ 'apple_tv': ('media_player', 'apple_tv'), 'frontier_silicon': ('media_player', 'frontier_silicon'), 'openhome': ('media_player', 'openhome'), + 'bose_soundtouch': ('media_player', 'soundtouch'), } CONF_IGNORE = 'ignore' diff --git a/homeassistant/components/media_player/services.yaml b/homeassistant/components/media_player/services.yaml index fa26e1613dc308..e23616a47a93ad 100644 --- a/homeassistant/components/media_player/services.yaml +++ b/homeassistant/components/media_player/services.yaml @@ -222,30 +222,39 @@ soundtouch_play_everywhere: description: Play on all Bose Soundtouch devices fields: - entity_id: - description: Name of entites that will coordinate the grouping. Platform dependent. It is a shortcut for creating a multi-room zone with all devices + master: + description: Name of the master entity that will coordinate the grouping. Platform dependent. It is a shortcut for creating a multi-room zone with all devices example: 'media_player.soundtouch_home' soundtouch_create_zone: description: Create a multi-room zone fields: - entity_id: - description: Name of entites that will coordinate the multi-room zone. Platform dependent. + master: + description: Name of the master entity that will coordinate the multi-room zone. Platform dependent. example: 'media_player.soundtouch_home' + slaves: + description: Name of slaves entities to add to the new zone + example: 'media_player.soundtouch_bedroom' soundtouch_add_zone_slave: description: Add a slave to a multi-room zone fields: - entity_id: - description: Name of entites that will be added to the multi-room zone. Platform dependent. + master: + description: Name of the master entity that is coordinating the multi-room zone. Platform dependent. example: 'media_player.soundtouch_home' + slaves: + description: Name of slaves entities to add to the existing zone + example: 'media_player.soundtouch_bedroom' soundtouch_remove_zone_slave: description: Remove a slave from the multi-room zone fields: - entity_id: - description: Name of entites that will be remove from the multi-room zone. Platform dependent. + master: + description: Name of the master entity that is coordinating the multi-room zone. Platform dependent. example: 'media_player.soundtouch_home' + slaves: + description: Name of slaves entities to remove from the existing zone + example: 'media_player.soundtouch_bedroom' diff --git a/homeassistant/components/media_player/soundtouch.py b/homeassistant/components/media_player/soundtouch.py index 90a870a8c65d74..fb2e02494df389 100644 --- a/homeassistant/components/media_player/soundtouch.py +++ b/homeassistant/components/media_player/soundtouch.py @@ -15,7 +15,7 @@ STATE_PAUSED, STATE_PLAYING, STATE_UNAVAILABLE) -REQUIREMENTS = ['libsoundtouch==0.1.0'] +REQUIREMENTS = ['libsoundtouch==0.3.0'] _LOGGER = logging.getLogger(__name__) @@ -29,33 +29,33 @@ "PLAY_STATE": STATE_PLAYING, "BUFFERING_STATE": STATE_PLAYING, "PAUSE_STATE": STATE_PAUSED, - "STOp_STATE": STATE_OFF + "STOP_STATE": STATE_OFF } +DATA_SOUNDTOUCH = "soundtouch" + SOUNDTOUCH_PLAY_EVERYWHERE = vol.Schema({ - 'master': cv.entity_id, + vol.Required('master'): cv.entity_id }) SOUNDTOUCH_CREATE_ZONE_SCHEMA = vol.Schema({ - 'master': cv.entity_id, - 'slaves': cv.entity_ids + vol.Required('master'): cv.entity_id, + vol.Required('slaves'): cv.entity_ids }) SOUNDTOUCH_ADD_ZONE_SCHEMA = vol.Schema({ - 'master': cv.entity_id, - 'slaves': cv.entity_ids + vol.Required('master'): cv.entity_id, + vol.Required('slaves'): cv.entity_ids }) SOUNDTOUCH_REMOVE_ZONE_SCHEMA = vol.Schema({ - 'master': cv.entity_id, - 'slaves': cv.entity_ids + vol.Required('master'): cv.entity_id, + vol.Required('slaves'): cv.entity_ids }) DEFAULT_NAME = 'Bose Soundtouch' DEFAULT_PORT = 8090 -DEVICES = [] - SUPPORT_SOUNDTOUCH = SUPPORT_PAUSE | SUPPORT_VOLUME_STEP | \ SUPPORT_VOLUME_MUTE | SUPPORT_PREVIOUS_TRACK | \ SUPPORT_NEXT_TRACK | SUPPORT_TURN_OFF | \ @@ -70,180 +70,99 @@ def setup_platform(hass, config, add_devices, discovery_info=None): """Setup the Bose Soundtouch platform.""" - name = config.get(CONF_NAME) - - remote_config = { - 'name': 'HomeAssistant', - 'description': config.get(CONF_NAME), - 'id': 'ha.component.soundtouch', - 'port': config.get(CONF_PORT), - 'host': config.get(CONF_HOST) - } - - soundtouch_device = SoundTouchDevice(name, remote_config) - DEVICES.append(soundtouch_device) - add_devices([soundtouch_device]) + if DATA_SOUNDTOUCH not in hass.data: + hass.data[DATA_SOUNDTOUCH] = [] + + if discovery_info: + # Discovery + host = discovery_info["host"] + port = int(discovery_info["port"]) + + # if device already exists by config + if host in [device.config['host'] for device in + hass.data[DATA_SOUNDTOUCH]]: + return + + remote_config = { + 'id': 'ha.component.soundtouch', + 'host': host, + 'port': port + } + soundtouch_device = SoundTouchDevice(None, remote_config) + hass.data[DATA_SOUNDTOUCH].append(soundtouch_device) + add_devices([soundtouch_device]) + else: + # Config + name = config.get(CONF_NAME) + remote_config = { + 'id': 'ha.component.soundtouch', + 'port': config.get(CONF_PORT), + 'host': config.get(CONF_HOST) + } + soundtouch_device = SoundTouchDevice(name, remote_config) + hass.data[DATA_SOUNDTOUCH].append(soundtouch_device) + add_devices([soundtouch_device]) descriptions = load_yaml_config_file( path.join(path.dirname(__file__), 'services.yaml')) + def service_handle(service): + """Internal func for applying a service.""" + master_device_id = service.data.get('master') + slaves_ids = service.data.get('slaves') + slaves = [] + if slaves_ids: + slaves = [device for device in hass.data[DATA_SOUNDTOUCH] if + device.entity_id in slaves_ids] + + master = next([device for device in hass.data[DATA_SOUNDTOUCH] if + device.entity_id == master_device_id].__iter__(), None) + + if master is None: + _LOGGER.warning("Unable to find master with entity_id:" + str( + master_device_id)) + return + + if service.service == SERVICE_PLAY_EVERYWHERE: + slaves = [d for d in hass.data[DATA_SOUNDTOUCH] if + d.entity_id != master_device_id] + master.create_zone(slaves) + elif service.service == SERVICE_CREATE_ZONE: + master.create_zone(slaves) + elif service.service == SERVICE_REMOVE_ZONE_SLAVE: + master.remove_zone_slave(slaves) + elif service.service == SERVICE_ADD_ZONE_SLAVE: + master.add_zone_slave(slaves) + hass.services.register(DOMAIN, SERVICE_PLAY_EVERYWHERE, - play_everywhere_service, + service_handle, descriptions.get(SERVICE_PLAY_EVERYWHERE), schema=SOUNDTOUCH_PLAY_EVERYWHERE) hass.services.register(DOMAIN, SERVICE_CREATE_ZONE, - create_zone_service, + service_handle, descriptions.get(SERVICE_CREATE_ZONE), schema=SOUNDTOUCH_CREATE_ZONE_SCHEMA) hass.services.register(DOMAIN, SERVICE_REMOVE_ZONE_SLAVE, - remove_zone_slave, + service_handle, descriptions.get(SERVICE_REMOVE_ZONE_SLAVE), schema=SOUNDTOUCH_REMOVE_ZONE_SCHEMA) hass.services.register(DOMAIN, SERVICE_ADD_ZONE_SLAVE, - add_zone_slave, + service_handle, descriptions.get(SERVICE_ADD_ZONE_SLAVE), schema=SOUNDTOUCH_ADD_ZONE_SCHEMA) -def play_everywhere_service(service): - """ - Create a zone (multi-room) and play on all devices. - - :param service: Home Assistant service with 'master' data set - - :Example: - - - service: media_player.soundtouch_play_everywhere - data: - master: media_player.soundtouch_living_room - - """ - master_device_id = service.data.get('master') - slaves = [d for d in DEVICES if d.entity_id != master_device_id] - master = next([device for device in DEVICES if - device.entity_id == master_device_id].__iter__(), None) - if master is None: - _LOGGER.warning( - "Unable to find master with entity_id:" + str(master_device_id)) - elif not slaves: - _LOGGER.warning("Unable to create zone without slaves") - else: - _LOGGER.info( - "Creating zone with master " + str(master.device.config.name)) - master.device.create_zone([slave.device for slave in slaves]) - - -def create_zone_service(service): - """ - Create a zone (multi-room) on a master and play on specified slaves. - - At least one master and one slave must be specified - - :param service: Home Assistant service with 'master' and 'slaves' data set - - :Example: - - - service: media_player.soundtouch_create_zone - data: - master: media_player.soundtouch_living_room - slaves: - - media_player.soundtouch_room - - media_player.soundtouch_kitchen - - """ - master_device_id = service.data.get('master') - slaves_ids = service.data.get('slaves') - slaves = [device for device in DEVICES if device.entity_id in slaves_ids] - master = next([device for device in DEVICES if - device.entity_id == master_device_id].__iter__(), None) - if master is None: - _LOGGER.warning( - "Unable to find master with entity_id:" + master_device_id) - elif not slaves: - _LOGGER.warning("Unable to create zone without slaves") - else: - _LOGGER.info( - "Creating zone with master " + str(master.device.config.name)) - master.device.create_zone([slave.device for slave in slaves]) - - -def add_zone_slave(service): - """ - Add slave(s) to and existing zone (multi-room). - - Zone must already exist and slaves array can not be empty. - - :param service: Home Assistant service with 'master' and 'slaves' data set - - :Example: - - - service: media_player.soundtouch_add_zone_slave - data: - master: media_player.soundtouch_living_room - slaves: - - media_player.soundtouch_room - - """ - master_device_id = service.data.get('master') - slaves_ids = service.data.get('slaves') - slaves = [device for device in DEVICES if device.entity_id in slaves_ids] - master = next([device for device in DEVICES if - device.entity_id == master_device_id].__iter__(), None) - if master is None: - _LOGGER.warning( - "Unable to find master with entity_id:" + str(master_device_id)) - elif not slaves: - _LOGGER.warning("Unable to find slaves to add") - else: - _LOGGER.info( - "Adding slaves to zone with master " + str( - master.device.config.name)) - master.device.add_zone_slave([slave.device for slave in slaves]) - - -def remove_zone_slave(service): - """ - Remove slave(s) from and existing zone (multi-room). - - Zone must already exist and slaves array can not be empty. - Note: If removing last slave, the zone will be deleted and you'll have to - create a new one. You will not be able to add a new slave anymore - - :param service: Home Assistant service with 'master' and 'slaves' data set - - :Example: - - - service: media_player.soundtouch_remove_zone_slave - data: - master: media_player.soundtouch_living_room - slaves: - - media_player.soundtouch_room - - """ - master_device_id = service.data.get('master') - slaves_ids = service.data.get('slaves') - slaves = [device for device in DEVICES if device.entity_id in slaves_ids] - master = next([device for device in DEVICES if - device.entity_id == master_device_id].__iter__(), None) - if master is None: - _LOGGER.warning( - "Unable to find master with entity_id:" + master_device_id) - elif not slaves: - _LOGGER.warning("Unable to find slaves to remove") - else: - _LOGGER.info("Removing slaves from zone with master " + - str(master.device.config.name)) - master.device.remove_zone_slave([slave.device for slave in slaves]) - - class SoundTouchDevice(MediaPlayerDevice): """Representation of a SoundTouch Bose device.""" def __init__(self, name, config): """Create Soundtouch Entity.""" from libsoundtouch import soundtouch_device - self._name = name self._device = soundtouch_device(config['host'], config['port']) + if name is None: + self._name = self._device.config.name + else: + self._name = name self._status = self._device.status() self._volume = self._device.volume() self._config = config @@ -297,7 +216,7 @@ def turn_off(self): self._status = self._device.status() def turn_on(self): - """Turn the media player on.""" + """Turn on media player.""" self._device.power_on() self._status = self._device.status() @@ -392,3 +311,52 @@ def play_media(self, media_type, media_id, **kwargs): self._device.select_preset(preset) else: _LOGGER.warning("Unable to find preset with id " + str(media_id)) + + def create_zone(self, slaves): + """ + Create a zone (multi-room) and play on selected devices. + + :param slaves: slaves on which to play + + """ + if not slaves: + _LOGGER.warning("Unable to create zone without slaves") + else: + _LOGGER.info( + "Creating zone with master " + str(self.device.config.name)) + self.device.create_zone([slave.device for slave in slaves]) + + def remove_zone_slave(self, slaves): + """ + Remove slave(s) from and existing zone (multi-room). + + Zone must already exist and slaves array can not be empty. + Note: If removing last slave, the zone will be deleted and you'll have + to create a new one. You will not be able to add a new slave anymore + + :param slaves: slaves to remove from the zone + + """ + if not slaves: + _LOGGER.warning("Unable to find slaves to remove") + else: + _LOGGER.info("Removing slaves from zone with master " + + str(self.device.config.name)) + self.device.remove_zone_slave([slave.device for slave in slaves]) + + def add_zone_slave(self, slaves): + """ + Add slave(s) to and existing zone (multi-room). + + Zone must already exist and slaves array can not be empty. + + :param slaves:slaves to add + + """ + if not slaves: + _LOGGER.warning("Unable to find slaves to add") + else: + _LOGGER.info( + "Adding slaves to zone with master " + str( + self.device.config.name)) + self.device.add_zone_slave([slave.device for slave in slaves]) diff --git a/requirements_all.txt b/requirements_all.txt index 7ab7178cbfa8b4..43ab2a051e493b 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -358,7 +358,7 @@ knxip==0.3.3 libnacl==1.5.0 # homeassistant.components.media_player.soundtouch -libsoundtouch==0.1.0 +libsoundtouch==0.3.0 # homeassistant.components.light.lifx_legacy liffylights==0.9.4 diff --git a/tests/components/media_player/test_soundtouch.py b/tests/components/media_player/test_soundtouch.py index 84551241694178..4958f5ee263bb9 100644 --- a/tests/components/media_player/test_soundtouch.py +++ b/tests/components/media_player/test_soundtouch.py @@ -155,21 +155,67 @@ def setUp(self): # pylint: disable=invalid-name def tearDown(self): # pylint: disable=invalid-name """Stop everything that was started.""" logging.disable(logging.NOTSET) - soundtouch.DEVICES = [] self.hass.stop() @mock.patch('libsoundtouch.soundtouch_device', side_effect=None) def test_ensure_setup_config(self, mocked_sountouch_device): - """Test setup OK.""" + """Test setup OK with custom config.""" soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) - # soundtouch.DEVICES[0].entity_id = 'entity_1' - self.assertEqual(len(soundtouch.DEVICES), 1) - self.assertEqual(soundtouch.DEVICES[0].name, 'soundtouch') - self.assertEqual(soundtouch.DEVICES[0].config['port'], 8090) + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + self.assertEqual(len(all_devices), 1) + self.assertEqual(all_devices[0].name, 'soundtouch') + self.assertEqual(all_devices[0].config['port'], 8090) self.assertEqual(mocked_sountouch_device.call_count, 1) + @mock.patch('libsoundtouch.soundtouch_device', side_effect=None) + def test_ensure_setup_discovery(self, mocked_sountouch_device): + """Test setup with discovery.""" + new_device = {"port": "8090", + "host": "192.168.1.1", + "properties": {}, + "hostname": "hostname.local"} + soundtouch.setup_platform(self.hass, + None, + mock.MagicMock(), + new_device) + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + self.assertEqual(len(all_devices), 1) + self.assertEqual(all_devices[0].config['port'], 8090) + self.assertEqual(all_devices[0].config['host'], '192.168.1.1') + self.assertEqual(mocked_sountouch_device.call_count, 1) + + @mock.patch('libsoundtouch.soundtouch_device', side_effect=None) + def test_ensure_setup_discovery_no_duplicate(self, + mocked_sountouch_device): + """Test setup OK if device already exists.""" + soundtouch.setup_platform(self.hass, + default_component(), + mock.MagicMock()) + self.assertEqual(len(self.hass.data[soundtouch.DATA_SOUNDTOUCH]), 1) + new_device = {"port": "8090", + "host": "192.168.1.1", + "properties": {}, + "hostname": "hostname.local"} + soundtouch.setup_platform(self.hass, + None, + mock.MagicMock(), + new_device # New device + ) + self.assertEqual(len(self.hass.data[soundtouch.DATA_SOUNDTOUCH]), 2) + existing_device = {"port": "8090", + "host": "192.168.0.1", + "properties": {}, + "hostname": "hostname.local"} + soundtouch.setup_platform(self.hass, + None, + mock.MagicMock(), + existing_device # Existing device + ) + self.assertEqual(mocked_sountouch_device.call_count, 2) + self.assertEqual(len(self.hass.data[soundtouch.DATA_SOUNDTOUCH]), 2) + @mock.patch('libsoundtouch.device.SoundTouchDevice.volume') @mock.patch('libsoundtouch.device.SoundTouchDevice.status') @mock.patch('libsoundtouch.soundtouch_device', @@ -183,7 +229,7 @@ def test_update(self, mocked_sountouch_device, mocked_status, self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 1) self.assertEqual(mocked_volume.call_count, 1) - soundtouch.DEVICES[0].update() + self.hass.data[soundtouch.DATA_SOUNDTOUCH][0].update() self.assertEqual(mocked_status.call_count, 2) self.assertEqual(mocked_volume.call_count, 2) @@ -201,13 +247,14 @@ def test_playing_media(self, mocked_sountouch_device, mocked_status, self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 1) self.assertEqual(mocked_volume.call_count, 1) - self.assertEqual(soundtouch.DEVICES[0].state, STATE_PLAYING) - self.assertEqual(soundtouch.DEVICES[0].media_image_url, "image.url") - self.assertEqual(soundtouch.DEVICES[0].media_title, "artist - track") - self.assertEqual(soundtouch.DEVICES[0].media_track, "track") - self.assertEqual(soundtouch.DEVICES[0].media_artist, "artist") - self.assertEqual(soundtouch.DEVICES[0].media_album_name, "album") - self.assertEqual(soundtouch.DEVICES[0].media_duration, 1) + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + self.assertEqual(all_devices[0].state, STATE_PLAYING) + self.assertEqual(all_devices[0].media_image_url, "image.url") + self.assertEqual(all_devices[0].media_title, "artist - track") + self.assertEqual(all_devices[0].media_track, "track") + self.assertEqual(all_devices[0].media_artist, "artist") + self.assertEqual(all_devices[0].media_album_name, "album") + self.assertEqual(all_devices[0].media_duration, 1) @mock.patch('libsoundtouch.device.SoundTouchDevice.volume') @mock.patch('libsoundtouch.device.SoundTouchDevice.status', @@ -223,7 +270,8 @@ def test_playing_unknown_media(self, mocked_sountouch_device, self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 1) self.assertEqual(mocked_volume.call_count, 1) - self.assertEqual(soundtouch.DEVICES[0].media_title, None) + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + self.assertEqual(all_devices[0].media_title, None) @mock.patch('libsoundtouch.device.SoundTouchDevice.volume') @mock.patch('libsoundtouch.device.SoundTouchDevice.status', @@ -239,13 +287,14 @@ def test_playing_radio(self, mocked_sountouch_device, mocked_status, self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 1) self.assertEqual(mocked_volume.call_count, 1) - self.assertEqual(soundtouch.DEVICES[0].state, STATE_PLAYING) - self.assertEqual(soundtouch.DEVICES[0].media_image_url, "image.url") - self.assertEqual(soundtouch.DEVICES[0].media_title, "station") - self.assertEqual(soundtouch.DEVICES[0].media_track, None) - self.assertEqual(soundtouch.DEVICES[0].media_artist, None) - self.assertEqual(soundtouch.DEVICES[0].media_album_name, None) - self.assertEqual(soundtouch.DEVICES[0].media_duration, None) + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + self.assertEqual(all_devices[0].state, STATE_PLAYING) + self.assertEqual(all_devices[0].media_image_url, "image.url") + self.assertEqual(all_devices[0].media_title, "station") + self.assertEqual(all_devices[0].media_track, None) + self.assertEqual(all_devices[0].media_artist, None) + self.assertEqual(all_devices[0].media_album_name, None) + self.assertEqual(all_devices[0].media_duration, None) @mock.patch('libsoundtouch.device.SoundTouchDevice.volume', side_effect=MockVolume) @@ -261,7 +310,8 @@ def test_get_volume_level(self, mocked_sountouch_device, mocked_status, self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 1) self.assertEqual(mocked_volume.call_count, 1) - self.assertEqual(soundtouch.DEVICES[0].volume_level, 0.12) + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + self.assertEqual(all_devices[0].volume_level, 0.12) @mock.patch('libsoundtouch.device.SoundTouchDevice.volume') @mock.patch('libsoundtouch.device.SoundTouchDevice.status', @@ -277,7 +327,8 @@ def test_get_state_off(self, mocked_sountouch_device, mocked_status, self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 1) self.assertEqual(mocked_volume.call_count, 1) - self.assertEqual(soundtouch.DEVICES[0].state, STATE_OFF) + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + self.assertEqual(all_devices[0].state, STATE_OFF) @mock.patch('libsoundtouch.device.SoundTouchDevice.volume') @mock.patch('libsoundtouch.device.SoundTouchDevice.status', @@ -293,7 +344,8 @@ def test_get_state_pause(self, mocked_sountouch_device, mocked_status, self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 1) self.assertEqual(mocked_volume.call_count, 1) - self.assertEqual(soundtouch.DEVICES[0].state, STATE_PAUSED) + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + self.assertEqual(all_devices[0].state, STATE_PAUSED) @mock.patch('libsoundtouch.device.SoundTouchDevice.volume', side_effect=MockVolumeMuted) @@ -309,7 +361,8 @@ def test_is_muted(self, mocked_sountouch_device, mocked_status, self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 1) self.assertEqual(mocked_volume.call_count, 1) - self.assertEqual(soundtouch.DEVICES[0].is_volume_muted, True) + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + self.assertEqual(all_devices[0].is_volume_muted, True) @mock.patch('libsoundtouch.soundtouch_device') def test_media_commands(self, mocked_sountouch_device): @@ -318,7 +371,8 @@ def test_media_commands(self, mocked_sountouch_device): default_component(), mock.MagicMock()) self.assertEqual(mocked_sountouch_device.call_count, 1) - self.assertEqual(soundtouch.DEVICES[0].supported_features, 17853) + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + self.assertEqual(all_devices[0].supported_features, 17853) @mock.patch('libsoundtouch.device.SoundTouchDevice.power_off') @mock.patch('libsoundtouch.device.SoundTouchDevice.volume') @@ -331,7 +385,8 @@ def test_should_turn_off(self, mocked_sountouch_device, mocked_status, soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) - soundtouch.DEVICES[0].turn_off() + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + all_devices[0].turn_off() self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 2) self.assertEqual(mocked_volume.call_count, 1) @@ -348,7 +403,8 @@ def test_should_turn_on(self, mocked_sountouch_device, mocked_status, soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) - soundtouch.DEVICES[0].turn_on() + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + all_devices[0].turn_on() self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 2) self.assertEqual(mocked_volume.call_count, 1) @@ -365,7 +421,8 @@ def test_volume_up(self, mocked_sountouch_device, mocked_status, soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) - soundtouch.DEVICES[0].volume_up() + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + all_devices[0].volume_up() self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 1) self.assertEqual(mocked_volume.call_count, 2) @@ -382,7 +439,8 @@ def test_volume_down(self, mocked_sountouch_device, mocked_status, soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) - soundtouch.DEVICES[0].volume_down() + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + all_devices[0].volume_down() self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 1) self.assertEqual(mocked_volume.call_count, 2) @@ -399,7 +457,8 @@ def test_set_volume_level(self, mocked_sountouch_device, mocked_status, soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) - soundtouch.DEVICES[0].set_volume_level(0.17) + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + all_devices[0].set_volume_level(0.17) self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 1) self.assertEqual(mocked_volume.call_count, 2) @@ -416,7 +475,8 @@ def test_mute(self, mocked_sountouch_device, mocked_status, mocked_volume, soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) - soundtouch.DEVICES[0].mute_volume(None) + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + all_devices[0].mute_volume(None) self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 1) self.assertEqual(mocked_volume.call_count, 2) @@ -433,7 +493,8 @@ def test_play(self, mocked_sountouch_device, mocked_status, mocked_volume, soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) - soundtouch.DEVICES[0].media_play() + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + all_devices[0].media_play() self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 2) self.assertEqual(mocked_volume.call_count, 1) @@ -450,7 +511,8 @@ def test_pause(self, mocked_sountouch_device, mocked_status, mocked_volume, soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) - soundtouch.DEVICES[0].media_pause() + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + all_devices[0].media_pause() self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 2) self.assertEqual(mocked_volume.call_count, 1) @@ -467,7 +529,8 @@ def test_play_pause_play(self, mocked_sountouch_device, mocked_status, soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) - soundtouch.DEVICES[0].media_play_pause() + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + all_devices[0].media_play_pause() self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 2) self.assertEqual(mocked_volume.call_count, 1) @@ -486,13 +549,14 @@ def test_next_previous_track(self, mocked_sountouch_device, mocked_status, soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 1) self.assertEqual(mocked_volume.call_count, 1) - soundtouch.DEVICES[0].media_next_track() + all_devices[0].media_next_track() self.assertEqual(mocked_status.call_count, 2) self.assertEqual(mocked_next_track.call_count, 1) - soundtouch.DEVICES[0].media_previous_track() + all_devices[0].media_previous_track() self.assertEqual(mocked_status.call_count, 3) self.assertEqual(mocked_previous_track.call_count, 1) @@ -509,13 +573,14 @@ def test_play_media(self, mocked_sountouch_device, mocked_status, soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] self.assertEqual(mocked_sountouch_device.call_count, 1) self.assertEqual(mocked_status.call_count, 1) self.assertEqual(mocked_volume.call_count, 1) - soundtouch.DEVICES[0].play_media('PLAYLIST', 1) + all_devices[0].play_media('PLAYLIST', 1) self.assertEqual(mocked_presets.call_count, 1) self.assertEqual(mocked_select_preset.call_count, 1) - soundtouch.DEVICES[0].play_media('PLAYLIST', 2) + all_devices[0].play_media('PLAYLIST', 2) self.assertEqual(mocked_presets.call_count, 2) self.assertEqual(mocked_select_preset.call_count, 1) @@ -533,26 +598,30 @@ def test_play_everywhere(self, mocked_sountouch_device, mocked_status, soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) - soundtouch.DEVICES[0].entity_id = "entity_1" - soundtouch.DEVICES[1].entity_id = "entity_2" + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + all_devices[0].entity_id = "media_player.entity_1" + all_devices[1].entity_id = "media_player.entity_2" self.assertEqual(mocked_sountouch_device.call_count, 2) self.assertEqual(mocked_status.call_count, 2) self.assertEqual(mocked_volume.call_count, 2) # one master, one slave => create zone - service = MockService("entity_1", []) - soundtouch.play_everywhere_service(service) + self.hass.services.call(soundtouch.DOMAIN, + soundtouch.SERVICE_PLAY_EVERYWHERE, + {"master": "media_player.entity_1"}, True) self.assertEqual(mocked_create_zone.call_count, 1) # unknown master. create zone is must not be called - service = MockService("entity_X", []) - soundtouch.play_everywhere_service(service) + self.hass.services.call(soundtouch.DOMAIN, + soundtouch.SERVICE_PLAY_EVERYWHERE, + {"master": "media_player.entity_X"}, True) self.assertEqual(mocked_create_zone.call_count, 1) # no slaves, create zone must not be called - soundtouch.DEVICES.pop(1) - service = MockService("entity_1", []) - soundtouch.play_everywhere_service(service) + all_devices.pop(1) + self.hass.services.call(soundtouch.DOMAIN, + soundtouch.SERVICE_PLAY_EVERYWHERE, + {"master": "media_player.entity_1"}, True) self.assertEqual(mocked_create_zone.call_count, 1) @mock.patch('libsoundtouch.device.SoundTouchDevice.create_zone') @@ -569,35 +638,41 @@ def test_create_zone(self, mocked_sountouch_device, mocked_status, soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) - soundtouch.DEVICES[0].entity_id = "entity_1" - soundtouch.DEVICES[1].entity_id = "entity_2" + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + all_devices[0].entity_id = "media_player.entity_1" + all_devices[1].entity_id = "media_player.entity_2" self.assertEqual(mocked_sountouch_device.call_count, 2) self.assertEqual(mocked_status.call_count, 2) self.assertEqual(mocked_volume.call_count, 2) # one master, one slave => create zone - service = MockService("entity_1", ["entity_2"]) - soundtouch.create_zone_service(service) + self.hass.services.call(soundtouch.DOMAIN, + soundtouch.SERVICE_CREATE_ZONE, + {"master": "media_player.entity_1", + "slaves": ["media_player.entity_2"]}, True) self.assertEqual(mocked_create_zone.call_count, 1) # unknown master. create zone is must not be called - service = MockService("entity_X", []) - soundtouch.create_zone_service(service) + self.hass.services.call(soundtouch.DOMAIN, + soundtouch.SERVICE_CREATE_ZONE, + {"master": "media_player.entity_X", + "slaves": ["media_player.entity_2"]}, True) self.assertEqual(mocked_create_zone.call_count, 1) # no slaves, create zone must not be called - soundtouch.DEVICES.pop(1) - service = MockService("entity_1", []) - soundtouch.create_zone_service(service) + self.hass.services.call(soundtouch.DOMAIN, + soundtouch.SERVICE_CREATE_ZONE, + {"master": "media_player.entity_X", + "slaves": []}, True) self.assertEqual(mocked_create_zone.call_count, 1) - @mock.patch('libsoundtouch.device.SoundTouchDevice.add_zone_slave') + @mock.patch('libsoundtouch.device.SoundTouchDevice.remove_zone_slave') @mock.patch('libsoundtouch.device.SoundTouchDevice.volume') @mock.patch('libsoundtouch.device.SoundTouchDevice.status') @mock.patch('libsoundtouch.soundtouch_device', side_effect=_mock_soundtouch_device) - def test_add_zone_slave(self, mocked_sountouch_device, mocked_status, - mocked_volume, mocked_add_zone_slave): + def test_remove_zone_slave(self, mocked_sountouch_device, mocked_status, + mocked_volume, mocked_remove_zone_slave): """Test adding a slave to an existing zone.""" soundtouch.setup_platform(self.hass, default_component(), @@ -605,34 +680,41 @@ def test_add_zone_slave(self, mocked_sountouch_device, mocked_status, soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) - soundtouch.DEVICES[0].entity_id = "entity_1" - soundtouch.DEVICES[1].entity_id = "entity_2" + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + all_devices[0].entity_id = "media_player.entity_1" + all_devices[1].entity_id = "media_player.entity_2" self.assertEqual(mocked_sountouch_device.call_count, 2) self.assertEqual(mocked_status.call_count, 2) self.assertEqual(mocked_volume.call_count, 2) # remove one slave - service = MockService("entity_1", ["entity_2"]) - soundtouch.add_zone_slave(service) - self.assertEqual(mocked_add_zone_slave.call_count, 1) + self.hass.services.call(soundtouch.DOMAIN, + soundtouch.SERVICE_REMOVE_ZONE_SLAVE, + {"master": "media_player.entity_1", + "slaves": ["media_player.entity_2"]}, True) + self.assertEqual(mocked_remove_zone_slave.call_count, 1) # unknown master. add zone slave is not called - service = MockService("entity_X", ["entity_2"]) - soundtouch.add_zone_slave(service) - self.assertEqual(mocked_add_zone_slave.call_count, 1) + self.hass.services.call(soundtouch.DOMAIN, + soundtouch.SERVICE_REMOVE_ZONE_SLAVE, + {"master": "media_player.entity_X", + "slaves": ["media_player.entity_2"]}, True) + self.assertEqual(mocked_remove_zone_slave.call_count, 1) # no slave to add, add zone slave is not called - service = MockService("entity_1", []) - soundtouch.add_zone_slave(service) - self.assertEqual(mocked_add_zone_slave.call_count, 1) + self.hass.services.call(soundtouch.DOMAIN, + soundtouch.SERVICE_REMOVE_ZONE_SLAVE, + {"master": "media_player.entity_1", + "slaves": []}, True) + self.assertEqual(mocked_remove_zone_slave.call_count, 1) - @mock.patch('libsoundtouch.device.SoundTouchDevice.remove_zone_slave') + @mock.patch('libsoundtouch.device.SoundTouchDevice.add_zone_slave') @mock.patch('libsoundtouch.device.SoundTouchDevice.volume') @mock.patch('libsoundtouch.device.SoundTouchDevice.status') @mock.patch('libsoundtouch.soundtouch_device', side_effect=_mock_soundtouch_device) - def test_remove_zone_slave(self, mocked_sountouch_device, mocked_status, - mocked_volume, mocked_remove_zone_slave): + def test_add_zone_slave(self, mocked_sountouch_device, mocked_status, + mocked_volume, mocked_add_zone_slave): """Test removing a slave from a zone.""" soundtouch.setup_platform(self.hass, default_component(), @@ -640,23 +722,30 @@ def test_remove_zone_slave(self, mocked_sountouch_device, mocked_status, soundtouch.setup_platform(self.hass, default_component(), mock.MagicMock()) - soundtouch.DEVICES[0].entity_id = "entity_1" - soundtouch.DEVICES[1].entity_id = "entity_2" + all_devices = self.hass.data[soundtouch.DATA_SOUNDTOUCH] + all_devices[0].entity_id = "media_player.entity_1" + all_devices[1].entity_id = "media_player.entity_2" self.assertEqual(mocked_sountouch_device.call_count, 2) self.assertEqual(mocked_status.call_count, 2) self.assertEqual(mocked_volume.call_count, 2) - # remove one slave - service = MockService("entity_1", ["entity_2"]) - soundtouch.remove_zone_slave(service) - self.assertEqual(mocked_remove_zone_slave.call_count, 1) + # add one slave + self.hass.services.call(soundtouch.DOMAIN, + soundtouch.SERVICE_ADD_ZONE_SLAVE, + {"master": "media_player.entity_1", + "slaves": ["media_player.entity_2"]}, True) + self.assertEqual(mocked_add_zone_slave.call_count, 1) - # unknown master. remove zone slave is not called - service = MockService("entity_X", ["entity_2"]) - soundtouch.remove_zone_slave(service) - self.assertEqual(mocked_remove_zone_slave.call_count, 1) + # unknown master. add zone slave is not called + self.hass.services.call(soundtouch.DOMAIN, + soundtouch.SERVICE_ADD_ZONE_SLAVE, + {"master": "media_player.entity_X", + "slaves": ["media_player.entity_2"]}, True) + self.assertEqual(mocked_add_zone_slave.call_count, 1) # no slave to add, add zone slave is not called - service = MockService("entity_1", []) - soundtouch.remove_zone_slave(service) - self.assertEqual(mocked_remove_zone_slave.call_count, 1) + self.hass.services.call(soundtouch.DOMAIN, + soundtouch.SERVICE_ADD_ZONE_SLAVE, + {"master": "media_player.entity_1", + "slaves": ["media_player.entity_X"]}, True) + self.assertEqual(mocked_add_zone_slave.call_count, 1) From ce51866bd2e0967d03a071da1d05ec95344cac66 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Wed, 19 Apr 2017 22:03:48 -0700 Subject: [PATCH 125/146] Update frontend --- homeassistant/components/frontend/version.py | 2 +- .../frontend/www_static/frontend.html | 16 +++++++++++++++- .../frontend/www_static/frontend.html.gz | Bin 140243 -> 140446 bytes .../www_static/home-assistant-polymer | 2 +- .../frontend/www_static/service_worker.js | 2 +- .../frontend/www_static/service_worker.js.gz | Bin 2514 -> 2518 bytes 6 files changed, 18 insertions(+), 4 deletions(-) diff --git a/homeassistant/components/frontend/version.py b/homeassistant/components/frontend/version.py index c060256408a94e..c3bf78c7711182 100644 --- a/homeassistant/components/frontend/version.py +++ b/homeassistant/components/frontend/version.py @@ -3,7 +3,7 @@ FINGERPRINTS = { "compatibility.js": "83d9c77748dafa9db49ae77d7f3d8fb0", "core.js": "5d08475f03adb5969bd31855d5ca0cfd", - "frontend.html": "32bdf1e9eb7b2d73682a65cfc5ded063", + "frontend.html": "8264c0ee8dafb09785ec7b934795d3b1", "mdi.html": "d86ee142ae2476f49384bfe866a2885e", "micromarkdown-js.html": "93b5ec4016f0bba585521cf4d18dec1a", "panels/ha-panel-config.html": "0b42cb4e709ce35ad2666ffeca6f9b14", diff --git a/homeassistant/components/frontend/www_static/frontend.html b/homeassistant/components/frontend/www_static/frontend.html index 345f4e103d404a..59d17b1c94b3a4 100644 --- a/homeassistant/components/frontend/www_static/frontend.html +++ b/homeassistant/components/frontend/www_static/frontend.html @@ -43,6 +43,20 @@ ).join(' '); }; +// Expects featureClassNames to be an object mapping feature-bit -> className +window.hassUtil.featureClassNames = function (stateObj, featureClassNames) { + if (!stateObj || !stateObj.attributes.supported_features) return ''; + + var features = stateObj.attributes.supported_features; + + return Object.keys(featureClassNames).map( + function (feature) { + return (features & feature) !== 0 ? featureClassNames[feature] : ''; + } + ).join(' '); +}; + + window.hassUtil.canToggleState = function (hass, stateObj) { var domain = window.hassUtil.computeDomain(stateObj); if (domain === 'group') { @@ -729,4 +743,4 @@ this.hass.callService('media_player', service, serviceData); }, }); -}()); \ No newline at end of file +}()); \ No newline at end of file diff --git a/homeassistant/components/frontend/www_static/frontend.html.gz b/homeassistant/components/frontend/www_static/frontend.html.gz index 3b5d1597428325a6a9c511cf029b8f0912bf3606..ccc0ffb90ff26a46b8d031db862937cc9a68898f 100644 GIT binary patch delta 108813 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
    2p$i- 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 z%0A&5G^mUyD$H^#4qeS!KpM2=?Ie)U*Aw&v7?8EuGL4JUrN+Xx@z6Rv6>XP&gw29-$}xNXk-?o@;mw zhUap)RgS zES~Zo(00Z1pizUKr&f6=Do3`vyMH6%5uYlGkQ(h5oct#&v~hNnkIigpQXSP}BlAS` zGB2d3U5{4?-$Wd%^cH>c-JGc}C$+yw(taTWRUIv!y8J!rX;n&g6nk#YDDF{xk*5~& z-%IS502CiQj;@*p5G^fYG; zoi6x3lHZvh&3j8NBhD2pl}+rPzQk141ea60mp>KE`|>3}ls&~1n%q$=r+BZ{^43P) z+Q=)xT0+TfQndh;DH%)(@??WZ@CC|HuH2&Yr?u z5)nc6_G15eH0LMLDB|l__2*tK<*i?nh(3T%XllWJ?F|n8Y!E7RfCfdl{HdyB;VxBC zzxB>Fw8nNZa-=T!=H{44XCDdB1Zre(rW49cDo0;txJ8mTfRP(c?7qA&3&OgK-PVkbSQ%Ig zo=JW?n&NuHe+==*p6u!TR=>(k@saXpQnn}2Yc*Uto*IunS^K(0;*7|b!?aRVUypq-JifLU3L^-KVLaGVEY zKZ=XQ-Cic16O*xc_dSOc^F-E`J!9aCl6G3h##W!{qwnZe`I;*%Spx~xmp|l`N6Y`8 zPZm}8Yj#I6DVMJU4U}&ZQLXfq01`-3~_tBeUmN+$Grx+v^HahlOobX8>Re) zq_}Df&iyoR#(th{UmTJMVgH_(5vV2#}ru^^BJ(j6vSO}UN+qc;M)E6L1iR^je@tyL*LRtQI)6yD|7X3iSYP2A=80QM_1d$v z=u4g3Vf?-rn~Y|4AoK`d>rn#XJOX~d^+NO7x-sG zO-{Bj+<)Oe)kCQCaw0#^_jvy}4V%p{5gtL)yLS_9dOH!zf6mH?w|xDH zrDj2@>7Jwzmy=MlXbPh>6G9A^@vC-gPfn#uMy%Fn){U7~)2*)2EgH9|O;Fl*{J6sw zjV^2rDu{*_@Mg^oZ{W7(6;swsLq_X>J?Zd>WPfPnt!hUIXlUrcoeXQpVZ2kyh(~t6 z#cE^^`swg2NxWNulXGO|OmF4uV1pzzC|cuDUkaR(^)HXSXUs+P$k(*RwjBcOy4Qe=4bR(@w6?|{H(_5(-YdN%|-mDAVc!}}c z41ds)CRcMy*dMriy>YX&OL#Ss#!LPQ+D_Xk&rR(!RNhjpA-sVO-f8MTLRIZX+w3g=_Sa)lHCaJz|N8~D;Mo$Ji^jern|hf*3wyIv|6HgYh{UdX>)XHjQ`^%@!4SW)PEw1 zhR@>WKusQtqp$R1Bs}b8|K>8UGq`fhn7zF>r1w|2F6yq3Y~03trce4e*@usL-M_BL zwF7My$^Li(z5j>rYvq1)bMZ>y96+8uEC715yNI})HM^>8@@t6$GobzVx}Tw}zRew} zgR6_($U|=~o zS7H&=vN?N%o+wvHcS$5Y|KY~W@~nrS5W-B6p|8@OWP^}C84B}V3V)VBDVuDr!;%Q2 ziIH(lwi*dri=A>ejy=amCf7JQ0+6|U9(;@H^l3szZ2ubK|El=e=e}s4UH->TKx9^f zxAaz}=EA=RcUwK7&aV*TSSX;zY;@i2RO8d3XYie_j4K%AtT!4Q@Eza!D2^B#>b;*_ zXinMYmU=(AaGkJY7k{M0C0@on-MSOf0p25wYaEbGd~?FB!gkUcZWU$P++iN7E#|S> zW9V;ZIt1c>!-*>hs}k)Dd;LcT^XwuDm>W%n}M+*UojXkGc_Db$%w zD#^bnb}31N)=A>OPH1$&_lPJG!KQX+GCGduNFSil_siS3kAMH(IIvCSI!d{DW{;`kQRM@>_%NMFU&&hr*Q@{N- zBo#Eq!NR_MZGXKTb*r{vcpuJtgYOSw{NKnKRU=Vx=D*r5%~iTN2vm0W4NjU(U@S_9 z&CnwV-vNzAC`>Yf2Ub17<2XPYpMV+X1eTK{A~?hWo8ECCPVsS|E*6l=6-AL9!NSmi zNLUJS*KY=&Q2juooFHB0X`jtrw6M9(+Hoap3<`-eVSje58L&fs{e^!t0WqLga{~%P zT9q1rD5b(cG5amRCR##i&{){qG%vhimw*;LZ);7V7uVeS;6lh)_%S4=I+yVGHf-|2 z@n9V%@|yzWaa(2!0Uzt{yo2q-`)C;gA=Fe-4;p}Mpua=}03OI_E9?`q2fVt*`OqT4 zz%}M641erme^3%7e9S)c!Jr2IHT%pUT#B+!kq`Rk81j^!jjYH6-cTaVh$z0tttMcU zXQR<)prjJmD6yW1(B#~a*h!~g<;TUx&#zD^;Vs?Uzk z-p^&OIlikg{{BW0FX3&m_-x@}fZ)C1s=jtwDSujMS~MbkX!TQUR@x9cWmbDer|ee- zxzARs^s~{qPo~wrFw#9eTd&uW;TUa&n_rQ+;wNoaLz`W(?ct=2!Z>8MQG7`FVIDu5 zoEPbqhdpLwZE;rj6xW?Lqwp-o_bcfn4?SH0KgOY$K_Ck(iajs`=JJm@c?LkXkaTu9 zw||3W3UuHf1k(=UHP2=%nm{ngL}1t8dPy1KKjaOE3xbvl4V3v$$B>aNJ>27FkzO(D zEX~|>Pg<*CsNU?}_4M_6v=JNYu?gcmt`N>x7)EOV19V8Bnt;z?oGI&Rf2I_D_cvrJ z%9~JmaEU7&$&vCwB8%}JGs@S6rvV4rfPcZjGG58@MMS2FcBDf}`>{2mvCVO_339pf zuR$Iobt_}T5IXs=XUa<0W38XnFDV(#dI?yC9}YYb1d3UihRl9!u%zd8DZ`&wgNV$GgRHg42i_J0FY*R6Jkii~bsyW&aLD`|NPkDV z7ygkOs)#Wc=BsobqH6~Cnb2J%Zde(4GlmP*FvfqJrb$xmzKz{*#U5XxKi7NWZ>XcR z{rGC>_*;7%f9s8ozqRuCt(!f5>BoP!a%f(@wc*}dd;EH(AlxJdci^_+^KEHl_EaB? z>22&EC7z3?0_$#*zAquY6$NfQ>3@ds(D4zmVh}i{7Yaeq=feyBjn6N}G?xXUD0g47 zhJabtnWBy-8f+JX6PX6B(chJ-Puh+b}^8y&rPVt5riq?Q>A~T-UQSxk~0qulBe~@>yGH zQ(4K9*T=-z?ZrW1&UYbW6N+ty#E*yQvzcg(Y0i9>>&ZqZ4LKZL*zDYxO@{OE!-6zj z3>ztwr!jGTun%Og=!?~Zynis*$@i4wEpZSX($4jIc|YT$K_|UQdRP<8Osz?}r~yN0 z(W$?e(v}6cyo-$VSGvQEa?WGnItFl3uHY+hZ&AZ>!4p@bKF!Y75evl|1|jzZR+=&Q zP7&}`PNSfACm|6HUj({AO3yiV?bMv#2tL9yL!U|*1#$giafg`VO@Cgqj5S-oP^p!R zDdprSrHQoSbJnIG>8ex!S8srQYsDc^$0H#qhD9r zi4lRo+NlxDm-TK%jiy0yiQ&!gImCW8ted*N#hQW6xd@vj1hsdh6>bzhrZkp{U3Ug= z(3BisEf)i$DGFJ{<9~?8Q(8o_xpNahs`=uO71i~M7Z!ZIOe^t0o>LjAmc4y_6qFZN`F0;h!{Z864X zwpne)T`ktyYc7L*EhM|sK$R`dr5U$+`$LrS^?(F zf1-T!M7~_&pKD(jR+rfDkfT1Iodu_-7(2N-J981QEh?GzS88JwF#-Oagje%?JiE+3 ztw`gnFyiIP#8jh7+o@{MfTX+CKQ~b5F!VnV($spVBbuN{DbB6L$@) zXcq$7g?4TMOn+W$`l8=#9h`Ptv(!WEyhS17*h)E1UO)#2MR@~ji3S~{FY4LYv)^cX zrj70QySA@zj5f57SKn4WkKV-YE)U}6b4-R4iJ}0{s#?LrWIua|NM!cLWoAn_z|Q_~ z#BM0v7e_5R8WXkOFC??R4*KFk(Q;$OuxNXpS8vC&bbkpa8wC1YPuQx)a;Mj~(@WUt zV*T4q`gwYV(Ok8U=V>urz}-v#c6oi3!-46u{;i~?3r5Y!UBL)nIA8UZSs2o?M}OEb zC3%6DWXd6k4g5X8Jc9PX+aJs!dJ=ehhdIoC1uZ?s+^VlZ0|zjd*7sloOUSl(?V+FT zthjzQkAH$ck4B?R7sjFc_@Ho-6$@=a|H>ng71eOOPf^%#i!ZHvxV`u734lm$kr ze81liHm77yWQOT`hj>Ty+|Nv?NNWC>ZC|Xitl*8$%5rhP##Jr%?KhX&&MnHa_iNDg zy}R2gil2|$-9jsQSk*0(pWEaAGm-rCsUlv6%YPf`u!0USLySBsR_>NH-91fyrw1KX zwk&3lQ0oZkEI*-Hp&~L4{DE%Ox`V5)Y(tAO&q+F=qwWbb^%JF;gt64%L{Y+zgYJ1x zz4`m-(fWc$0CdD_%8QB9@_c%grFeV8QtR$8#iIf3;%iv@66VJ_S)K?NwR93i& z2_j<$M(9}^jFh^Rq%j_aXyAp>d0J&kFX-@Juz`71YeS$jqyzKK4LtPS_9|&_W9-a< zX|lq8CgEFAp)5t2MaU#k12@q{W}>e#27kK0yOYEm<171m-N~e?eR;rM=@vs!N`+4r z%NpK(F$J%@DxYa~qxvF$80_f4YjKp?il492B6tI9+&$O{?R_mH1<4i*zahW8oKi=| zt$6hwi`|!7)aKXnOA-E0=9s*RSW}qPO@Y#41xy(g*vqRZz%Gis-XP=HHmws^PH6UmI=uk`VUKBr%IAWdkd8 zeTx&JLphWbZI-UJt5pPTinp1zCuGut2&A3$0Idqyvrl}0cYocu`3^94 zpHKUv9UO5%YxpXRjz;6bfvU#319|G$X%f)gT`P&|qITqk1c=@V!0D;_ez8gnL}AjO*{Ob-qvyXqVzFJ`L4I9fxu=i$nb~9IG2l z99jqTIFzTzIMj|wXAuU>^MBvWj4m)^n9O)Iozy$r0Aa)3mWwt%Q@)2qH=kucWs4=+ z09Je?WFPLdU*mf1BTtisHcDp<(E3Cpm_;Y@Ct;+4q^&!)RHa>WqmXgKif$Y*TN>A~ zUE4TSjPc&+zH;b<9JP;|lD0eXCmS*6+~y&N?>LPls9h^nr1Mi15r3by6Q|9WJNY-` zn|V>(%xA(=&3q3MF=>4(}hhNzzwE%DGk2*B8_eJG{eyAU;4^A2T z96Er-5N7W*pIem3?|;%p#Gs%T%F6^+G^j7L!a2HFXW*Xk(KyAJZ=TK1oMmyIUmy@g zx%$1|I+x?@I%AkMy`4FIj9;{#g2l+2j2u`%mC&b^YNguiXN| zVf@i(c`M$nmdrPnH~2_-mDAq_yclAjtWTLX`^ zzDsX9U2(qS6W@8pMiayVOZb%^MyB9ty0O+pUVNNhuNHWdzFcMJOA)^N&am4C<}bxF&1H{os6N&0GRx@!6q zNO1g`X#v8`p!a;mLPs`ZwXxg``DJT94*6flMsD?1XH?YeuDFg3cA2C(jlI|N8f}rZ z9dr8@O=rffywIJ|OR&dEG8Am(rn1zGEN+nCwXrnL5R`j5W7)ra3EyXRpoR_KTsZAM zn^ErP!GBM=6RwRA9X-u)(j_^&RY*oMfp?uL?qs*%Ofhae_2{`6W!&~!HN0k&7{i(iWhLmdDZ9KMEHIEE+%Ql%ipK3m3zx#1U+Vo2QWt54xWI8vGYe z=I||8`g-oSrA^^PbAzz5>=>%Hzp{V}VS&}1q)XVo^LmldQ!lJg@DW9p5ASyky%*)N z>wh|jf|b%K zd%h^E%w{Nk?8;GD!$y`;&Upu>cAO7b(>I$FdS$+O;WpOE*x|lsAY8k@{ezn9xmmG$S$4|O@-QZz#hS=Y zjH8XS<*2d^eest!R>4+nzB*%d(cIVZsk^hp4U6wt7HRV$tDoxyd!}o-<<$C6&v1{0)^)%B>LzNEF3oMASrsJ2eGl*H9tFWBigCc>a}IgnkZeSalW zZ1VNX4}aHh&uj%XGTwKwkuhF2-?h4R^*k+p|8u9b#F*!+Y{rkC%5Z0yWph%9dW`I4 ziNIeC8MMm^g7#{eq58M9M^%k%XLN+c?qhF+<-Xe9NYeaIwl^xPS-!x~4aG(1F}uYl z*ta4}S+ubKewI6;?v4gZr6Q%xgn!4A?JLcdq;#8|us$EY5WhPd(iv>3bD)$}yru+x zqGUhxQAW!emC(fq!N?-_B&F z^{8i#cSoZQJo@RYT^wo~MXXI_Jof3M=xEz;@*O8{G)>nMr>>!FsORYaSi7Gu6 zS=~`JvBo!7WgQbXYQR+uoesnZLA>mKB!<)NWxkmAXX$EwXU0@QPkJqNj4r=@`fX(# zx&XjL1*{6po8kpwWmI7!;;H}KN07HEK4;-C>kK97qIh%UeFHzlv47KZk)fBVl=-dT zf7$lx7WM6^_u5|BNZf0K<)2O1N%t{_^2h^2Ox=q@3wV;%Bn%i-X7(KcAdTv*&GfuP zGb18m4IiryVmY^)#} z#i|=)w~*G!Xw49Wip1VGIoDp4S8(j@5xm8!mjWZwr-HUg3XH&D?m%C978kJUx7U(K zum)fs2~=*qULD!_=bwx8DxW=PvdZE`uXwQ2fp^x$;hVSbUVrwFe}470@9zG@`8Oc5 z#~`vNAZ*Z+L0$g31etxFR*0~o?&qtR1XwQM>uB676M^^wGozJ|C@u*$;5km+-QAKS zjnU7Zmel^}beS^TV2u0cMzCx}Q{m44W=JXS5h?@8J;qg!4(-+|N8u65Wje!09Oj5R zPgftMH!4qx)_=<3o370i+i0SNuY2ULM|s%Eng(_ZvpYRt!~P>>XTzL>H3)jLl;G6^ z%Vdx>kskv#C7aV zYVR%9Wmj&Dm3iiQK3~V!t9zi9c#u&PvhfDtCTpwy5`W*Iw-N1GT6{{YJ02Z%wkoUY zGR;?Nlv##=EU}Q)^at&U^khl9BK;-IQdj|GJ^O2Gb{jo0nN1dD=7z^i#7sW&*HlY` zkJp2&AW-J3649a%-wJNtZ}10!i^uf+dMUsD3j1(fUe7KGVi7-|;4gxh3KGf%__@jZbX2P+9h=Y7oy?1e-JE^-`gN-Gt~27Yz*ziegPvNF{rAGwse zfm~vQ(Sj_cTCjj7o9XRT8~$?1y%HTeu1+pju>LOave#=&gDsP_0a7+YBw-Y=_oR44 zbw7=71xJKdq(gtjL*w2(f_t|bxqkxj--=?lZhz-GTP6bP7-oADw&esavGnu5KP?H@ z^2-g(OD#&o8{qNa z!yfME>~k;Np9{>_`6|8n3x+r&3`0WNm%kkYDd1)X2kxA4k|aQ=IQS6v>V(>1_n7y% zF>y1amfHcAP5C*8Xe{g_UyHV(57>pk4S>WHkOb_>2reSlIM^8i+tf?W><41ZXFFj8b zIZb&+PNxh8o#%@M4MbA82{h#yw=zVv?Z(<6W%jW)m6YQDMo5g6Z*btrIBd(vTJ&WZ z899GOEnUwybiJGAWx-VZzw={cc76_|v3Ei5-Q@!*q6%2-W46qY>s725j0ZQDd7ZIH z0j=h8dbB^4FBlxKkbcm)wbsa;|E?h;4K7Gn`WHf4RxFIVkk4TBco+x6C>Z`R4v0dG zr^wPrj~~au{_qF*7tEFbeHWs&b;z`Cc07M@BgJ34PapTSKH@X2Vr*bAnG6Lb4+4Yf zn5Hp4Fh>DXwUG##hUE#~^e8v5V#>lQ+I`ou?+=Gw5X^0#i8WfcdL4dAnTz;BjG_@m0Fy(6m9{R4gv1_{^hz$$}fccwk!+IdWPB9nh0 z@7t}A*!CXK+NvW*=^d#rv(;63m60b1-R?&Rk9dy`OoO_*xhEoR%N}SGr@ae*rDcVO zr&7ejlArZ&%GDg>6nlr^=2J7#BCQM2*1V-^^iv`qjbE78g}j~bBM15A9hNi!Jf+pt z)s!cIEpC5rGIM7 zs>@B?uqv}Bb!{Y)rkwsqb(Vp@s_WJCNBpC|`@?VY=zg9toB{Rdem6pWmwtah2sgdW zv#aT8XERK-K*z>f7aN=OSrpqfI@I>W1=UW7&L(~b95P$Z=2Kpx+T9)QByb?x-Hm>w z|1*%NO?pOS#cE?D+8Qa0iGr^2otw?njy^uk2P?QsU%>x9oH1hxc_1-Zk)Lya_>cMW zxylpqW#m(tbBB4VfHO1M8S)59Twf+4X#fEt5T4z$o@8X)>f+A;VPk(!n_R4d7w<_waKMHw_u zOf38o+)rjn{pHKudNR8|mI>=a7SB2^6BPDoiqrj@JMMOhM>BsQ0{Ya!7VK@u`uP+g zq-ZBQGom=8GqkGbkl^dVr*d(9mAM9Oldn~F;)#`2K3!y=vPGbpk`+Hf^_#Sc7*yr; zYL@XeRsfKHui#J6CS-IVZ8;2elUZ1|{unjFrF>J@V(yusd=-4239W|mO9ZFKMUjsi zUl-q=pX*=~Y`T9kd)r?`37>}rCH_c_^r)6N5T2DMaO!wlSijHDHyP4z3c@bT<1Wja zUw|E`*XD*zm7oBm;tk3({~qa^pWkU0w);K?|H{kj%I3l^^1HF$@?MEl3VXV>>w@f# z)s^F!<*{PZWM(%>>sqCh0VCXdXGdq`SpiFhP211(&BuQ$Oljwn3nXHz7Wr)F;h%yg z=ba{b{f&wYo#_TLB!koJ$YZ#4vyx?`_>s)k=OlG8K3ZI^D@P(F(fwZzQ zX?P){Pf5!fUj~OtT=}oB?m_6U%lnY|>#~)|Uww>3LEW@wnDWt0E_Td;f1lOcj=5Hu zSBS`Z%bb7d$Rn1AW+Z1?)XguxiQkR>@~5YaA)4aN@;KAe#SzikPc{NT@bx!vwx>V_ zsB4;#%v9t(?W^{D)YBM)l;NYWYt%MmU2+yBZq1)CZaX{fXl9YVr!%d?fmvsR%O&Nx zkIy9){A#C5s^y>XsOBHElau$ox`rcmI?v{6yl{WVp^cZem!>02fFVT9%P1}?P~Wk} z@gzKf-6E*VpaOn;G(}QfSfSLLtg6xr@d)%W`^**{NFgV)S0%y)kj1O-KH9LkA&m-p z3w}YDw~OJo#Wl}3{TtUk$>dG2RX`rg*yCOY@i)0C(u8b;y2@$9+rY5+64eZrMRMG5 z35|cXx#E3~ae>#VfFj>n`x>5ploU0RB1AleU9AQC%i2#m=0qlK%xau8H|CaSt&KU^ zIlWu97GZD}fsTFWJLSgQ`ex9Hh{jCT^`I%=I{xX|`{|pPFOHv0-=91?dHH^P8ZMc@ zhjF+>NtnYQ*Tu&Ik5*?JAo?}k1n@Bl@pylzv=T8-;xj6dE!kNt>J#?ff+;q+8g@KW zeDH|y_M}MQ!0=}Sk6gb}3&Ln3n=tixHRU<4Fp;ZHX@o31d-}%H^_i5=+tqHi;pxgO zDQ6dzesr(W*c&STWXs~lEKK;*+jdpRsY%5j?r&L~%~#g+{*(I@2I<4n`v==nF6VzX zl|LBm-;4Kr#h*W5eI zg_cKHsK0#CU@krCB7ZS7N|41oI+TB=VC-_~K5~~i);roUc*h7PZtTb;&xpXKV+`YK z^jXuj8KlRR#>bs{yi*y)jE&RRb-J-@9uB~<=Rg6+u=nXxfW-ZyaHAVr>P zyGSttXL6q`eiY7Pyaj~v`9afXwmw0qUHV8q&yLljy{u2{1?}${{B+OrPHTT$`L#Ms z3F}l96qzz%lGWgz(xoga>}(Q@Q?mz-e#dzH`0|Ai+7Jm_bBC4mH~n8nY3#_{Zh^2`hz$}3117^(Fp3d&PwAQ{a9r;YWkpQ zjx*m4gzjy^4}+@EU(3};bo77X&7iY;7ViwLs!jhnZ{?U}WAzm5-q!%j=PXdYN(c@! z52^>tGRJ#4wib!)Q)gh->TKm94O`k7xw~RyUId#%b&wg!E7bJ#%n&E!$Z|M5svp2n zc|4pn4tAAcAP#-s99I-y#ZpEXjgKDEp7}BR{9FZR;5vsM*_P0s&ZvJOV-xKGl3;^{ z0Yo)`HsfpIgAbKgy()qUu|l^obdHDP^Q3-yEu7bAEjs)XR_gQ~@|=ls&E#z($Ja%tpa*LFH$eHmql`va0Zm>u6n@Wg z>ZRqeoK@_DN`1$2Py<`m!aJaL6sLiIHtZnLoZ7G2uZhMuAnsbkiMxfth_7 znnUtSikN0~*Vq8p45MZnNGgnEBf<_1AErN?KQb&?4xgrS!-1S4j?QIWFRSr`2bU$R z3W(-Yp$*I+FCSd6?)T~WH=92olHkJwH?$5z)CrD@s$PFx6LTsSOy?`+nczT|4MR#i zO!c(NelBZ2fU{{?&oWO7%>Cudy*ObE=EkTg^vw9p?F6CsJtTu}QrJg3`7~NwtHNWWpmU2Gnt0{l=i}5dtO}_bLZA2|c$pc%+{8YamM}aNUS} zL$#xEO#FWt)CxhXi1Xxb9jD2ua`QOq;hA>zGM!!aY|a(&3W2uh?leHz!U2uX~ko+w0EYeN|m^N#gdVBRSX#DO51@b6gn@gsEm*)SxA)d$@6C>kmEiTZ1L-<$F13OK>6z3!!J6U8U%7RRRAH|n1 z{I8rlU`$eW>x4C*c5JM3oh_;iONFb93}$~BspLr|im5s?x2AVgtOw-N7d##vi&5_F z45K);A`%I76wJv`SNL7qDmt>GDaNujM{$xT#c6higyy@u*tbDZ-t?k=&Os^WPakKG zgd0lE;9ZD)a7bV?>H$ooyqt#<)GDNVNqEEtW2$cK;a1M0CP0UwZhT#=csddl2qz=zZ?(G_@f+9mV(?7S46AQ(S{Q zU6dEbNs@hPacyB4?#^Mm@8dqkB2RxZY>0=CHM48VcS={fIiWEovlLe3^o&QZOt0&5 zZ7$2O$*t<@P6WXii_7NZAAQngjYks|Zj&|U;*DBH>WJz$F{xeu3#o$w7>^(==0Q(Y z`Uuf2VAAO++zR~wQ6Qo_g9|(!=y0MUfa(_UFygZwehm7-V`w;<$gZ8|x7mMOS(Z-( z^y`F-(T9_jZBh?|S;7#jgS$=$jjI^Vn;eb~_#%NeVQBG&aW3}BF_pu8}1c4M6cO`=R&5-SD#5ATCS3)sh?1xbCKyR70{kj zSXngMEn6w~4w=HH$^9-{e#~GIY$*!ck^Hq$^R;G5iG|W1`v!D#EKGm5OmCi{8hrjj zt_2*s*leC#AlegdQ;R>jMWjKaZvr>iZh08(DctiAXa>Ae3tm%0YQR)pHDnI28g0_1 z4fg_Jf@q!(*G))u-wl+&4;V!+7j)+mPkij7RBW)-+N;tyY6nM#3tOmcGK3)el_MN< zx*lBd3;RocBtK)vWX*rF#3Q99jG(gaD3wWpN76cI(_D*zS{|&z$gmx0sa_Ekh|`*# zdv~`)V1&d4oPP24&9md5-%tN~eDc%u=eN_Jj^CfWefMwj@vVIf%4kFUGdPp))UF4( zl2z1TOj@2<^_(`6Wu#9KZ}_jHwwmp^;e*N??+BwP(M$2{$jpDCkS~3?I7=UTxCOHl zZQRt{kc((m7bbxhSSlFwa_7V9W zx@g-3uSGtxB}ISinq68>=EU8roOHVmD7P8AzG+NK}Sj!w`sxQ^oA zK{=zKhVw!2Ye8qmx(v>*7l;E1HT=gl9M}iud)xgFc1?dXebf2wYflE8c~-6FAh&o` zFj(idJc6^$rt+|>v1*QS0MFCe#@OiZ-6B1WmN+o!H_x+fS?!@AFLKl_l@~>BzQ##J zYnhf%Fi=9Ud{2{4D;L|D2W7#W4BaT(l57b(Vp1a z=i-=XoL}$vRF}Y+r^sMv)?7i$WB8EHAKEDfpYrS`$=FpUii@?ZCe!T^%wpM5_#oV? z_waw;aKFR9*Y?hIy;}6~?0nC+rnUe1q(E~_xENI8UQmeG#lK)bfxOE2fbV(y_ixxy zEggR!(Y2y-u68>~QaB%pUG~Q#e&wQ9Ke|Zv#24oG6#i6RWx+G?avlm;y+t{r)nkAs z@*=&;I8<7GQ9u)D68$1$cD}5sqt;ZE8_|C*9v^#A{(~hGBqtvi zD3J{(654)ynCnthq@VH&3dqNcBU{qCPG^^<$%1&e^Rp~zNz=C-E^}^}4pEd_sQQ0v zf-!y&s{6kyxqPkhbJDc)Rjiu`QCnqj;GJbs+F*)%g(}9kJbH9wdwvr+gX;Q2Rj+!Z zXizN|dEEo*`9|&^fnJW`8S>N789o-azaVKo)M&qC+^PqI2OrQsW2(j1QGV=R159CV zsj~H}%XEcMznGzNz>ZklseehA%f)}^Ucb+51^dcEFq+tD3{67&&e~%4^y?3oSvq$T z$!^j4C^{WUO#o9A+=m)=>1KdSTIZ<^7N_ChF}LO-X_x*GTSZCGmQ zX~BS7oUD)Tq*mBI^;7+&jiBd7W=lu>A-e=QE76ib80q|id5$6VN1k@3Z|r}@rO(yu z;IiB&Q-z#KeZ^xccZ%=i3-hesXlc@TCHx@8#XPS&BERSQzm@%Emy+jgSo*B=w-lT_CZx~#-r`X zdsyO0KBz&rKt2%fkZ^O%2Z}|>&JMXr>C}?_$S*prWJ3~3Bta$K#(94}w_@=M=Sd>% z1C`SGTJ`v0U`!`bBu_Wck>%rqPMYQ0XEtG$cUw1o6kYSC4>#7QYqg7qhD=IyJ#IpU=bS zDEx&CX3?ABdKo~wflg(BD;pX<4?=Sy2CM7>&NeId<2=n_l^uj|n=LAsVodjq_D#8Q zX3=MId?!4R(C5hP;0Qa|CT72*AUU(sCpz+-&K~I(FJHerdAWaStUV)K>(dGw9sdHd zlvf$*E6T;E%tMGR7r-{4q_%8W%`pi{rG*xt)Lww);SAYrq{3G;(19Wq?eRfAsG7jo z)&>}Tdeci!mCv&e=@!u)J9_xAZ{o!Rp*;A>voD(Llcvi6&J^KG>3xC0XR_y@8)-&l zn5@rg-JUdUX7qx%v*oN*?br-AbbANw0j3gbS z^~CPvfW%WYde_*WRx(=Z56C%%23Xy0bit3>DbmZUX6z!1@}g8wtc2Z4VYj%n-0_!4 z5GI#pG*bKt6DCsN9X26$S`=XBw9(Y50lyGJ7BVz%OTQ2xxE~`-H=R@3F?4U6I1#eWOE?vb)0@m|0B-X$El` zVjj8)z%6>!R|t7zRY>Y09XF5Jd>J|sPJt#fKsZ#&;44fRN0LWDE@pbZ-~oM9bBWN; z8V|l=HsCw5Vh;4DvYvH~=TafK;USCSF5D&`STuii@%<#?DjS%xOOL)2j+le%)nbYp zn}wn1=^ZcN4JX~uMP7tNO?imAU3H8Dw-_2W%@w8~``KZnvfG^A>0!jW_2zYX5xl*w zTe_jcCvE~OwzUDKzbac=!b5X9B13o%2fkFp(=@|-vo$F^#8YZu98(pjedD#?F>a-t z5(j??EhmhQNDI`)8V?)MCtLcj_eZRu;o%EJQ9z|caDuC(n^!KNt?;Ams~tv6t}|2S zuwH(IhqK`VmKXkXS%m>#SJelf1aFV2jF|UO&qd{-gjCF&4z^H9D)`TDLjy*GEPpo`P*aIDd7e%&D9oI>iBhy!{xWi{eK8)+4JtgCFPXqiVSPdOzpH-~ zPLVO}F(1nE<9I*jk1XSd>$ub$Hg&heI&xh%F&-Qm4Ui!0?v~uC5h07#QCu=878kCh zB$D{`bBg*&yeJoOn$*7Uf|_!7H$5s&?XqY6;?yp8HZG6)qj7pP8fT2Ur#1U8e&(MJ z#itS6kAPfVI>xRoCyUk73-xi}4`P4rkj0~jRmZ1-F)Ye(Ltya0m>gh4YE+9n6ON@l z{iGO8irw9vauU^$YnkF1k()hlC>Iy~K9=Qf`PeyFyN1Q^dhg@4#89=cP21A5*!~u+t{=kgPqUctY)NswJ@O;JAS9Y+nD^iH%DQwD2beY8~ zeF#zc1@y2gG*7Ho`1xo0+GBr-aWJQ7IPcj`5pn+~SQ{z?W#Iu$hw{;?U)|))zbUW8 z#_%RxYR_8zY<|&_jd@eC)&fQ@p3fDj>Ne>eF(>< zpMRz>v&6DKS7NTri=}<16lp4alPLd*>GSC*3A<~$AP=;Pxis-JSciX}1!(F-3kH5P z21GpZX|=1y%ueu^bhBUIvURg=A(k`*8f?6h$Ssd6o>gIs$4CEhL?24ii^e&XJlC?i z&R2Rxnm3QmtWCDEFZ9gf^s|l^+#Uq_#+FbtPG`G^05L~nHBzR;&ITj0JjYLZ9x~-) z>ypg$9>4uYpCriH=I;no96&=Og?l(j9Y{hfU5c zYsULe@VBnX4aimeLwSo&Gx$+HXYj9=DGc{`80EL~P0RMDNq5Pa?8SCQ)TfQA+~ zrKW!|H+8HfKa>2yIp)i`~AK)fBdN6F! zvZSI$lDJqGre~wk=VwJhmrAs1Ab+f9pVAy8Jzsyo^bywl#%=-!Nhn?LKz03rQVunN=+W`+!E^op)h@k`Hf+`x* zXMvzmqd@aRRzngSa{{gXGs*a#pt@xpJ%)efdSEhez;-z51dJpZ9HJI-y3)qPBOq{E z!hhC~sp<@P~2FxV; z)`AX1^xjFh9^2WMl3B1YcF05#AoLad124Bl*=Lg3XS#Y^{NVxxt3PF%dA0@9tQLQ& zbz6fix;SAi3TYuN32Xj2q%uWA0Hae60(84#pNfnB^*{cnazG|GUf8X&^vd$#hX%fm#(1&Gvrf!-)9=B z<)^RYMtrL`X zuoS;apOmVSPfj~|`jC9CAYp$#I_Hmqg*dNUBt*|N*LbMC_~ua3gwx*cyrhS2CdXJb z-G{f%TNYWo$ja(@yrNsHg<~;`M;BM`44pi?YabnRdMH!8Mx0+RN(QERqEgy`i+}~+ z9h!YOJg(6;HboHeboadZvDriS&?%dZ&(~b)#EV;7n6PK8yp=)4+n;~Lfz+p(3Z6u* zTv^i$Yo~OY7M5TJ;bs>@F46>vxk%m(lA9`vun(*>-?Juau3LPHu6p(?F9VLtYseTd zT%8XZwQ@=*4gXa{>)4-sbU`RzItkbJU#amLrC@^RI_n7tJBMBKSh$|>8Yh;5Tn`I)PA^g!g}dwJoNNc>qaUSHwrR?QVarx6^78qE9OFd#{W&S@PxRKD=$n z_M7&2(u4@m5lw@9(Zd)MyL0l|X%u6d6Ecycq0gF(;ms^sCY*K@_!Lt1XEma&@%tf! zUU8@JpypoT=lDniiPN+hSx&W#f}C=^6j1C^F5SbjH@&)`%*KBgZQ(b(oFzvUFzfY7 z-`awTBAuPfh>iY!Q6aw~jqH4YJB!? zP3qOli~88W(9_q2or(SQG#K4A(MUJ~`U$K*&~yZG+0N2^5y{@1-?b1>@Dux<(i`p4 zj6mo0s1F=oHBWyBMwjS*-3moQpW}!fTn|#b_1x_d@Xo+^pY^{OrU8oj_fP%v#@_pP zcSoUH(6ns}hjD>nW4Hhy>V)}@H(dmtfkznDgobW-O7-)6TfHmsr+d2iqn<&hh=ZiH z1spg5d@9p(e!G9l@9h=&t+zWLqk<{MoXV|ht%vuYmjQo}M)MSw)>=tJdu_Qyc*JE& zrz|A5nnM^WMprJzf<(`&3L#SKVj(&#L|Oi7>z3QN4E3QI2#_|qS%I+c>fkh!?KJLm z;gHN*JkJ;{mRG>5vb1DGvs!<0$gcZLuC`BsgOW~!&y-c zE@j$W*9apGt}W78mY!UsI0@@=q{KMztzREd RtAu^vyT6A$UD{{B2mlbwX@UR% delta 108655 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 P54`>Z?>aN1O1%gGTORR3 diff --git a/homeassistant/components/frontend/www_static/home-assistant-polymer b/homeassistant/components/frontend/www_static/home-assistant-polymer index 5469c425e76953..3fdba359865823 160000 --- a/homeassistant/components/frontend/www_static/home-assistant-polymer +++ b/homeassistant/components/frontend/www_static/home-assistant-polymer @@ -1 +1 @@ -Subproject commit 5469c425e7695352a8402edd1fa6d36f95f0e083 +Subproject commit 3fdba359865823805e8ea756c8500d3913976158 diff --git a/homeassistant/components/frontend/www_static/service_worker.js b/homeassistant/components/frontend/www_static/service_worker.js index cec17959a2e3a6..a72ef49fd2207b 100644 --- a/homeassistant/components/frontend/www_static/service_worker.js +++ b/homeassistant/components/frontend/www_static/service_worker.js @@ -1 +1 @@ -"use strict";function setOfCachedUrls(e){return e.keys().then(function(e){return e.map(function(e){return e.url})}).then(function(e){return new Set(e)})}function notificationEventCallback(e,t){firePushCallback({action:t.action,data:t.notification.data,tag:t.notification.tag,type:e},t.notification.data.jwt)}function firePushCallback(e,t){delete e.data.jwt,0===Object.keys(e.data).length&&e.data.constructor===Object&&delete e.data,fetch("/api/notify.html5/callback",{method:"POST",headers:new Headers({"Content-Type":"application/json",Authorization:"Bearer "+t}),body:JSON.stringify(e)})}var precacheConfig=[["/","7e22d2422660188dd58de213fac2ea44"],["/frontend/panels/dev-event-2db9c218065ef0f61d8d08db8093cad2.html","b5b751e49b1bba55f633ae0d7a92677d"],["/frontend/panels/dev-info-61610e015a411cfc84edd2c4d489e71d.html","6568377ee31cbd78fedc003b317f7faf"],["/frontend/panels/dev-service-415552027cb083badeff5f16080410ed.html","a4b1ec9bfa5bc3529af7783ae56cb55c"],["/frontend/panels/dev-state-d70314913b8923d750932367b1099750.html","c61b5b1461959aac106400e122993e9e"],["/frontend/panels/dev-template-567fbf86735e1b891e40c2f4060fec9b.html","d2853ecf45de1dbadf49fe99a7424ef3"],["/frontend/panels/map-31c592c239636f91e07c7ac232a5ebc4.html","182580419ce2c935ae6ec65502b6db96"],["/static/compatibility-83d9c77748dafa9db49ae77d7f3d8fb0.js","5f05c83be2b028d577962f9625904806"],["/static/core-5d08475f03adb5969bd31855d5ca0cfd.js","1cd99ba798bfcff9768c9d2bb2f58a7c"],["/static/frontend-32bdf1e9eb7b2d73682a65cfc5ded063.html","24dd29d5af1bfd77d6df24a772742bdd"],["/static/mdi-989f02c51eba561dc32b9ecc628a84b3.html","ceace2dd01ba2127f138aed71ef71040"],["static/fonts/roboto/Roboto-Bold.ttf","d329cc8b34667f114a95422aaad1b063"],["static/fonts/roboto/Roboto-Light.ttf","7b5fb88f12bec8143f00e21bc3222124"],["static/fonts/roboto/Roboto-Medium.ttf","fe13e4170719c2fc586501e777bde143"],["static/fonts/roboto/Roboto-Regular.ttf","ac3f799d5bbaf5196fab15ab8de8431c"],["static/icons/favicon-192x192.png","419903b8422586a7e28021bbe9011175"],["static/icons/favicon.ico","04235bda7843ec2fceb1cbe2bc696cf4"],["static/images/card_media_player_bg.png","a34281d1c1835d338a642e90930e61aa"],["static/webcomponents-lite.min.js","32b5a9b7ada86304bec6b43d3f2194f0"]],cacheName="sw-precache-v3--"+(self.registration?self.registration.scope:""),ignoreUrlParametersMatching=[/^utm_/],addDirectoryIndex=function(e,t){var n=new URL(e);return"/"===n.pathname.slice(-1)&&(n.pathname+=t),n.toString()},cleanResponse=function(e){return e.redirected?("body"in e?Promise.resolve(e.body):e.blob()).then(function(t){return new Response(t,{headers:e.headers,status:e.status,statusText:e.statusText})}):Promise.resolve(e)},createCacheKey=function(e,t,n,a){var c=new URL(e);return a&&c.pathname.match(a)||(c.search+=(c.search?"&":"")+encodeURIComponent(t)+"="+encodeURIComponent(n)),c.toString()},isPathWhitelisted=function(e,t){if(0===e.length)return!0;var n=new URL(t).pathname;return e.some(function(e){return n.match(e)})},stripIgnoredUrlParameters=function(e,t){var n=new URL(e);return n.search=n.search.slice(1).split("&").map(function(e){return e.split("=")}).filter(function(e){return t.every(function(t){return!t.test(e[0])})}).map(function(e){return e.join("=")}).join("&"),n.toString()},hashParamName="_sw-precache",urlsToCacheKeys=new Map(precacheConfig.map(function(e){var t=e[0],n=e[1],a=new URL(t,self.location),c=createCacheKey(a,hashParamName,n,!1);return[a.toString(),c]}));self.addEventListener("install",function(e){e.waitUntil(caches.open(cacheName).then(function(e){return setOfCachedUrls(e).then(function(t){return Promise.all(Array.from(urlsToCacheKeys.values()).map(function(n){if(!t.has(n)){var a=new Request(n,{credentials:"same-origin"});return fetch(a).then(function(t){if(!t.ok)throw new Error("Request for "+n+" returned a response with status "+t.status);return cleanResponse(t).then(function(t){return e.put(n,t)})})}}))})}).then(function(){return self.skipWaiting()}))}),self.addEventListener("activate",function(e){var t=new Set(urlsToCacheKeys.values());e.waitUntil(caches.open(cacheName).then(function(e){return e.keys().then(function(n){return Promise.all(n.map(function(n){if(!t.has(n.url))return e.delete(n)}))})}).then(function(){return self.clients.claim()}))}),self.addEventListener("fetch",function(e){if("GET"===e.request.method){var t,n=stripIgnoredUrlParameters(e.request.url,ignoreUrlParametersMatching);t=urlsToCacheKeys.has(n);t||(n=addDirectoryIndex(n,"index.html"),t=urlsToCacheKeys.has(n));!t&&"navigate"===e.request.mode&&isPathWhitelisted(["^((?!(static|api|local|service_worker.js|manifest.json)).)*$"],e.request.url)&&(n=new URL("/",self.location).toString(),t=urlsToCacheKeys.has(n)),t&&e.respondWith(caches.open(cacheName).then(function(e){return e.match(urlsToCacheKeys.get(n)).then(function(e){if(e)return e;throw Error("The cached response that was expected is missing.")})}).catch(function(t){return console.warn('Couldn\'t serve response for "%s" from cache: %O',e.request.url,t),fetch(e.request)}))}}),self.addEventListener("push",function(e){var t;e.data&&(t=e.data.json(),e.waitUntil(self.registration.showNotification(t.title,t).then(function(e){firePushCallback({type:"received",tag:t.tag,data:t.data},t.data.jwt)})))}),self.addEventListener("notificationclick",function(e){var t;notificationEventCallback("clicked",e),e.notification.close(),e.notification.data&&e.notification.data.url&&(t=e.notification.data.url)&&e.waitUntil(clients.matchAll({type:"window"}).then(function(e){var n,a;for(n=0;ns$;;$Jn#mMq>QM*wxp^kk0`!}<>U;?9TCnT39zpa8ZaY7S>;h_kyWrr1rC6PQ zv2LsT;Qsv58g53fz~T&kwzH*fY-vg*+`~`TP}^sss-#e#dc-_D=Nc zu52_6LM^Por+qn*n+vU&Kc2^_(B7`#3hu)bOQMfAcF(jU-MvK`DzJe2-L449Y&Lr? zKZ3FYdc&(As-T|R#l^+uQ`OYyiM6s#yIXK^aUd=3hgB~e`*+^6rnZRX_%&|UyYj?pRc$sp`PenJ7yhtD zA#M4ee(uWq5kw2^$h)-nK`0x2d-ac3&wq;?bLu%-F*xm7w4+rE$}tBum~uXQ_s*Mm zp_j3kNFXZVGMA|lCL>IcJdIfqo7hP2eTW~Lwl_;pR-%Tgn`pQmgY)^AX;~;nbCPl} z#H3W`n&evMq==Q!tVaR$NG>x@At@x4QgCk4I2J&3CJL5jnLe+ltW7gcX-WwY%0)t{ zGAd6%Yo-#Nb*W&SP|i6cEK`!? zu|&TZ!wpSIP7*X>r%5D|f-0mDT&kF}0-?)t+!Ifg#tt!oO9)mIo*FZIH-6Vy9q7Yfa5-{;;RhU-Bh&C^nVsVkisX+xKQ<=bL zCOAlyY&FoFaff4}fT<$p0#Z;Z=Y+`=iIff+96+U-sAjpsfh?=i-j4HF7b?rLB-g@- zLd&EOfW*m6taBqt^sz$)+z_tNZNMa9x#n3`q|D$SFGzwUeWaj8aFDJ^hU;RXB`?xK z>X_!7Ypw)QMh|kS(nTRfR^-wsV~Q-zRiT-b%Ok%mp>fXAL=gaIvLr>8b5NNq z;v_4$jwRi~LQKwSnkw`Wp@~#N79zQvjMU0W8T*H#)J@>N|MIk67@?tU)YVTOmZXh+)yS#mwpG8iCUPKSfTn7_Vj2b>QsZ3-t&U6oYxqm z*y_9xElRXlBYzcGXtB1<-c5dA+vSJJ`%q~8SFHH1KHvUaYxq2SXkuL9ch#?+xjOsi zN@< zdO&gM9OR4O%NJio9kwTGaXH%!pL!RbbL}P6s?qS~<q+Wb>M=s zdw~kyE|8uTG6(b{pO?mW-5qRtxnMB$37H;}!3I0Sr#s(u%@R)b!JEDHEmi1Rtkusw zLG=Mc{}}sF+JMMxJJ|4#22qDipY;)`;C$1*`DW(1&fSz1YCiR$jj&H^Z%;7l31(yH zu&aMZ-UogEe^%GWrmVNBhB2DRXPx{m^MGs55^sE2a^@Fo0v?R;N{cLWM#IQ7?r>6HdZR%Y=#jwTkjF+hrCp4M z)Z~sZn=G|ce2`~dteyi3qSe~%#`Z+MM{k}u(C&Ev9o>B@S8vgW1AX0s@C*UmarGLB zb;y8$o7pYg29c0 zp<52Za{_|t6Fl#GH8yB-$AiPIV6D2iI4Vc}JMVYjfBM89x~eZ?Reo`~s`|1yXnwe9 z+E378U-e}v>e4t_?u3s~9Q^rD*pMCUyl+W%xzC;453}EXHaokG(7G#)A^7xL488xI zkV64{EPoDti9TM3&W9cCrbCk0B#74w81*XkLprbvVMjNj8^PyQ-#d-UZiEc)aAT1- zP*wF7oX7#LiEb(vZf)&<|EyV8y8hSqcI5De2OWJv`mXavE|m@zT#dea{{11|m`OHQ zI=ktf`RA#>T6c>R8Dcuz525?8kZo?BIu~Q%equP$123AJ-}bJ#e5}@`tz1WO4D<0_ zTYp#PA={z62JLOG)Z8uF=GM*qxT~~>+q2+nfxUm@h6%x4XB}_#{EeX3uW^Qe+xWr# zovIp4?nl!DY9}V0dp2;Md>6P?dpUQLzIx{VfQfR0%?*ZrbK{-5_Ut>hP)w037<6P> z|7F`oPV39d07)&d8>z7yar!VDxa?pWweDP#FSdjiQ9tJgQ(Un%!-d-0UUjf5a*yBm g_Ul>p&>4u{p)7B0#^6`0tpC9fMXT_08Rt**8l(j literal 2514 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 From e020d5114a2de6e660a0d6e536793b7b86ef7e96 Mon Sep 17 00:00:00 2001 From: happyleavesaoc Date: Thu, 20 Apr 2017 01:45:12 -0400 Subject: [PATCH 126/146] spotify media player (#6980) * spotify media player * fix refresh token * spotify improvements * add checks for idle * import STATE_IDLE * support more media_ids, limit updates * move spotify device update * Remove schedule_update_ha_state because should_poll is true --- .coveragerc | 1 + .../components/media_player/spotify.py | 286 ++++++++++++++++++ requirements_all.txt | 3 + 3 files changed, 290 insertions(+) create mode 100644 homeassistant/components/media_player/spotify.py diff --git a/.coveragerc b/.coveragerc index 4c3d883cae47f8..9cc8101cc7c40c 100644 --- a/.coveragerc +++ b/.coveragerc @@ -281,6 +281,7 @@ omit = homeassistant/components/media_player/samsungtv.py homeassistant/components/media_player/snapcast.py homeassistant/components/media_player/sonos.py + homeassistant/components/media_player/spotify.py homeassistant/components/media_player/squeezebox.py homeassistant/components/media_player/vlc.py homeassistant/components/media_player/volumio.py diff --git a/homeassistant/components/media_player/spotify.py b/homeassistant/components/media_player/spotify.py new file mode 100644 index 00000000000000..ce4230bf92cca8 --- /dev/null +++ b/homeassistant/components/media_player/spotify.py @@ -0,0 +1,286 @@ +""" +Support for interacting with Spotify Connect. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/media_player.spotify/ +""" + +import logging +from datetime import timedelta + +import voluptuous as vol + +from homeassistant.core import callback +from homeassistant.loader import get_component +from homeassistant.components.http import HomeAssistantView +from homeassistant.components.media_player import ( + MEDIA_TYPE_MUSIC, MEDIA_TYPE_PLAYLIST, SUPPORT_VOLUME_SET, + SUPPORT_PLAY, SUPPORT_PAUSE, SUPPORT_PLAY_MEDIA, SUPPORT_NEXT_TRACK, + SUPPORT_PREVIOUS_TRACK, SUPPORT_SELECT_SOURCE, PLATFORM_SCHEMA, + MediaPlayerDevice) +from homeassistant.const import ( + CONF_NAME, STATE_PLAYING, STATE_PAUSED, STATE_IDLE, STATE_UNKNOWN) +import homeassistant.helpers.config_validation as cv + + +COMMIT = '544614f4b1d508201d363e84e871f86c90aa26b2' +REQUIREMENTS = ['https://github.com/happyleavesaoc/spotipy/' + 'archive/%s.zip#spotipy==2.4.4' % COMMIT] + +DEPENDENCIES = ['http'] + +_LOGGER = logging.getLogger(__name__) + +SUPPORT_SPOTIFY = SUPPORT_VOLUME_SET | SUPPORT_PAUSE | SUPPORT_PLAY |\ + SUPPORT_NEXT_TRACK | SUPPORT_PREVIOUS_TRACK | SUPPORT_SELECT_SOURCE |\ + SUPPORT_PLAY_MEDIA + +SCOPE = 'user-read-playback-state user-modify-playback-state' +DEFAULT_CACHE_PATH = '.spotify-token-cache' +AUTH_CALLBACK_PATH = '/api/spotify' +AUTH_CALLBACK_NAME = 'api:spotify' +ICON = 'mdi:spotify' +DEFAULT_NAME = 'Spotify' +DOMAIN = 'spotify' +CONF_CLIENT_ID = 'client_id' +CONF_CLIENT_SECRET = 'client_secret' +CONF_CACHE_PATH = 'cache_path' +CONFIGURATOR_LINK_NAME = 'Link Spotify account' +CONFIGURATOR_SUBMIT_CAPTION = 'I authorized successfully' +CONFIGURATOR_DESCRIPTION = 'To link your Spotify account, ' \ + 'click the link, login, and authorize:' + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_CLIENT_ID): cv.string, + vol.Required(CONF_CLIENT_SECRET): cv.string, + vol.Optional(CONF_NAME): cv.string, + vol.Optional(CONF_CACHE_PATH): cv.string +}) + +SCAN_INTERVAL = timedelta(seconds=30) + + +def request_configuration(hass, config, add_devices, oauth): + """Request Spotify authorization.""" + configurator = get_component('configurator') + hass.data[DOMAIN] = configurator.request_config( + hass, DEFAULT_NAME, lambda _: None, + link_name=CONFIGURATOR_LINK_NAME, + link_url=oauth.get_authorize_url(), + description=CONFIGURATOR_DESCRIPTION, + submit_caption=CONFIGURATOR_SUBMIT_CAPTION) + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup the Spotify platform.""" + import spotipy.oauth2 + callback_url = '{}{}'.format(hass.config.api.base_url, AUTH_CALLBACK_PATH) + cache = config.get(CONF_CACHE_PATH, hass.config.path(DEFAULT_CACHE_PATH)) + oauth = spotipy.oauth2.SpotifyOAuth( + config.get(CONF_CLIENT_ID), config.get(CONF_CLIENT_SECRET), + callback_url, scope=SCOPE, + cache_path=cache) + token_info = oauth.get_cached_token() + if not token_info: + _LOGGER.info('no token; requesting authorization') + hass.http.register_view(SpotifyAuthCallbackView( + config, add_devices, oauth)) + request_configuration(hass, config, add_devices, oauth) + return + if hass.data.get(DOMAIN): + configurator = get_component('configurator') + configurator.request_done(hass.data.get(DOMAIN)) + del hass.data[DOMAIN] + player = SpotifyMediaPlayer(oauth, config.get(CONF_NAME, DEFAULT_NAME)) + add_devices([player], True) + + +class SpotifyAuthCallbackView(HomeAssistantView): + """Spotify Authorization Callback View.""" + + requires_auth = False + url = AUTH_CALLBACK_PATH + name = AUTH_CALLBACK_NAME + + def __init__(self, config, add_devices, oauth): + """Initialize.""" + self.config = config + self.add_devices = add_devices + self.oauth = oauth + + @callback + def get(self, request): + """Receive authorization token.""" + hass = request.app['hass'] + self.oauth.get_access_token(request.GET['code']) + hass.async_add_job(setup_platform, hass, self.config, self.add_devices) + + +class SpotifyMediaPlayer(MediaPlayerDevice): + """Representation of a Spotify controller.""" + + def __init__(self, oauth, name): + """Initialize.""" + self._name = name + self._oauth = oauth + self._album = None + self._title = None + self._artist = None + self._uri = None + self._image_url = None + self._state = STATE_UNKNOWN + self._current_device = None + self._devices = None + self._volume = None + self._player = None + self._token_info = self._oauth.get_cached_token() + + def refresh_spotify_instance(self): + """Fetch a new spotify instance.""" + import spotipy + token_refreshed = False + need_token = (self._token_info is None or + self._oauth.is_token_expired(self._token_info)) + if need_token: + new_token = \ + self._oauth.refresh_access_token( + self._token_info['refresh_token']) + self._token_info = new_token + token_refreshed = True + if self._player is None or token_refreshed: + self._player = \ + spotipy.Spotify(auth=self._token_info.get('access_token')) + + def update(self): + """Update state and attributes.""" + self.refresh_spotify_instance() + # Available devices + devices = self._player.devices().get('devices') + if devices is not None: + self._devices = {device.get('name'): device.get('id') + for device in devices} + # Current playback state + current = self._player.current_playback() + if current is None: + self._state = STATE_IDLE + return + # Track metadata + item = current.get('item') + if item: + self._album = item.get('album').get('name') + self._title = item.get('name') + self._artist = ', '.join([artist.get('name') + for artist in item.get('artists')]) + self._uri = current.get('uri') + self._image_url = item.get('album').get('images')[0].get('url') + # Playing state + self._state = STATE_PAUSED + if current.get('is_playing'): + self._state = STATE_PLAYING + device = current.get('device') + if device is None: + self._state = STATE_IDLE + else: + if device.get('volume_percent'): + self._volume = device.get('volume_percent') / 100 + if device.get('name'): + self._current_device = device.get('name') + + def set_volume_level(self, volume): + """Set the volume level.""" + self._player.volume(int(volume * 100)) + + def media_next_track(self): + """Skip to next track.""" + self._player.next_track() + + def media_previous_track(self): + """Skip to previous track.""" + self._player.previous_track() + + def media_play(self): + """Start or resume playback.""" + self._player.start_playback() + + def media_pause(self): + """Pause playback.""" + self._player.pause_playback() + + def select_source(self, source): + """Select playback device.""" + self._player.transfer_playback(self._devices[source]) + + def play_media(self, media_type, media_id, **kwargs): + """Play media.""" + kwargs = {} + if media_type == MEDIA_TYPE_MUSIC: + kwargs['uris'] = [media_id] + elif media_type == MEDIA_TYPE_PLAYLIST: + kwargs['context_uri'] = media_id + else: + _LOGGER.error('media type %s is not supported', media_type) + return + if not media_id.startswith('spotify:'): + _LOGGER.error('media id must be spotify uri') + return + self._player.start_playback(**kwargs) + + @property + def name(self): + """Name.""" + return self._name + + @property + def icon(self): + """Icon.""" + return ICON + + @property + def state(self): + """Playback state.""" + return self._state + + @property + def volume_level(self): + """Device volume.""" + return self._volume + + @property + def source_list(self): + """Playback devices.""" + return list(self._devices.keys()) + + @property + def source(self): + """Current playback device.""" + return self._current_device + + @property + def media_content_id(self): + """Media URL.""" + return self._uri + + @property + def media_image_url(self): + """Media image url.""" + return self._image_url + + @property + def media_artist(self): + """Media artist.""" + return self._artist + + @property + def media_album_name(self): + """Media album.""" + return self._album + + @property + def media_title(self): + """Media title.""" + return self._title + + @property + def supported_features(self): + """Media player features that are supported.""" + return SUPPORT_SPOTIFY diff --git a/requirements_all.txt b/requirements_all.txt index 43ab2a051e493b..b737eb5e10bb88 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -264,6 +264,9 @@ https://github.com/bashwork/pymodbus/archive/d7fc4f1cc975631e0a9011390e8017f64b6 # homeassistant.components.lutron_caseta https://github.com/gurumitts/pylutron-caseta/archive/v0.2.6.zip#pylutron-caseta==v0.2.6 +# homeassistant.components.media_player.spotify +https://github.com/happyleavesaoc/spotipy/archive/544614f4b1d508201d363e84e871f86c90aa26b2.zip#spotipy==2.4.4 + # homeassistant.components.netatmo https://github.com/jabesq/netatmo-api-python/archive/v0.9.1.zip#lnetatmo==0.9.1 From f59b3da5fe823e4d6c06742c6d43890092b5b883 Mon Sep 17 00:00:00 2001 From: Gianluca Barbaro Date: Thu, 20 Apr 2017 07:53:07 +0200 Subject: [PATCH 127/146] JSON MQTT Device tracker (#7055) * ready for PR * minor fix * another minor fix * new platform mqtt_json * using ATTR constants * voluptuous check on JSON payload * voluptuous check on JSON payload --- .../components/device_tracker/mqtt_json.py | 85 ++++++++++++ .../device_tracker/test_mqtt_json.py | 128 ++++++++++++++++++ 2 files changed, 213 insertions(+) create mode 100644 homeassistant/components/device_tracker/mqtt_json.py create mode 100644 tests/components/device_tracker/test_mqtt_json.py diff --git a/homeassistant/components/device_tracker/mqtt_json.py b/homeassistant/components/device_tracker/mqtt_json.py new file mode 100644 index 00000000000000..da85055ba9645d --- /dev/null +++ b/homeassistant/components/device_tracker/mqtt_json.py @@ -0,0 +1,85 @@ +""" +Support for GPS tracking MQTT enabled devices. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/device_tracker.mqtt_json/ +""" +import asyncio +import json +import logging + +import voluptuous as vol + +import homeassistant.components.mqtt as mqtt +from homeassistant.core import callback +from homeassistant.components.mqtt import CONF_QOS +from homeassistant.components.device_tracker import PLATFORM_SCHEMA +import homeassistant.helpers.config_validation as cv +from homeassistant.const import ( + CONF_DEVICES, ATTR_GPS_ACCURACY, ATTR_LATITUDE, + ATTR_LONGITUDE, ATTR_BATTERY_LEVEL) + +DEPENDENCIES = ['mqtt'] + +_LOGGER = logging.getLogger(__name__) + +GPS_JSON_PAYLOAD_SCHEMA = vol.Schema({ + vol.Required(ATTR_LATITUDE): vol.Coerce(float), + vol.Required(ATTR_LONGITUDE): vol.Coerce(float), + vol.Optional(ATTR_GPS_ACCURACY, default=None): vol.Coerce(int), + vol.Optional(ATTR_BATTERY_LEVEL, default=None): vol.Coerce(str), +}, extra=vol.ALLOW_EXTRA) + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(mqtt.SCHEMA_BASE).extend({ + vol.Required(CONF_DEVICES): {cv.string: mqtt.valid_subscribe_topic}, +}) + + +@asyncio.coroutine +def async_setup_scanner(hass, config, async_see, discovery_info=None): + """Setup the MQTT tracker.""" + devices = config[CONF_DEVICES] + qos = config[CONF_QOS] + + dev_id_lookup = {} + + @callback + def async_tracker_message_received(topic, payload, qos): + """MQTT message received.""" + dev_id = dev_id_lookup[topic] + + try: + data = GPS_JSON_PAYLOAD_SCHEMA(json.loads(payload)) + except vol.MultipleInvalid: + _LOGGER.error('Skipping update for following data ' + 'because of missing or malformatted data: %s', + payload) + return + except ValueError: + _LOGGER.error('Error parsing JSON payload: %s', payload) + return + + kwargs = _parse_see_args(dev_id, data) + hass.async_add_job( + async_see(**kwargs)) + + for dev_id, topic in devices.items(): + dev_id_lookup[topic] = dev_id + yield from mqtt.async_subscribe( + hass, topic, async_tracker_message_received, qos) + + return True + + +def _parse_see_args(dev_id, data): + """Parse the payload location parameters, into the format see expects.""" + kwargs = { + 'gps': (data[ATTR_LATITUDE], data[ATTR_LONGITUDE]), + 'dev_id': dev_id + } + + if ATTR_GPS_ACCURACY in data: + kwargs[ATTR_GPS_ACCURACY] = data[ATTR_GPS_ACCURACY] + if ATTR_BATTERY_LEVEL in data: + kwargs['battery'] = data[ATTR_BATTERY_LEVEL] + return kwargs diff --git a/tests/components/device_tracker/test_mqtt_json.py b/tests/components/device_tracker/test_mqtt_json.py new file mode 100644 index 00000000000000..fdca113a7ff7c5 --- /dev/null +++ b/tests/components/device_tracker/test_mqtt_json.py @@ -0,0 +1,128 @@ +"""The tests for the JSON MQTT device tracker platform.""" +import asyncio +import json +import unittest +from unittest.mock import patch +import logging +import os + +from homeassistant.setup import setup_component +from homeassistant.components import device_tracker +from homeassistant.const import CONF_PLATFORM + +from tests.common import ( + get_test_home_assistant, mock_mqtt_component, fire_mqtt_message) + +_LOGGER = logging.getLogger(__name__) + +LOCATION_MESSAGE = { + 'longitude': 1.0, + 'gps_accuracy': 60, + 'latitude': 2.0, + 'battery_level': 99.9} + +LOCATION_MESSAGE_INCOMPLETE = { + 'longitude': 2.0} + + +class TestComponentsDeviceTrackerJSONMQTT(unittest.TestCase): + """Test JSON MQTT device tracker platform.""" + + def setUp(self): # pylint: disable=invalid-name + """Setup things to be run when tests are started.""" + self.hass = get_test_home_assistant() + mock_mqtt_component(self.hass) + + def tearDown(self): # pylint: disable=invalid-name + """Stop everything that was started.""" + self.hass.stop() + try: + os.remove(self.hass.config.path(device_tracker.YAML_DEVICES)) + except FileNotFoundError: + pass + + def test_ensure_device_tracker_platform_validation(self): \ + # pylint: disable=invalid-name + """Test if platform validation was done.""" + @asyncio.coroutine + def mock_setup_scanner(hass, config, see, discovery_info=None): + """Check that Qos was added by validation.""" + self.assertTrue('qos' in config) + + with patch('homeassistant.components.device_tracker.mqtt_json.' + 'async_setup_scanner', autospec=True, + side_effect=mock_setup_scanner) as mock_sp: + + dev_id = 'paulus' + topic = 'location/paulus' + assert setup_component(self.hass, device_tracker.DOMAIN, { + device_tracker.DOMAIN: { + CONF_PLATFORM: 'mqtt_json', + 'devices': {dev_id: topic} + } + }) + assert mock_sp.call_count == 1 + + def test_json_message(self): + """Test json location message.""" + dev_id = 'zanzito' + topic = 'location/zanzito' + location = json.dumps(LOCATION_MESSAGE) + + self.hass.config.components = set(['mqtt_json', 'zone']) + assert setup_component(self.hass, device_tracker.DOMAIN, { + device_tracker.DOMAIN: { + CONF_PLATFORM: 'mqtt_json', + 'devices': {dev_id: topic} + } + }) + fire_mqtt_message(self.hass, topic, location) + self.hass.block_till_done() + state = self.hass.states.get('device_tracker.zanzito') + self.assertEqual(state.attributes.get('latitude'), 2.0) + self.assertEqual(state.attributes.get('longitude'), 1.0) + + def test_non_json_message(self): + """Test receiving a non JSON message.""" + dev_id = 'zanzito' + topic = 'location/zanzito' + location = 'home' + + self.hass.config.components = set(['mqtt_json']) + assert setup_component(self.hass, device_tracker.DOMAIN, { + device_tracker.DOMAIN: { + CONF_PLATFORM: 'mqtt_json', + 'devices': {dev_id: topic} + } + }) + + with self.assertLogs(level='ERROR') as test_handle: + fire_mqtt_message(self.hass, topic, location) + self.hass.block_till_done() + self.assertIn( + "ERROR:homeassistant.components.device_tracker.mqtt_json:" + "Error parsing JSON payload: home", + test_handle.output[0]) + + def test_incomplete_message(self): + """Test receiving an incomplete message.""" + dev_id = 'zanzito' + topic = 'location/zanzito' + location = json.dumps(LOCATION_MESSAGE_INCOMPLETE) + + self.hass.config.components = set(['mqtt_json']) + assert setup_component(self.hass, device_tracker.DOMAIN, { + device_tracker.DOMAIN: { + CONF_PLATFORM: 'mqtt_json', + 'devices': {dev_id: topic} + } + }) + + with self.assertLogs(level='ERROR') as test_handle: + fire_mqtt_message(self.hass, topic, location) + self.hass.block_till_done() + self.assertIn( + "ERROR:homeassistant.components.device_tracker.mqtt_json:" + "Skipping update for following data because of missing " + "or malformatted data: {\"longitude\": 2.0}", + test_handle.output[0]) From 1860b6c52161a935d0a822d8ef415c5f9ee64baa Mon Sep 17 00:00:00 2001 From: happyleavesaoc Date: Thu, 20 Apr 2017 01:56:20 -0400 Subject: [PATCH 128/146] opensky sensor (#7061) * opensky sensor * address opensky review comments * update opensky distance calc --- .coveragerc | 1 + homeassistant/components/sensor/opensky.py | 141 +++++++++++++++++++++ 2 files changed, 142 insertions(+) create mode 100644 homeassistant/components/sensor/opensky.py diff --git a/.coveragerc b/.coveragerc index 9cc8101cc7c40c..ff081214ec7fd8 100644 --- a/.coveragerc +++ b/.coveragerc @@ -384,6 +384,7 @@ omit = homeassistant/components/sensor/onewire.py homeassistant/components/sensor/openevse.py homeassistant/components/sensor/openexchangerates.py + homeassistant/components/sensor/opensky.py homeassistant/components/sensor/openweathermap.py homeassistant/components/sensor/pi_hole.py homeassistant/components/sensor/plex.py diff --git a/homeassistant/components/sensor/opensky.py b/homeassistant/components/sensor/opensky.py new file mode 100644 index 00000000000000..17e5f1f351c02f --- /dev/null +++ b/homeassistant/components/sensor/opensky.py @@ -0,0 +1,141 @@ +""" +Sensor for the Open Sky Network. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/sensor.opensky/ +""" +import logging +from datetime import timedelta + +import requests +import voluptuous as vol + +from homeassistant.components.sensor import PLATFORM_SCHEMA +from homeassistant.const import ( + CONF_NAME, CONF_LATITUDE, CONF_LONGITUDE, + ATTR_ATTRIBUTION, ATTR_LATITUDE, ATTR_LONGITUDE, + LENGTH_KILOMETERS, LENGTH_METERS) +from homeassistant.helpers.entity import Entity +from homeassistant.util import distance as util_distance +from homeassistant.util import location as util_location +import homeassistant.helpers.config_validation as cv + + +_LOGGER = logging.getLogger(__name__) + +SCAN_INTERVAL = timedelta(seconds=12) # opensky public limit is 10 seconds +DOMAIN = 'opensky' +EVENT_OPENSKY_ENTRY = '{}_entry'.format(DOMAIN) +EVENT_OPENSKY_EXIT = '{}_exit'.format(DOMAIN) +CONF_RADIUS = 'radius' +ATTR_SENSOR = 'sensor' +ATTR_STATES = 'states' +ATTR_ON_GROUND = 'on_ground' +ATTR_CALLSIGN = 'callsign' +OPENSKY_ATTRIBUTION = "Information provided by the OpenSky Network "\ + "(https://opensky-network.org)" +OPENSKY_API_URL = 'https://opensky-network.org/api/states/all' +OPENSKY_API_FIELDS = [ + 'icao24', ATTR_CALLSIGN, 'origin_country', 'time_position', + 'time_velocity', ATTR_LONGITUDE, ATTR_LATITUDE, 'altitude', + ATTR_ON_GROUND, 'velocity', 'heading', 'vertical_rate', 'sensors'] + + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_RADIUS): vol.Coerce(float), + vol.Optional(CONF_NAME): cv.string, + vol.Inclusive(CONF_LATITUDE, 'coordinates'): cv.latitude, + vol.Inclusive(CONF_LONGITUDE, 'coordinates'): cv.longitude +}) + + +# pylint: disable=unused-argument +def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup the Open Sky platform.""" + latitude = config.get(CONF_LATITUDE, hass.config.latitude) + longitude = config.get(CONF_LONGITUDE, hass.config.longitude) + add_devices([OpenSkySensor( + hass, config.get(CONF_NAME, DOMAIN), latitude, longitude, + config.get(CONF_RADIUS))], True) + + +class OpenSkySensor(Entity): + """Open Sky Network Sensor.""" + + def __init__(self, hass, name, latitude, longitude, radius): + """Initialize the sensor.""" + self._session = requests.Session() + self._latitude = latitude + self._longitude = longitude + self._radius = util_distance.convert( + radius, LENGTH_KILOMETERS, LENGTH_METERS) + self._state = 0 + self._hass = hass + self._name = name + self._previously_tracked = None + + @property + def name(self): + """Return the name of the sensor.""" + return self._name + + @property + def state(self): + """Return the state of the sensor.""" + return self._state + + def _handle_boundary(self, callsigns, event): + """Handle flights crossing region boundary.""" + for callsign in callsigns: + data = { + ATTR_CALLSIGN: callsign, + ATTR_SENSOR: self._name + } + self._hass.bus.fire(event, data) + + def update(self): + """Update device state.""" + currently_tracked = set() + states = self._session.get(OPENSKY_API_URL).json().get(ATTR_STATES) + for state in states: + data = dict(zip(OPENSKY_API_FIELDS, state)) + missing_location = ( + data.get(ATTR_LONGITUDE) is None or + data.get(ATTR_LATITUDE) is None) + if missing_location: + continue + if data.get(ATTR_ON_GROUND): + continue + distance = util_location.distance( + self._latitude, self._longitude, + data.get(ATTR_LATITUDE), data.get(ATTR_LONGITUDE)) + if distance is None or distance > self._radius: + continue + callsign = data[ATTR_CALLSIGN].strip() + if callsign == '': + continue + currently_tracked.add(callsign) + if self._previously_tracked is not None: + entries = currently_tracked - self._previously_tracked + exits = self._previously_tracked - currently_tracked + self._handle_boundary(entries, EVENT_OPENSKY_ENTRY) + self._handle_boundary(exits, EVENT_OPENSKY_EXIT) + self._state = len(currently_tracked) + self._previously_tracked = currently_tracked + + @property + def device_state_attributes(self): + """Return the state attributes.""" + return { + ATTR_ATTRIBUTION: OPENSKY_ATTRIBUTION + } + + @property + def unit_of_measurement(self): + """Unit of measurement.""" + return 'flights' + + @property + def icon(self): + """Icon.""" + return 'mdi:airplane' From b1621d4175e5e2676d9e948407ede778faa36e42 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Thu, 20 Apr 2017 08:15:26 +0200 Subject: [PATCH 129/146] Add ping binary sensor (#7052) * Add ping binary sensor * Fix typo and lint issues * Use SCAN_INTERVAL --- .coveragerc | 1 + .../components/binary_sensor/ping.py | 130 ++++++++++++++++++ 2 files changed, 131 insertions(+) create mode 100644 homeassistant/components/binary_sensor/ping.py diff --git a/.coveragerc b/.coveragerc index ff081214ec7fd8..3cd614e1503861 100644 --- a/.coveragerc +++ b/.coveragerc @@ -165,6 +165,7 @@ omit = homeassistant/components/binary_sensor/flic.py homeassistant/components/binary_sensor/hikvision.py homeassistant/components/binary_sensor/iss.py + homeassistant/components/binary_sensor/ping.py homeassistant/components/binary_sensor/rest.py homeassistant/components/browser.py homeassistant/components/camera/amcrest.py diff --git a/homeassistant/components/binary_sensor/ping.py b/homeassistant/components/binary_sensor/ping.py new file mode 100644 index 00000000000000..cee5b81f00d3da --- /dev/null +++ b/homeassistant/components/binary_sensor/ping.py @@ -0,0 +1,130 @@ +""" +Tracks the latency of a host by sending ICMP echo requests (ping). + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/binary_sensor.ping/ +""" +import logging +import subprocess +import re +import sys +from datetime import timedelta + +import voluptuous as vol + +import homeassistant.helpers.config_validation as cv +from homeassistant.components.binary_sensor import ( + BinarySensorDevice, PLATFORM_SCHEMA) +from homeassistant.const import CONF_NAME, CONF_HOST + +_LOGGER = logging.getLogger(__name__) + +ATTR_ROUND_TRIP_TIME_AVG = 'round_trip_time_avg' +ATTR_ROUND_TRIP_TIME_MAX = 'round_trip_time_max' +ATTR_ROUND_TRIP_TIME_MDEV = 'round_trip_time_mdev' +ATTR_ROUND_TRIP_TIME_MIN = 'round_trip_time_min' + +CONF_PING_COUNT = 'count' + +DEFAULT_NAME = 'Ping Binary sensor' +DEFAULT_PING_COUNT = 5 +DEFAULT_SENSOR_CLASS = 'connectivity' + +SCAN_INTERVAL = timedelta(minutes=5) + +PING_MATCHER = re.compile( + r'(?P\d+.\d+)\/(?P\d+.\d+)\/(?P\d+.\d+)\/(?P\d+.\d+)') + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_HOST): cv.string, + vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, + vol.Optional(CONF_PING_COUNT, default=DEFAULT_PING_COUNT): cv.positive_int, +}) + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Set up the Ping Binary sensor.""" + name = config.get(CONF_NAME) + host = config.get(CONF_HOST) + count = config.get(CONF_PING_COUNT) + + add_devices([PingBinarySensor(name, PingData(host, count))], True) + + +class PingBinarySensor(BinarySensorDevice): + """Representation of a Ping Binary sensor.""" + + def __init__(self, name, ping): + """Initialize the Ping Binary sensor.""" + self._name = name + self.ping = ping + + @property + def name(self): + """Return the name of the device.""" + return self._name + + @property + def device_class(self): + """Return the class of this sensor.""" + return DEFAULT_SENSOR_CLASS + + @property + def is_on(self): + """Return true if the binary sensor is on.""" + return self.ping.available + + @property + def device_state_attributes(self): + """Return the state attributes of the ICMP checo request.""" + if self.ping.data is not False: + return { + ATTR_ROUND_TRIP_TIME_AVG: self.ping.data['avg'], + ATTR_ROUND_TRIP_TIME_MAX: self.ping.data['max'], + ATTR_ROUND_TRIP_TIME_MDEV: self.ping.data['mdev'], + ATTR_ROUND_TRIP_TIME_MIN: self.ping.data['min'], + } + + def update(self): + """Get the latest data.""" + self.ping.update() + + +class PingData(object): + """The Class for handling the data retrieval.""" + + def __init__(self, host, count): + """Initialize the data object.""" + self._ip_address = host + self._count = count + self.data = {} + self.available = False + + if sys.platform == 'win32': + self._ping_cmd = [ + 'ping', '-n', str(self._count), '-w 1000', self._ip_address] + else: + self._ping_cmd = [ + 'ping', '-n', '-q', '-c', str(self._count), '-W1', + self._ip_address] + + def ping(self): + """Send ICMP echo request and return details if success.""" + pinger = subprocess.Popen( + self._ping_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + try: + out = pinger.communicate() + match = PING_MATCHER.search(str(out).split('\n')[-1]) + rtt_min, rtt_avg, rtt_max, rtt_mdev = match.groups() + return { + 'min': rtt_min, + 'avg': rtt_avg, + 'max': rtt_max, + 'mdev': rtt_mdev} + except (subprocess.CalledProcessError, AttributeError): + return False + + def update(self): + """Retrieve the latest details from the host.""" + self.data = self.ping() + self.available = bool(self.data) From 0c14c66fbc64ed8d2730204437e29f3410ec0493 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6ren=20Oldag?= Date: Thu, 20 Apr 2017 02:32:20 -0400 Subject: [PATCH 130/146] Added light.pwm component. (#7009) * Added light.pwm component. * Renamed pwm platform to rpi_gpio_pwm. * Update requirements_all.txt --- .coveragerc | 1 + .../components/light/rpi_gpio_pwm.py | 213 ++++++++++++++++++ requirements_all.txt | 3 + 3 files changed, 217 insertions(+) create mode 100644 homeassistant/components/light/rpi_gpio_pwm.py diff --git a/.coveragerc b/.coveragerc index 3cd614e1503861..623e985c8f5d33 100644 --- a/.coveragerc +++ b/.coveragerc @@ -236,6 +236,7 @@ omit = homeassistant/components/light/limitlessled.py homeassistant/components/light/mystrom.py homeassistant/components/light/osramlightify.py + homeassistant/components/light/rpi_gpio_pwm.py homeassistant/components/light/piglow.py homeassistant/components/light/tikteck.py homeassistant/components/light/tradfri.py diff --git a/homeassistant/components/light/rpi_gpio_pwm.py b/homeassistant/components/light/rpi_gpio_pwm.py new file mode 100644 index 00000000000000..c8ba110c58af05 --- /dev/null +++ b/homeassistant/components/light/rpi_gpio_pwm.py @@ -0,0 +1,213 @@ +""" +Support for LED lights that can be controlled using PWM. + +For more details about this platform, please refer to the documentation at +https://home-assistant.io/components/light.pwm/ +""" + +import logging + +import voluptuous as vol + +from homeassistant.const import CONF_NAME, CONF_TYPE +from homeassistant.components.light import ( + Light, ATTR_BRIGHTNESS, ATTR_RGB_COLOR, ATTR_TRANSITION, + SUPPORT_BRIGHTNESS, SUPPORT_RGB_COLOR, SUPPORT_TRANSITION, PLATFORM_SCHEMA) +import homeassistant.helpers.config_validation as cv + +REQUIREMENTS = ['pwmled==1.1.1'] + +_LOGGER = logging.getLogger(__name__) + +CONF_LEDS = 'leds' +CONF_DRIVER = 'driver' +CONF_PINS = 'pins' +CONF_FREQUENCY = 'frequency' +CONF_ADDRESS = 'address' + +CONF_DRIVER_GPIO = 'gpio' +CONF_DRIVER_PCA9685 = 'pca9685' +CONF_DRIVER_TYPES = [CONF_DRIVER_GPIO, CONF_DRIVER_PCA9685] + +CONF_LED_TYPE_SIMPLE = 'simple' +CONF_LED_TYPE_RGB = 'rgb' +CONF_LED_TYPE_RGBW = 'rgbw' +CONF_LED_TYPES = [CONF_LED_TYPE_SIMPLE, CONF_LED_TYPE_RGB, CONF_LED_TYPE_RGBW] + +DEFAULT_COLOR = [255, 255, 255] + +SUPPORT_SIMPLE_LED = (SUPPORT_BRIGHTNESS | SUPPORT_TRANSITION) +SUPPORT_RGB_LED = (SUPPORT_BRIGHTNESS | SUPPORT_RGB_COLOR | SUPPORT_TRANSITION) + +PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ + vol.Required(CONF_LEDS): vol.All(cv.ensure_list, [ + { + vol.Required(CONF_NAME): cv.string, + vol.Required(CONF_DRIVER): vol.In(CONF_DRIVER_TYPES), + vol.Required(CONF_PINS): vol.All(cv.ensure_list, + [cv.positive_int]), + vol.Required(CONF_TYPE): vol.In(CONF_LED_TYPES), + vol.Optional(CONF_FREQUENCY): cv.positive_int, + vol.Optional(CONF_ADDRESS): cv.byte + } + ]) +}) + + +def setup_platform(hass, config, add_devices, discovery_info=None): + """Setup the pwm lights.""" + from pwmled.led import SimpleLed + from pwmled.led.rgb import RgbLed + from pwmled.led.rgbw import RgbwLed + from pwmled.driver.gpio import GpioDriver + from pwmled.driver.pca9685 import Pca9685Driver + + leds = [] + for led_conf in config[CONF_LEDS]: + driver_type = led_conf[CONF_DRIVER] + pins = led_conf[CONF_PINS] + opt_args = {} + if CONF_FREQUENCY in led_conf: + opt_args['freq'] = led_conf[CONF_FREQUENCY] + if driver_type == CONF_DRIVER_GPIO: + driver = GpioDriver(pins, **opt_args) + elif driver_type == CONF_DRIVER_PCA9685: + if CONF_ADDRESS in led_conf: + opt_args['address'] = led_conf[CONF_ADDRESS] + driver = Pca9685Driver(pins, **opt_args) + else: + _LOGGER.error("Invalid driver type.") + return + + name = led_conf[CONF_NAME] + led_type = led_conf[CONF_TYPE] + if led_type == CONF_LED_TYPE_SIMPLE: + led = PwmSimpleLed(SimpleLed(driver), name) + elif led_type == CONF_LED_TYPE_RGB: + led = PwmRgbLed(RgbLed(driver), name) + elif led_type == CONF_LED_TYPE_RGBW: + led = PwmRgbLed(RgbwLed(driver), name) + else: + _LOGGER.error("Invalid led type.") + return + leds.append(led) + + add_devices(leds) + + +class PwmSimpleLed(Light): + """Representation of a simple on-color pwm led.""" + + def __init__(self, led, name): + """Initialize led.""" + self._led = led + self._name = name + self._is_on = False + self._brightness = 255 + + @property + def should_poll(self): + """No polling needed.""" + return False + + @property + def name(self): + """Return the name of the group.""" + return self._name + + @property + def is_on(self): + """Return true if device is on.""" + return self._is_on + + @property + def brightness(self): + """Return the brightness property.""" + return self._brightness + + @property + def supported_features(self): + """Flag supported features.""" + return SUPPORT_SIMPLE_LED + + def turn_on(self, **kwargs): + """Turn on a led.""" + if ATTR_BRIGHTNESS in kwargs: + self._brightness = kwargs[ATTR_BRIGHTNESS] + + if ATTR_TRANSITION in kwargs: + transition_time = kwargs[ATTR_TRANSITION] + self._led.transition( + transition_time, + is_on=True, + brightness=_from_hass_brightness(self._brightness)) + else: + self._led.set(is_on=True, + brightness=_from_hass_brightness(self._brightness)) + + self._is_on = True + self.schedule_update_ha_state() + + def turn_off(self, **kwargs): + """Turn off a led.""" + if self.is_on: + if ATTR_TRANSITION in kwargs: + transition_time = kwargs[ATTR_TRANSITION] + self._led.transition(transition_time, is_on=False) + else: + self._led.off() + + self._is_on = False + self.schedule_update_ha_state() + + +class PwmRgbLed(PwmSimpleLed): + """Representation of a rgb(w) pwm led.""" + + def __init__(self, led, name): + """Initialize led.""" + super().__init__(led, name) + self._color = DEFAULT_COLOR + + @property + def rgb_color(self): + """Return the color property.""" + return self._color + + @property + def supported_features(self): + """Flag supported features.""" + return SUPPORT_RGB_LED + + def turn_on(self, **kwargs): + """Turn on a led.""" + if ATTR_RGB_COLOR in kwargs: + self._color = kwargs[ATTR_RGB_COLOR] + if ATTR_BRIGHTNESS in kwargs: + self._brightness = kwargs[ATTR_BRIGHTNESS] + + if ATTR_TRANSITION in kwargs: + transition_time = kwargs[ATTR_TRANSITION] + self._led.transition( + transition_time, + is_on=True, + brightness=_from_hass_brightness(self._brightness), + color=_from_hass_color(self._color)) + else: + self._led.set(is_on=True, + brightness=_from_hass_brightness(self._brightness), + color=_from_hass_color(self._color)) + + self._is_on = True + self.schedule_update_ha_state() + + +def _from_hass_brightness(brightness): + """Convert Home Assistant brightness units to percentage.""" + return brightness / 255 + + +def _from_hass_color(color): + """Convert Home Assistant RGB list to Color tuple.""" + from pwmled import Color + return Color(*tuple(color)) diff --git a/requirements_all.txt b/requirements_all.txt index b737eb5e10bb88..59178bb5df1399 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -468,6 +468,9 @@ pushetta==1.0.15 # homeassistant.components.sensor.waqi pwaqi==3.0 +# homeassistant.components.light.rpi_gpio_pwm +pwmled==1.1.1 + # homeassistant.components.sensor.cpuspeed py-cpuinfo==3.0.0 From 2d5ab520ef8752835f172a37ee07f67d957a007a Mon Sep 17 00:00:00 2001 From: Mitko Masarliev Date: Thu, 20 Apr 2017 10:08:53 +0300 Subject: [PATCH 131/146] Fix for errors on missing preview on LG webos TV (#6755) * fix for missing image preview on LG webos TV * fix to use largeIcon if it start with http --- homeassistant/components/media_player/webostv.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/media_player/webostv.py b/homeassistant/components/media_player/webostv.py index 7fa4fd697c5079..b8f43486db1c20 100644 --- a/homeassistant/components/media_player/webostv.py +++ b/homeassistant/components/media_player/webostv.py @@ -238,7 +238,10 @@ def media_content_type(self): def media_image_url(self): """Image url of current playing media.""" if self._current_source_id in self._app_list: - return self._app_list[self._current_source_id]['largeIcon'] + icon = self._app_list[self._current_source_id]['largeIcon'] + if not icon.startswith('http'): + icon = self._app_list[self._current_source_id]['icon'] + return icon return None @property From 2e11d49af3003e0fce14937a2d2367ed1dfccab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre=20St=C3=A5hl?= Date: Thu, 20 Apr 2017 09:09:27 +0200 Subject: [PATCH 132/146] Fix auto discovery for Apple TV (#7188) --- homeassistant/components/media_player/apple_tv.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/components/media_player/apple_tv.py b/homeassistant/components/media_player/apple_tv.py index 4059d81a671952..3833d3f50bd875 100644 --- a/homeassistant/components/media_player/apple_tv.py +++ b/homeassistant/components/media_player/apple_tv.py @@ -51,7 +51,7 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): if discovery_info is not None: name = discovery_info['name'] host = discovery_info['host'] - login_id = discovery_info['properties']['hsgid'] + login_id = discovery_info['properties']['hG'] start_off = False else: name = config.get(CONF_NAME) From 93820d5124cb043e2f4373735f7c94ba48e689cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre=20St=C3=A5hl?= Date: Thu, 20 Apr 2017 09:10:06 +0200 Subject: [PATCH 133/146] Do not request artwork if not available (#7189) This should fix the "dancing media player" issue where the media player requests artwork when it's not really available, making the UI "dance". --- homeassistant/components/media_player/apple_tv.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/homeassistant/components/media_player/apple_tv.py b/homeassistant/components/media_player/apple_tv.py index 3833d3f50bd875..580870cf375f8c 100644 --- a/homeassistant/components/media_player/apple_tv.py +++ b/homeassistant/components/media_player/apple_tv.py @@ -145,6 +145,8 @@ def state(self): @callback def playstatus_update(self, updater, playing): """Print what is currently playing when it changes.""" + self._playing = playing + if self.state == STATE_IDLE: self._artwork_hash = None elif self._has_playing_media_changed(playing): @@ -153,7 +155,6 @@ def playstatus_update(self, updater, playing): self._artwork_hash = hashlib.md5( base.encode('utf-8')).hexdigest() - self._playing = playing self.hass.async_add_job(self.async_update_ha_state()) def _has_playing_media_changed(self, new_playing): From 920d298c7e117cb9b83e3489df5d40860b5d334b Mon Sep 17 00:00:00 2001 From: mountainsandcode Date: Thu, 20 Apr 2017 09:11:55 +0200 Subject: [PATCH 134/146] mvglive bug fixes and improvements (#6953) * Refactored mvglive.py This pull requests builds on the first work with the mvglive sensor: - Refactoring the code so that multiple sensors for departures can be added - Rewrites the transport mode restrictions ("products") to be more modular - Fixes bugs, such as missing implementation of line restriction - Other improvements, such as including data attribution * Further improvements to mvglive sensor - The API returns the property 'direction', which can be used to filter U-Bahn trains by direction without having to enter all final destinations - The sensor icon now corresponds to the mode of transport of the next departure * UBahnDirection refactored U-Bahn SEV (bus replacement services) have unexpected direction values, fixed resulting bug and hound issues --- homeassistant/components/sensor/mvglive.py | 183 ++++++++++++--------- 1 file changed, 102 insertions(+), 81 deletions(-) diff --git a/homeassistant/components/sensor/mvglive.py b/homeassistant/components/sensor/mvglive.py index b8bab2a6b5d832..c2f8c2be71fee1 100644 --- a/homeassistant/components/sensor/mvglive.py +++ b/homeassistant/components/sensor/mvglive.py @@ -10,149 +10,170 @@ import voluptuous as vol import homeassistant.helpers.config_validation as cv -from homeassistant.util import Throttle from homeassistant.helpers.entity import Entity from homeassistant.components.sensor import PLATFORM_SCHEMA -from homeassistant.const import STATE_UNKNOWN +from homeassistant.const import ( + CONF_NAME, ATTR_ATTRIBUTION, STATE_UNKNOWN + ) REQUIREMENTS = ['PyMVGLive==1.1.3'] _LOGGER = logging.getLogger(__name__) -CONF_BUS = 'bus' -CONF_DEST = 'destination' -CONF_LINE = 'line' -CONF_OFFSET = 'offset' -CONF_SBAHN = 'sbahn' -CONF_STATION = 'station' -CONF_TRAM = 'tram' -CONF_UBAHN = 'ubahn' - -ICON = 'mdi:bus' +CONF_NEXT_DEPARTURE = 'nextdeparture' -MIN_TIME_BETWEEN_UPDATES = timedelta(seconds=15) +CONF_STATION = 'station' +CONF_DESTINATIONS = 'destinations' +CONF_DIRECTIONS = 'directions' +CONF_LINES = 'lines' +CONF_PRODUCTS = 'products' +CONF_TIMEOFFSET = 'timeoffset' + +ICONS = { + 'U-Bahn': 'mdi:subway', + 'Tram': 'mdi:tram', + 'Bus': 'mdi:bus', + 'S-Bahn': 'mdi:train', + 'SEV': 'mdi:checkbox-blank-circle-outline', + '-': 'mdi:clock' +} +ATTRIBUTION = "Data provided by MVG-live.de" + +SCAN_INTERVAL = timedelta(seconds=30) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ - vol.Required(CONF_STATION): cv.string, - vol.Optional(CONF_DEST, default=None): cv.string, - vol.Optional(CONF_LINE, default=None): cv.string, - vol.Optional(CONF_OFFSET, default=0): cv.positive_int, - vol.Optional(CONF_UBAHN, default=True): cv.boolean, - vol.Optional(CONF_TRAM, default=True): cv.boolean, - vol.Optional(CONF_BUS, default=True): cv.boolean, - vol.Optional(CONF_SBAHN, default=True): cv.boolean, + vol.Optional(CONF_NEXT_DEPARTURE): [{ + vol.Required(CONF_STATION): cv.string, + vol.Optional(CONF_DESTINATIONS, default=['']): cv.ensure_list_csv, + vol.Optional(CONF_DIRECTIONS, default=['']): cv.ensure_list_csv, + vol.Optional(CONF_LINES, default=['']): cv.ensure_list_csv, + vol.Optional(CONF_PRODUCTS, + default=['U-Bahn', 'Tram', + 'Bus', 'S-Bahn']): cv.ensure_list_csv, + vol.Optional(CONF_TIMEOFFSET, default=0): cv.positive_int, + vol.Optional(CONF_NAME): cv.string}] }) def setup_platform(hass, config, add_devices, discovery_info=None): - """Set up the MVG Live Sensor.""" - station = config.get(CONF_STATION) - destination = config.get(CONF_DEST) - line = config.get(CONF_LINE) - offset = config.get(CONF_OFFSET) - ubahn = config.get(CONF_UBAHN) - tram = config.get(CONF_TRAM) - bus = config.get(CONF_BUS) - sbahn = config.get(CONF_SBAHN) - - add_devices([MVGLiveSensor( - station, destination, line, offset, ubahn, tram, bus, sbahn)], True) - - + """Get the MVGLive sensor.""" + sensors = [] + for nextdeparture in config.get(CONF_NEXT_DEPARTURE): + sensors.append( + MVGLiveSensor( + nextdeparture.get(CONF_STATION), + nextdeparture.get(CONF_DESTINATIONS), + nextdeparture.get(CONF_DIRECTIONS), + nextdeparture.get(CONF_LINES), + nextdeparture.get(CONF_PRODUCTS), + nextdeparture.get(CONF_TIMEOFFSET), + nextdeparture.get(CONF_NAME))) + add_devices(sensors, True) + + +# pylint: disable=too-few-public-methods class MVGLiveSensor(Entity): """Implementation of an MVG Live sensor.""" - def __init__(self, station, destination, line, - offset, ubahn, tram, bus, sbahn): + def __init__(self, station, destinations, directions, + lines, products, timeoffset, name): """Initialize the sensor.""" self._station = station - self._destination = destination - self._line = line - self.data = MVGLiveData(station, destination, line, - offset, ubahn, tram, bus, sbahn) + self._name = name + self.data = MVGLiveData(station, destinations, directions, + lines, products, timeoffset) self._state = STATE_UNKNOWN + self._icon = ICONS['-'] @property def name(self): """Return the name of the sensor.""" - # e.g. - # 'Hauptbahnhof (S1)' - # 'Hauptbahnhof-Marienplatz' - # 'Hauptbahnhof-Marienplatz (S1)' - namestr = self._station - if self._destination: - namestr = '{}-{}'.format(namestr, self._destination) - if self._line: - namestr = '{} ({})'.format(namestr, self._line) - return namestr - - @property - def icon(self): - """Return the icon for the frontend.""" - return ICON + if self._name: + return self._name + else: + return self._station @property def state(self): - """Return the departure time of the next train.""" + """Return the next departure time.""" return self._state @property def state_attributes(self): """Return the state attributes.""" - return self.data.nextdeparture + return self.data.departures + + @property + def icon(self): + """Icon to use in the frontend, if any.""" + return self._icon + + @property + def unit_of_measurement(self): + """Return the unit this state is expressed in.""" + return "min" def update(self): """Get the latest data and update the state.""" self.data.update() - if not self.data.nextdeparture: + if not self.data.departures: self._state = '-' + self._icon = ICONS['-'] else: - self._state = self.data.nextdeparture.get('time', '-') + self._state = self.data.departures.get('time', '-') + self._icon = ICONS[self.data.departures.get('product', '-')] class MVGLiveData(object): """Pull data from the mvg-live.de web page.""" - def __init__(self, station, destination, line, - offset, ubahn, tram, bus, sbahn): + def __init__(self, station, destinations, directions, + lines, products, timeoffset): """Initialize the sensor.""" import MVGLive self._station = station - self._destination = destination - self._line = line - self._offset = offset - self._ubahn = ubahn - self._tram = tram - self._bus = bus - self._sbahn = sbahn + self._destinations = destinations + self._directions = directions + self._lines = lines + self._products = products + self._timeoffset = timeoffset + self._include_ubahn = True if 'U-Bahn' in self._products else False + self._include_tram = True if 'Tram' in self._products else False + self._include_bus = True if 'Bus' in self._products else False + self._include_sbahn = True if 'S-Bahn' in self._products else False self.mvg = MVGLive.MVGLive() - self.nextdeparture = {} + self.departures = {} - @Throttle(MIN_TIME_BETWEEN_UPDATES) def update(self): """Update the connection data.""" try: - _departures = self.mvg.getlivedata( - station=self._station, ubahn=self._ubahn, tram=self._tram, - bus=self._bus, sbahn=self._sbahn) + _departures = self.mvg.getlivedata(station=self._station, + ubahn=self._include_ubahn, + tram=self._include_tram, + bus=self._include_bus, + sbahn=self._include_sbahn) except ValueError: - self.nextdeparture = {} + self.departures = {} _LOGGER.warning("Returned data not understood.") return for _departure in _departures: # find the first departure meeting the criteria - if not _departure['destination'].startswith(self._destination): + if ('' not in self._destinations[:1] and + _departure['destination'] not in self._destinations): + continue + elif ('' not in self._directions[:1] and + _departure['direction'] not in self._directions): continue - elif (self._line is not None - and _departure['linename'] != self._line): + elif ('' not in self._lines[:1] and + _departure['linename'] not in self._lines): continue - elif _departure['time'] < self._offset: + elif _departure['time'] < self._timeoffset: continue # now select the relevant data - _nextdep = {} + _nextdep = {ATTR_ATTRIBUTION: ATTRIBUTION} for k in ['destination', 'linename', 'time', 'direction', 'product']: _nextdep[k] = _departure.get(k, '') _nextdep['time'] = int(_nextdep['time']) - self.nextdeparture = _nextdep + self.departures = _nextdep break From eb2e5e5b9da3129e97ab80868b0fb91bbd365982 Mon Sep 17 00:00:00 2001 From: Fabian Affolter Date: Thu, 20 Apr 2017 12:07:56 +0200 Subject: [PATCH 135/146] Upgrade py-cpuinfo to 3.2.0 (#7190) --- homeassistant/components/sensor/cpuspeed.py | 2 +- requirements_all.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/sensor/cpuspeed.py b/homeassistant/components/sensor/cpuspeed.py index eeb52b8e35bbf6..e26d12469d852f 100644 --- a/homeassistant/components/sensor/cpuspeed.py +++ b/homeassistant/components/sensor/cpuspeed.py @@ -13,7 +13,7 @@ import homeassistant.helpers.config_validation as cv from homeassistant.helpers.entity import Entity -REQUIREMENTS = ['py-cpuinfo==3.0.0'] +REQUIREMENTS = ['py-cpuinfo==3.2.0'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 59178bb5df1399..7775d07fb6382f 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -472,7 +472,7 @@ pwaqi==3.0 pwmled==1.1.1 # homeassistant.components.sensor.cpuspeed -py-cpuinfo==3.0.0 +py-cpuinfo==3.2.0 # homeassistant.components.hdmi_cec pyCEC==0.4.13 From bbeb64eb242079530446fd025241097d2b13d88f Mon Sep 17 00:00:00 2001 From: LvivEchoes Date: Fri, 21 Apr 2017 04:28:49 +0300 Subject: [PATCH 136/146] Add support of input registers while querying modbus sensor. (#7082) * Add support of input registers while querying modbus sensor. * Changed config option. Refactoring. --- homeassistant/components/modbus.py | 9 +++++ homeassistant/components/sensor/modbus.py | 46 +++++++++++++++++++---- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/homeassistant/components/modbus.py b/homeassistant/components/modbus.py index 1f1363f20606df..3ed9fff9cf0cb8 100644 --- a/homeassistant/components/modbus.py +++ b/homeassistant/components/modbus.py @@ -158,6 +158,15 @@ def read_coils(self, unit, address, count): count, **kwargs) + def read_input_registers(self, unit, address, count): + """Read input registers.""" + with self._lock: + kwargs = {'unit': unit} if unit else {} + return self._client.read_input_registers( + address, + count, + **kwargs) + def read_holding_registers(self, unit, address, count): """Read holding registers.""" with self._lock: diff --git a/homeassistant/components/sensor/modbus.py b/homeassistant/components/sensor/modbus.py index 5b30f52d9267fd..f1449e5df06bf6 100644 --- a/homeassistant/components/sensor/modbus.py +++ b/homeassistant/components/sensor/modbus.py @@ -5,6 +5,7 @@ https://home-assistant.io/components/sensor.modbus/ """ import logging +import struct import voluptuous as vol @@ -24,16 +25,28 @@ CONF_REGISTERS = 'registers' CONF_SCALE = 'scale' CONF_SLAVE = 'slave' +CONF_DATA_TYPE = 'data_type' +CONF_REGISTER_TYPE = 'register_type' + +REGISTER_TYPE_HOLDING = 'holding' +REGISTER_TYPE_INPUT = 'input' + +DATA_TYPE_INT = 'int' +DATA_TYPE_FLOAT = 'float' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_REGISTERS): [{ vol.Required(CONF_NAME): cv.string, vol.Required(CONF_REGISTER): cv.positive_int, + vol.Optional(CONF_REGISTER_TYPE, default=REGISTER_TYPE_HOLDING): + vol.In([REGISTER_TYPE_HOLDING, REGISTER_TYPE_INPUT]), vol.Optional(CONF_COUNT, default=1): cv.positive_int, vol.Optional(CONF_OFFSET, default=0): vol.Coerce(float), vol.Optional(CONF_PRECISION, default=0): cv.positive_int, vol.Optional(CONF_SCALE, default=1): vol.Coerce(float), vol.Optional(CONF_SLAVE): cv.positive_int, + vol.Optional(CONF_DATA_TYPE, default=DATA_TYPE_INT): + vol.In([DATA_TYPE_INT, DATA_TYPE_FLOAT]), vol.Optional(CONF_UNIT_OF_MEASUREMENT): cv.string }] }) @@ -47,10 +60,12 @@ def setup_platform(hass, config, add_devices, discovery_info=None): register.get(CONF_NAME), register.get(CONF_SLAVE), register.get(CONF_REGISTER), + register.get(CONF_REGISTER_TYPE), register.get(CONF_UNIT_OF_MEASUREMENT), register.get(CONF_COUNT), register.get(CONF_SCALE), register.get(CONF_OFFSET), + register.get(CONF_DATA_TYPE), register.get(CONF_PRECISION))) add_devices(sensors) @@ -58,17 +73,20 @@ def setup_platform(hass, config, add_devices, discovery_info=None): class ModbusRegisterSensor(Entity): """Modbus resgister sensor.""" - def __init__(self, name, slave, register, unit_of_measurement, count, - scale, offset, precision): + def __init__(self, name, slave, register, register_type, + unit_of_measurement, count, scale, offset, data_type, + precision): """Initialize the modbus register sensor.""" self._name = name self._slave = int(slave) if slave else None self._register = int(register) + self._register_type = register_type self._unit_of_measurement = unit_of_measurement self._count = int(count) self._scale = scale self._offset = offset self._precision = precision + self._data_type = data_type self._value = None @property @@ -88,16 +106,28 @@ def unit_of_measurement(self): def update(self): """Update the state of the sensor.""" - result = modbus.HUB.read_holding_registers( - self._slave, - self._register, - self._count) + if self._register_type == REGISTER_TYPE_INPUT: + result = modbus.HUB.read_input_registers( + self._slave, + self._register, + self._count) + else: + result = modbus.HUB.read_holding_registers( + self._slave, + self._register, + self._count) val = 0 if not result: _LOGGER.error("No response from modbus slave %s register %s", self._slave, self._register) return - for i, res in enumerate(result.registers): - val += res * (2**(i*16)) + if self._data_type == DATA_TYPE_FLOAT: + byte_string = b''.join( + [x.to_bytes(2, byteorder='big') for x in result.registers] + ) + val = struct.unpack(">f", byte_string)[0] + elif self._data_type == DATA_TYPE_INT: + for i, res in enumerate(result.registers): + val += res * (2**(i*16)) self._value = format( self._scale * val + self._offset, '.{}f'.format(self._precision)) From f641287aa24ab2ee142d8c35cc4ec7b806931cd4 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Fri, 21 Apr 2017 03:45:15 +0200 Subject: [PATCH 137/146] Add HassIO to discovery component (#7195) * Add HassIO to autodiscovery * Fix tests * fix tests * fix test v2 * fix mock test * call --- homeassistant/components/discovery.py | 7 +++++++ tests/components/test_discovery.py | 16 ++++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/homeassistant/components/discovery.py b/homeassistant/components/discovery.py index ea8710158d1686..01b25cf0a87af4 100644 --- a/homeassistant/components/discovery.py +++ b/homeassistant/components/discovery.py @@ -10,6 +10,7 @@ import json from datetime import timedelta import logging +import os import voluptuous as vol @@ -29,12 +30,14 @@ SERVICE_WEMO = 'belkin_wemo' SERVICE_HASS_IOS_APP = 'hass_ios' SERVICE_IKEA_TRADFRI = 'ikea_tradfri' +SERVICE_HASSIO = 'hassio' SERVICE_HANDLERS = { SERVICE_HASS_IOS_APP: ('ios', None), SERVICE_NETGEAR: ('device_tracker', None), SERVICE_WEMO: ('wemo', None), SERVICE_IKEA_TRADFRI: ('tradfri', None), + SERVICE_HASSIO: ('hassio', None), 'philips_hue': ('light', 'hue'), 'google_cast': ('media_player', 'cast'), 'panasonic_viera': ('media_player', 'panasonic_viera'), @@ -124,6 +127,10 @@ def schedule_first(event): """Schedule the first discovery when Home Assistant starts up.""" async_track_point_in_utc_time(hass, scan_devices, dt_util.utcnow()) + # discovery local services + if 'HASSIO' in os.environ: + hass.async_add_job(new_service_found(SERVICE_HASSIO, {})) + hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, schedule_first) return True diff --git a/tests/components/test_discovery.py b/tests/components/test_discovery.py index 6b03ffa34e747d..7073c420341617 100644 --- a/tests/components/test_discovery.py +++ b/tests/components/test_discovery.py @@ -1,5 +1,6 @@ """The tests for the discovery component.""" import asyncio +import os from unittest.mock import patch @@ -128,3 +129,18 @@ def discover(netdisco): mock_discover.assert_called_with( hass, SERVICE_NO_PLATFORM, SERVICE_INFO, SERVICE_NO_PLATFORM_COMPONENT, BASE_CONFIG) + + +@asyncio.coroutine +def test_load_component_hassio(hass): + """Test load hassio component.""" + def discover(netdisco): + """Fake discovery.""" + return [] + + with patch.dict(os.environ, {'HASSIO': "FAKE_HASSIO"}), \ + patch('homeassistant.components.hassio.async_setup', + return_value=mock_coro(return_value=True)) as mock_hassio: + yield from mock_discovery(hass, discover) + + assert mock_hassio.called From e3f682c7d3bb67d57187e50b1f22583bd5e39a75 Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Fri, 21 Apr 2017 07:46:12 +0200 Subject: [PATCH 138/146] LIFX light effects (#7145) * Refactor into find_hsbk This will be useful for new methods that also have to find passed in colors. * Add AwaitAioLIFX This encapsulates the callback and Event that aiolifx needs and thus avoids an explosion of those when new calls are added. The refresh_state is now generally useful, so move it into its own method. * Initial effects support for LIFX These effects are useful as notifications. They mimic the breathe and pulse effects from the LIFX HTTP API: https://api.developer.lifx.com/docs/breathe-effect https://api.developer.lifx.com/docs/pulse-effect However, this implementation runs locally with the LIFX LAN protocol. * Saturate LIFX no color value Now the color is "full saturation, no brightness". This avoids a lot of temporary white when fading from the "no color" value and into a real color. * Organize LIFX effects in classes This is to move the setup/restore away from the actual effect, making it quite simple to add additional effects. * Stop running LIFX effects on conflicting service calls Turning the light on/off or starting a new effect will now stop the running effect. * Present default LIFX effects as light.turn_on effects This makes the effects (with default parameters) easily accessible from the UI. * Add LIFX colorloop effect This cycles the HSV colors, so that is added as an internal way to set a color. * Move lifx to its own package and split effects into a separate file * Always show LIFX light name in logs The name is actually the easiest way to identify a bulb so just using it as a fallback was a bit odd. * Compact effect getter * Always use full brightness for random flash color This is a stopgap. When a bit more infrastructure is in place, the intention is to turn the current hue some degrees. This will guarantee a flash color that is both unlike the current color and unlike white. * Clear effects concurrently We have to wait for the bulbs, so let us wait for all of them at once. * Add lifx_effect_stop The colorloop effect is most impressive if run on many lights. Testing this has revealed the need for an easy way to stop effects on all lights and return to the initial state of each bulb. This new call does just that. Calling turn_on/turn_off could also stop the effect but that would not restore the initial state. * Always calculate the initial effect color To fade nicely from power off, the breathe effect needs to keep an unchanging hue. So give up on using a static start color and just find the correct hue from the target color. The colorloop effect can start from anything but we use a random color just to keep things a little interesting during power on. * Fix lint * Update .coveragerc --- .coveragerc | 2 +- .../light/{lifx.py => lifx/__init__.py} | 166 ++++++--- .../components/light/lifx/effects.py | 338 ++++++++++++++++++ .../components/light/lifx/services.yaml | 99 +++++ 4 files changed, 559 insertions(+), 46 deletions(-) rename homeassistant/components/light/{lifx.py => lifx/__init__.py} (74%) create mode 100644 homeassistant/components/light/lifx/effects.py create mode 100644 homeassistant/components/light/lifx/services.yaml diff --git a/.coveragerc b/.coveragerc index 623e985c8f5d33..c8e59e55357db8 100644 --- a/.coveragerc +++ b/.coveragerc @@ -231,7 +231,7 @@ omit = homeassistant/components/light/flux_led.py homeassistant/components/light/hue.py homeassistant/components/light/hyperion.py - homeassistant/components/light/lifx.py + homeassistant/components/light/lifx/*.py homeassistant/components/light/lifx_legacy.py homeassistant/components/light/limitlessled.py homeassistant/components/light/mystrom.py diff --git a/homeassistant/components/light/lifx.py b/homeassistant/components/light/lifx/__init__.py similarity index 74% rename from homeassistant/components/light/lifx.py rename to homeassistant/components/light/lifx/__init__.py index 945c163435b36e..7c7bdd4eeea6cb 100644 --- a/homeassistant/components/light/lifx.py +++ b/homeassistant/components/light/lifx/__init__.py @@ -10,19 +10,24 @@ import sys from functools import partial from datetime import timedelta +import async_timeout import voluptuous as vol from homeassistant.components.light import ( - ATTR_BRIGHTNESS, ATTR_COLOR_TEMP, ATTR_RGB_COLOR, ATTR_TRANSITION, + Light, PLATFORM_SCHEMA, ATTR_BRIGHTNESS, ATTR_COLOR_NAME, ATTR_RGB_COLOR, + ATTR_COLOR_TEMP, ATTR_TRANSITION, ATTR_EFFECT, SUPPORT_BRIGHTNESS, SUPPORT_COLOR_TEMP, SUPPORT_RGB_COLOR, - SUPPORT_TRANSITION, Light, PLATFORM_SCHEMA) + SUPPORT_TRANSITION, SUPPORT_EFFECT) from homeassistant.util.color import ( color_temperature_mired_to_kelvin, color_temperature_kelvin_to_mired) from homeassistant import util from homeassistant.core import callback from homeassistant.helpers.event import async_track_point_in_utc_time import homeassistant.helpers.config_validation as cv +import homeassistant.util.color as color_util + +from . import effects as lifx_effects _LOGGER = logging.getLogger(__name__) @@ -35,18 +40,19 @@ CONF_SERVER = 'server' +ATTR_HSBK = 'hsbk' + BYTE_MAX = 255 SHORT_MAX = 65535 SUPPORT_LIFX = (SUPPORT_BRIGHTNESS | SUPPORT_COLOR_TEMP | SUPPORT_RGB_COLOR | - SUPPORT_TRANSITION) + SUPPORT_TRANSITION | SUPPORT_EFFECT) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_SERVER, default='0.0.0.0'): cv.string, }) -# pylint: disable=unused-argument @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Setup the LIFX platform.""" @@ -65,6 +71,9 @@ def async_setup_platform(hass, config, async_add_devices, discovery_info=None): local_addr=(server_addr, UDP_BROADCAST_PORT)) hass.async_add_job(coro) + + lifx_effects.setup(hass, lifx_manager) + return True @@ -104,10 +113,42 @@ def unregister(self, device): entity = self.entities[device.mac_addr] _LOGGER.debug("%s unregister", entity.who) entity.device = None - entity.updated_event.set() self.hass.async_add_job(entity.async_update_ha_state()) +class AwaitAioLIFX: + """Wait for an aiolifx callback and return the message.""" + + def __init__(self, light): + """Initialize the wrapper.""" + self.light = light + self.device = None + self.message = None + self.event = asyncio.Event() + + @callback + def callback(self, device, message): + """Callback that aiolifx invokes when the response is received.""" + self.device = device + self.message = message + self.event.set() + + @asyncio.coroutine + def wait(self, method): + """Call an aiolifx method and wait for its response or a timeout.""" + self.event.clear() + method(self.callback) + + while self.light.available and not self.event.is_set(): + try: + with async_timeout.timeout(1.0, loop=self.light.hass.loop): + yield from self.event.wait() + except asyncio.TimeoutError: + pass + + return self.message + + def convert_rgb_to_hsv(rgb): """Convert Home Assistant RGB values to HSV values.""" red, green, blue = [_ / BYTE_MAX for _ in rgb] @@ -125,8 +166,8 @@ class LIFXLight(Light): def __init__(self, device): """Initialize the light.""" self.device = device - self.updated_event = asyncio.Event() self.blocker = None + self.effect_data = None self.postponed_update = None self._name = device.label self.set_power(device.power_level) @@ -145,10 +186,10 @@ def name(self): @property def who(self): """Return a string identifying the device.""" + ip_addr = '-' if self.device: - return self.device.ip_addr[0] - else: - return "(%s)" % self.name + ip_addr = self.device.ip_addr[0] + return "%s (%s)" % (ip_addr, self.name) @property def rgb_color(self): @@ -178,11 +219,21 @@ def is_on(self): _LOGGER.debug("is_on: %d", self._power) return self._power != 0 + @property + def effect(self): + """Return the currently running effect.""" + return self.effect_data.effect.name if self.effect_data else None + @property def supported_features(self): """Flag supported features.""" return SUPPORT_LIFX + @property + def effect_list(self): + """Return the list of supported effects.""" + return lifx_effects.effect_list() + @callback def update_after_transition(self, now): """Request new status after completion of the last transition.""" @@ -213,36 +264,18 @@ def update_later(self, when): @asyncio.coroutine def async_turn_on(self, **kwargs): """Turn the device on.""" + yield from self.stop_effect() + + if ATTR_EFFECT in kwargs: + yield from lifx_effects.default_effect(self, **kwargs) + return + if ATTR_TRANSITION in kwargs: fade = int(kwargs[ATTR_TRANSITION] * 1000) else: fade = 0 - changed_color = False - - if ATTR_RGB_COLOR in kwargs: - hue, saturation, brightness = \ - convert_rgb_to_hsv(kwargs[ATTR_RGB_COLOR]) - changed_color = True - else: - hue = self._hue - saturation = self._sat - brightness = self._bri - - if ATTR_BRIGHTNESS in kwargs: - brightness = kwargs[ATTR_BRIGHTNESS] * (BYTE_MAX + 1) - changed_color = True - else: - brightness = self._bri - - if ATTR_COLOR_TEMP in kwargs: - kelvin = int(color_temperature_mired_to_kelvin( - kwargs[ATTR_COLOR_TEMP])) - changed_color = True - else: - kelvin = self._kel - - hsbk = [hue, saturation, brightness, kelvin] + hsbk, changed_color = self.find_hsbk(**kwargs) _LOGGER.debug("turn_on: %s (%d) %d %d %d %d %d", self.who, self._power, fade, *hsbk) @@ -263,6 +296,8 @@ def async_turn_on(self, **kwargs): @asyncio.coroutine def async_turn_off(self, **kwargs): """Turn the device off.""" + yield from self.stop_effect() + if ATTR_TRANSITION in kwargs: fade = int(kwargs[ATTR_TRANSITION] * 1000) else: @@ -274,22 +309,63 @@ def async_turn_off(self, **kwargs): if fade < BULB_LATENCY: self.set_power(0) - @callback - def got_color(self, device, msg): - """Callback that gets current power/color status.""" - self.set_power(device.power_level) - self.set_color(*device.color) - self._name = device.label - self.updated_event.set() - @asyncio.coroutine def async_update(self): """Update bulb status (if it is available).""" _LOGGER.debug("%s async_update", self.who) if self.available and self.blocker is None: - self.updated_event.clear() - self.device.get_color(self.got_color) - yield from self.updated_event.wait() + yield from self.refresh_state() + + @asyncio.coroutine + def stop_effect(self): + """Stop the currently running effect (if any).""" + if self.effect_data: + yield from self.effect_data.effect.async_restore(self) + + @asyncio.coroutine + def refresh_state(self): + """Ask the device about its current state and update our copy.""" + msg = yield from AwaitAioLIFX(self).wait(self.device.get_color) + if msg is not None: + self.set_power(self.device.power_level) + self.set_color(*self.device.color) + self._name = self.device.label + + def find_hsbk(self, **kwargs): + """Find the desired color from a number of possible inputs.""" + changed_color = False + + hsbk = kwargs.pop(ATTR_HSBK, None) + if hsbk is not None: + return [hsbk, True] + + color_name = kwargs.pop(ATTR_COLOR_NAME, None) + if color_name is not None: + kwargs[ATTR_RGB_COLOR] = color_util.color_name_to_rgb(color_name) + + if ATTR_RGB_COLOR in kwargs: + hue, saturation, brightness = \ + convert_rgb_to_hsv(kwargs[ATTR_RGB_COLOR]) + changed_color = True + else: + hue = self._hue + saturation = self._sat + brightness = self._bri + + if ATTR_BRIGHTNESS in kwargs: + brightness = kwargs[ATTR_BRIGHTNESS] * (BYTE_MAX + 1) + changed_color = True + else: + brightness = self._bri + + if ATTR_COLOR_TEMP in kwargs: + kelvin = int(color_temperature_mired_to_kelvin( + kwargs[ATTR_COLOR_TEMP])) + changed_color = True + else: + kelvin = self._kel + + return [[hue, saturation, brightness, kelvin], changed_color] def set_power(self, power): """Set power state value.""" diff --git a/homeassistant/components/light/lifx/effects.py b/homeassistant/components/light/lifx/effects.py new file mode 100644 index 00000000000000..e2ba0a73534809 --- /dev/null +++ b/homeassistant/components/light/lifx/effects.py @@ -0,0 +1,338 @@ +"""Support for light effects for the LIFX light platform.""" +import logging +import asyncio +import random +from os import path + +import voluptuous as vol + +from homeassistant.components.light import ( + DOMAIN, ATTR_BRIGHTNESS, ATTR_COLOR_NAME, ATTR_RGB_COLOR, ATTR_EFFECT) +from homeassistant.config import load_yaml_config_file +from homeassistant.const import (ATTR_ENTITY_ID) +from homeassistant.helpers.service import extract_entity_ids +import homeassistant.helpers.config_validation as cv + +_LOGGER = logging.getLogger(__name__) + +SERVICE_EFFECT_BREATHE = 'lifx_effect_breathe' +SERVICE_EFFECT_PULSE = 'lifx_effect_pulse' +SERVICE_EFFECT_COLORLOOP = 'lifx_effect_colorloop' +SERVICE_EFFECT_STOP = 'lifx_effect_stop' + +ATTR_POWER_ON = 'power_on' +ATTR_PERIOD = 'period' +ATTR_CYCLES = 'cycles' +ATTR_SPREAD = 'spread' +ATTR_CHANGE = 'change' + +# aiolifx waveform modes +WAVEFORM_SINE = 1 +WAVEFORM_PULSE = 4 + +LIFX_EFFECT_SCHEMA = vol.Schema({ + vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, + vol.Optional(ATTR_POWER_ON, default=True): cv.boolean, +}) + +LIFX_EFFECT_BREATHE_SCHEMA = LIFX_EFFECT_SCHEMA.extend({ + ATTR_BRIGHTNESS: vol.All(vol.Coerce(int), vol.Clamp(min=0, max=255)), + ATTR_COLOR_NAME: cv.string, + ATTR_RGB_COLOR: vol.All(vol.ExactSequence((cv.byte, cv.byte, cv.byte)), + vol.Coerce(tuple)), + vol.Optional(ATTR_PERIOD, default=1.0): vol.All(vol.Coerce(float), + vol.Range(min=0.05)), + vol.Optional(ATTR_CYCLES, default=1.0): vol.All(vol.Coerce(float), + vol.Range(min=1)), +}) + +LIFX_EFFECT_PULSE_SCHEMA = LIFX_EFFECT_BREATHE_SCHEMA + +LIFX_EFFECT_COLORLOOP_SCHEMA = LIFX_EFFECT_SCHEMA.extend({ + ATTR_BRIGHTNESS: vol.All(vol.Coerce(int), vol.Clamp(min=0, max=255)), + vol.Optional(ATTR_PERIOD, default=60): vol.All(vol.Coerce(float), + vol.Clamp(min=1)), + vol.Optional(ATTR_CHANGE, default=20): vol.All(vol.Coerce(float), + vol.Clamp(min=0, max=360)), + vol.Optional(ATTR_SPREAD, default=30): vol.All(vol.Coerce(float), + vol.Clamp(min=0, max=360)), +}) + +LIFX_EFFECT_STOP_SCHEMA = vol.Schema({ + vol.Optional(ATTR_ENTITY_ID): cv.entity_ids, + vol.Optional(ATTR_POWER_ON, default=False): cv.boolean, +}) + + +def setup(hass, lifx_manager): + """Register the LIFX effects as hass service calls.""" + @asyncio.coroutine + def async_service_handle(service): + """Internal func for applying a service.""" + entity_ids = extract_entity_ids(hass, service) + if entity_ids: + devices = [entity for entity in lifx_manager.entities.values() + if entity.entity_id in entity_ids] + else: + devices = list(lifx_manager.entities.values()) + + if devices: + yield from start_effect(hass, devices, + service.service, **service.data) + + descriptions = load_yaml_config_file( + path.join(path.dirname(__file__), 'services.yaml')) + + hass.services.async_register( + DOMAIN, SERVICE_EFFECT_BREATHE, async_service_handle, + descriptions.get(SERVICE_EFFECT_BREATHE), + schema=LIFX_EFFECT_BREATHE_SCHEMA) + + hass.services.async_register( + DOMAIN, SERVICE_EFFECT_PULSE, async_service_handle, + descriptions.get(SERVICE_EFFECT_PULSE), + schema=LIFX_EFFECT_PULSE_SCHEMA) + + hass.services.async_register( + DOMAIN, SERVICE_EFFECT_COLORLOOP, async_service_handle, + descriptions.get(SERVICE_EFFECT_COLORLOOP), + schema=LIFX_EFFECT_COLORLOOP_SCHEMA) + + hass.services.async_register( + DOMAIN, SERVICE_EFFECT_STOP, async_service_handle, + descriptions.get(SERVICE_EFFECT_STOP), + schema=LIFX_EFFECT_STOP_SCHEMA) + + +@asyncio.coroutine +def start_effect(hass, devices, service, **data): + """Start a light effect.""" + tasks = [] + for light in devices: + tasks.append(hass.async_add_job(light.stop_effect())) + yield from asyncio.wait(tasks, loop=hass.loop) + + if service in SERVICE_EFFECT_BREATHE: + effect = LIFXEffectBreathe(hass, devices) + elif service in SERVICE_EFFECT_PULSE: + effect = LIFXEffectPulse(hass, devices) + elif service == SERVICE_EFFECT_COLORLOOP: + effect = LIFXEffectColorloop(hass, devices) + elif service == SERVICE_EFFECT_STOP: + effect = LIFXEffectStop(hass, devices) + + hass.async_add_job(effect.async_perform(**data)) + + +@asyncio.coroutine +def default_effect(light, **kwargs): + """Start an effect with default parameters.""" + service = kwargs[ATTR_EFFECT] + data = { + ATTR_ENTITY_ID: light.entity_id, + } + if service in (SERVICE_EFFECT_BREATHE, SERVICE_EFFECT_PULSE): + data[ATTR_RGB_COLOR] = [ + random.randint(1, 127), + random.randint(1, 127), + random.randint(1, 127), + ] + data[ATTR_BRIGHTNESS] = 255 + yield from light.hass.services.async_call(DOMAIN, service, data) + + +def effect_list(): + """Return the list of supported effects.""" + return [ + SERVICE_EFFECT_COLORLOOP, + SERVICE_EFFECT_BREATHE, + SERVICE_EFFECT_PULSE, + SERVICE_EFFECT_STOP, + ] + + +class LIFXEffectData(object): + """Structure describing a running effect.""" + + def __init__(self, effect, power, color): + """Initialize data structure.""" + self.effect = effect + self.power = power + self.color = color + + +class LIFXEffect(object): + """Representation of a light effect running on a number of lights.""" + + def __init__(self, hass, lights): + """Initialize the effect.""" + self.hass = hass + self.lights = lights + + @asyncio.coroutine + def async_perform(self, **kwargs): + """Do common setup and play the effect.""" + yield from self.async_setup(**kwargs) + yield from self.async_play(**kwargs) + + @asyncio.coroutine + def async_setup(self, **kwargs): + """Prepare all lights for the effect.""" + for light in self.lights: + yield from light.refresh_state() + if not light.device: + self.lights.remove(light) + else: + light.effect_data = LIFXEffectData( + self, light.is_on, light.device.color) + + # Temporarily turn on power for the effect to be visible + if kwargs[ATTR_POWER_ON] and not light.is_on: + hsbk = self.from_poweroff_hsbk(light, **kwargs) + light.device.set_color(hsbk) + light.device.set_power(True) + + # pylint: disable=no-self-use + @asyncio.coroutine + def async_play(self, **kwargs): + """Play the effect.""" + yield None + + @asyncio.coroutine + def async_restore(self, light): + """Restore to the original state (if we are still running).""" + if light.effect_data: + if light.effect_data.effect == self: + if light.device and not light.effect_data.power: + light.device.set_power(False) + yield from asyncio.sleep(0.5) + if light.device: + light.device.set_color(light.effect_data.color) + yield from asyncio.sleep(0.5) + light.effect_data = None + self.lights.remove(light) + + def from_poweroff_hsbk(self, light, **kwargs): + """The initial color when starting from a powered off state.""" + return None + + +class LIFXEffectBreathe(LIFXEffect): + """Representation of a breathe effect.""" + + def __init__(self, hass, lights): + """Initialize the breathe effect.""" + super(LIFXEffectBreathe, self).__init__(hass, lights) + self.name = SERVICE_EFFECT_BREATHE + self.waveform = WAVEFORM_SINE + + @asyncio.coroutine + def async_play(self, **kwargs): + """Play the effect on all lights.""" + for light in self.lights: + self.hass.async_add_job(self.async_light_play(light, **kwargs)) + + @asyncio.coroutine + def async_light_play(self, light, **kwargs): + """Play a light effect on the bulb.""" + period = kwargs[ATTR_PERIOD] + cycles = kwargs[ATTR_CYCLES] + hsbk, _ = light.find_hsbk(**kwargs) + + # Start the effect + args = { + 'transient': 1, + 'color': hsbk, + 'period': int(period*1000), + 'cycles': cycles, + 'duty_cycle': 0, + 'waveform': self.waveform, + } + light.device.set_waveform(args) + + # Wait for completion and restore the initial state + yield from asyncio.sleep(period*cycles) + yield from self.async_restore(light) + + def from_poweroff_hsbk(self, light, **kwargs): + """Initial color is the target color, but no brightness.""" + hsbk, _ = light.find_hsbk(**kwargs) + return [hsbk[0], hsbk[1], 0, hsbk[2]] + + +class LIFXEffectPulse(LIFXEffectBreathe): + """Representation of a pulse effect.""" + + def __init__(self, hass, lights): + """Initialize the pulse effect.""" + super(LIFXEffectPulse, self).__init__(hass, lights) + self.name = SERVICE_EFFECT_PULSE + self.waveform = WAVEFORM_PULSE + + +class LIFXEffectColorloop(LIFXEffect): + """Representation of a colorloop effect.""" + + def __init__(self, hass, lights): + """Initialize the colorloop effect.""" + super(LIFXEffectColorloop, self).__init__(hass, lights) + self.name = SERVICE_EFFECT_COLORLOOP + + @asyncio.coroutine + def async_play(self, **kwargs): + """Play the effect on all lights.""" + period = kwargs[ATTR_PERIOD] + spread = kwargs[ATTR_SPREAD] + change = kwargs[ATTR_CHANGE] + direction = 1 if random.randint(0, 1) else -1 + + # Random start + hue = random.randint(0, 359) + + while self.lights: + hue = (hue + direction*change) % 360 + + random.shuffle(self.lights) + lhue = hue + + transition = int(1000 * random.uniform(period/2, period)) + for light in self.lights: + if spread > 0: + transition = int(1000 * random.uniform(period/2, period)) + + if ATTR_BRIGHTNESS in kwargs: + brightness = int(65535/255*kwargs[ATTR_BRIGHTNESS]) + else: + brightness = light.effect_data.color[2] + + hsbk = [ + int(65535/359*lhue), + int(random.uniform(0.8, 1.0)*65535), + brightness, + 4000, + ] + light.device.set_color(hsbk, None, transition) + + # Adjust the next light so the full spread is used + if len(self.lights) > 1: + lhue = (lhue + spread/(len(self.lights)-1)) % 360 + + yield from asyncio.sleep(period) + + def from_poweroff_hsbk(self, light, **kwargs): + """Start from a random hue.""" + return [random.randint(0, 65535), 65535, 0, 4000] + + +class LIFXEffectStop(LIFXEffect): + """A no-op effect, but starting it will stop an existing effect.""" + + def __init__(self, hass, lights): + """Initialize the stop effect.""" + super(LIFXEffectStop, self).__init__(hass, lights) + self.name = SERVICE_EFFECT_STOP + + @asyncio.coroutine + def async_perform(self, **kwargs): + """Do nothing.""" + yield None diff --git a/homeassistant/components/light/lifx/services.yaml b/homeassistant/components/light/lifx/services.yaml new file mode 100644 index 00000000000000..1b34c54f253891 --- /dev/null +++ b/homeassistant/components/light/lifx/services.yaml @@ -0,0 +1,99 @@ +lifx_effect_breathe: + description: Run a breathe effect by fading to a color and back. + + fields: + entity_id: + description: Name(s) of entities to run the effect on + example: 'light.kitchen' + + brightness: + description: Number between 0..255 indicating brightness when the effect peaks + example: 120 + + color_name: + description: A human readable color name + example: 'red' + + rgb_color: + description: Color for the fade in RGB-format + example: '[255, 100, 100]' + + period: + description: Duration of the effect in seconds (default 1.0) + example: 3 + + cycles: + description: Number of times the effect should run (default 1.0) + example: 2 + + power_on: + description: Powered off lights are temporarily turned on during the effect (default True) + example: False + +lifx_effect_pulse: + description: Run a flash effect by changing to a color and back. + + fields: + entity_id: + description: Name(s) of entities to run the effect on + example: 'light.kitchen' + + brightness: + description: Number between 0..255 indicating brightness of the temporary color + example: 120 + + color_name: + description: A human readable color name + example: 'red' + + rgb_color: + description: The temporary color in RGB-format + example: '[255, 100, 100]' + + period: + description: Duration of the effect in seconds (default 1.0) + example: 3 + + cycles: + description: Number of times the effect should run (default 1.0) + example: 2 + + power_on: + description: Powered off lights are temporarily turned on during the effect (default True) + example: False + +lifx_effect_colorloop: + description: Run an effect with looping colors. + + fields: + entity_id: + description: Name(s) of entities to run the effect on + example: 'light.disco1, light.disco2, light.disco3' + + brightness: + description: Number between 0..255 indicating brightness of the effect. Leave this out to maintain the current brightness of each participating light + example: 120 + + period: + description: Duration between color changes (deafult 60) + example: 180 + + change: + description: Hue movement per period, in degrees on a color wheel (default 20) + example: 45 + + spread: + description: Maximum hue difference between participating lights, in degrees on a color wheel (default 30) + example: 0 + + power_on: + description: Powered off lights are temporarily turned on during the effect (default True) + example: False + +lifx_effect_stop: + description: Stop a running effect. + + fields: + entity_id: + description: Name(s) of entities to stop effects on. Leave out to stop effects everywhere. + example: 'light.bedroom' From 5c737cfa6ee5aa7e5367da6f6b90daacd40eba72 Mon Sep 17 00:00:00 2001 From: Pascal Vizeli Date: Fri, 21 Apr 2017 12:20:19 +0200 Subject: [PATCH 139/146] HassIO API v2 (#7201) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add an optional extended description… --- homeassistant/components/hassio.py | 10 ++++++++-- homeassistant/components/services.yaml | 3 +++ tests/components/test_hassio.py | 18 ++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/hassio.py b/homeassistant/components/hassio.py index 25da7a67f4b19e..c74918dbfa0f6e 100644 --- a/homeassistant/components/hassio.py +++ b/homeassistant/components/hassio.py @@ -31,9 +31,11 @@ SERVICE_HOST_REBOOT = 'host_reboot' SERVICE_HOST_UPDATE = 'host_update' -SERVICE_SUPERVISOR_UPDATE = 'supervisor_update' SERVICE_HOMEASSISTANT_UPDATE = 'homeassistant_update' +SERVICE_SUPERVISOR_UPDATE = 'supervisor_update' +SERVICE_SUPERVISOR_RELOAD = 'supervisor_reload' + SERVICE_ADDON_INSTALL = 'addon_install' SERVICE_ADDON_UNINSTALL = 'addon_uninstall' SERVICE_ADDON_UPDATE = 'addon_update' @@ -61,8 +63,9 @@ SERVICE_HOST_SHUTDOWN: None, SERVICE_HOST_REBOOT: None, SERVICE_HOST_UPDATE: SCHEMA_SERVICE_UPDATE, - SERVICE_SUPERVISOR_UPDATE: SCHEMA_SERVICE_UPDATE, SERVICE_HOMEASSISTANT_UPDATE: SCHEMA_SERVICE_UPDATE, + SERVICE_SUPERVISOR_UPDATE: SCHEMA_SERVICE_UPDATE, + SERVICE_SUPERVISOR_RELOAD: None, SERVICE_ADDON_INSTALL: SCHEMA_SERVICE_ADDONS_VERSION, SERVICE_ADDON_UNINSTALL: SCHEMA_SERVICE_ADDONS, SERVICE_ADDON_START: SCHEMA_SERVICE_ADDONS, @@ -117,6 +120,9 @@ def async_service_handler(service): elif service.service == SERVICE_SUPERVISOR_UPDATE: yield from hassio.send_command( "/supervisor/update", payload=version) + elif service.service == SERVICE_SUPERVISOR_RELOAD: + yield from hassio.send_command( + "/supervisor/reload", timeout=LONG_TASK_TIMEOUT) elif service.service == SERVICE_HOMEASSISTANT_UPDATE: yield from hassio.send_command( "/homeassistant/update", payload=version, diff --git a/homeassistant/components/services.yaml b/homeassistant/components/services.yaml index cf5999200d8927..6cff6d5f4f4580 100644 --- a/homeassistant/components/services.yaml +++ b/homeassistant/components/services.yaml @@ -338,6 +338,9 @@ hassio: description: Optional or it will be use the latest version. example: '0.3' + supervisor_reload: + description: Reload HassIO supervisor addons/updates/configs. + homeassistant_update: description: Update HomeAssistant docker image. fields: diff --git a/tests/components/test_hassio.py b/tests/components/test_hassio.py index bde419c410421f..2574e7fa9f3dac 100644 --- a/tests/components/test_hassio.py +++ b/tests/components/test_hassio.py @@ -53,6 +53,8 @@ def test_setup_component_test_service(self, aioclient_mock): assert self.hass.services.has_service( ho.DOMAIN, ho.SERVICE_SUPERVISOR_UPDATE) + assert self.hass.services.has_service( + ho.DOMAIN, ho.SERVICE_SUPERVISOR_RELOAD) assert self.hass.services.has_service( ho.DOMAIN, ho.SERVICE_ADDON_INSTALL) @@ -216,6 +218,22 @@ def test_rest_command_http_supervisor_update(self, aioclient_mock): assert len(aioclient_mock.mock_calls) == 2 assert aioclient_mock.mock_calls[-1][2]['version'] == '0.4' + def test_rest_command_http_supervisor_reload(self, aioclient_mock): + """Call a hassio for supervisor reload.""" + aioclient_mock.get( + "http://127.0.0.1/supervisor/ping", json=self.ok_msg) + with assert_setup_component(0, ho.DOMAIN): + setup_component(self.hass, ho.DOMAIN, self.config) + + aioclient_mock.get( + self.url.format("supervisor/reload"), json=self.ok_msg) + + self.hass.services.call( + ho.DOMAIN, ho.SERVICE_SUPERVISOR_RELOAD, {}) + self.hass.block_till_done() + + assert len(aioclient_mock.mock_calls) == 2 + def test_rest_command_http_homeassistant_update(self, aioclient_mock): """Call a hassio for homeassistant update.""" aioclient_mock.get( From 2d57c6a1c78626d369cf0c9d3efd8aded4213020 Mon Sep 17 00:00:00 2001 From: Anders Melchiorsen Date: Sat, 22 Apr 2017 05:16:36 +0200 Subject: [PATCH 140/146] Support xy_color with LIFX lights (#7208) --- homeassistant/components/light/lifx/__init__.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/light/lifx/__init__.py b/homeassistant/components/light/lifx/__init__.py index 7c7bdd4eeea6cb..4d3cd0d4931397 100644 --- a/homeassistant/components/light/lifx/__init__.py +++ b/homeassistant/components/light/lifx/__init__.py @@ -16,9 +16,9 @@ from homeassistant.components.light import ( Light, PLATFORM_SCHEMA, ATTR_BRIGHTNESS, ATTR_COLOR_NAME, ATTR_RGB_COLOR, - ATTR_COLOR_TEMP, ATTR_TRANSITION, ATTR_EFFECT, + ATTR_XY_COLOR, ATTR_COLOR_TEMP, ATTR_TRANSITION, ATTR_EFFECT, SUPPORT_BRIGHTNESS, SUPPORT_COLOR_TEMP, SUPPORT_RGB_COLOR, - SUPPORT_TRANSITION, SUPPORT_EFFECT) + SUPPORT_XY_COLOR, SUPPORT_TRANSITION, SUPPORT_EFFECT) from homeassistant.util.color import ( color_temperature_mired_to_kelvin, color_temperature_kelvin_to_mired) from homeassistant import util @@ -46,7 +46,7 @@ SHORT_MAX = 65535 SUPPORT_LIFX = (SUPPORT_BRIGHTNESS | SUPPORT_COLOR_TEMP | SUPPORT_RGB_COLOR | - SUPPORT_TRANSITION | SUPPORT_EFFECT) + SUPPORT_XY_COLOR | SUPPORT_TRANSITION | SUPPORT_EFFECT) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_SERVER, default='0.0.0.0'): cv.string, @@ -358,6 +358,14 @@ def find_hsbk(self, **kwargs): else: brightness = self._bri + if ATTR_XY_COLOR in kwargs: + hue, saturation, _ = \ + color_util.color_xy_brightness_to_hsv( + *kwargs[ATTR_XY_COLOR], + ibrightness=(brightness // (BYTE_MAX + 1))) + saturation = saturation * (BYTE_MAX + 1) + changed_color = True + if ATTR_COLOR_TEMP in kwargs: kelvin = int(color_temperature_mired_to_kelvin( kwargs[ATTR_COLOR_TEMP])) From 07fcf22aebca2f579056caecf4a63dbfbb963bdb Mon Sep 17 00:00:00 2001 From: Nikolas Beutler Date: Sat, 22 Apr 2017 05:16:59 +0200 Subject: [PATCH 141/146] Update ios.py (#7160) * Update ios.py as discussed. the part: if battery_state == ios.ATTR_BATTERY_STATE_FULL: returning_icon_level = DEFAULT_ICON_LEVEL kinda screws up the charging icon. i might just miss a logical solution for that though. let me know what you think. it might not be beautiful but i think its an overall improve over the current "double battery" solution * Update ios.py chound fix and full_battery_charge fix * Update ios.py removed new line * Update ios.py * Update ios.py * Update ios.py * Update ios.py * Update ios.py * Update ios.py * merged request from robbie * Update ios.py * Update ios.py * Update ios.py --- homeassistant/components/sensor/ios.py | 42 ++++++++++++++++++-------- 1 file changed, 29 insertions(+), 13 deletions(-) diff --git a/homeassistant/components/sensor/ios.py b/homeassistant/components/sensor/ios.py index 35f03d7a1c1545..3173eec4285710 100644 --- a/homeassistant/components/sensor/ios.py +++ b/homeassistant/components/sensor/ios.py @@ -14,7 +14,8 @@ "state": ["Battery State", None] } -DEFAULT_ICON = "mdi:battery" +DEFAULT_ICON_LEVEL = "mdi:battery" +DEFAULT_ICON_STATE = "mdi:power-plug" def setup_platform(hass, config, add_devices, discovery_info=None): @@ -62,7 +63,6 @@ def unique_id(self): @property def unit_of_measurement(self): """Return the unit of measurement this sensor expresses itself in.""" - return self._unit_of_measurement @property def device_state_attributes(self): @@ -84,28 +84,44 @@ def icon(self): battery_state = device_battery[ios.ATTR_BATTERY_STATE] battery_level = device_battery[ios.ATTR_BATTERY_LEVEL] rounded_level = round(battery_level, -1) - returning_icon = DEFAULT_ICON + returning_icon_level = DEFAULT_ICON_LEVEL if battery_state == ios.ATTR_BATTERY_STATE_FULL: - returning_icon = DEFAULT_ICON + returning_icon_level = DEFAULT_ICON_LEVEL + if battery_state == ios.ATTR_BATTERY_STATE_CHARGING: + returning_icon_state = DEFAULT_ICON_STATE + else: + returning_icon_state = "{}-off".format(DEFAULT_ICON_STATE) elif battery_state == ios.ATTR_BATTERY_STATE_CHARGING: # Why is MDI missing 10, 50, 70? if rounded_level in (20, 30, 40, 60, 80, 90, 100): - returning_icon = "{}-charging-{}".format(DEFAULT_ICON, - str(rounded_level)) + returning_icon_level = "{}-charging-{}".format( + DEFAULT_ICON_LEVEL, str(rounded_level)) + returning_icon_state = DEFAULT_ICON_STATE else: - returning_icon = "{}-charging".format(DEFAULT_ICON) + returning_icon_level = "{}-charging".format( + DEFAULT_ICON_LEVEL) + returning_icon_state = DEFAULT_ICON_STATE elif battery_state == ios.ATTR_BATTERY_STATE_UNPLUGGED: if rounded_level < 10: - returning_icon = "{}-outline".format(DEFAULT_ICON) + returning_icon_level = "{}-outline".format( + DEFAULT_ICON_LEVEL) + returning_icon_state = "{}-off".format(DEFAULT_ICON_STATE) elif battery_level > 95: - returning_icon = DEFAULT_ICON + returning_icon_state = "{}-off".format(DEFAULT_ICON_STATE) + returning_icon_level = "{}-outline".format( + DEFAULT_ICON_LEVEL) else: - returning_icon = "{}-{}".format(DEFAULT_ICON, - str(rounded_level)) + returning_icon_level = "{}-{}".format(DEFAULT_ICON_LEVEL, + str(rounded_level)) + returning_icon_state = "{}-off".format(DEFAULT_ICON_STATE) elif battery_state == ios.ATTR_BATTERY_STATE_UNKNOWN: - returning_icon = "{}-unknown".format(DEFAULT_ICON) + returning_icon_level = "{}-unknown".format(DEFAULT_ICON_LEVEL) + returning_icon_state = "{}-unknown".format(DEFAULT_ICON_LEVEL) - return returning_icon + if self.type == "state": + return returning_icon_state + else: + return returning_icon_level def update(self): """Get the latest state of the sensor.""" From b641f6863cfc0779d598c903cda5479822cd5e82 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Fri, 21 Apr 2017 23:22:36 -0400 Subject: [PATCH 142/146] Fix arwn platform to update hass state when events are received (#7202) The arwn platform was refactored to be asyncio friendly, however in doing so one thing was missed which was explicitly telling hass when something interesting has happened. This led to the very interesting to debug issue that the state cards were all out of date, even though the graphs were not. --- homeassistant/components/sensor/arwn.py | 1 + 1 file changed, 1 insertion(+) diff --git a/homeassistant/components/sensor/arwn.py b/homeassistant/components/sensor/arwn.py index 0bf68e68b0d033..d2e148b8204783 100644 --- a/homeassistant/components/sensor/arwn.py +++ b/homeassistant/components/sensor/arwn.py @@ -116,6 +116,7 @@ def set_event(self, event): """Update the sensor with the most recent event.""" self.event = {} self.event.update(event) + self.hass.async_add_job(self.async_update_ha_state()) @property def state(self): From dafbdbd2d028faad0ca0ada3dab24a2ef6b6c50f Mon Sep 17 00:00:00 2001 From: Henrik Nicolaisen Date: Sat, 22 Apr 2017 05:24:21 +0200 Subject: [PATCH 143/146] Issue 6749 updated pylgtv to 0.1.6 to fix thread leak in asyncio loop (#7199) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * updated pylgtv module to fix problems with timeouts * - update pylgtv to 0.1.6 - handle new TimeoutError exception from pylgtv * used full name for exception handling of concurrent.futures._base.TimeoutError * the exception handling should now follow the rules * float typecasting should not be necessary * use asyncio for TimeoutError it’s an alias for concurrent.futures.TimeoutError --- homeassistant/components/media_player/webostv.py | 12 ++++++++---- homeassistant/components/notify/webostv.py | 2 +- requirements_all.txt | 2 +- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/media_player/webostv.py b/homeassistant/components/media_player/webostv.py index b8f43486db1c20..c1b51e2d32ae6a 100644 --- a/homeassistant/components/media_player/webostv.py +++ b/homeassistant/components/media_player/webostv.py @@ -5,6 +5,7 @@ https://home-assistant.io/components/media_player.webostv/ """ import logging +import asyncio from datetime import timedelta from urllib.parse import urlparse @@ -24,7 +25,7 @@ from homeassistant.loader import get_component import homeassistant.helpers.config_validation as cv -REQUIREMENTS = ['pylgtv==0.1.5', +REQUIREMENTS = ['pylgtv==0.1.6', 'websockets==3.2', 'wakeonlan==0.2.2'] @@ -99,7 +100,8 @@ def setup_tv(host, mac, name, customize, config, hass, add_devices): _LOGGER.warning( "Connected to LG webOS TV %s but not paired", host) return - except (OSError, ConnectionClosed): + except (OSError, ConnectionClosed, TypeError, + asyncio.TimeoutError): _LOGGER.error("Unable to connect to host %s", host) return else: @@ -196,7 +198,8 @@ def update(self): app = self._app_list[source['appId']] self._source_list[app['title']] = app - except (OSError, ConnectionClosed): + except (OSError, ConnectionClosed, TypeError, + asyncio.TimeoutError): self._state = STATE_OFF @property @@ -257,7 +260,8 @@ def turn_off(self): self._state = STATE_OFF try: self._client.power_off() - except (OSError, ConnectionClosed): + except (OSError, ConnectionClosed, TypeError, + asyncio.TimeoutError): pass def turn_on(self): diff --git a/homeassistant/components/notify/webostv.py b/homeassistant/components/notify/webostv.py index 50788b8cccf8bc..0e91fc8698a8d1 100644 --- a/homeassistant/components/notify/webostv.py +++ b/homeassistant/components/notify/webostv.py @@ -14,7 +14,7 @@ ATTR_DATA, BaseNotificationService, PLATFORM_SCHEMA) from homeassistant.const import (CONF_FILENAME, CONF_HOST, CONF_ICON) -REQUIREMENTS = ['pylgtv==0.1.5'] +REQUIREMENTS = ['pylgtv==0.1.6'] _LOGGER = logging.getLogger(__name__) diff --git a/requirements_all.txt b/requirements_all.txt index 7775d07fb6382f..e98df3bf99ba68 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -564,7 +564,7 @@ pylast==1.8.0 # homeassistant.components.media_player.webostv # homeassistant.components.notify.webostv -pylgtv==0.1.5 +pylgtv==0.1.6 # homeassistant.components.litejet pylitejet==0.1 From 80e9e9bfda49f28d254e004e4e80af396b9752dd Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Fri, 21 Apr 2017 23:32:51 -0700 Subject: [PATCH 144/146] tradfri: Improve color temp support detection (#7211) --- homeassistant/components/light/tradfri.py | 32 ++++++++++++++--------- script/dev_docker | 1 + virtualization/Docker/Dockerfile.dev | 3 ++- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/light/tradfri.py b/homeassistant/components/light/tradfri.py index 542f8dae8ef2e4..ee4aa273224026 100644 --- a/homeassistant/components/light/tradfri.py +++ b/homeassistant/components/light/tradfri.py @@ -13,13 +13,11 @@ _LOGGER = logging.getLogger(__name__) DEPENDENCIES = ['tradfri'] -SUPPORTED_FEATURES = (SUPPORT_BRIGHTNESS | SUPPORT_RGB_COLOR) -SUPPORTED_FEATURES_IKEA = (SUPPORT_BRIGHTNESS | SUPPORT_COLOR_TEMP) PLATFORM_SCHEMA = LIGHT_PLATFORM_SCHEMA -IKEA = 'ikea_of_sweden' - -ALLOWED_TEMPERATURES = {IKEA: {2200: 'efd275', 2700: 'f1e0b5', 4000: 'f5faf6'}} -ALLOWED_FEATURES = {IKEA: SUPPORTED_FEATURES_IKEA} +IKEA = 'IKEA of Sweden' +ALLOWED_TEMPERATURES = { + IKEA: {2200: 'efd275', 2700: 'f1e0b5', 4000: 'f5faf6'} +} def setup_platform(hass, config, add_devices, discovery_info=None): @@ -46,8 +44,14 @@ def __init__(self, light): self._light_data = light.light_control.lights[0] self._name = light.name self._rgb_color = None - self._features = ALLOWED_FEATURES.get( - slugify(self._light.device_info.manufacturer), SUPPORTED_FEATURES) + self._features = SUPPORT_BRIGHTNESS + + if self._light_data.hex_color is not None: + if self._light.device_info.manufacturer == IKEA: + self._features &= SUPPORT_COLOR_TEMP + else: + self._features &= SUPPORT_RGB_COLOR + self._ok_temps = ALLOWED_TEMPERATURES.get( slugify(self._light.device_info.manufacturer)) @@ -74,16 +78,18 @@ def brightness(self): @property def color_temp(self): """Return the CT color value in mireds.""" - if not self.supported_features & SUPPORT_COLOR_TEMP or \ - not self._ok_temps: - return + if (self._light_data.hex_color is None or + self.supported_features & SUPPORT_COLOR_TEMP == 0 or + not self._ok_temps): + return None + kelvin = next(( kelvin for kelvin, hex_color in self._ok_temps.items() if hex_color == self._light_data.hex_color), None) if kelvin is None: _LOGGER.error( - 'unexpected color temperature found %s', - self._light_data.hex_color) + 'unexpected color temperature found for %s: %s', + self.name, self._light_data.hex_color) return return color_util.color_temperature_kelvin_to_mired(kelvin) diff --git a/script/dev_docker b/script/dev_docker index 73c4ee60d0ae43..514fce734777e9 100755 --- a/script/dev_docker +++ b/script/dev_docker @@ -27,6 +27,7 @@ else -v /etc/localtime:/etc/localtime:ro \ -v `pwd`:/usr/src/app \ -v `pwd`/config:/config \ + --rm \ -t -i home-assistant-dev fi diff --git a/virtualization/Docker/Dockerfile.dev b/virtualization/Docker/Dockerfile.dev index 62c9f9f65964f2..5d16e9400ef072 100644 --- a/virtualization/Docker/Dockerfile.dev +++ b/virtualization/Docker/Dockerfile.dev @@ -12,6 +12,7 @@ MAINTAINER Paulus Schoutsen #ENV INSTALL_OPENZWAVE no #ENV INSTALL_LIBCEC no #ENV INSTALL_PHANTOMJS no +#ENV INSTALL_COAP_CLIENT no VOLUME /config @@ -25,7 +26,7 @@ RUN virtualization/Docker/setup_docker_prereqs # Install hass component dependencies COPY requirements_all.txt requirements_all.txt RUN pip3 install --no-cache-dir -r requirements_all.txt && \ - pip3 install --no-cache-dir mysqlclient psycopg2 uvloop + pip3 install --no-cache-dir mysqlclient psycopg2 uvloop cchardet # BEGIN: Development additions From 093c7f0e44082e2d3e4ff4abb646755af9defa45 Mon Sep 17 00:00:00 2001 From: Martin Hjelmare Date: Sat, 22 Apr 2017 09:31:23 +0200 Subject: [PATCH 145/146] Fix tradfri lights (#7212) * Remove leftover use of slugify * The IKEA manufacturer key is now exactly as found in device info. * Fix bitwise addition of supported features --- homeassistant/components/light/tradfri.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/homeassistant/components/light/tradfri.py b/homeassistant/components/light/tradfri.py index ee4aa273224026..9c0284c22f6c00 100644 --- a/homeassistant/components/light/tradfri.py +++ b/homeassistant/components/light/tradfri.py @@ -8,7 +8,6 @@ PLATFORM_SCHEMA as LIGHT_PLATFORM_SCHEMA from homeassistant.components.tradfri import KEY_GATEWAY from homeassistant.util import color as color_util -from homeassistant.util import slugify _LOGGER = logging.getLogger(__name__) @@ -48,12 +47,12 @@ def __init__(self, light): if self._light_data.hex_color is not None: if self._light.device_info.manufacturer == IKEA: - self._features &= SUPPORT_COLOR_TEMP + self._features |= SUPPORT_COLOR_TEMP else: - self._features &= SUPPORT_RGB_COLOR + self._features |= SUPPORT_RGB_COLOR self._ok_temps = ALLOWED_TEMPERATURES.get( - slugify(self._light.device_info.manufacturer)) + self._light.device_info.manufacturer) @property def supported_features(self): @@ -123,7 +122,7 @@ def turn_on(self, **kwargs): kelvin = color_util.color_temperature_mired_to_kelvin( kwargs[ATTR_COLOR_TEMP]) # find closest allowed kelvin temp from user input - kelvin = min(self._ok_temps.keys(), key=lambda x: abs(x-kelvin)) + kelvin = min(self._ok_temps.keys(), key=lambda x: abs(x - kelvin)) self._light_control.set_hex_color(self._ok_temps[kelvin]) def update(self): From 477ebd99b47484ddaade572298b56a4f8cc1218f Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Sat, 22 Apr 2017 00:32:27 -0700 Subject: [PATCH 146/146] Version bump to 0.43 --- homeassistant/const.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/homeassistant/const.py b/homeassistant/const.py index a65b721625cbb4..5cc08642299d13 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -2,7 +2,7 @@ """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 MINOR_VERSION = 43 -PATCH_VERSION = '0.dev0' +PATCH_VERSION = '0' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) REQUIRED_PYTHON_VER = (3, 4, 2)

    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