From 3dfeec5033ac4f703e657b0b405ad7d6015ab455 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 25 May 2020 17:41:50 -0500 Subject: [PATCH] Implement async_get_stream_source in the camera integration (#35704) --- homeassistant/components/camera/__init__.py | 8 ++++++++ homeassistant/components/homekit/type_cameras.py | 9 +++------ tests/components/camera/test_init.py | 13 +++++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/homeassistant/components/camera/__init__.py b/homeassistant/components/camera/__init__.py index 0b2c1e77d3f..1dc18baf232 100644 --- a/homeassistant/components/camera/__init__.py +++ b/homeassistant/components/camera/__init__.py @@ -161,6 +161,14 @@ async def async_get_image(hass, entity_id, timeout=10): raise HomeAssistantError("Unable to get image") +@bind_hass +async def async_get_stream_source(hass, entity_id): + """Fetch the stream source for a camera entity.""" + camera = _get_camera_from_entity_id(hass, entity_id) + + return await camera.stream_source() + + @bind_hass async def async_get_mjpeg_stream(hass, request, entity_id): """Fetch an mjpeg stream from a camera entity.""" diff --git a/homeassistant/components/homekit/type_cameras.py b/homeassistant/components/homekit/type_cameras.py index c4e52f07832..c81790a3874 100644 --- a/homeassistant/components/homekit/type_cameras.py +++ b/homeassistant/components/homekit/type_cameras.py @@ -12,7 +12,6 @@ from pyhap.camera import ( ) from pyhap.const import CATEGORY_CAMERA -from homeassistant.components.camera.const import DOMAIN as DOMAIN_CAMERA from homeassistant.components.ffmpeg import DATA_FFMPEG from homeassistant.core import callback from homeassistant.helpers.event import async_track_time_interval @@ -126,7 +125,6 @@ class Camera(HomeAccessory, PyhapCamera): """Initialize a Camera accessory object.""" self._ffmpeg = hass.data[DATA_FFMPEG] self._cur_session = None - self._camera = hass.data[DOMAIN_CAMERA] for config_key in CONFIG_DEFAULTS: if config_key not in config: config[config_key] = CONFIG_DEFAULTS[config_key] @@ -188,14 +186,13 @@ class Camera(HomeAccessory, PyhapCamera): async def _async_get_stream_source(self): """Find the camera stream source url.""" - camera = self._camera.get_entity(self.entity_id) - if not camera or not camera.is_on: - return None stream_source = self.config.get(CONF_STREAM_SOURCE) if stream_source: return stream_source try: - stream_source = await camera.stream_source() + stream_source = await self.hass.components.camera.async_get_stream_source( + self.entity_id + ) except Exception: # pylint: disable=broad-except _LOGGER.exception( "Failed to get stream source - this could be a transient error or your camera might not be compatible with HomeKit yet" diff --git a/tests/components/camera/test_init.py b/tests/components/camera/test_init.py index 36ee9b8aabf..81f215a145d 100644 --- a/tests/components/camera/test_init.py +++ b/tests/components/camera/test_init.py @@ -67,6 +67,19 @@ async def test_get_image_from_camera(hass, image_mock_url): assert image.content == b"Test" +async def test_get_stream_source_from_camera(hass, mock_camera): + """Fetch stream source from camera entity.""" + + with patch( + "homeassistant.components.camera.Camera.stream_source", + return_value="rtsp://127.0.0.1/stream", + ) as mock_camera_stream_source: + stream_source = await camera.async_get_stream_source(hass, "camera.demo_camera") + + assert mock_camera_stream_source.called + assert stream_source == "rtsp://127.0.0.1/stream" + + async def test_get_image_without_exists_camera(hass, image_mock_url): """Try to get image without exists camera.""" with patch(