mirror of
https://github.com/home-assistant/core.git
synced 2025-07-16 17:57:11 +00:00
parent
6acaf25b0d
commit
e6b9d5f5b3
@ -10,37 +10,35 @@ import requests
|
|||||||
from requests.auth import HTTPBasicAuth, HTTPDigestAuth
|
from requests.auth import HTTPBasicAuth, HTTPDigestAuth
|
||||||
import voluptuous as vol
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.const import CONF_NAME, CONF_USERNAME, CONF_PASSWORD
|
from homeassistant.const import (
|
||||||
|
CONF_NAME, CONF_USERNAME, CONF_PASSWORD, CONF_AUTHENTICATION,
|
||||||
|
HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION)
|
||||||
from homeassistant.exceptions import TemplateError
|
from homeassistant.exceptions import TemplateError
|
||||||
from homeassistant.components.camera import PLATFORM_SCHEMA, Camera
|
from homeassistant.components.camera import (PLATFORM_SCHEMA, Camera)
|
||||||
from homeassistant.helpers import config_validation as cv, template
|
from homeassistant.helpers import config_validation as cv, template
|
||||||
|
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
CONF_AUTHENTICATION = 'authentication'
|
|
||||||
CONF_STILL_IMAGE_URL = 'still_image_url'
|
|
||||||
CONF_LIMIT_REFETCH_TO_URL_CHANGE = 'limit_refetch_to_url_change'
|
CONF_LIMIT_REFETCH_TO_URL_CHANGE = 'limit_refetch_to_url_change'
|
||||||
|
CONF_STILL_IMAGE_URL = 'still_image_url'
|
||||||
|
|
||||||
DEFAULT_NAME = 'Generic Camera'
|
DEFAULT_NAME = 'Generic Camera'
|
||||||
BASIC_AUTHENTICATION = 'basic'
|
|
||||||
DIGEST_AUTHENTICATION = 'digest'
|
|
||||||
|
|
||||||
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
# pylint: disable=no-value-for-parameter
|
vol.Required(CONF_STILL_IMAGE_URL): vol.Any(cv.url, cv.template),
|
||||||
vol.Required(CONF_STILL_IMAGE_URL): vol.Any(vol.Url(), cv.template),
|
vol.Optional(CONF_AUTHENTICATION, default=HTTP_BASIC_AUTHENTICATION):
|
||||||
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
vol.In([HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION]),
|
||||||
vol.Optional(CONF_USERNAME): cv.string,
|
|
||||||
vol.Optional(CONF_PASSWORD): cv.string,
|
|
||||||
vol.Optional(CONF_AUTHENTICATION, default=BASIC_AUTHENTICATION):
|
|
||||||
vol.In([BASIC_AUTHENTICATION, DIGEST_AUTHENTICATION]),
|
|
||||||
vol.Optional(CONF_LIMIT_REFETCH_TO_URL_CHANGE, default=False): cv.boolean,
|
vol.Optional(CONF_LIMIT_REFETCH_TO_URL_CHANGE, default=False): cv.boolean,
|
||||||
|
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
||||||
|
vol.Optional(CONF_PASSWORD): cv.string,
|
||||||
|
vol.Optional(CONF_USERNAME): cv.string,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=unused-argument
|
# pylint: disable=unused-argument
|
||||||
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
"""Setup a generic IP Camera."""
|
"""Setup a generic IP Camera."""
|
||||||
add_devices_callback([GenericCamera(config)])
|
add_devices([GenericCamera(config)])
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=too-many-instance-attributes
|
# pylint: disable=too-many-instance-attributes
|
||||||
@ -58,7 +56,7 @@ class GenericCamera(Camera):
|
|||||||
password = device_info.get(CONF_PASSWORD)
|
password = device_info.get(CONF_PASSWORD)
|
||||||
|
|
||||||
if username and password:
|
if username and password:
|
||||||
if device_info[CONF_AUTHENTICATION] == DIGEST_AUTHENTICATION:
|
if device_info[CONF_AUTHENTICATION] == HTTP_DIGEST_AUTHENTICATION:
|
||||||
self._auth = HTTPDigestAuth(username, password)
|
self._auth = HTTPDigestAuth(username, password)
|
||||||
else:
|
else:
|
||||||
self._auth = HTTPBasicAuth(username, password)
|
self._auth = HTTPBasicAuth(username, password)
|
||||||
|
@ -9,26 +9,35 @@ from contextlib import closing
|
|||||||
|
|
||||||
import requests
|
import requests
|
||||||
from requests.auth import HTTPBasicAuth, HTTPDigestAuth
|
from requests.auth import HTTPBasicAuth, HTTPDigestAuth
|
||||||
|
import voluptuous as vol
|
||||||
|
|
||||||
from homeassistant.components.camera import DOMAIN, Camera
|
from homeassistant.const import (
|
||||||
from homeassistant.helpers import validate_config
|
CONF_NAME, CONF_USERNAME, CONF_PASSWORD, CONF_AUTHENTICATION,
|
||||||
|
HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION)
|
||||||
CONTENT_TYPE_HEADER = 'Content-Type'
|
from homeassistant.components.camera import (PLATFORM_SCHEMA, Camera)
|
||||||
|
from homeassistant.helpers import config_validation as cv
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
BASIC_AUTHENTICATION = 'basic'
|
CONF_MJPEG_URL = 'mjpeg_url'
|
||||||
DIGEST_AUTHENTICATION = 'digest'
|
CONTENT_TYPE_HEADER = 'Content-Type'
|
||||||
|
|
||||||
|
DEFAULT_NAME = 'Mjpeg Camera'
|
||||||
|
|
||||||
|
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({
|
||||||
|
vol.Required(CONF_MJPEG_URL): cv.url,
|
||||||
|
vol.Optional(CONF_AUTHENTICATION, default=HTTP_BASIC_AUTHENTICATION):
|
||||||
|
vol.In([HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION]),
|
||||||
|
vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string,
|
||||||
|
vol.Optional(CONF_PASSWORD): cv.string,
|
||||||
|
vol.Optional(CONF_USERNAME): cv.string,
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
# pylint: disable=unused-argument
|
# pylint: disable=unused-argument
|
||||||
def setup_platform(hass, config, add_devices_callback, discovery_info=None):
|
def setup_platform(hass, config, add_devices, discovery_info=None):
|
||||||
"""Setup a MJPEG IP Camera."""
|
"""Setup a MJPEG IP Camera."""
|
||||||
if not validate_config({DOMAIN: config}, {DOMAIN: ['mjpeg_url']},
|
add_devices([MjpegCamera(config)])
|
||||||
_LOGGER):
|
|
||||||
return None
|
|
||||||
|
|
||||||
add_devices_callback([MjpegCamera(config)])
|
|
||||||
|
|
||||||
|
|
||||||
def extract_image_from_mjpeg(stream):
|
def extract_image_from_mjpeg(stream):
|
||||||
@ -50,17 +59,16 @@ class MjpegCamera(Camera):
|
|||||||
def __init__(self, device_info):
|
def __init__(self, device_info):
|
||||||
"""Initialize a MJPEG camera."""
|
"""Initialize a MJPEG camera."""
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self._name = device_info.get('name', 'Mjpeg Camera')
|
self._name = device_info.get(CONF_NAME)
|
||||||
self._authentication = device_info.get('authentication',
|
self._authentication = device_info.get(CONF_AUTHENTICATION)
|
||||||
BASIC_AUTHENTICATION)
|
self._username = device_info.get(CONF_USERNAME)
|
||||||
self._username = device_info.get('username')
|
self._password = device_info.get(CONF_PASSWORD)
|
||||||
self._password = device_info.get('password')
|
self._mjpeg_url = device_info[CONF_MJPEG_URL]
|
||||||
self._mjpeg_url = device_info['mjpeg_url']
|
|
||||||
|
|
||||||
def camera_stream(self):
|
def camera_stream(self):
|
||||||
"""Return a MJPEG stream image response directly from the camera."""
|
"""Return a MJPEG stream image response directly from the camera."""
|
||||||
if self._username and self._password:
|
if self._username and self._password:
|
||||||
if self._authentication == DIGEST_AUTHENTICATION:
|
if self._authentication == HTTP_DIGEST_AUTHENTICATION:
|
||||||
auth = HTTPDigestAuth(self._username, self._password)
|
auth = HTTPDigestAuth(self._username, self._password)
|
||||||
else:
|
else:
|
||||||
auth = HTTPBasicAuth(self._username, self._password)
|
auth = HTTPBasicAuth(self._username, self._password)
|
||||||
|
@ -23,6 +23,7 @@ CONF_ACCESS_TOKEN = 'access_token'
|
|||||||
CONF_AFTER = 'after'
|
CONF_AFTER = 'after'
|
||||||
CONF_ALIAS = 'alias'
|
CONF_ALIAS = 'alias'
|
||||||
CONF_API_KEY = 'api_key'
|
CONF_API_KEY = 'api_key'
|
||||||
|
CONF_AUTHENTICATION = 'authentication'
|
||||||
CONF_BEFORE = 'before'
|
CONF_BEFORE = 'before'
|
||||||
CONF_BELOW = 'below'
|
CONF_BELOW = 'below'
|
||||||
CONF_BLACKLIST = 'blacklist'
|
CONF_BLACKLIST = 'blacklist'
|
||||||
@ -280,6 +281,9 @@ HTTP_METHOD_NOT_ALLOWED = 405
|
|||||||
HTTP_UNPROCESSABLE_ENTITY = 422
|
HTTP_UNPROCESSABLE_ENTITY = 422
|
||||||
HTTP_INTERNAL_SERVER_ERROR = 500
|
HTTP_INTERNAL_SERVER_ERROR = 500
|
||||||
|
|
||||||
|
HTTP_BASIC_AUTHENTICATION = 'basic'
|
||||||
|
HTTP_DIGEST_AUTHENTICATION = 'digest'
|
||||||
|
|
||||||
HTTP_HEADER_HA_AUTH = 'X-HA-access'
|
HTTP_HEADER_HA_AUTH = 'X-HA-access'
|
||||||
HTTP_HEADER_ACCEPT_ENCODING = 'Accept-Encoding'
|
HTTP_HEADER_ACCEPT_ENCODING = 'Accept-Encoding'
|
||||||
HTTP_HEADER_CONTENT_TYPE = 'Content-type'
|
HTTP_HEADER_CONTENT_TYPE = 'Content-type'
|
||||||
|
Loading…
x
Reference in New Issue
Block a user