"""Support for Xeoma Cameras.""" import logging import voluptuous as vol from homeassistant.components.camera import PLATFORM_SCHEMA, Camera from homeassistant.const import ( CONF_HOST, CONF_NAME, CONF_PASSWORD, CONF_USERNAME) from homeassistant.helpers import config_validation as cv _LOGGER = logging.getLogger(__name__) CONF_CAMERAS = 'cameras' CONF_HIDE = 'hide' CONF_IMAGE_NAME = 'image_name' CONF_NEW_VERSION = 'new_version' CONF_VIEWER_PASSWORD = 'viewer_password' CONF_VIEWER_USERNAME = 'viewer_username' CAMERAS_SCHEMA = vol.Schema({ vol.Required(CONF_IMAGE_NAME): cv.string, vol.Optional(CONF_HIDE, default=False): cv.boolean, vol.Optional(CONF_NAME): cv.string, }, required=False) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_CAMERAS): vol.Schema(vol.All(cv.ensure_list, [CAMERAS_SCHEMA])), vol.Optional(CONF_NEW_VERSION, default=True): cv.boolean, vol.Optional(CONF_PASSWORD): cv.string, vol.Optional(CONF_USERNAME): cv.string, }) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Discover and setup Xeoma Cameras.""" from pyxeoma.xeoma import Xeoma, XeomaError host = config[CONF_HOST] login = config.get(CONF_USERNAME) password = config.get(CONF_PASSWORD) xeoma = Xeoma(host, login, password) try: await xeoma.async_test_connection() discovered_image_names = await xeoma.async_get_image_names() discovered_cameras = [ { CONF_IMAGE_NAME: image_name, CONF_HIDE: False, CONF_NAME: image_name, CONF_VIEWER_USERNAME: username, CONF_VIEWER_PASSWORD: pw } for image_name, username, pw in discovered_image_names ] for cam in config.get(CONF_CAMERAS, []): camera = next( (dc for dc in discovered_cameras if dc[CONF_IMAGE_NAME] == cam[CONF_IMAGE_NAME]), None) if camera is not None: if CONF_NAME in cam: camera[CONF_NAME] = cam[CONF_NAME] if CONF_HIDE in cam: camera[CONF_HIDE] = cam[CONF_HIDE] cameras = list(filter(lambda c: not c[CONF_HIDE], discovered_cameras)) async_add_entities( [XeomaCamera(xeoma, camera[CONF_IMAGE_NAME], camera[CONF_NAME], camera[CONF_VIEWER_USERNAME], camera[CONF_VIEWER_PASSWORD]) for camera in cameras]) except XeomaError as err: _LOGGER.error("Error: %s", err.message) return class XeomaCamera(Camera): """Implementation of a Xeoma camera.""" def __init__(self, xeoma, image, name, username, password): """Initialize a Xeoma camera.""" super().__init__() self._xeoma = xeoma self._name = name self._image = image self._username = username self._password = password self._last_image = None async def async_camera_image(self): """Return a still image response from the camera.""" from pyxeoma.xeoma import XeomaError try: image = await self._xeoma.async_get_camera_image( self._image, self._username, self._password) self._last_image = image except XeomaError as err: _LOGGER.error("Error fetching image: %s", err.message) return self._last_image @property def name(self): """Return the name of this device.""" return self._name