Home Assistant Unofficial Reference 2024.12.1
camera.py
Go to the documentation of this file.
1 """Support for Xeoma Cameras."""
2 
3 from __future__ import annotations
4 
5 import logging
6 
7 from pyxeoma.xeoma import Xeoma, XeomaError
8 import voluptuous as vol
9 
11  PLATFORM_SCHEMA as CAMERA_PLATFORM_SCHEMA,
12  Camera,
13 )
14 from homeassistant.const import CONF_HOST, CONF_NAME, CONF_PASSWORD, CONF_USERNAME
15 from homeassistant.core import HomeAssistant
16 from homeassistant.helpers import config_validation as cv
17 from homeassistant.helpers.entity_platform import AddEntitiesCallback
18 from homeassistant.helpers.typing import ConfigType, DiscoveryInfoType
19 
20 _LOGGER = logging.getLogger(__name__)
21 
22 CONF_CAMERAS = "cameras"
23 CONF_HIDE = "hide"
24 CONF_IMAGE_NAME = "image_name"
25 CONF_NEW_VERSION = "new_version"
26 CONF_VIEWER_PASSWORD = "viewer_password"
27 CONF_VIEWER_USERNAME = "viewer_username"
28 
29 CAMERAS_SCHEMA = vol.Schema(
30  {
31  vol.Required(CONF_IMAGE_NAME): cv.string,
32  vol.Optional(CONF_HIDE, default=False): cv.boolean,
33  vol.Optional(CONF_NAME): cv.string,
34  },
35  required=False,
36 )
37 
38 PLATFORM_SCHEMA = CAMERA_PLATFORM_SCHEMA.extend(
39  {
40  vol.Required(CONF_HOST): cv.string,
41  vol.Optional(CONF_CAMERAS): vol.Schema(
42  vol.All(cv.ensure_list, [CAMERAS_SCHEMA])
43  ),
44  vol.Optional(CONF_NEW_VERSION, default=True): cv.boolean,
45  vol.Optional(CONF_PASSWORD): cv.string,
46  vol.Optional(CONF_USERNAME): cv.string,
47  }
48 )
49 
50 
52  hass: HomeAssistant,
53  config: ConfigType,
54  async_add_entities: AddEntitiesCallback,
55  discovery_info: DiscoveryInfoType | None = None,
56 ) -> None:
57  """Discover and setup Xeoma Cameras."""
58 
59  host = config[CONF_HOST]
60  login = config.get(CONF_USERNAME)
61  password = config.get(CONF_PASSWORD)
62 
63  xeoma = Xeoma(host, login, password)
64 
65  try:
66  await xeoma.async_test_connection()
67  discovered_image_names = await xeoma.async_get_image_names()
68  discovered_cameras = [
69  {
70  CONF_IMAGE_NAME: image_name,
71  CONF_HIDE: False,
72  CONF_NAME: image_name,
73  CONF_VIEWER_USERNAME: username,
74  CONF_VIEWER_PASSWORD: pw,
75  }
76  for image_name, username, pw in discovered_image_names
77  ]
78 
79  for cam in config.get(CONF_CAMERAS, []):
80  camera = next(
81  (
82  dc
83  for dc in discovered_cameras
84  if dc[CONF_IMAGE_NAME] == cam[CONF_IMAGE_NAME]
85  ),
86  None,
87  )
88 
89  if camera is not None:
90  if CONF_NAME in cam:
91  camera[CONF_NAME] = cam[CONF_NAME]
92  if CONF_HIDE in cam:
93  camera[CONF_HIDE] = cam[CONF_HIDE]
94 
95  cameras = list(filter(lambda c: not c[CONF_HIDE], discovered_cameras))
97  [
99  xeoma,
100  camera[CONF_IMAGE_NAME],
101  camera[CONF_NAME],
102  camera[CONF_VIEWER_USERNAME],
103  camera[CONF_VIEWER_PASSWORD],
104  )
105  for camera in cameras
106  ]
107  )
108  except XeomaError as err:
109  _LOGGER.error("Error: %s", err.message)
110  return
111 
112 
114  """Implementation of a Xeoma camera."""
115 
116  def __init__(self, xeoma, image, name, username, password):
117  """Initialize a Xeoma camera."""
118  super().__init__()
119  self._xeoma_xeoma = xeoma
120  self._name_name = name
121  self._image_image = image
122  self._username_username = username
123  self._password_password = password
124  self._last_image_last_image = None
125 
127  self, width: int | None = None, height: int | None = None
128  ) -> bytes | None:
129  """Return a still image response from the camera."""
130 
131  try:
132  image = await self._xeoma_xeoma.async_get_camera_image(
133  self._image_image, self._username_username, self._password_password
134  )
135  self._last_image_last_image = image
136  except XeomaError as err:
137  _LOGGER.error("Error fetching image: %s", err.message)
138 
139  return self._last_image_last_image
140 
141  @property
142  def name(self):
143  """Return the name of this device."""
144  return self._name_name
bytes|None async_camera_image(self, int|None width=None, int|None height=None)
Definition: camera.py:128
def __init__(self, xeoma, image, name, username, password)
Definition: camera.py:116
None async_setup_platform(HomeAssistant hass, ConfigType config, AddEntitiesCallback async_add_entities, DiscoveryInfoType|None discovery_info=None)
Definition: camera.py:56