mirror of
https://github.com/home-assistant/core.git
synced 2025-07-17 02:07:09 +00:00
Kodi use websocket loop task created by library (#6703)
This commit is contained in:
parent
5569ae38f1
commit
796143a6c6
@ -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):
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user