Change xiaomi camera conf_host to template (#25799)

* changed conf_host to template

Changed conf_host to template to accommodate dynamic ips

* Update camera.py

* Updated per comment

* update for black formatter

* black changes
This commit is contained in:
Sriram Vaidyanathan 2019-09-03 20:06:11 -04:00 committed by Paulus Schoutsen
parent 757482ee85
commit f7a58cc19e

View File

@ -5,6 +5,7 @@ import logging
import voluptuous as vol
from homeassistant.components.camera import Camera, PLATFORM_SCHEMA
from homeassistant.exceptions import TemplateError
from homeassistant.components.ffmpeg import DATA_FFMPEG
from homeassistant.const import (
CONF_HOST,
@ -34,7 +35,7 @@ MODEL_XIAOFANG = "xiaofang"
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend(
{
vol.Required(CONF_NAME): cv.string,
vol.Required(CONF_HOST): cv.string,
vol.Required(CONF_HOST): cv.template,
vol.Required(CONF_MODEL): vol.Any(MODEL_YI, MODEL_XIAOFANG),
vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port,
vol.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string,
@ -63,6 +64,7 @@ class XiaomiCamera(Camera):
self._manager = hass.data[DATA_FFMPEG]
self._name = config[CONF_NAME]
self.host = config[CONF_HOST]
self.host.hass = hass
self._model = config[CONF_MODEL]
self.port = config[CONF_PORT]
self.path = config[CONF_PATH]
@ -84,11 +86,11 @@ class XiaomiCamera(Camera):
"""Return the camera model."""
return self._model
def get_latest_video_url(self):
def get_latest_video_url(self, host):
"""Retrieve the latest video file from the Xiaomi Camera FTP server."""
from ftplib import FTP, error_perm
ftp = FTP(self.host)
ftp = FTP(host)
try:
ftp.login(self.user, self.passwd)
except error_perm as exc:
@ -133,14 +135,20 @@ class XiaomiCamera(Camera):
video = videos[-1]
return "ftp://{0}:{1}@{2}:{3}{4}/{5}".format(
self.user, self.passwd, self.host, self.port, ftp.pwd(), video
self.user, self.passwd, host, self.port, ftp.pwd(), video
)
async def async_camera_image(self):
"""Return a still image response from the camera."""
from haffmpeg.tools import ImageFrame, IMAGE_JPEG
url = await self.hass.async_add_job(self.get_latest_video_url)
try:
host = self.host.async_render()
except TemplateError as exc:
_LOGGER.error("Error parsing template %s: %s", self.host, exc)
return self._last_image
url = await self.hass.async_add_executor_job(self.get_latest_video_url, host)
if url != self._last_url:
ffmpeg = ImageFrame(self._manager.binary, loop=self.hass.loop)
self._last_image = await asyncio.shield(