From 9aaf11de8c159d4b9a719709bfa373cfd341e48a Mon Sep 17 00:00:00 2001 From: cdce8p <30130371+cdce8p@users.noreply.github.com> Date: Mon, 1 Oct 2018 08:52:42 +0200 Subject: [PATCH] Async syntax 8/8 (#17022) * Async syntax 8 * Pylint fixes --- homeassistant/components/__init__.py | 25 +++----- homeassistant/components/abode.py | 7 +-- homeassistant/components/alexa/__init__.py | 4 +- homeassistant/components/alexa/intent.py | 21 +++---- homeassistant/components/alexa/smart_home.py | 8 +-- homeassistant/components/android_ip_webcam.py | 18 +++--- homeassistant/components/apple_tv.py | 34 +++++------ homeassistant/components/cloud/__init__.py | 19 +++--- homeassistant/components/demo.py | 7 +-- .../components/device_sun_light_trigger.py | 4 +- homeassistant/components/doorbird.py | 4 +- homeassistant/components/duckdns.py | 24 +++----- .../components/emulated_hue/hue_api.py | 11 ++-- homeassistant/components/envisalink.py | 5 +- homeassistant/components/ffmpeg.py | 40 +++++------- homeassistant/components/foursquare.py | 6 +- homeassistant/components/freedns.py | 17 +++--- homeassistant/components/google_domains.py | 18 +++--- .../components/homematic/__init__.py | 6 +- homeassistant/components/hydrawise.py | 4 +- homeassistant/components/ihc/ihcdevice.py | 4 +- homeassistant/components/insteon/__init__.py | 11 ++-- homeassistant/components/insteon_plm.py | 4 +- homeassistant/components/intent_script.py | 9 +-- homeassistant/components/introduction.py | 4 +- homeassistant/components/ios/__init__.py | 6 +- homeassistant/components/isy994.py | 4 +- homeassistant/components/lutron.py | 4 +- homeassistant/components/lutron_caseta.py | 9 +-- homeassistant/components/microsoft_face.py | 61 ++++++++----------- homeassistant/components/mqtt_statestream.py | 4 +- homeassistant/components/namecheapdns.py | 18 +++--- homeassistant/components/no_ip.py | 17 +++--- .../persistent_notification/__init__.py | 4 +- homeassistant/components/plant.py | 12 ++-- homeassistant/components/prometheus.py | 4 +- homeassistant/components/raincloud.py | 4 +- homeassistant/components/rest_command.py | 8 +-- homeassistant/components/rflink.py | 33 ++++------ homeassistant/components/rfxtrx.py | 4 +- homeassistant/components/rss_feed_template.py | 4 +- homeassistant/components/satel_integra.py | 10 ++- homeassistant/components/shell_command.py | 10 ++- homeassistant/components/sun.py | 4 +- .../components/system_log/__init__.py | 13 ++-- homeassistant/components/tellstick.py | 4 +- homeassistant/components/thethingsnetwork.py | 4 +- homeassistant/components/upcloud.py | 4 +- homeassistant/components/wake_on_lan.py | 11 ++-- homeassistant/components/weather/__init__.py | 6 +- .../components/weather/buienradar.py | 8 +-- homeassistant/components/wink/__init__.py | 7 +-- homeassistant/components/xiaomi_aqara.py | 7 +-- homeassistant/components/zigbee.py | 7 +-- 54 files changed, 223 insertions(+), 382 deletions(-) diff --git a/homeassistant/components/__init__.py b/homeassistant/components/__init__.py index bf1577cbf01..e8994592d40 100644 --- a/homeassistant/components/__init__.py +++ b/homeassistant/components/__init__.py @@ -103,17 +103,14 @@ def reload_core_config(hass): hass.services.call(ha.DOMAIN, SERVICE_RELOAD_CORE_CONFIG) -@asyncio.coroutine -def async_reload_core_config(hass): +async def async_reload_core_config(hass): """Reload the core config.""" - yield from hass.services.async_call(ha.DOMAIN, SERVICE_RELOAD_CORE_CONFIG) + await hass.services.async_call(ha.DOMAIN, SERVICE_RELOAD_CORE_CONFIG) -@asyncio.coroutine -def async_setup(hass: ha.HomeAssistant, config: dict) -> Awaitable[bool]: +async def async_setup(hass: ha.HomeAssistant, config: dict) -> Awaitable[bool]: """Set up general services related to Home Assistant.""" - @asyncio.coroutine - def async_handle_turn_service(service): + async def async_handle_turn_service(service): """Handle calls to homeassistant.turn_on/off.""" entity_ids = extract_entity_ids(hass, service) @@ -148,7 +145,7 @@ def async_setup(hass: ha.HomeAssistant, config: dict) -> Awaitable[bool]: tasks.append(hass.services.async_call( domain, service.service, data, blocking)) - yield from asyncio.wait(tasks, loop=hass.loop) + await asyncio.wait(tasks, loop=hass.loop) hass.services.async_register( ha.DOMAIN, SERVICE_TURN_OFF, async_handle_turn_service) @@ -164,15 +161,14 @@ def async_setup(hass: ha.HomeAssistant, config: dict) -> Awaitable[bool]: hass.helpers.intent.async_register(intent.ServiceIntentHandler( intent.INTENT_TOGGLE, ha.DOMAIN, SERVICE_TOGGLE, "Toggled {}")) - @asyncio.coroutine - def async_handle_core_service(call): + async def async_handle_core_service(call): """Service handler for handling core services.""" if call.service == SERVICE_HOMEASSISTANT_STOP: hass.async_create_task(hass.async_stop()) return try: - errors = yield from conf_util.async_check_ha_config_file(hass) + errors = await conf_util.async_check_ha_config_file(hass) except HomeAssistantError: return @@ -193,16 +189,15 @@ def async_setup(hass: ha.HomeAssistant, config: dict) -> Awaitable[bool]: hass.services.async_register( ha.DOMAIN, SERVICE_CHECK_CONFIG, async_handle_core_service) - @asyncio.coroutine - def async_handle_reload_config(call): + async def async_handle_reload_config(call): """Service handler for reloading core config.""" try: - conf = yield from conf_util.async_hass_config_yaml(hass) + conf = await conf_util.async_hass_config_yaml(hass) except HomeAssistantError as err: _LOGGER.error(err) return - yield from conf_util.async_process_ha_core_config( + await conf_util.async_process_ha_core_config( hass, conf.get(ha.DOMAIN) or {}) hass.services.async_register( diff --git a/homeassistant/components/abode.py b/homeassistant/components/abode.py index bafbc0781ca..64bedb4ac7c 100644 --- a/homeassistant/components/abode.py +++ b/homeassistant/components/abode.py @@ -4,7 +4,6 @@ This component provides basic support for Abode Home Security system. For more details about this component, please refer to the documentation at https://home-assistant.io/components/abode/ """ -import asyncio import logging from functools import partial from requests.exceptions import HTTPError, ConnectTimeout @@ -261,8 +260,7 @@ class AbodeDevice(Entity): self._data = data self._device = device - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Subscribe Abode events.""" self.hass.async_add_job( self._data.abode.events.add_device_callback, @@ -308,8 +306,7 @@ class AbodeAutomation(Entity): self._automation = automation self._event = event - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Subscribe Abode events.""" if self._event: self.hass.async_add_job( diff --git a/homeassistant/components/alexa/__init__.py b/homeassistant/components/alexa/__init__.py index d120270650f..337d8993b28 100644 --- a/homeassistant/components/alexa/__init__.py +++ b/homeassistant/components/alexa/__init__.py @@ -4,7 +4,6 @@ Support for Alexa skill service end point. For more details about this component, please refer to the documentation at https://home-assistant.io/components/alexa/ """ -import asyncio import logging import voluptuous as vol @@ -53,8 +52,7 @@ CONFIG_SCHEMA = vol.Schema({ }, extra=vol.ALLOW_EXTRA) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Activate Alexa component.""" config = config.get(DOMAIN, {}) flash_briefings_config = config.get(CONF_FLASH_BRIEFINGS) diff --git a/homeassistant/components/alexa/intent.py b/homeassistant/components/alexa/intent.py index 8d4520d74e8..85cb4f105cd 100644 --- a/homeassistant/components/alexa/intent.py +++ b/homeassistant/components/alexa/intent.py @@ -4,7 +4,6 @@ Support for Alexa skill service end point. For more details about this component, please refer to the documentation at https://home-assistant.io/components/alexa/ """ -import asyncio import enum import logging @@ -59,16 +58,15 @@ class AlexaIntentsView(http.HomeAssistantView): url = INTENTS_API_ENDPOINT name = 'api:alexa' - @asyncio.coroutine - def post(self, request): + async def post(self, request): """Handle Alexa.""" hass = request.app['hass'] - message = yield from request.json() + message = await request.json() _LOGGER.debug("Received Alexa request: %s", message) try: - response = yield from async_handle_message(hass, message) + response = await async_handle_message(hass, message) return b'' if response is None else self.json(response) except UnknownRequest as err: _LOGGER.warning(str(err)) @@ -101,8 +99,7 @@ def intent_error_response(hass, message, error): return alexa_response.as_dict() -@asyncio.coroutine -def async_handle_message(hass, message): +async def async_handle_message(hass, message): """Handle an Alexa intent. Raises: @@ -120,20 +117,18 @@ def async_handle_message(hass, message): if not handler: raise UnknownRequest('Received unknown request {}'.format(req_type)) - return (yield from handler(hass, message)) + return await handler(hass, message) @HANDLERS.register('SessionEndedRequest') -@asyncio.coroutine -def async_handle_session_end(hass, message): +async def async_handle_session_end(hass, message): """Handle a session end request.""" return None @HANDLERS.register('IntentRequest') @HANDLERS.register('LaunchRequest') -@asyncio.coroutine -def async_handle_intent(hass, message): +async def async_handle_intent(hass, message): """Handle an intent request. Raises: @@ -153,7 +148,7 @@ def async_handle_intent(hass, message): else: intent_name = alexa_intent_info['name'] - intent_response = yield from intent.async_handle( + intent_response = await intent.async_handle( hass, DOMAIN, intent_name, {key: {'value': value} for key, value in alexa_response.variables.items()}) diff --git a/homeassistant/components/alexa/smart_home.py b/homeassistant/components/alexa/smart_home.py index 176c286ebc3..f88d81ab851 100644 --- a/homeassistant/components/alexa/smart_home.py +++ b/homeassistant/components/alexa/smart_home.py @@ -1,5 +1,4 @@ """Support for alexa Smart Home Skill API.""" -import asyncio import logging import math from datetime import datetime @@ -695,8 +694,7 @@ class SmartHomeView(http.HomeAssistantView): """Initialize.""" self.smart_home_config = smart_home_config - @asyncio.coroutine - def post(self, request): + async def post(self, request): """Handle Alexa Smart Home requests. The Smart Home API requires the endpoint to be implemented in AWS @@ -704,11 +702,11 @@ class SmartHomeView(http.HomeAssistantView): the response. """ hass = request.app['hass'] - message = yield from request.json() + message = await request.json() _LOGGER.debug("Received Alexa Smart Home request: %s", message) - response = yield from async_handle_message( + response = await async_handle_message( hass, self.smart_home_config, message) _LOGGER.debug("Sending Alexa Smart Home response: %s", response) return b'' if response is None else self.json(response) diff --git a/homeassistant/components/android_ip_webcam.py b/homeassistant/components/android_ip_webcam.py index 5da117e74c3..b8a2d461489 100644 --- a/homeassistant/components/android_ip_webcam.py +++ b/homeassistant/components/android_ip_webcam.py @@ -149,16 +149,14 @@ CONFIG_SCHEMA = vol.Schema({ }, extra=vol.ALLOW_EXTRA) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up the IP Webcam component.""" from pydroid_ipcam import PyDroidIPCam webcams = hass.data[DATA_IP_WEBCAM] = {} websession = async_get_clientsession(hass) - @asyncio.coroutine - def async_setup_ipcamera(cam_config): + async def async_setup_ipcamera(cam_config): """Set up an IP camera.""" host = cam_config[CONF_HOST] username = cam_config.get(CONF_USERNAME) @@ -188,16 +186,15 @@ def async_setup(hass, config): if motion is None: motion = 'motion_active' in cam.enabled_sensors - @asyncio.coroutine - def async_update_data(now): + async def async_update_data(now): """Update data from IP camera in SCAN_INTERVAL.""" - yield from cam.update() + await cam.update() async_dispatcher_send(hass, SIGNAL_UPDATE_DATA, host) async_track_point_in_utc_time( hass, async_update_data, utcnow() + interval) - yield from async_update_data(None) + await async_update_data(None) # Load platforms webcams[host] = cam @@ -242,7 +239,7 @@ def async_setup(hass, config): tasks = [async_setup_ipcamera(conf) for conf in config[DOMAIN]] if tasks: - yield from asyncio.wait(tasks, loop=hass.loop) + await asyncio.wait(tasks, loop=hass.loop) return True @@ -255,8 +252,7 @@ class AndroidIPCamEntity(Entity): self._host = host self._ipcam = ipcam - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Register update dispatcher.""" @callback def async_ipcam_update(host): diff --git a/homeassistant/components/apple_tv.py b/homeassistant/components/apple_tv.py index 21ff0e3286d..96e31e6bbf1 100644 --- a/homeassistant/components/apple_tv.py +++ b/homeassistant/components/apple_tv.py @@ -77,14 +77,13 @@ def request_configuration(hass, config, atv, credentials): """Request configuration steps from the user.""" configurator = hass.components.configurator - @asyncio.coroutine - def configuration_callback(callback_data): + async def configuration_callback(callback_data): """Handle the submitted configuration.""" from pyatv import exceptions pin = callback_data.get('pin') try: - yield from atv.airplay.finish_authentication(pin) + await atv.airplay.finish_authentication(pin) hass.components.persistent_notification.async_create( 'Authentication succeeded!

Add the following ' 'to credentials: in your apple_tv configuration:

' @@ -108,11 +107,10 @@ def request_configuration(hass, config, atv, credentials): ) -@asyncio.coroutine -def scan_for_apple_tvs(hass): +async def scan_for_apple_tvs(hass): """Scan for devices and present a notification of the ones found.""" import pyatv - atvs = yield from pyatv.scan_for_apple_tvs(hass.loop, timeout=3) + atvs = await pyatv.scan_for_apple_tvs(hass.loop, timeout=3) devices = [] for atv in atvs: @@ -132,14 +130,12 @@ def scan_for_apple_tvs(hass): notification_id=NOTIFICATION_SCAN_ID) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up the Apple TV component.""" if DATA_APPLE_TV not in hass.data: hass.data[DATA_APPLE_TV] = {} - @asyncio.coroutine - def async_service_handler(service): + async def async_service_handler(service): """Handle service calls.""" entity_ids = service.data.get(ATTR_ENTITY_ID) @@ -158,17 +154,16 @@ def async_setup(hass, config): continue atv = device.atv - credentials = yield from atv.airplay.generate_credentials() - yield from atv.airplay.load_credentials(credentials) + credentials = await atv.airplay.generate_credentials() + await atv.airplay.load_credentials(credentials) _LOGGER.debug('Generated new credentials: %s', credentials) - yield from atv.airplay.start_authentication() + await atv.airplay.start_authentication() hass.async_add_job(request_configuration, hass, config, atv, credentials) - @asyncio.coroutine - def atv_discovered(service, info): + async def atv_discovered(service, info): """Set up an Apple TV that was auto discovered.""" - yield from _setup_atv(hass, { + await _setup_atv(hass, { CONF_NAME: info['name'], CONF_HOST: info['host'], CONF_LOGIN_ID: info['properties']['hG'], @@ -179,7 +174,7 @@ def async_setup(hass, config): tasks = [_setup_atv(hass, conf) for conf in config.get(DOMAIN, [])] if tasks: - yield from asyncio.wait(tasks, loop=hass.loop) + await asyncio.wait(tasks, loop=hass.loop) hass.services.async_register( DOMAIN, SERVICE_SCAN, async_service_handler, @@ -192,8 +187,7 @@ def async_setup(hass, config): return True -@asyncio.coroutine -def _setup_atv(hass, atv_config): +async def _setup_atv(hass, atv_config): """Set up an Apple TV.""" import pyatv name = atv_config.get(CONF_NAME) @@ -209,7 +203,7 @@ def _setup_atv(hass, atv_config): session = async_get_clientsession(hass) atv = pyatv.connect_to_apple_tv(details, hass.loop, session=session) if credentials: - yield from atv.airplay.load_credentials(credentials) + await atv.airplay.load_credentials(credentials) power = AppleTVPowerManager(hass, atv, start_off) hass.data[DATA_APPLE_TV][host] = { diff --git a/homeassistant/components/cloud/__init__.py b/homeassistant/components/cloud/__init__.py index 33a939bf9d0..217b39aff62 100644 --- a/homeassistant/components/cloud/__init__.py +++ b/homeassistant/components/cloud/__init__.py @@ -92,8 +92,7 @@ CONFIG_SCHEMA = vol.Schema({ }, extra=vol.ALLOW_EXTRA) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Initialize the Home Assistant cloud.""" if DOMAIN in config: kwargs = dict(config[DOMAIN]) @@ -112,7 +111,7 @@ def async_setup(hass, config): cloud = hass.data[DOMAIN] = Cloud(hass, **kwargs) hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, cloud.async_start) - yield from http_api.async_setup(hass) + await http_api.async_setup(hass) return True @@ -226,17 +225,16 @@ class Cloud: 'authorization': self.id_token }) - @asyncio.coroutine - def logout(self): + async def logout(self): """Close connection and remove all credentials.""" - yield from self.iot.disconnect() + await self.iot.disconnect() self.id_token = None self.access_token = None self.refresh_token = None self._gactions_config = None - yield from self.hass.async_add_job( + await self.hass.async_add_job( lambda: os.remove(self.user_info_path)) def write_user_info(self): @@ -313,8 +311,7 @@ class Cloud: self._prefs[STORAGE_ENABLE_ALEXA] = alexa_enabled await self._store.async_save(self._prefs) - @asyncio.coroutine - def _fetch_jwt_keyset(self): + async def _fetch_jwt_keyset(self): """Fetch the JWT keyset for the Cognito instance.""" session = async_get_clientsession(self.hass) url = ("https://cognito-idp.us-east-1.amazonaws.com/" @@ -322,8 +319,8 @@ class Cloud: try: with async_timeout.timeout(10, loop=self.hass.loop): - req = yield from session.get(url) - self.jwt_keyset = yield from req.json() + req = await session.get(url) + self.jwt_keyset = await req.json() return True diff --git a/homeassistant/components/demo.py b/homeassistant/components/demo.py index c2c7866148f..8999087a137 100644 --- a/homeassistant/components/demo.py +++ b/homeassistant/components/demo.py @@ -35,8 +35,7 @@ COMPONENTS_WITH_DEMO_PLATFORM = [ ] -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up the demo environment.""" group = hass.components.group configurator = hass.components.configurator @@ -101,7 +100,7 @@ def async_setup(hass, config): {'weblink': {'entities': [{'name': 'Router', 'url': 'http://192.168.1.1'}]}})) - results = yield from asyncio.gather(*tasks, loop=hass.loop) + results = await asyncio.gather(*tasks, loop=hass.loop) if any(not result for result in results): return False @@ -192,7 +191,7 @@ def async_setup(hass, config): 'climate.ecobee', ], view=True)) - results = yield from asyncio.gather(*tasks2, loop=hass.loop) + results = await asyncio.gather(*tasks2, loop=hass.loop) if any(not result for result in results): return False diff --git a/homeassistant/components/device_sun_light_trigger.py b/homeassistant/components/device_sun_light_trigger.py index b766513f1f4..cd81b3a01ad 100644 --- a/homeassistant/components/device_sun_light_trigger.py +++ b/homeassistant/components/device_sun_light_trigger.py @@ -4,7 +4,6 @@ Provides functionality to turn on lights based on the states. For more details about this component, please refer to the documentation at https://home-assistant.io/components/device_sun_light_trigger/ """ -import asyncio import logging from datetime import timedelta @@ -45,8 +44,7 @@ CONFIG_SCHEMA = vol.Schema({ }, extra=vol.ALLOW_EXTRA) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up the triggers to control lights based on device presence.""" logger = logging.getLogger(__name__) device_tracker = hass.components.device_tracker diff --git a/homeassistant/components/doorbird.py b/homeassistant/components/doorbird.py index c97289b9f07..ab929eb90bb 100644 --- a/homeassistant/components/doorbird.py +++ b/homeassistant/components/doorbird.py @@ -6,7 +6,6 @@ https://home-assistant.io/components/doorbird/ """ import logging -import asyncio import voluptuous as vol from homeassistant.components.http import HomeAssistantView @@ -170,8 +169,7 @@ class DoorbirdRequestView(HomeAssistantView): extra_urls = [API_URL + '/{sensor}'] # pylint: disable=no-self-use - @asyncio.coroutine - def get(self, request, sensor): + async def get(self, request, sensor): """Respond to requests from the device.""" hass = request.app['hass'] diff --git a/homeassistant/components/duckdns.py b/homeassistant/components/duckdns.py index 6ec2e6b1e03..3420bbed1bc 100644 --- a/homeassistant/components/duckdns.py +++ b/homeassistant/components/duckdns.py @@ -4,7 +4,6 @@ Integrate with DuckDNS. For more details about this component, please refer to the documentation at https://home-assistant.io/components/duckdns/ """ -import asyncio from datetime import timedelta import logging @@ -39,27 +38,24 @@ SERVICE_TXT_SCHEMA = vol.Schema({ }) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Initialize the DuckDNS component.""" domain = config[DOMAIN][CONF_DOMAIN] token = config[DOMAIN][CONF_ACCESS_TOKEN] session = async_get_clientsession(hass) - result = yield from _update_duckdns(session, domain, token) + result = await _update_duckdns(session, domain, token) if not result: return False - @asyncio.coroutine - def update_domain_interval(now): + async def update_domain_interval(now): """Update the DuckDNS entry.""" - yield from _update_duckdns(session, domain, token) + await _update_duckdns(session, domain, token) - @asyncio.coroutine - def update_domain_service(call): + async def update_domain_service(call): """Update the DuckDNS entry.""" - yield from _update_duckdns( + await _update_duckdns( session, domain, token, txt=call.data[ATTR_TXT]) async_track_time_interval(hass, update_domain_interval, INTERVAL) @@ -73,8 +69,8 @@ def async_setup(hass, config): _SENTINEL = object() -@asyncio.coroutine -def _update_duckdns(session, domain, token, *, txt=_SENTINEL, clear=False): +async def _update_duckdns(session, domain, token, *, txt=_SENTINEL, + clear=False): """Update DuckDNS.""" params = { 'domains': domain, @@ -92,8 +88,8 @@ def _update_duckdns(session, domain, token, *, txt=_SENTINEL, clear=False): if clear: params['clear'] = 'true' - resp = yield from session.get(UPDATE_URL, params=params) - body = yield from resp.text() + resp = await session.get(UPDATE_URL, params=params) + body = await resp.text() if body != 'OK': _LOGGER.warning("Updating DuckDNS domain failed: %s", domain) diff --git a/homeassistant/components/emulated_hue/hue_api.py b/homeassistant/components/emulated_hue/hue_api.py index f7fbe2e15e3..fa24b656d7a 100644 --- a/homeassistant/components/emulated_hue/hue_api.py +++ b/homeassistant/components/emulated_hue/hue_api.py @@ -1,5 +1,4 @@ """Provides a Hue API to control Home Assistant.""" -import asyncio import logging from aiohttp import web @@ -36,11 +35,10 @@ class HueUsernameView(HomeAssistantView): extra_urls = ['/api/'] requires_auth = False - @asyncio.coroutine - def post(self, request): + async def post(self, request): """Handle a POST request.""" try: - data = yield from request.json() + data = await request.json() except ValueError: return self.json_message('Invalid JSON', HTTP_BAD_REQUEST) @@ -146,8 +144,7 @@ class HueOneLightChangeView(HomeAssistantView): """Initialize the instance of the view.""" self.config = config - @asyncio.coroutine - def put(self, request, username, entity_number): + async def put(self, request, username, entity_number): """Process a request to set the state of an individual light.""" config = self.config hass = request.app['hass'] @@ -168,7 +165,7 @@ class HueOneLightChangeView(HomeAssistantView): return web.Response(text="Entity not exposed", status=404) try: - request_json = yield from request.json() + request_json = await request.json() except ValueError: _LOGGER.error('Received invalid json') return self.json_message('Invalid JSON', HTTP_BAD_REQUEST) diff --git a/homeassistant/components/envisalink.py b/homeassistant/components/envisalink.py index 9b5b25c934c..eabe2d76851 100644 --- a/homeassistant/components/envisalink.py +++ b/homeassistant/components/envisalink.py @@ -81,8 +81,7 @@ CONFIG_SCHEMA = vol.Schema({ }, extra=vol.ALLOW_EXTRA) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up for Envisalink devices.""" from pyenvisalink import EnvisalinkAlarmPanel @@ -165,7 +164,7 @@ def async_setup(hass, config): _LOGGER.info("Start envisalink.") controller.start() - result = yield from sync_connect + result = await sync_connect if not result: return False diff --git a/homeassistant/components/ffmpeg.py b/homeassistant/components/ffmpeg.py index 9aaae16ee21..64915f8849c 100644 --- a/homeassistant/components/ffmpeg.py +++ b/homeassistant/components/ffmpeg.py @@ -4,7 +4,6 @@ Component that will help set the FFmpeg component. For more details about this component, please refer to the documentation at https://home-assistant.io/components/ffmpeg/ """ -import asyncio import logging import voluptuous as vol @@ -76,8 +75,7 @@ def async_restart(hass, entity_id=None): hass.async_add_job(hass.services.async_call(DOMAIN, SERVICE_RESTART, data)) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up the FFmpeg component.""" conf = config.get(DOMAIN, {}) @@ -88,8 +86,7 @@ def async_setup(hass, config): ) # Register service - @asyncio.coroutine - def async_service_handle(service): + async def async_service_handle(service): """Handle service ffmpeg process.""" entity_ids = service.data.get(ATTR_ENTITY_ID) @@ -131,8 +128,7 @@ class FFmpegManager: """Return ffmpeg binary from config.""" return self._bin - @asyncio.coroutine - def async_run_test(self, input_source): + async def async_run_test(self, input_source): """Run test on this input. TRUE is deactivate or run correct. This method must be run in the event loop. @@ -146,7 +142,7 @@ class FFmpegManager: # run test ffmpeg_test = Test(self.binary, loop=self.hass.loop) - success = yield from ffmpeg_test.run_test(input_source) + success = await ffmpeg_test.run_test(input_source) if not success: _LOGGER.error("FFmpeg '%s' test fails!", input_source) self._cache[input_source] = False @@ -163,8 +159,7 @@ class FFmpegBase(Entity): self.ffmpeg = None self.initial_state = initial_state - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Register dispatcher & events. This method is a coroutine. @@ -189,40 +184,36 @@ class FFmpegBase(Entity): """Return True if entity has to be polled for state.""" return False - @asyncio.coroutine - def _async_start_ffmpeg(self, entity_ids): + async def _async_start_ffmpeg(self, entity_ids): """Start a FFmpeg process. This method is a coroutine. """ raise NotImplementedError() - @asyncio.coroutine - def _async_stop_ffmpeg(self, entity_ids): + async def _async_stop_ffmpeg(self, entity_ids): """Stop a FFmpeg process. This method is a coroutine. """ if entity_ids is None or self.entity_id in entity_ids: - yield from self.ffmpeg.close() + await self.ffmpeg.close() - @asyncio.coroutine - def _async_restart_ffmpeg(self, entity_ids): + async def _async_restart_ffmpeg(self, entity_ids): """Stop a FFmpeg process. This method is a coroutine. """ if entity_ids is None or self.entity_id in entity_ids: - yield from self._async_stop_ffmpeg(None) - yield from self._async_start_ffmpeg(None) + await self._async_stop_ffmpeg(None) + await self._async_start_ffmpeg(None) @callback def _async_register_events(self): """Register a FFmpeg process/device.""" - @asyncio.coroutine - def async_shutdown_handle(event): + async def async_shutdown_handle(event): """Stop FFmpeg process.""" - yield from self._async_stop_ffmpeg(None) + await self._async_stop_ffmpeg(None) self.hass.bus.async_listen_once( EVENT_HOMEASSISTANT_STOP, async_shutdown_handle) @@ -231,10 +222,9 @@ class FFmpegBase(Entity): if not self.initial_state: return - @asyncio.coroutine - def async_start_handle(event): + async def async_start_handle(event): """Start FFmpeg process.""" - yield from self._async_start_ffmpeg(None) + await self._async_start_ffmpeg(None) self.async_schedule_update_ha_state() self.hass.bus.async_listen_once( diff --git a/homeassistant/components/foursquare.py b/homeassistant/components/foursquare.py index 2c10df327f4..a4a7395adc4 100644 --- a/homeassistant/components/foursquare.py +++ b/homeassistant/components/foursquare.py @@ -4,7 +4,6 @@ Support for the Foursquare (Swarm) API. For more details about this component, please refer to the documentation at https://home-assistant.io/components/foursquare/ """ -import asyncio import logging import requests @@ -85,11 +84,10 @@ class FoursquarePushReceiver(HomeAssistantView): """Initialize the OAuth callback view.""" self.push_secret = push_secret - @asyncio.coroutine - def post(self, request): + async def post(self, request): """Accept the POST from Foursquare.""" try: - data = yield from request.json() + data = await request.json() except ValueError: return self.json_message('Invalid JSON', HTTP_BAD_REQUEST) diff --git a/homeassistant/components/freedns.py b/homeassistant/components/freedns.py index 0512030bdcb..0b5cbeda01a 100644 --- a/homeassistant/components/freedns.py +++ b/homeassistant/components/freedns.py @@ -37,8 +37,7 @@ CONFIG_SCHEMA = vol.Schema({ }, extra=vol.ALLOW_EXTRA) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Initialize the FreeDNS component.""" url = config[DOMAIN].get(CONF_URL) auth_token = config[DOMAIN].get(CONF_ACCESS_TOKEN) @@ -46,16 +45,15 @@ def async_setup(hass, config): session = hass.helpers.aiohttp_client.async_get_clientsession() - result = yield from _update_freedns( + result = await _update_freedns( hass, session, url, auth_token) if result is False: return False - @asyncio.coroutine - def update_domain_callback(now): + async def update_domain_callback(now): """Update the FreeDNS entry.""" - yield from _update_freedns(hass, session, url, auth_token) + await _update_freedns(hass, session, url, auth_token) hass.helpers.event.async_track_time_interval( update_domain_callback, update_interval) @@ -63,8 +61,7 @@ def async_setup(hass, config): return True -@asyncio.coroutine -def _update_freedns(hass, session, url, auth_token): +async def _update_freedns(hass, session, url, auth_token): """Update FreeDNS.""" params = None @@ -77,8 +74,8 @@ def _update_freedns(hass, session, url, auth_token): try: with async_timeout.timeout(TIMEOUT, loop=hass.loop): - resp = yield from session.get(url, params=params) - body = yield from resp.text() + resp = await session.get(url, params=params) + body = await resp.text() if "has not changed" in body: # IP has not changed. diff --git a/homeassistant/components/google_domains.py b/homeassistant/components/google_domains.py index 3b414306be5..32bdb79557a 100644 --- a/homeassistant/components/google_domains.py +++ b/homeassistant/components/google_domains.py @@ -36,8 +36,7 @@ CONFIG_SCHEMA = vol.Schema({ }, extra=vol.ALLOW_EXTRA) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Initialize the Google Domains component.""" domain = config[DOMAIN].get(CONF_DOMAIN) user = config[DOMAIN].get(CONF_USERNAME) @@ -46,16 +45,15 @@ def async_setup(hass, config): session = hass.helpers.aiohttp_client.async_get_clientsession() - result = yield from _update_google_domains( + result = await _update_google_domains( hass, session, domain, user, password, timeout) if not result: return False - @asyncio.coroutine - def update_domain_interval(now): + async def update_domain_interval(now): """Update the Google Domains entry.""" - yield from _update_google_domains( + await _update_google_domains( hass, session, domain, user, password, timeout) hass.helpers.event.async_track_time_interval( @@ -64,8 +62,8 @@ def async_setup(hass, config): return True -@asyncio.coroutine -def _update_google_domains(hass, session, domain, user, password, timeout): +async def _update_google_domains(hass, session, domain, user, password, + timeout): """Update Google Domains.""" url = UPDATE_URL.format(user, password) @@ -75,8 +73,8 @@ def _update_google_domains(hass, session, domain, user, password, timeout): try: with async_timeout.timeout(timeout, loop=hass.loop): - resp = yield from session.get(url, params=params) - body = yield from resp.text() + resp = await session.get(url, params=params) + body = await resp.text() if body.startswith('good') or body.startswith('nochg'): return True diff --git a/homeassistant/components/homematic/__init__.py b/homeassistant/components/homematic/__init__.py index 3d6eb69bb5e..b2b3b18ff34 100644 --- a/homeassistant/components/homematic/__init__.py +++ b/homeassistant/components/homematic/__init__.py @@ -4,7 +4,6 @@ Support for HomeMatic devices. For more details about this component, please refer to the documentation at https://home-assistant.io/components/homematic/ """ -import asyncio from datetime import timedelta from functools import partial import logging @@ -715,10 +714,9 @@ class HMDevice(Entity): if self._state: self._state = self._state.upper() - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Load data init callbacks.""" - yield from self.hass.async_add_job(self.link_homematic) + await self.hass.async_add_job(self.link_homematic) @property def unique_id(self): diff --git a/homeassistant/components/hydrawise.py b/homeassistant/components/hydrawise.py index 0c4db63034e..5a045a083b3 100644 --- a/homeassistant/components/hydrawise.py +++ b/homeassistant/components/hydrawise.py @@ -4,7 +4,6 @@ Support for Hydrawise cloud. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/hydrawise/ """ -import asyncio from datetime import timedelta import logging @@ -127,8 +126,7 @@ class HydrawiseEntity(Entity): """Return the name of the sensor.""" return self._name - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Register callbacks.""" async_dispatcher_connect( self.hass, SIGNAL_UPDATE_HYDRAWISE, self._update_callback) diff --git a/homeassistant/components/ihc/ihcdevice.py b/homeassistant/components/ihc/ihcdevice.py index 93ab81850c9..26ee2fb14fc 100644 --- a/homeassistant/components/ihc/ihcdevice.py +++ b/homeassistant/components/ihc/ihcdevice.py @@ -1,5 +1,4 @@ """Implementation of a base class for all IHC devices.""" -import asyncio from homeassistant.helpers.entity import Entity @@ -28,8 +27,7 @@ class IHCDevice(Entity): self.ihc_note = '' self.ihc_position = '' - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Add callback for IHC changes.""" self.ihc_controller.add_notify_event( self.ihc_id, self.on_ihc_change, True) diff --git a/homeassistant/components/insteon/__init__.py b/homeassistant/components/insteon/__init__.py index 749d167e6de..924baeaa560 100644 --- a/homeassistant/components/insteon/__init__.py +++ b/homeassistant/components/insteon/__init__.py @@ -4,7 +4,6 @@ Support for INSTEON Modems (PLM and Hub). For more details about this component, please refer to the documentation at https://home-assistant.io/components/insteon/ """ -import asyncio import collections import logging from typing import Dict @@ -149,8 +148,7 @@ X10_HOUSECODE_SCHEMA = vol.Schema({ }) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up the connection to the modem.""" import insteonplm @@ -292,7 +290,7 @@ def async_setup(hass, config): if host: _LOGGER.info('Connecting to Insteon Hub on %s', host) - conn = yield from insteonplm.Connection.create( + conn = await insteonplm.Connection.create( host=host, port=ip_port, username=username, @@ -302,7 +300,7 @@ def async_setup(hass, config): workdir=hass.config.config_dir) else: _LOGGER.info("Looking for Insteon PLM on %s", port) - conn = yield from insteonplm.Connection.create( + conn = await insteonplm.Connection.create( device=port, loop=hass.loop, workdir=hass.config.config_dir) @@ -494,8 +492,7 @@ class InsteonEntity(Entity): deviceid.human, group, val) self.async_schedule_update_ha_state() - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Register INSTEON update events.""" _LOGGER.debug('Tracking updates for device %s group %d statename %s', self.address, self.group, diff --git a/homeassistant/components/insteon_plm.py b/homeassistant/components/insteon_plm.py index b89e5679a63..b3011e9d7bd 100644 --- a/homeassistant/components/insteon_plm.py +++ b/homeassistant/components/insteon_plm.py @@ -4,14 +4,12 @@ Support for INSTEON PowerLinc Modem. For more details about this component, please refer to the documentation at https://home-assistant.io/components/insteon_plm/ """ -import asyncio import logging _LOGGER = logging.getLogger(__name__) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up the insteon_plm component. This component is deprecated as of release 0.77 and should be removed in diff --git a/homeassistant/components/intent_script.py b/homeassistant/components/intent_script.py index 91489e188c5..0c47b8880ba 100644 --- a/homeassistant/components/intent_script.py +++ b/homeassistant/components/intent_script.py @@ -1,5 +1,4 @@ """Handle intents with scripts.""" -import asyncio import copy import logging @@ -45,8 +44,7 @@ CONFIG_SCHEMA = vol.Schema({ _LOGGER = logging.getLogger(__name__) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Activate Alexa component.""" intents = copy.deepcopy(config[DOMAIN]) template.attach(hass, intents) @@ -69,8 +67,7 @@ class ScriptIntentHandler(intent.IntentHandler): self.intent_type = intent_type self.config = config - @asyncio.coroutine - def async_handle(self, intent_obj): + async def async_handle(self, intent_obj): """Handle the intent.""" speech = self.config.get(CONF_SPEECH) card = self.config.get(CONF_CARD) @@ -83,7 +80,7 @@ class ScriptIntentHandler(intent.IntentHandler): if is_async_action: intent_obj.hass.async_add_job(action.async_run(slots)) else: - yield from action.async_run(slots) + await action.async_run(slots) response = intent_obj.create_response() diff --git a/homeassistant/components/introduction.py b/homeassistant/components/introduction.py index cc3e00c4475..17de7fcd6ca 100644 --- a/homeassistant/components/introduction.py +++ b/homeassistant/components/introduction.py @@ -4,7 +4,6 @@ Component that will help guide the user taking its first steps. For more details about this component, please refer to the documentation at https://home-assistant.io/components/introduction/ """ -import asyncio import logging import voluptuous as vol @@ -16,8 +15,7 @@ CONFIG_SCHEMA = vol.Schema({ }, extra=vol.ALLOW_EXTRA) -@asyncio.coroutine -def async_setup(hass, config=None): +async def async_setup(hass, config=None): """Set up the introduction component.""" log = logging.getLogger(__name__) log.info(""" diff --git a/homeassistant/components/ios/__init__.py b/homeassistant/components/ios/__init__.py index a67be0a63de..0b1282b605a 100644 --- a/homeassistant/components/ios/__init__.py +++ b/homeassistant/components/ios/__init__.py @@ -4,7 +4,6 @@ Native Home Assistant iOS app component. For more details about this component, please refer to the documentation at https://home-assistant.io/ecosystem/ios/ """ -import asyncio import logging import datetime @@ -259,11 +258,10 @@ class iOSIdentifyDeviceView(HomeAssistantView): """Initiliaze the view.""" self._config_path = config_path - @asyncio.coroutine - def post(self, request): + async def post(self, request): """Handle the POST request for device identification.""" try: - data = yield from request.json() + data = await request.json() except ValueError: return self.json_message("Invalid JSON", HTTP_BAD_REQUEST) diff --git a/homeassistant/components/isy994.py b/homeassistant/components/isy994.py index d8afb7be5da..9b539b0690a 100644 --- a/homeassistant/components/isy994.py +++ b/homeassistant/components/isy994.py @@ -4,7 +4,6 @@ Support the ISY-994 controllers. For configuration details please visit the documentation for this component at https://home-assistant.io/components/isy994/ """ -import asyncio from collections import namedtuple import logging from urllib.parse import urlparse @@ -414,8 +413,7 @@ class ISYDevice(Entity): self._change_handler = None self._control_handler = None - @asyncio.coroutine - def async_added_to_hass(self) -> None: + async def async_added_to_hass(self) -> None: """Subscribe to the node change events.""" self._change_handler = self._node.status.subscribe( 'changed', self.on_update) diff --git a/homeassistant/components/lutron.py b/homeassistant/components/lutron.py index bef821220b3..2e49d7ce690 100644 --- a/homeassistant/components/lutron.py +++ b/homeassistant/components/lutron.py @@ -4,7 +4,6 @@ Component for interacting with a Lutron RadioRA 2 system. For more details about this component, please refer to the documentation at https://home-assistant.io/components/lutron/ """ -import asyncio import logging import voluptuous as vol @@ -69,8 +68,7 @@ class LutronDevice(Entity): self._controller = controller self._area_name = area_name - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Register callbacks.""" self.hass.async_add_job( self._controller.subscribe, self._lutron_device, diff --git a/homeassistant/components/lutron_caseta.py b/homeassistant/components/lutron_caseta.py index 2535fb76120..eb4010e43a1 100644 --- a/homeassistant/components/lutron_caseta.py +++ b/homeassistant/components/lutron_caseta.py @@ -4,7 +4,6 @@ Component for interacting with a Lutron Caseta system. For more details about this component, please refer to the documentation at https://home-assistant.io/components/lutron_caseta/ """ -import asyncio import logging import voluptuous as vol @@ -40,8 +39,7 @@ LUTRON_CASETA_COMPONENTS = [ ] -@asyncio.coroutine -def async_setup(hass, base_config): +async def async_setup(hass, base_config): """Set up the Lutron component.""" from pylutron_caseta.smartbridge import Smartbridge @@ -54,7 +52,7 @@ def async_setup(hass, base_config): certfile=certfile, ca_certs=ca_certs) hass.data[LUTRON_CASETA_SMARTBRIDGE] = bridge - yield from bridge.connect() + await bridge.connect() if not hass.data[LUTRON_CASETA_SMARTBRIDGE].is_connected(): _LOGGER.error("Unable to connect to Lutron smartbridge at %s", config[CONF_HOST]) @@ -85,8 +83,7 @@ class LutronCasetaDevice(Entity): self._state = None self._smartbridge = bridge - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Register callbacks.""" self._smartbridge.add_subscriber(self._device_id, self.async_schedule_update_ha_state) diff --git a/homeassistant/components/microsoft_face.py b/homeassistant/components/microsoft_face.py index e0e0e716d2e..c06ed6bc8f3 100644 --- a/homeassistant/components/microsoft_face.py +++ b/homeassistant/components/microsoft_face.py @@ -106,8 +106,7 @@ def face_person(hass, group, person, camera_entity): hass.services.call(DOMAIN, SERVICE_FACE_PERSON, data) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up Microsoft Face.""" entities = {} face = MicrosoftFace( @@ -120,26 +119,25 @@ def async_setup(hass, config): try: # read exists group/person from cloud and create entities - yield from face.update_store() + await face.update_store() except HomeAssistantError as err: _LOGGER.error("Can't load data from face api: %s", err) return False hass.data[DATA_MICROSOFT_FACE] = face - @asyncio.coroutine - def async_create_group(service): + async def async_create_group(service): """Create a new person group.""" name = service.data[ATTR_NAME] g_id = slugify(name) try: - yield from face.call_api( + await face.call_api( 'put', "persongroups/{0}".format(g_id), {'name': name}) face.store[g_id] = {} entities[g_id] = MicrosoftFaceGroupEntity(hass, face, g_id, name) - yield from entities[g_id].async_update_ha_state() + await entities[g_id].async_update_ha_state() except HomeAssistantError as err: _LOGGER.error("Can't create group '%s' with error: %s", g_id, err) @@ -147,13 +145,12 @@ def async_setup(hass, config): DOMAIN, SERVICE_CREATE_GROUP, async_create_group, schema=SCHEMA_GROUP_SERVICE) - @asyncio.coroutine - def async_delete_group(service): + async def async_delete_group(service): """Delete a person group.""" g_id = slugify(service.data[ATTR_NAME]) try: - yield from face.call_api('delete', "persongroups/{0}".format(g_id)) + await face.call_api('delete', "persongroups/{0}".format(g_id)) face.store.pop(g_id) entity = entities.pop(g_id) @@ -165,13 +162,12 @@ def async_setup(hass, config): DOMAIN, SERVICE_DELETE_GROUP, async_delete_group, schema=SCHEMA_GROUP_SERVICE) - @asyncio.coroutine - def async_train_group(service): + async def async_train_group(service): """Train a person group.""" g_id = service.data[ATTR_GROUP] try: - yield from face.call_api( + await face.call_api( 'post', "persongroups/{0}/train".format(g_id)) except HomeAssistantError as err: _LOGGER.error("Can't train group '%s' with error: %s", g_id, err) @@ -180,19 +176,18 @@ def async_setup(hass, config): DOMAIN, SERVICE_TRAIN_GROUP, async_train_group, schema=SCHEMA_TRAIN_SERVICE) - @asyncio.coroutine - def async_create_person(service): + async def async_create_person(service): """Create a person in a group.""" name = service.data[ATTR_NAME] g_id = service.data[ATTR_GROUP] try: - user_data = yield from face.call_api( + user_data = await face.call_api( 'post', "persongroups/{0}/persons".format(g_id), {'name': name} ) face.store[g_id][name] = user_data['personId'] - yield from entities[g_id].async_update_ha_state() + await entities[g_id].async_update_ha_state() except HomeAssistantError as err: _LOGGER.error("Can't create person '%s' with error: %s", name, err) @@ -200,19 +195,18 @@ def async_setup(hass, config): DOMAIN, SERVICE_CREATE_PERSON, async_create_person, schema=SCHEMA_PERSON_SERVICE) - @asyncio.coroutine - def async_delete_person(service): + async def async_delete_person(service): """Delete a person in a group.""" name = service.data[ATTR_NAME] g_id = service.data[ATTR_GROUP] p_id = face.store[g_id].get(name) try: - yield from face.call_api( + await face.call_api( 'delete', "persongroups/{0}/persons/{1}".format(g_id, p_id)) face.store[g_id].pop(name) - yield from entities[g_id].async_update_ha_state() + await entities[g_id].async_update_ha_state() except HomeAssistantError as err: _LOGGER.error("Can't delete person '%s' with error: %s", p_id, err) @@ -220,8 +214,7 @@ def async_setup(hass, config): DOMAIN, SERVICE_DELETE_PERSON, async_delete_person, schema=SCHEMA_PERSON_SERVICE) - @asyncio.coroutine - def async_face_person(service): + async def async_face_person(service): """Add a new face picture to a person.""" g_id = service.data[ATTR_GROUP] p_id = face.store[g_id].get(service.data[ATTR_PERSON]) @@ -230,9 +223,9 @@ def async_setup(hass, config): camera = hass.components.camera try: - image = yield from camera.async_get_image(hass, camera_entity) + image = await camera.async_get_image(hass, camera_entity) - yield from face.call_api( + await face.call_api( 'post', "persongroups/{0}/persons/{1}/persistedFaces".format( g_id, p_id), @@ -307,10 +300,9 @@ class MicrosoftFace: """Store group/person data and IDs.""" return self._store - @asyncio.coroutine - def update_store(self): + async def update_store(self): """Load all group/person data into local store.""" - groups = yield from self.call_api('get', 'persongroups') + groups = await self.call_api('get', 'persongroups') tasks = [] for group in groups: @@ -319,7 +311,7 @@ class MicrosoftFace: self._entities[g_id] = MicrosoftFaceGroupEntity( self.hass, self, g_id, group['name']) - persons = yield from self.call_api( + persons = await self.call_api( 'get', "persongroups/{0}/persons".format(g_id)) for person in persons: @@ -328,11 +320,10 @@ class MicrosoftFace: tasks.append(self._entities[g_id].async_update_ha_state()) if tasks: - yield from asyncio.wait(tasks, loop=self.hass.loop) + await asyncio.wait(tasks, loop=self.hass.loop) - @asyncio.coroutine - def call_api(self, method, function, data=None, binary=False, - params=None): + async def call_api(self, method, function, data=None, binary=False, + params=None): """Make an api call.""" headers = {"Ocp-Apim-Subscription-Key": self._api_key} url = self._server_url.format(function) @@ -350,10 +341,10 @@ class MicrosoftFace: try: with async_timeout.timeout(self.timeout, loop=self.hass.loop): - response = yield from getattr(self.websession, method)( + response = await getattr(self.websession, method)( url, data=payload, headers=headers, params=params) - answer = yield from response.json() + answer = await response.json() _LOGGER.debug("Read from microsoft face api: %s", answer) if response.status < 300: diff --git a/homeassistant/components/mqtt_statestream.py b/homeassistant/components/mqtt_statestream.py index 592e31cbff1..3a0e5d39ff0 100644 --- a/homeassistant/components/mqtt_statestream.py +++ b/homeassistant/components/mqtt_statestream.py @@ -4,7 +4,6 @@ Publish simple item state changes via MQTT. For more details about this component, please refer to the documentation at https://home-assistant.io/components/mqtt_statestream/ """ -import asyncio import json import voluptuous as vol @@ -43,8 +42,7 @@ CONFIG_SCHEMA = vol.Schema({ }, extra=vol.ALLOW_EXTRA) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up the MQTT state feed.""" conf = config.get(DOMAIN, {}) base_topic = conf.get(CONF_BASE_TOPIC) diff --git a/homeassistant/components/namecheapdns.py b/homeassistant/components/namecheapdns.py index dcca8829535..32a5c318852 100644 --- a/homeassistant/components/namecheapdns.py +++ b/homeassistant/components/namecheapdns.py @@ -4,7 +4,6 @@ Integrate with namecheap DNS services. For more details about this component, please refer to the documentation at https://home-assistant.io/components/namecheapdns/ """ -import asyncio import logging from datetime import timedelta @@ -32,8 +31,7 @@ CONFIG_SCHEMA = vol.Schema({ }, extra=vol.ALLOW_EXTRA) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Initialize the namecheap DNS component.""" host = config[DOMAIN][CONF_HOST] domain = config[DOMAIN][CONF_DOMAIN] @@ -41,23 +39,21 @@ def async_setup(hass, config): session = async_get_clientsession(hass) - result = yield from _update_namecheapdns(session, host, domain, password) + result = await _update_namecheapdns(session, host, domain, password) if not result: return False - @asyncio.coroutine - def update_domain_interval(now): + async def update_domain_interval(now): """Update the namecheap DNS entry.""" - yield from _update_namecheapdns(session, host, domain, password) + await _update_namecheapdns(session, host, domain, password) async_track_time_interval(hass, update_domain_interval, INTERVAL) return result -@asyncio.coroutine -def _update_namecheapdns(session, host, domain, password): +async def _update_namecheapdns(session, host, domain, password): """Update namecheap DNS entry.""" import xml.etree.ElementTree as ET @@ -67,8 +63,8 @@ def _update_namecheapdns(session, host, domain, password): 'password': password, } - resp = yield from session.get(UPDATE_URL, params=params) - xml_string = yield from resp.text() + resp = await session.get(UPDATE_URL, params=params) + xml_string = await resp.text() root = ET.fromstring(xml_string) err_count = root.find('ErrCount').text diff --git a/homeassistant/components/no_ip.py b/homeassistant/components/no_ip.py index 6051fa85f55..beb11ed738f 100644 --- a/homeassistant/components/no_ip.py +++ b/homeassistant/components/no_ip.py @@ -53,8 +53,7 @@ CONFIG_SCHEMA = vol.Schema({ }, extra=vol.ALLOW_EXTRA) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Initialize the NO-IP component.""" domain = config[DOMAIN].get(CONF_DOMAIN) user = config[DOMAIN].get(CONF_USERNAME) @@ -65,16 +64,15 @@ def async_setup(hass, config): session = hass.helpers.aiohttp_client.async_get_clientsession() - result = yield from _update_no_ip( + result = await _update_no_ip( hass, session, domain, auth_str, timeout) if not result: return False - @asyncio.coroutine - def update_domain_interval(now): + async def update_domain_interval(now): """Update the NO-IP entry.""" - yield from _update_no_ip(hass, session, domain, auth_str, timeout) + await _update_no_ip(hass, session, domain, auth_str, timeout) hass.helpers.event.async_track_time_interval( update_domain_interval, INTERVAL) @@ -82,8 +80,7 @@ def async_setup(hass, config): return True -@asyncio.coroutine -def _update_no_ip(hass, session, domain, auth_str, timeout): +async def _update_no_ip(hass, session, domain, auth_str, timeout): """Update NO-IP.""" url = UPDATE_URL @@ -98,8 +95,8 @@ def _update_no_ip(hass, session, domain, auth_str, timeout): try: with async_timeout.timeout(timeout, loop=hass.loop): - resp = yield from session.get(url, params=params, headers=headers) - body = yield from resp.text() + resp = await session.get(url, params=params, headers=headers) + body = await resp.text() if body.startswith('good') or body.startswith('nochg'): return True diff --git a/homeassistant/components/persistent_notification/__init__.py b/homeassistant/components/persistent_notification/__init__.py index 6b8fd68bc26..066afe1fe22 100644 --- a/homeassistant/components/persistent_notification/__init__.py +++ b/homeassistant/components/persistent_notification/__init__.py @@ -4,7 +4,6 @@ A component which is collecting configuration errors. For more details about this component, please refer to the documentation at https://home-assistant.io/components/persistent_notification/ """ -import asyncio import logging from collections import OrderedDict from typing import Awaitable @@ -99,8 +98,7 @@ def async_dismiss(hass: HomeAssistant, notification_id: str) -> None: hass.async_add_job(hass.services.async_call(DOMAIN, SERVICE_DISMISS, data)) -@asyncio.coroutine -def async_setup(hass: HomeAssistant, config: dict) -> Awaitable[bool]: +async def async_setup(hass: HomeAssistant, config: dict) -> Awaitable[bool]: """Set up the persistent notification component.""" persistent_notifications = OrderedDict() hass.data[DOMAIN] = {'notifications': persistent_notifications} diff --git a/homeassistant/components/plant.py b/homeassistant/components/plant.py index 84dc8402742..9659fd4f7e1 100644 --- a/homeassistant/components/plant.py +++ b/homeassistant/components/plant.py @@ -4,7 +4,6 @@ For more details about this component, please refer to the documentation at https://home-assistant.io/components/plant/ """ import logging -import asyncio from datetime import datetime, timedelta from collections import deque import voluptuous as vol @@ -97,8 +96,7 @@ CONFIG_SCHEMA = vol.Schema({ ENABLE_LOAD_HISTORY = False -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up the Plant component.""" component = EntityComponent(_LOGGER, DOMAIN, hass, group_name=GROUP_NAME_ALL_PLANTS) @@ -112,7 +110,7 @@ def async_setup(hass, config): async_track_state_change(hass, sensor_entity_ids, entity.state_changed) entities.append(entity) - yield from component.async_add_entities(entities) + await component.async_add_entities(entities) return True @@ -246,15 +244,13 @@ class Plant(Entity): return '{} high'.format(sensor_name) return None - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """After being added to hass, load from history.""" if ENABLE_LOAD_HISTORY and 'recorder' in self.hass.config.components: # only use the database if it's configured self.hass.async_add_job(self._load_history_from_db) - @asyncio.coroutine - def _load_history_from_db(self): + async def _load_history_from_db(self): """Load the history of the brightness values from the database. This only needs to be done once during startup. diff --git a/homeassistant/components/prometheus.py b/homeassistant/components/prometheus.py index 5fa768b6983..ee4b88d4d9b 100644 --- a/homeassistant/components/prometheus.py +++ b/homeassistant/components/prometheus.py @@ -4,7 +4,6 @@ Support for Prometheus metrics export. For more details about this component, please refer to the documentation at https://home-assistant.io/components/prometheus/ """ -import asyncio import logging import voluptuous as vol @@ -265,8 +264,7 @@ class PrometheusView(HomeAssistantView): """Initialize Prometheus view.""" self.prometheus_client = prometheus_client - @asyncio.coroutine - def get(self, request): + async def get(self, request): """Handle request for Prometheus metrics.""" _LOGGER.debug("Received Prometheus metrics request") diff --git a/homeassistant/components/raincloud.py b/homeassistant/components/raincloud.py index 53cd8e79d7e..47f6176d5f8 100644 --- a/homeassistant/components/raincloud.py +++ b/homeassistant/components/raincloud.py @@ -4,7 +4,6 @@ Support for Melnor RainCloud sprinkler water timer. For more details about this platform, please refer to the documentation at https://home-assistant.io/components/raincloud/ """ -import asyncio from datetime import timedelta import logging @@ -148,8 +147,7 @@ class RainCloudEntity(Entity): """Return the name of the sensor.""" return self._name - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Register callbacks.""" async_dispatcher_connect( self.hass, SIGNAL_UPDATE_RAINCLOUD, self._update_callback) diff --git a/homeassistant/components/rest_command.py b/homeassistant/components/rest_command.py index 4632315b757..3f9b258634d 100644 --- a/homeassistant/components/rest_command.py +++ b/homeassistant/components/rest_command.py @@ -53,8 +53,7 @@ CONFIG_SCHEMA = vol.Schema({ }, extra=vol.ALLOW_EXTRA) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up the REST command component.""" websession = async_get_clientsession(hass) @@ -87,8 +86,7 @@ def async_setup(hass, config): headers = {} headers[hdrs.CONTENT_TYPE] = content_type - @asyncio.coroutine - def async_service_handler(service): + async def async_service_handler(service): """Execute a shell command service.""" payload = None if template_payload: @@ -98,7 +96,7 @@ def async_setup(hass, config): try: with async_timeout.timeout(timeout, loop=hass.loop): - request = yield from getattr(websession, method)( + request = await getattr(websession, method)( template_url.async_render(variables=service.data), data=payload, auth=auth, diff --git a/homeassistant/components/rflink.py b/homeassistant/components/rflink.py index b8af971b3ff..f96ce3968c4 100644 --- a/homeassistant/components/rflink.py +++ b/homeassistant/components/rflink.py @@ -105,8 +105,7 @@ def identify_event_type(event): return 'unknown' -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up the Rflink component.""" from rflink.protocol import create_rflink_connection import serial @@ -125,11 +124,10 @@ def async_setup(hass, config): # Allow platform to specify function to register new unknown devices hass.data[DATA_DEVICE_REGISTER] = {} - @asyncio.coroutine - def async_send_command(call): + async def async_send_command(call): """Send Rflink command.""" _LOGGER.debug('Rflink command for %s', str(call.data)) - if not (yield from RflinkCommand.send_command( + if not (await RflinkCommand.send_command( call.data.get(CONF_DEVICE_ID), call.data.get(CONF_COMMAND))): _LOGGER.error('Failed Rflink command for %s', str(call.data)) @@ -196,8 +194,7 @@ def async_setup(hass, config): _LOGGER.warning('disconnected from Rflink, reconnecting') hass.async_add_job(connect) - @asyncio.coroutine - def connect(): + async def connect(): """Set up connection and hook it into HA for reconnect/shutdown.""" _LOGGER.info('Initiating Rflink connection') @@ -217,7 +214,7 @@ def async_setup(hass, config): try: with async_timeout.timeout(CONNECTION_TIMEOUT, loop=hass.loop): - transport, protocol = yield from connection + transport, protocol = await connection except (serial.serialutil.SerialException, ConnectionRefusedError, TimeoutError, OSError, asyncio.TimeoutError) as exc: @@ -330,8 +327,7 @@ class RflinkDevice(Entity): self._available = availability self.async_schedule_update_ha_state() - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Register update callback.""" async_dispatcher_connect(self.hass, SIGNAL_AVAILABILITY, self.set_availability) @@ -367,13 +363,11 @@ class RflinkCommand(RflinkDevice): return bool(cls._protocol) @classmethod - @asyncio.coroutine - def send_command(cls, device_id, action): + async def send_command(cls, device_id, action): """Send device command to Rflink and wait for acknowledgement.""" - return (yield from cls._protocol.send_command_ack(device_id, action)) + return await cls._protocol.send_command_ack(device_id, action) - @asyncio.coroutine - def _async_handle_command(self, command, *args): + async def _async_handle_command(self, command, *args): """Do bookkeeping for command, send it to rflink and update state.""" self.cancel_queued_send_commands() @@ -412,10 +406,10 @@ class RflinkCommand(RflinkDevice): # Send initial command and queue repetitions. # This allows the entity state to be updated quickly and not having to # wait for all repetitions to be sent - yield from self._async_send_command(cmd, self._signal_repetitions) + await self._async_send_command(cmd, self._signal_repetitions) # Update state of entity - yield from self.async_update_ha_state() + await self.async_update_ha_state() def cancel_queued_send_commands(self): """Cancel queued signal repetition commands. @@ -428,8 +422,7 @@ class RflinkCommand(RflinkDevice): if self._repetition_task: self._repetition_task.cancel() - @asyncio.coroutine - def _async_send_command(self, cmd, repetitions): + async def _async_send_command(self, cmd, repetitions): """Send a command for device to Rflink gateway.""" _LOGGER.debug( "Sending command: %s to Rflink device: %s", cmd, self._device_id) @@ -440,7 +433,7 @@ class RflinkCommand(RflinkDevice): if self._wait_ack: # Puts command on outgoing buffer then waits for Rflink to confirm # the command has been send out in the ether. - yield from self._protocol.send_command_ack(self._device_id, cmd) + await self._protocol.send_command_ack(self._device_id, cmd) else: # Puts command on outgoing buffer and returns straight away. # Rflink protocol/transport handles asynchronous writing of buffer diff --git a/homeassistant/components/rfxtrx.py b/homeassistant/components/rfxtrx.py index b5bc97b7ffa..f2c82842bc1 100644 --- a/homeassistant/components/rfxtrx.py +++ b/homeassistant/components/rfxtrx.py @@ -4,7 +4,6 @@ Support for RFXtrx components. For more details about this component, please refer to the documentation at https://home-assistant.io/components/rfxtrx/ """ -import asyncio from collections import OrderedDict import logging @@ -316,8 +315,7 @@ class RfxtrxDevice(Entity): self._brightness = 0 self.added_to_hass = False - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Subscribe RFXtrx events.""" self.added_to_hass = True diff --git a/homeassistant/components/rss_feed_template.py b/homeassistant/components/rss_feed_template.py index 1441a98c0a8..34bee1ec5fc 100644 --- a/homeassistant/components/rss_feed_template.py +++ b/homeassistant/components/rss_feed_template.py @@ -5,7 +5,6 @@ For more details about this platform, please refer to the documentation at https://home-assistant.io/components/rss_feed_template/ """ -import asyncio from html import escape from aiohttp import web @@ -76,8 +75,7 @@ class RssView(HomeAssistantView): self._title = title self._items = items - @asyncio.coroutine - def get(self, request, entity_id=None): + async def get(self, request, entity_id=None): """Generate the RSS view XML.""" response = '\n\n' diff --git a/homeassistant/components/satel_integra.py b/homeassistant/components/satel_integra.py index 128377d19f7..8d7d1e619db 100644 --- a/homeassistant/components/satel_integra.py +++ b/homeassistant/components/satel_integra.py @@ -67,8 +67,7 @@ CONFIG_SCHEMA = vol.Schema({ }, extra=vol.ALLOW_EXTRA) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up the Satel Integra component.""" conf = config.get(DOMAIN) @@ -83,13 +82,12 @@ def async_setup(hass, config): hass.data[DATA_SATEL] = controller - result = yield from controller.connect() + result = await controller.connect() if not result: return False - @asyncio.coroutine - def _close(): + async def _close(): controller.close() hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _close()) @@ -105,7 +103,7 @@ def async_setup(hass, config): async_load_platform(hass, 'binary_sensor', DOMAIN, {CONF_ZONES: zones}, config)) - yield from asyncio.wait([task_control_panel, task_zones], loop=hass.loop) + await asyncio.wait([task_control_panel, task_zones], loop=hass.loop) @callback def alarm_status_update_callback(status): diff --git a/homeassistant/components/shell_command.py b/homeassistant/components/shell_command.py index 10a6c350b7c..2a95dd5c144 100644 --- a/homeassistant/components/shell_command.py +++ b/homeassistant/components/shell_command.py @@ -27,15 +27,13 @@ CONFIG_SCHEMA = vol.Schema({ }, extra=vol.ALLOW_EXTRA) -@asyncio.coroutine -def async_setup(hass: HomeAssistantType, config: ConfigType) -> bool: +async def async_setup(hass: HomeAssistantType, config: ConfigType) -> bool: """Set up the shell_command component.""" conf = config.get(DOMAIN, {}) cache = {} - @asyncio.coroutine - def async_service_handler(service: ServiceCall) -> None: + async def async_service_handler(service: ServiceCall) -> None: """Execute a shell command service.""" cmd = conf[service.service] @@ -85,8 +83,8 @@ def async_setup(hass: HomeAssistantType, config: ConfigType) -> bool: stderr=asyncio.subprocess.PIPE, ) - process = yield from create_process - stdout_data, stderr_data = yield from process.communicate() + process = await create_process + stdout_data, stderr_data = await process.communicate() if stdout_data: _LOGGER.debug("Stdout of command: `%s`, return code: %s:\n%s", diff --git a/homeassistant/components/sun.py b/homeassistant/components/sun.py index 90c7f69e64a..e2717047b0a 100644 --- a/homeassistant/components/sun.py +++ b/homeassistant/components/sun.py @@ -4,7 +4,6 @@ Support for functionality to keep track of the sun. For more details about this component, please refer to the documentation at https://home-assistant.io/components/sun/ """ -import asyncio import logging from datetime import timedelta @@ -36,8 +35,7 @@ STATE_ATTR_NEXT_RISING = 'next_rising' STATE_ATTR_NEXT_SETTING = 'next_setting' -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Track the state of the sun.""" if config.get(CONF_ELEVATION) is not None: _LOGGER.warning( diff --git a/homeassistant/components/system_log/__init__.py b/homeassistant/components/system_log/__init__.py index 2a2a19aa2f5..8ab6bd752ef 100644 --- a/homeassistant/components/system_log/__init__.py +++ b/homeassistant/components/system_log/__init__.py @@ -4,7 +4,6 @@ Support for system log. For more details about this component, please refer to the documentation at https://home-assistant.io/components/system_log/ """ -import asyncio from collections import deque from io import StringIO import logging @@ -134,8 +133,7 @@ class LogErrorHandler(logging.Handler): self.hass.bus.fire(EVENT_SYSTEM_LOG, entry) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up the logger component.""" conf = config.get(DOMAIN) if conf is None: @@ -147,8 +145,7 @@ def async_setup(hass, config): hass.http.register_view(AllErrorsView(handler)) - @asyncio.coroutine - def async_service_handler(service): + async def async_service_handler(service): """Handle logger services.""" if service.service == 'clear': handler.records.clear() @@ -159,8 +156,7 @@ def async_setup(hass, config): level = service.data[CONF_LEVEL] getattr(logger, level)(service.data[CONF_MESSAGE]) - @asyncio.coroutine - def async_shutdown_handler(event): + async def async_shutdown_handler(event): """Remove logging handler when Home Assistant is shutdown.""" # This is needed as older logger instances will remain logging.getLogger().removeHandler(handler) @@ -188,8 +184,7 @@ class AllErrorsView(HomeAssistantView): """Initialize a new AllErrorsView.""" self.handler = handler - @asyncio.coroutine - def get(self, request): + async def get(self, request): """Get all errors and warnings.""" # deque is not serializable (it's just "list-like") so it must be # converted to a list before it can be serialized to json diff --git a/homeassistant/components/tellstick.py b/homeassistant/components/tellstick.py index 0eef2c4ece1..8f1c45d7312 100644 --- a/homeassistant/components/tellstick.py +++ b/homeassistant/components/tellstick.py @@ -4,7 +4,6 @@ Tellstick Component. For more details about this component, please refer to the documentation at https://home-assistant.io/components/tellstick/ """ -import asyncio import logging import threading @@ -158,8 +157,7 @@ class TellstickDevice(Entity): self._tellcore_device = tellcore_device self._name = tellcore_device.name - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Register callbacks.""" self.hass.helpers.dispatcher.async_dispatcher_connect( SIGNAL_TELLCORE_CALLBACK, diff --git a/homeassistant/components/thethingsnetwork.py b/homeassistant/components/thethingsnetwork.py index 08715c74d1f..61f9843be45 100644 --- a/homeassistant/components/thethingsnetwork.py +++ b/homeassistant/components/thethingsnetwork.py @@ -4,7 +4,6 @@ Support for The Things network. For more details about this component, please refer to the documentation at https://home-assistant.io/components/thethingsnetwork/ """ -import asyncio import logging import voluptuous as vol @@ -32,8 +31,7 @@ CONFIG_SCHEMA = vol.Schema({ }, extra=vol.ALLOW_EXTRA) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Initialize of The Things Network component.""" conf = config[DOMAIN] app_id = conf.get(CONF_APP_ID) diff --git a/homeassistant/components/upcloud.py b/homeassistant/components/upcloud.py index 0f503dcdc39..a0b61f86e56 100644 --- a/homeassistant/components/upcloud.py +++ b/homeassistant/components/upcloud.py @@ -4,7 +4,6 @@ Support for UpCloud. For more details about this component, please refer to the documentation at https://home-assistant.io/components/upcloud/ """ -import asyncio import logging from datetime import timedelta @@ -129,8 +128,7 @@ class UpCloudServerEntity(Entity): except (AttributeError, KeyError, TypeError): return DEFAULT_COMPONENT_NAME.format(self.uuid) - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Register callbacks.""" async_dispatcher_connect( self.hass, SIGNAL_UPDATE_UPCLOUD, self._update_callback) diff --git a/homeassistant/components/wake_on_lan.py b/homeassistant/components/wake_on_lan.py index 5bcb0d4dd79..dba99bf7e3d 100644 --- a/homeassistant/components/wake_on_lan.py +++ b/homeassistant/components/wake_on_lan.py @@ -4,7 +4,6 @@ Component to wake up devices sending Wake-On-LAN magic packets. For more details about this component, please refer to the documentation at https://home-assistant.io/components/wake_on_lan/ """ -import asyncio from functools import partial import logging @@ -29,24 +28,22 @@ WAKE_ON_LAN_SEND_MAGIC_PACKET_SCHEMA = vol.Schema({ }) -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up the wake on LAN component.""" import wakeonlan - @asyncio.coroutine - def send_magic_packet(call): + async def send_magic_packet(call): """Send magic packet to wake up a device.""" mac_address = call.data.get(CONF_MAC) broadcast_address = call.data.get(CONF_BROADCAST_ADDRESS) _LOGGER.info("Send magic packet to mac %s (broadcast: %s)", mac_address, broadcast_address) if broadcast_address is not None: - yield from hass.async_add_job( + await hass.async_add_job( partial(wakeonlan.send_magic_packet, mac_address, ip_address=broadcast_address)) else: - yield from hass.async_add_job( + await hass.async_add_job( partial(wakeonlan.send_magic_packet, mac_address)) hass.services.async_register( diff --git a/homeassistant/components/weather/__init__.py b/homeassistant/components/weather/__init__.py index c2a9f4f79d1..f9a8f1fbbe4 100644 --- a/homeassistant/components/weather/__init__.py +++ b/homeassistant/components/weather/__init__.py @@ -4,7 +4,6 @@ Weather component that handles meteorological data for your location. For more details about this component, please refer to the documentation at https://home-assistant.io/components/weather/ """ -import asyncio import logging from homeassistant.helpers.entity_component import EntityComponent @@ -39,12 +38,11 @@ ATTR_WEATHER_WIND_BEARING = 'wind_bearing' ATTR_WEATHER_WIND_SPEED = 'wind_speed' -@asyncio.coroutine -def async_setup(hass, config): +async def async_setup(hass, config): """Set up the weather component.""" component = EntityComponent(_LOGGER, DOMAIN, hass) - yield from component.async_setup(config) + await component.async_setup(config) return True diff --git a/homeassistant/components/weather/buienradar.py b/homeassistant/components/weather/buienradar.py index 6b92eb97c9e..1ec3fc513e9 100644 --- a/homeassistant/components/weather/buienradar.py +++ b/homeassistant/components/weather/buienradar.py @@ -5,7 +5,6 @@ For more details about this platform, please refer to the documentation at https://home-assistant.io/components/weather.buienradar/ """ import logging -import asyncio import voluptuous as vol @@ -55,9 +54,8 @@ PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ }) -@asyncio.coroutine -def async_setup_platform(hass, config, async_add_entities, - discovery_info=None): +async def async_setup_platform(hass, config, async_add_entities, + discovery_info=None): """Set up the buienradar platform.""" latitude = config.get(CONF_LATITUDE, hass.config.latitude) longitude = config.get(CONF_LONGITUDE, hass.config.longitude) @@ -86,7 +84,7 @@ def async_setup_platform(hass, config, async_add_entities, async_add_entities([BrWeather(data, config)]) # schedule the first update in 1 minute from now: - yield from data.schedule_update(1) + await data.schedule_update(1) class BrWeather(WeatherEntity): diff --git a/homeassistant/components/wink/__init__.py b/homeassistant/components/wink/__init__.py index 0399b25b278..d21ccc18c93 100644 --- a/homeassistant/components/wink/__init__.py +++ b/homeassistant/components/wink/__init__.py @@ -4,7 +4,6 @@ Support for Wink hubs. For more details about this component, please refer to the documentation at https://home-assistant.io/components/wink/ """ -import asyncio from datetime import timedelta import json import logging @@ -763,8 +762,7 @@ class WinkDevice(Entity): class WinkSirenDevice(WinkDevice): """Representation of a Wink siren device.""" - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Call when entity is added to hass.""" self.hass.data[DOMAIN]['entities']['switch'].append(self) @@ -824,8 +822,7 @@ class WinkNimbusDialDevice(WinkDevice): super().__init__(dial, hass) self.parent = nimbus - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Call when entity is added to hass.""" self.hass.data[DOMAIN]['entities']['sensor'].append(self) diff --git a/homeassistant/components/xiaomi_aqara.py b/homeassistant/components/xiaomi_aqara.py index 9c2fb9f7fe7..790510db3d3 100644 --- a/homeassistant/components/xiaomi_aqara.py +++ b/homeassistant/components/xiaomi_aqara.py @@ -4,7 +4,6 @@ Support for Xiaomi Gateways. For more details about this component, please refer to the documentation at https://home-assistant.io/components/xiaomi_aqara/ """ -import asyncio import logging from datetime import timedelta @@ -113,8 +112,7 @@ def setup(hass, config): interface = config[DOMAIN][CONF_INTERFACE] discovery_retry = config[DOMAIN][CONF_DISCOVERY_RETRY] - @asyncio.coroutine - def xiaomi_gw_discovered(service, discovery_info): + async def xiaomi_gw_discovered(service, discovery_info): """Perform action when Xiaomi Gateway device(s) has been found.""" # We don't need to do anything here, the purpose of Home Assistant's # discovery service is to just trigger loading of this @@ -233,8 +231,7 @@ class XiaomiDevice(Entity): def _add_push_data_job(self, *args): self.hass.add_job(self.push_data, *args) - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Start unavailability tracking.""" self._xiaomi_hub.callbacks[self._sid].append(self._add_push_data_job) self._async_track_unavailable() diff --git a/homeassistant/components/zigbee.py b/homeassistant/components/zigbee.py index 67bdf744251..4c294e51231 100644 --- a/homeassistant/components/zigbee.py +++ b/homeassistant/components/zigbee.py @@ -4,7 +4,6 @@ Support for ZigBee devices. For more details about this component, please refer to the documentation at https://home-assistant.io/components/zigbee/ """ -import asyncio import logging from binascii import hexlify, unhexlify @@ -277,8 +276,7 @@ class ZigBeeDigitalIn(Entity): self._config = config self._state = False - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Register callbacks.""" def handle_frame(frame): """Handle an incoming frame. @@ -403,8 +401,7 @@ class ZigBeeAnalogIn(Entity): self._config = config self._value = None - @asyncio.coroutine - def async_added_to_hass(self): + async def async_added_to_hass(self): """Register callbacks.""" def handle_frame(frame): """Handle an incoming frame.