From 1b2d0e7a6ff107ef3886a747a403b9aff965d743 Mon Sep 17 00:00:00 2001 From: Aaron Bach Date: Mon, 30 Jul 2018 22:56:52 -0600 Subject: [PATCH] Better handling of Yi camera being disconnected (#15754) * Better handling of Yi camera being disconnected * Handling video processing as well * Cleanup * Member-requested changes * Member-requested changes --- homeassistant/components/camera/yi.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/homeassistant/components/camera/yi.py b/homeassistant/components/camera/yi.py index b575a705f98..4efc2c7d8ba 100644 --- a/homeassistant/components/camera/yi.py +++ b/homeassistant/components/camera/yi.py @@ -57,6 +57,7 @@ class YiCamera(Camera): self._last_url = None self._manager = hass.data[DATA_FFMPEG] self._name = config[CONF_NAME] + self._is_on = True self.host = config[CONF_HOST] self.port = config[CONF_PORT] self.path = config[CONF_PATH] @@ -68,6 +69,11 @@ class YiCamera(Camera): """Camera brand.""" return DEFAULT_BRAND + @property + def is_on(self): + """Determine whether the camera is on.""" + return self._is_on + @property def name(self): """Return the name of this camera.""" @@ -81,7 +87,7 @@ class YiCamera(Camera): try: await ftp.connect(self.host) await ftp.login(self.user, self.passwd) - except StatusCodeError as err: + except (ConnectionRefusedError, StatusCodeError) as err: raise PlatformNotReady(err) try: @@ -101,12 +107,13 @@ class YiCamera(Camera): return None await ftp.quit() - + self._is_on = True return 'ftp://{0}:{1}@{2}:{3}{4}/{5}/{6}'.format( self.user, self.passwd, self.host, self.port, self.path, latest_dir, videos[-1]) except (ConnectionRefusedError, StatusCodeError) as err: _LOGGER.error('Error while fetching video: %s', err) + self._is_on = False return None async def async_camera_image(self): @@ -114,7 +121,7 @@ class YiCamera(Camera): from haffmpeg import ImageFrame, IMAGE_JPEG url = await self._get_latest_video_url() - if url != self._last_url: + if url and url != self._last_url: ffmpeg = ImageFrame(self._manager.binary, loop=self.hass.loop) self._last_image = await asyncio.shield( ffmpeg.get_image( @@ -130,6 +137,9 @@ class YiCamera(Camera): """Generate an HTTP MJPEG stream from the camera.""" from haffmpeg import CameraMjpeg + if not self._is_on: + return + stream = CameraMjpeg(self._manager.binary, loop=self.hass.loop) await stream.open_camera( self._last_url, extra_cmd=self._extra_arguments)