Kodi use websocket loop task created by library (#6703)

This commit is contained in:
Adam Mills 2017-03-19 15:46:14 -04:00 committed by Paulus Schoutsen
parent 5569ae38f1
commit 796143a6c6
2 changed files with 19 additions and 23 deletions

View File

@ -27,7 +27,7 @@ from homeassistant.helpers.aiohttp_client import async_get_clientsession
import homeassistant.helpers.config_validation as cv import homeassistant.helpers.config_validation as cv
from homeassistant.helpers.deprecation import get_deprecated from homeassistant.helpers.deprecation import get_deprecated
REQUIREMENTS = ['jsonrpc-async==0.4', 'jsonrpc-websocket==0.2'] REQUIREMENTS = ['jsonrpc-async==0.4', 'jsonrpc-websocket==0.3']
_LOGGER = logging.getLogger(__name__) _LOGGER = logging.getLogger(__name__)
@ -186,7 +186,6 @@ class KodiDevice(MediaPlayerDevice):
self._properties = {} self._properties = {}
self._item = {} self._item = {}
self._app_properties = {} self._app_properties = {}
self._ws_connected = False
@callback @callback
def async_on_speed_event(self, sender, data): def async_on_speed_event(self, sender, data):
@ -261,29 +260,26 @@ class KodiDevice(MediaPlayerDevice):
"""Connect to Kodi via websocket protocol.""" """Connect to Kodi via websocket protocol."""
import jsonrpc_base import jsonrpc_base
try: try:
yield from self._ws_server.ws_connect() ws_loop_future = yield from self._ws_server.ws_connect()
except jsonrpc_base.jsonrpc.TransportError: except jsonrpc_base.jsonrpc.TransportError:
_LOGGER.info("Unable to connect to Kodi via websocket") _LOGGER.info("Unable to connect to Kodi via websocket")
_LOGGER.debug( _LOGGER.debug(
"Unable to connect to Kodi via websocket", exc_info=True) "Unable to connect to Kodi via websocket", exc_info=True)
# Websocket connection is not required. Just return.
return return
self.hass.async_add_job(self.async_ws_loop())
self._ws_connected = True
@asyncio.coroutine @asyncio.coroutine
def async_ws_loop(self): def ws_loop_wrapper():
"""Run the websocket asyncio message loop.""" """Catch exceptions from the websocket loop task."""
import jsonrpc_base try:
try: yield from ws_loop_future
yield from self._ws_server.ws_loop() except jsonrpc_base.TransportError:
except jsonrpc_base.jsonrpc.TransportError: # Kodi abruptly ends ws connection when exiting. We will try
# Kodi abruptly ends ws connection when exiting. We only need to # to reconnect on the next poll.
# know that it was closed. pass
pass
finally: # Create a task instead of adding a tracking job, since this task will
yield from self._ws_server.close() # run until the websocket connection is closed.
self._ws_connected = False self.hass.loop.create_task(ws_loop_wrapper())
@asyncio.coroutine @asyncio.coroutine
def async_update(self): def async_update(self):
@ -296,7 +292,7 @@ class KodiDevice(MediaPlayerDevice):
self._app_properties = {} self._app_properties = {}
return return
if self._enable_websocket and not self._ws_connected: if self._enable_websocket and not self._ws_server.connected:
self.hass.async_add_job(self.async_ws_connect()) self.hass.async_add_job(self.async_ws_connect())
self._app_properties = \ self._app_properties = \
@ -327,7 +323,7 @@ class KodiDevice(MediaPlayerDevice):
@property @property
def server(self): def server(self):
"""Active server for json-rpc requests.""" """Active server for json-rpc requests."""
if self._ws_connected: if self._ws_server.connected:
return self._ws_server return self._ws_server
else: else:
return self._http_server return self._http_server
@ -340,7 +336,7 @@ class KodiDevice(MediaPlayerDevice):
@property @property
def should_poll(self): def should_poll(self):
"""Return True if entity has to be polled for state.""" """Return True if entity has to be polled for state."""
return not self._ws_connected return not self._ws_server.connected
@property @property
def volume_level(self): def volume_level(self):

View File

@ -327,7 +327,7 @@ insteonplm==0.7.4
jsonrpc-async==0.4 jsonrpc-async==0.4
# homeassistant.components.media_player.kodi # homeassistant.components.media_player.kodi
jsonrpc-websocket==0.2 jsonrpc-websocket==0.3
# homeassistant.scripts.keyring # homeassistant.scripts.keyring
keyring>=9.3,<10.0 keyring>=9.3,<10.0