mirror of
https://github.com/home-assistant/core.git
synced 2025-07-22 12:47:08 +00:00
Catch samsungtv websocket exceptions (#28849)
* catch websocket exceptions * fix syntax * use exceptions from base class * add comments * add test
This commit is contained in:
parent
5b64052d69
commit
430f7bdfd4
@ -6,6 +6,7 @@ import socket
|
|||||||
from samsungctl import exceptions as samsung_exceptions, Remote as SamsungRemote
|
from samsungctl import exceptions as samsung_exceptions, Remote as SamsungRemote
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
import wakeonlan
|
import wakeonlan
|
||||||
|
from websocket import WebSocketException
|
||||||
|
|
||||||
from homeassistant.components.media_player import (
|
from homeassistant.components.media_player import (
|
||||||
MediaPlayerDevice,
|
MediaPlayerDevice,
|
||||||
@ -209,23 +210,26 @@ class SamsungTVDevice(MediaPlayerDevice):
|
|||||||
try:
|
try:
|
||||||
self.get_remote().control(key)
|
self.get_remote().control(key)
|
||||||
break
|
break
|
||||||
except (samsung_exceptions.ConnectionClosed, BrokenPipeError):
|
except (
|
||||||
|
samsung_exceptions.ConnectionClosed,
|
||||||
|
BrokenPipeError,
|
||||||
|
WebSocketException,
|
||||||
|
):
|
||||||
# BrokenPipe can occur when the commands is sent to fast
|
# BrokenPipe can occur when the commands is sent to fast
|
||||||
|
# WebSocketException can occur when timed out
|
||||||
self._remote = None
|
self._remote = None
|
||||||
self._state = STATE_ON
|
self._state = STATE_ON
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
# Auto-detect could not find working config yet
|
# Auto-detect could not find working config yet
|
||||||
pass
|
pass
|
||||||
except (
|
except (samsung_exceptions.UnhandledResponse, samsung_exceptions.AccessDenied):
|
||||||
samsung_exceptions.UnhandledResponse,
|
|
||||||
samsung_exceptions.AccessDenied,
|
|
||||||
):
|
|
||||||
# We got a response so it's on.
|
# We got a response so it's on.
|
||||||
self._state = STATE_ON
|
self._state = STATE_ON
|
||||||
self._remote = None
|
self._remote = None
|
||||||
LOGGER.debug("Failed sending command %s", key, exc_info=True)
|
LOGGER.debug("Failed sending command %s", key, exc_info=True)
|
||||||
return
|
return
|
||||||
except OSError:
|
except OSError:
|
||||||
|
# Different reasons, e.g. hostname not resolveable
|
||||||
self._state = STATE_OFF
|
self._state = STATE_OFF
|
||||||
self._remote = None
|
self._remote = None
|
||||||
if self._power_off_in_progress():
|
if self._power_off_in_progress():
|
||||||
|
@ -8,6 +8,7 @@ from asynctest import mock
|
|||||||
import pytest
|
import pytest
|
||||||
from samsungctl import exceptions
|
from samsungctl import exceptions
|
||||||
from tests.common import async_fire_time_changed
|
from tests.common import async_fire_time_changed
|
||||||
|
from websocket import WebSocketException
|
||||||
|
|
||||||
from homeassistant.components.media_player import DEVICE_CLASS_TV
|
from homeassistant.components.media_player import DEVICE_CLASS_TV
|
||||||
from homeassistant.components.media_player.const import (
|
from homeassistant.components.media_player.const import (
|
||||||
@ -387,6 +388,17 @@ async def test_send_key_unhandled_response(hass, remote):
|
|||||||
assert state.state == STATE_ON
|
assert state.state == STATE_ON
|
||||||
|
|
||||||
|
|
||||||
|
async def test_send_key_websocketexception(hass, remote):
|
||||||
|
"""Testing unhandled response exception."""
|
||||||
|
await setup_samsungtv(hass, MOCK_CONFIG)
|
||||||
|
remote.control = mock.Mock(side_effect=WebSocketException("Boom"))
|
||||||
|
assert await hass.services.async_call(
|
||||||
|
DOMAIN, SERVICE_VOLUME_UP, {ATTR_ENTITY_ID: ENTITY_ID}, True
|
||||||
|
)
|
||||||
|
state = hass.states.get(ENTITY_ID)
|
||||||
|
assert state.state == STATE_ON
|
||||||
|
|
||||||
|
|
||||||
async def test_send_key_os_error(hass, remote):
|
async def test_send_key_os_error(hass, remote):
|
||||||
"""Testing broken pipe Exception."""
|
"""Testing broken pipe Exception."""
|
||||||
await setup_samsungtv(hass, MOCK_CONFIG)
|
await setup_samsungtv(hass, MOCK_CONFIG)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user