DIR_LEFT = "LEFT" DIR_RIGHT = "RIGHT" ZOOM_OUT = "ZOOM_OUT" ZOOM_IN = "ZOOM_IN" PTZ_NONE = "NONE" SERVICE_PTZ = "onvif_ptz" ONVIF_DATA = "onvif" ENTITIES = "entities" PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_EXTRA_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string, vol.Optional(CONF_PROFILE, default=DEFAULT_PROFILE): vol.All(vol.Coerce(int), vol.Range(min=0)), }) SERVICE_PTZ_SCHEMA = vol.Schema({ ATTR_ENTITY_ID: cv.entity_ids, ATTR_PAN: vol.In([DIR_LEFT, DIR_RIGHT, PTZ_NONE]), ATTR_TILT: vol.In([DIR_UP, DIR_DOWN, PTZ_NONE]), ATTR_ZOOM: vol.In([ZOOM_OUT, ZOOM_IN, PTZ_NONE]) }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up a ONVIF camera."""
SERVICE_SET_CONFIG = 'logi_circle_set_config' SERVICE_LIVESTREAM_SNAPSHOT = 'logi_circle_livestream_snapshot' SERVICE_LIVESTREAM_RECORD = 'logi_circle_livestream_record' DATA_KEY = 'camera.logi_circle' BATTERY_SAVING_MODE_KEY = 'BATTERY_SAVING' PRIVACY_MODE_KEY = 'PRIVACY_MODE' LED_MODE_KEY = 'LED' ATTR_MODE = 'mode' ATTR_VALUE = 'value' ATTR_DURATION = 'duration' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_SCAN_INTERVAL, default=SCAN_INTERVAL): cv.time_period, }) LOGI_CIRCLE_SERVICE_SET_CONFIG = CAMERA_SERVICE_SCHEMA.extend({ vol.Required(ATTR_MODE): vol.In([BATTERY_SAVING_MODE_KEY, LED_MODE_KEY, PRIVACY_MODE_KEY]), vol.Required(ATTR_VALUE): cv.boolean }) LOGI_CIRCLE_SERVICE_SNAPSHOT = CAMERA_SERVICE_SCHEMA.extend({ vol.Required(ATTR_FILENAME): cv.template }) LOGI_CIRCLE_SERVICE_RECORD = CAMERA_SERVICE_SCHEMA.extend({ vol.Required(ATTR_FILENAME): cv.template, vol.Required(ATTR_DURATION): cv.positive_int
async_get_clientsession, async_aiohttp_proxy_web) from homeassistant.helpers import config_validation as cv _LOGGER = logging.getLogger(__name__) CONF_MJPEG_URL = 'mjpeg_url' CONF_STILL_IMAGE_URL = 'still_image_url' CONTENT_TYPE_HEADER = 'Content-Type' DEFAULT_NAME = 'Mjpeg Camera' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_MJPEG_URL): cv.url, vol.Optional(CONF_STILL_IMAGE_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, }) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up a MJPEG IP Camera.""" # Filter header errors from urllib3 due to a urllib3 bug urllib3_logger = logging.getLogger("urllib3.connectionpool") if not any(isinstance(x, NoHeaderErrorFilter) for x in urllib3_logger.filters): urllib3_logger.addFilter( NoHeaderErrorFilter()
DEPENDENCIES = ['ffmpeg'] _LOGGER = logging.getLogger(__name__) DEFAULT_BRAND = 'YI Home Camera' DEFAULT_PASSWORD = '' DEFAULT_PATH = '/tmp/sd/record' DEFAULT_PORT = 21 DEFAULT_USERNAME = '******' CONF_FFMPEG_ARGUMENTS = 'ffmpeg_arguments' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_NAME): cv.string, vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.string, vol.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string, vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_FFMPEG_ARGUMENTS): cv.string }) async def async_setup_platform( hass, config, async_add_entities, discovery_info=None): """Set up a Yi Camera.""" async_add_entities([YiCamera(hass, config)], True) class YiCamera(Camera): """Define an implementation of a Yi Camera."""
CONF_FORCE_RESIZE = 'force_resize' CONF_IMAGE_QUALITY = 'image_quality' CONF_IMAGE_REFRESH_RATE = 'image_refresh_rate' CONF_MAX_IMAGE_WIDTH = 'max_image_width' CONF_MAX_STREAM_WIDTH = 'max_stream_width' CONF_STREAM_QUALITY = 'stream_quality' DEFAULT_BASENAME = "Camera Proxy" DEFAULT_QUALITY = 75 PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_ENTITY_ID): cv.entity_id, vol.Optional(CONF_CACHE_IMAGES, False): cv.boolean, vol.Optional(CONF_FORCE_RESIZE, False): cv.boolean, vol.Optional(CONF_IMAGE_QUALITY): int, vol.Optional(CONF_IMAGE_REFRESH_RATE): float, vol.Optional(CONF_MAX_IMAGE_WIDTH): int, vol.Optional(CONF_MAX_STREAM_WIDTH): int, vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_STREAM_QUALITY): int, }) async def async_setup_platform( hass, config, async_add_devices, discovery_info=None): """Set up the Proxy camera platform.""" async_add_devices([ProxyCamera(hass, config)]) def _resize_image(image, opts): """Resize image."""
import logging from datetime import timedelta import requests import homeassistant.components.nest as nest from homeassistant.components.camera import (PLATFORM_SCHEMA, Camera) from homeassistant.util.dt import utcnow _LOGGER = logging.getLogger(__name__) DEPENDENCIES = ['nest'] NEST_BRAND = 'Nest' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({}) def setup_platform(hass, config, add_devices, discovery_info=None): """Set up a Nest Cam. No longer in use. """ async def async_setup_entry(hass, entry, async_add_devices): """Set up a Nest sensor based on a config entry.""" camera_devices = \ await hass.async_add_job(hass.data[nest.DATA_NEST].cameras) cameras = [NestCamera(structure, device) for structure, device in camera_devices]
from homeassistant.components.netatmo import WelcomeData from homeassistant.components.camera import (Camera, PLATFORM_SCHEMA) from homeassistant.loader import get_component from homeassistant.helpers import config_validation as cv DEPENDENCIES = ['netatmo'] _LOGGER = logging.getLogger(__name__) CONF_HOME = 'home' CONF_CAMERAS = 'cameras' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_HOME): cv.string, vol.Optional(CONF_CAMERAS, default=[]): vol.All(cv.ensure_list, [cv.string]), }) # pylint: disable=unused-argument def setup_platform(hass, config, add_devices, discovery_info=None): """Setup access to Netatmo Welcome cameras.""" netatmo = get_component('netatmo') home = config.get(CONF_HOME) import lnetatmo try: data = WelcomeData(netatmo.NETATMO_AUTH, home) except lnetatmo.NoDevice: return None
import voluptuous as vol from homeassistant.components.camera import Camera, PLATFORM_SCHEMA from homeassistant.const import CONF_IP_ADDRESS, CONF_NAME from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv _LOGGER = logging.getLogger(__name__) REQUIREMENTS = ['python-family-hub-local==0.0.2'] DEFAULT_NAME = 'FamilyHub Camera' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_IP_ADDRESS): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, }) async def async_setup_platform( hass, config, async_add_entities, discovery_info=None): """Set up the Family Hub Camera.""" from pyfamilyhublocal import FamilyHubCam address = config.get(CONF_IP_ADDRESS) name = config.get(CONF_NAME) session = async_get_clientsession(hass) family_hub_cam = FamilyHubCam(address, hass.loop, session) async_add_entities([FamilyHubCamera(name, family_hub_cam)], True)
DEPENDENCIES = ['ffmpeg'] _LOGGER = logging.getLogger(__name__) DEFAULT_BRAND = 'YI Home Camera' DEFAULT_PASSWORD = '' DEFAULT_PATH = '/tmp/sd/record' DEFAULT_PORT = 21 DEFAULT_USERNAME = '******' CONF_FFMPEG_ARGUMENTS = 'ffmpeg_arguments' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_NAME): cv.string, vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.string, vol.Optional(CONF_PATH, default=DEFAULT_PATH): cv.string, vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_FFMPEG_ARGUMENTS): cv.string }) async def async_setup_platform( hass, config, async_add_devices, discovery_info=None): """Set up a Yi Camera.""" async_add_devices([YiCamera(hass, config)], True) class YiCamera(Camera): """Define an implementation of a Yi Camera."""
from homeassistant.const import ( CONF_NAME, ) from homeassistant.helpers import config_validation as cv from homeassistant.util import Throttle _LOGGER = logging.getLogger(__name__) CONF_VACUUM_CONNECTION_STRING = "vacuum_ssh" CONF_VACUUM_ENTITY_ID = "vacuum_entity" DEFAULT_NAME = "Xiaomi Vacuum Camera" PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_VACUUM_CONNECTION_STRING): cv.string, vol.Required(CONF_VACUUM_ENTITY_ID): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string }) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): async_add_entities([VacuumCamera(hass, config)]) class VacuumCamera(Camera): def __init__(self, hass, device_info): super().__init__()
from .const import ( CONF_RTSP_PORT, CONF_STREAM, DOMAIN, LOGGER, SERVICE_PTZ, SERVICE_PTZ_PRESET, ) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required("ip"): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Required(CONF_USERNAME): cv.string, vol.Optional(CONF_NAME, default="Foscam Camera"): cv.string, vol.Optional(CONF_PORT, default=88): cv.port, vol.Optional(CONF_RTSP_PORT): cv.port, }) DIR_UP = "up" DIR_DOWN = "down" DIR_LEFT = "left" DIR_RIGHT = "right" DIR_TOPLEFT = "top_left" DIR_TOPRIGHT = "top_right" DIR_BOTTOMLEFT = "bottom_left"
from .const import ( CONF_FFMPEG_ARGUMENTS, DATA_COORDINATOR, DEFAULT_FFMPEG_ARGUMENTS, DOMAIN, MANUFACTURER, ) from .coordinator import CanaryDataUpdateCoordinator FORCE_CAMERA_REFRESH_INTERVAL: Final = timedelta(minutes=15) PLATFORM_SCHEMA: Final = vol.All( cv.deprecated(CONF_FFMPEG_ARGUMENTS), PARENT_PLATFORM_SCHEMA.extend({ vol.Optional(CONF_FFMPEG_ARGUMENTS, default=DEFAULT_FFMPEG_ARGUMENTS): cv.string }), ) _LOGGER = logging.getLogger(__name__) async def async_setup_entry( hass: HomeAssistant, entry: ConfigEntry, async_add_entities: AddEntitiesCallback, ) -> None: """Set up Canary sensors based on a config entry.""" coordinator: CanaryDataUpdateCoordinator = hass.data[DOMAIN][ entry.entry_id][DATA_COORDINATOR] ffmpeg_arguments: str = entry.options.get(CONF_FFMPEG_ARGUMENTS,
CONF_COUNTRY = "country_code" _LOGGER = logging.getLogger(__name__) # Maximum range according to docs DIM_RANGE = vol.All(vol.Coerce(int), vol.Range(min=120, max=700)) # Multiple choice for available Radar Map URL SUPPORTED_COUNTRY_CODES = ["NL", "BE"] PLATFORM_SCHEMA = vol.All( PLATFORM_SCHEMA.extend({ vol.Optional(CONF_DIMENSION, default=512): DIM_RANGE, vol.Optional(CONF_DELTA, default=600.0): cv.positive_float, vol.Optional(CONF_NAME, default="Buienradar loop"): cv.string, vol.Optional(CONF_COUNTRY, default="NL"): vol.All(vol.Coerce(str), vol.In(SUPPORTED_COUNTRY_CODES)), })) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up buienradar radar-loop camera component.""" dimension = config[CONF_DIMENSION] delta = config[CONF_DELTA] name = config[CONF_NAME] country = config[CONF_COUNTRY]
CONF_ID, CONF_DELTA, CONF_FRAMES, CONF_LOCATION)) return config LOCATIONS_MSG = "Set '{}' to one of: {}".format(CONF_LOCATION, ', '.join(sorted(LOCATIONS))) XOR_MSG = "Specify exactly one of '{}' or '{}'".format(CONF_ID, CONF_LOCATION) PLATFORM_SCHEMA = vol.All( PLATFORM_SCHEMA.extend({ vol.Exclusive(CONF_ID, 'xor', msg=XOR_MSG): cv.string, vol.Exclusive(CONF_LOCATION, 'xor', msg=XOR_MSG): vol.In(LOCATIONS, msg=LOCATIONS_MSG), vol.Optional(CONF_DELTA): cv.positive_int, vol.Optional(CONF_FRAMES): cv.positive_int, vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_OUTFILE): cv.string, }), _validate_schema) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up BOM radar-loop camera component.""" location = config.get(CONF_LOCATION) or "ID {}".format(config.get(CONF_ID)) name = config.get(CONF_NAME) or "BOM Radar Loop - {}".format(location) args = [ config.get(x) for x in (CONF_LOCATION, CONF_ID, CONF_DELTA, CONF_FRAMES, CONF_OUTFILE)
ATTR_CAMERA = 'camera_entity' ATTR_PROCESSOR = 'processor_entity' CONF_CAMERA = 'camera' CONF_COLOR = 'color' CONF_PROCESSOR = 'processor' CONF_CLASSIFIER = 'classifier' DEFAULT_COLOR = (255, 255, 0) DEFAULT_NAME = 'OpenCV' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Required(CONF_CAMERA): cv.entity_id, vol.Required(CONF_PROCESSOR): cv.entity_id, vol.Optional(CONF_CLASSIFIER, default=None): cv.string, vol.Optional(CONF_COLOR, default=DEFAULT_COLOR): (int, int, int) }) def setup_platform(hass, config, add_devices, discovery_info=None): """Set up the OpenCV camera platform.""" add_devices([OpenCVCamera(hass, config.get(CONF_NAME, DEFAULT_NAME), config[CONF_CAMERA], config[CONF_PROCESSOR], config[CONF_CLASSIFIER], config[CONF_COLOR])]) class OpenCVCamera(Camera): """Visual representation of opencv matched regions.""" def __init__(self, hass, name, camera, processor, classifier, color):
REQUIREMENTS = ['onvif-py3==0.1.3', 'suds-py3==1.3.3.0', 'http://github.com/tgaugry/suds-passworddigest-py3' '/archive/86fc50e39b4d2b8997481967d6a7fe1c57118999.zip' '#suds-passworddigest-py3==0.1.2a'] DEPENDENCIES = ['ffmpeg'] DEFAULT_NAME = 'ONVIF Camera' DEFAULT_PORT = 5000 DEFAULT_USERNAME = '******' DEFAULT_PASSWORD = '******' DEFAULT_ARGUMENTS = '-q:v 2' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_EXTRA_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string, }) @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Set up a ONVIF camera.""" if not hass.data[DATA_FFMPEG].async_run_test(config.get(CONF_HOST)): return async_add_devices([ONVIFCamera(hass, config)]) class ONVIFCamera(Camera): """An implementation of an ONVIF camera."""
"""Family Hub camera for Samsung Refrigerators.""" from pyfamilyhublocal import FamilyHubCam import voluptuous as vol from homeassistant.components.camera import PLATFORM_SCHEMA, Camera from homeassistant.const import CONF_IP_ADDRESS, CONF_NAME from homeassistant.helpers.aiohttp_client import async_get_clientsession import homeassistant.helpers.config_validation as cv DEFAULT_NAME = "FamilyHub Camera" PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_IP_ADDRESS): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, }) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Family Hub Camera.""" address = config.get(CONF_IP_ADDRESS) name = config.get(CONF_NAME) session = async_get_clientsession(hass) family_hub_cam = FamilyHubCam(address, hass.loop, session)
MODE_RESIZE = 'resize' MODE_CROP = 'crop' DEFAULT_BASENAME = "Camera Proxy" DEFAULT_QUALITY = 75 PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_ENTITY_ID): cv.entity_id, vol.Optional(CONF_NAME): cv.string, vol.Optional(CONF_CACHE_IMAGES, False): cv.boolean, vol.Optional(CONF_FORCE_RESIZE, False): cv.boolean, vol.Optional(CONF_MODE, default=MODE_RESIZE): vol.In([MODE_RESIZE, MODE_CROP]), vol.Optional(CONF_IMAGE_QUALITY): int, vol.Optional(CONF_IMAGE_REFRESH_RATE): float, vol.Optional(CONF_MAX_IMAGE_WIDTH): int, vol.Optional(CONF_MAX_IMAGE_HEIGHT): int, vol.Optional(CONF_MAX_STREAM_WIDTH): int, vol.Optional(CONF_MAX_STREAM_HEIGHT): int, vol.Optional(CONF_IMAGE_LEFT): int, vol.Optional(CONF_IMAGE_TOP): int, vol.Optional(CONF_STREAM_QUALITY): int, }) async def async_setup_platform( hass, config, async_add_entities, discovery_info=None): """Set up the Proxy camera platform.""" async_add_entities([ProxyCamera(hass, config)])
from homeassistant.util import dt as dt_util CONF_FFMPEG_ARGUMENTS = 'ffmpeg_arguments' DEPENDENCIES = ['ring', 'ffmpeg'] FORCE_REFRESH_INTERVAL = timedelta(minutes=45) _LOGGER = logging.getLogger(__name__) NOTIFICATION_TITLE = 'Ring Camera Setup' SCAN_INTERVAL = timedelta(seconds=90) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_FFMPEG_ARGUMENTS): cv.string, vol.Optional(CONF_SCAN_INTERVAL, default=SCAN_INTERVAL): cv.time_period, }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up a Ring Door Bell and StickUp Camera.""" ring = hass.data[DATA_RING] cams = [] cams_no_plan = [] for camera in ring.doorbells: if camera.has_subscription: cams.append(RingCam(hass, camera, config)) else: cams_no_plan.append(camera)
CONF_CONTENT_TYPE = 'content_type' CONF_LIMIT_REFETCH_TO_URL_CHANGE = 'limit_refetch_to_url_change' CONF_STILL_IMAGE_URL = 'still_image_url' CONF_STREAM_SOURCE = 'stream_source' CONF_FRAMERATE = 'framerate' DEFAULT_NAME = 'Generic Camera' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_STILL_IMAGE_URL): cv.template, vol.Optional(CONF_STREAM_SOURCE, default=None): vol.Any(None, cv.string), vol.Optional(CONF_AUTHENTICATION, default=HTTP_BASIC_AUTHENTICATION): vol.In([HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION]), 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, vol.Optional(CONF_CONTENT_TYPE, default=DEFAULT_CONTENT_TYPE): cv.string, vol.Optional(CONF_FRAMERATE, default=2): cv.positive_int, vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, }) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up a generic IP Camera.""" async_add_entities([GenericCamera(hass, config)]) class GenericCamera(Camera):
ZOOM_OUT = "ZOOM_OUT" ZOOM_IN = "ZOOM_IN" SERVICE_PTZ = "onvif_ptz" ONVIF_DATA = "onvif" ENTITIES = "entities" PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_EXTRA_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string, vol.Optional(CONF_PROFILE, default=DEFAULT_PROFILE): vol.All(vol.Coerce(int), vol.Range(min=0)), }) SERVICE_PTZ_SCHEMA = vol.Schema({ ATTR_ENTITY_ID: cv.entity_ids, ATTR_PAN: vol.In([DIR_LEFT, DIR_RIGHT]), ATTR_TILT: vol.In([DIR_UP, DIR_DOWN]), ATTR_ZOOM: vol.In([ZOOM_OUT, ZOOM_IN]) })
from homeassistant.exceptions import PlatformNotReady REQUIREMENTS = ['uvcclient==0.10.1'] _LOGGER = logging.getLogger(__name__) CONF_NVR = 'nvr' CONF_KEY = 'key' CONF_PASSWORD = '******' DEFAULT_PASSWORD = '******' DEFAULT_PORT = 7080 PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_NVR): cv.string, vol.Required(CONF_KEY): cv.string, vol.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, }) def setup_platform(hass, config, add_devices, discovery_info=None): """Discover cameras on a Unifi NVR.""" addr = config[CONF_NVR] key = config[CONF_KEY] password = config[CONF_PASSWORD] port = config[CONF_PORT] from uvcclient import nvr try: # Exceptions may be raised in all method calls to the nvr library. nvrconn = nvr.UVCRemote(addr, port, key)
DEFAULT_PATH = "/media/mmcblk0p1/record" DEFAULT_PORT = 21 DEFAULT_USERNAME = "******" DEFAULT_ARGUMENTS = "-pred 1" CONF_FFMPEG_ARGUMENTS = "ffmpeg_arguments" MODEL_YI = "yi" MODEL_XIAOFANG = "xiaofang" PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Required(CONF_NAME): 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, vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_FFMPEG_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string, } ) async def async_setup_platform( hass: HomeAssistant, config: ConfigType, async_add_entities: AddEntitiesCallback, discovery_info: DiscoveryInfoType | None = None, ) -> None: """Set up a Xiaomi Camera.""" _LOGGER.debug("Received configuration for model %s", config[CONF_MODEL])
CONF_BUFFER_SIZE = 'buffer' CONF_IMAGE_FIELD = 'field' CONF_TOKEN = 'token' DEFAULT_NAME = "Push Camera" ATTR_FILENAME = 'filename' ATTR_LAST_TRIP = 'last_trip' ATTR_TOKEN = 'token' PUSH_CAMERA_DATA = 'push_camera' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_BUFFER_SIZE, default=1): cv.positive_int, vol.Optional(CONF_TIMEOUT, default=timedelta(seconds=5)): vol.All( cv.time_period, cv.positive_timedelta), vol.Optional(CONF_IMAGE_FIELD, default='image'): cv.string, vol.Optional(CONF_TOKEN): vol.All(cv.string, vol.Length(min=8)), }) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Push Camera platform.""" if PUSH_CAMERA_DATA not in hass.data: hass.data[PUSH_CAMERA_DATA] = {} cameras = [PushCamera(config[CONF_NAME], config[CONF_BUFFER_SIZE], config[CONF_TIMEOUT], config.get(CONF_TOKEN))]
DEPENDENCIES = ['skybell'] _LOGGER = logging.getLogger(__name__) SCAN_INTERVAL = timedelta(seconds=90) IMAGE_AVATAR = 'avatar' IMAGE_ACTIVITY = 'activity' CONF_ACTIVITY_NAME = 'activity_name' CONF_AVATAR_NAME = 'avatar_name' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_MONITORED_CONDITIONS, default=[IMAGE_AVATAR]): vol.All(cv.ensure_list, [vol.In([IMAGE_AVATAR, IMAGE_ACTIVITY])]), vol.Optional(CONF_ACTIVITY_NAME): cv.string, vol.Optional(CONF_AVATAR_NAME): cv.string, }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the platform for a Skybell device.""" cond = config[CONF_MONITORED_CONDITIONS] names = {} names[IMAGE_ACTIVITY] = config.get(CONF_ACTIVITY_NAME) names[IMAGE_AVATAR] = config.get(CONF_AVATAR_NAME) skybell = hass.data.get(SKYBELL_DOMAIN) sensors = [] for device in skybell.get_devices(): for camera_type in cond:
from homeassistant.const import CONF_VERIFY_SSL from homeassistant.components.netatmo import CameraData from homeassistant.components.camera import (Camera, PLATFORM_SCHEMA) from homeassistant.helpers import config_validation as cv DEPENDENCIES = ['netatmo'] _LOGGER = logging.getLogger(__name__) CONF_HOME = 'home' CONF_CAMERAS = 'cameras' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, vol.Optional(CONF_HOME): cv.string, vol.Optional(CONF_CAMERAS, default=[]): vol.All(cv.ensure_list, [cv.string]), }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up access to Netatmo cameras.""" netatmo = hass.components.netatmo home = config.get(CONF_HOME) verify_ssl = config.get(CONF_VERIFY_SSL, True) import pyatmo try: data = CameraData(netatmo.NETATMO_AUTH, home) for camera_name in data.get_camera_names(): camera_type = data.get_camera_type(camera=camera_name, home=home) if CONF_CAMERAS in config:
} STREAM_SOURCE_LIST = { 'mjpeg': 0, 'snapshot': 1 } CONTENT_TYPE_HEADER = 'Content-Type' TIMEOUT = 5 PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_HOST): cv.string, vol.Required(CONF_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_RESOLUTION, default=DEFAULT_RESOLUTION): vol.All(vol.In(RESOLUTION_LIST)), vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_STREAM_SOURCE, default=DEFAULT_STREAM_SOURCE): vol.All(vol.In(STREAM_SOURCE_LIST)), }) def setup_platform(hass, config, add_devices, discovery_info=None): """Set up an Amcrest IP Camera.""" from amcrest import AmcrestCamera camera = AmcrestCamera( config.get(CONF_HOST), config.get(CONF_PORT), config.get(CONF_USERNAME), config.get(CONF_PASSWORD)).camera persistent_notification = loader.get_component('persistent_notification')
from homeassistant.components.camera import (PLATFORM_SCHEMA, Camera) from homeassistant.helpers import config_validation as cv from homeassistant.util.async import run_coroutine_threadsafe _LOGGER = logging.getLogger(__name__) CONF_LIMIT_REFETCH_TO_URL_CHANGE = 'limit_refetch_to_url_change' CONF_STILL_IMAGE_URL = 'still_image_url' DEFAULT_NAME = 'Generic Camera' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_STILL_IMAGE_URL): cv.template, vol.Optional(CONF_AUTHENTICATION, default=HTTP_BASIC_AUTHENTICATION): vol.In([HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION]), 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, }) @asyncio.coroutine # pylint: disable=unused-argument def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Setup a generic IP Camera.""" yield from async_add_devices([GenericCamera(hass, config)]) class GenericCamera(Camera): """A generic implementation of an IP camera."""
DIR_RIGHT = "RIGHT" ZOOM_OUT = "ZOOM_OUT" ZOOM_IN = "ZOOM_IN" SERVICE_PTZ = "onvif_ptz" ONVIF_DATA = "onvif" ENTITIES = "entities" PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_HOST): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_EXTRA_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string, }) SERVICE_PTZ_SCHEMA = vol.Schema({ ATTR_ENTITY_ID: cv.entity_ids, ATTR_PAN: vol.In([DIR_LEFT, DIR_RIGHT]), ATTR_TILT: vol.In([DIR_UP, DIR_DOWN]), ATTR_ZOOM: vol.In([ZOOM_OUT, ZOOM_IN]) })
CONF_BUFFER_SIZE = "buffer" CONF_IMAGE_FIELD = "field" DEFAULT_NAME = "Push Camera" ATTR_FILENAME = "filename" ATTR_LAST_TRIP = "last_trip" PUSH_CAMERA_DATA = "push_camera" PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_BUFFER_SIZE, default=1): cv.positive_int, vol.Optional(CONF_TIMEOUT, default=timedelta(seconds=5)): vol.All( cv.time_period, cv.positive_timedelta ), vol.Optional(CONF_IMAGE_FIELD, default="image"): cv.string, vol.Required(CONF_WEBHOOK_ID): cv.string, } ) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up the Push Camera platform.""" if PUSH_CAMERA_DATA not in hass.data: hass.data[PUSH_CAMERA_DATA] = {} webhook_id = config.get(CONF_WEBHOOK_ID) cameras = [
REQUIREMENTS = ['py-synology==0.2.0'] _LOGGER = logging.getLogger(__name__) DEFAULT_NAME = 'Synology Camera' DEFAULT_TIMEOUT = 5 PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Required(CONF_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Required(CONF_URL): cv.string, vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, vol.Optional(CONF_WHITELIST, default=[]): cv.ensure_list, vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, }) @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Set up a Synology IP Camera.""" verify_ssl = config.get(CONF_VERIFY_SSL) timeout = config.get(CONF_TIMEOUT)
_LOGGER = logging.getLogger(__name__) CONF_NVR = 'nvr' CONF_KEY = 'key' CONF_PASSWORD = '******' DEFAULT_PASSWORD = '******' DEFAULT_PORT = 7080 DEFAULT_SSL = False PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_NVR): cv.string, vol.Required(CONF_KEY): cv.string, vol.Optional(CONF_PASSWORD, default=DEFAULT_PASSWORD): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_SSL, default=DEFAULT_SSL): cv.boolean, }) def setup_platform(hass, config, add_entities, discovery_info=None): """Discover cameras on a Unifi NVR.""" addr = config[CONF_NVR] key = config[CONF_KEY] password = config[CONF_PASSWORD] port = config[CONF_PORT] ssl = config[CONF_SSL]
DIR_DOWN: "ptz_move_down", DIR_LEFT: "ptz_move_left", DIR_RIGHT: "ptz_move_right", DIR_TOPLEFT: "ptz_move_top_left", DIR_TOPRIGHT: "ptz_move_top_right", DIR_BOTTOMLEFT: "ptz_move_bottom_left", DIR_BOTTOMRIGHT: "ptz_move_bottom_right", } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_IP): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Required(CONF_USERNAME): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, vol.Optional(CONF_RTSP_PORT): cv.port, }) SERVICE_PTZ_SCHEMA = vol.Schema({ vol.Required(ATTR_ENTITY_ID): cv.entity_ids, vol.Required(ATTR_MOVEMENT): vol.In([ DIR_UP, DIR_DOWN, DIR_LEFT,
DEFAULT_PATH = '/media/mmcblk0p1/record' DEFAULT_PORT = 21 DEFAULT_USERNAME = '******' CONF_FFMPEG_ARGUMENTS = 'ffmpeg_arguments' CONF_MODEL = 'model' MODEL_YI = 'yi' MODEL_XIAOFANG = 'xiaofang' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_NAME): cv.string, vol.Required(CONF_HOST): cv.string, 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, vol.Optional(CONF_USERNAME, default=DEFAULT_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_FFMPEG_ARGUMENTS): cv.string }) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up a Xiaomi Camera.""" _LOGGER.debug('Received configuration for model %s', config[CONF_MODEL]) async_add_entities([XiaomiCamera(hass, config)])
CONF_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, }) @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, 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)
import os import voluptuous as vol from homeassistant.const import CONF_NAME from homeassistant.components.camera import Camera, PLATFORM_SCHEMA from homeassistant.helpers import config_validation as cv _LOGGER = logging.getLogger(__name__) CONF_FILE_PATH = 'file_path' DEFAULT_NAME = 'Local File' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_FILE_PATH): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string }) def setup_platform(hass, config, add_devices, discovery_info=None): """Set up the Camera that works with local files.""" file_path = config[CONF_FILE_PATH] # check filepath given is readable if not os.access(file_path, os.R_OK): _LOGGER.warning("Could not read camera %s image from file: %s", config[CONF_NAME], file_path) add_devices([LocalFile(config[CONF_NAME], file_path)])
from homeassistant.helpers import config_validation as cv from homeassistant.helpers.aiohttp_client import async_aiohttp_proxy_stream from homeassistant.components.arlo import DEFAULT_BRAND, DATA_ARLO from homeassistant.components.camera import Camera, PLATFORM_SCHEMA from homeassistant.components.ffmpeg import DATA_FFMPEG DEPENDENCIES = ['arlo', 'ffmpeg'] _LOGGER = logging.getLogger(__name__) CONF_FFMPEG_ARGUMENTS = 'ffmpeg_arguments' ARLO_MODE_ARMED = 'armed' ARLO_MODE_DISARMED = 'disarmed' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_FFMPEG_ARGUMENTS): cv.string, }) @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Set up an Arlo IP Camera.""" arlo = hass.data.get(DATA_ARLO) if not arlo: return False cameras = [] for camera in arlo.cameras: cameras.append(ArloCam(hass, camera, config)) async_add_devices(cameras, True)
CONF_HIDE = 'hide' CONF_IMAGE_NAME = 'image_name' CONF_NEW_VERSION = 'new_version' CONF_VIEWER_PASSWORD = '******' CONF_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, }) @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, 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)
DEFAULT_IMAGE_ROTATION = 0 DEFAULT_IMAGE_WIDTH = 640 DEFAULT_NAME = 'Raspberry Pi Camera' DEFAULT_TIMELAPSE = 1000 DEFAULT_VERTICAL_FLIP = 0 PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_FILE_PATH): cv.isfile, vol.Optional(CONF_HORIZONTAL_FLIP, default=DEFAULT_HORIZONTAL_FLIP): vol.All(vol.Coerce(int), vol.Range(min=0, max=1)), vol.Optional(CONF_IMAGE_HEIGHT, default=DEFAULT_IMAGE_HEIGHT): vol.Coerce(int), vol.Optional(CONF_IMAGE_QUALITY, default=DEFAULT_IMAGE_QUALITY): vol.All(vol.Coerce(int), vol.Range(min=0, max=100)), vol.Optional(CONF_IMAGE_ROTATION, default=DEFAULT_IMAGE_ROTATION): vol.All(vol.Coerce(int), vol.Range(min=0, max=359)), vol.Optional(CONF_IMAGE_WIDTH, default=DEFAULT_IMAGE_WIDTH): vol.Coerce(int), vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_TIMELAPSE, default=1000): vol.Coerce(int), vol.Optional(CONF_VERTICAL_FLIP, default=DEFAULT_VERTICAL_FLIP): vol.All(vol.Coerce(int), vol.Range(min=0, max=1)), }) def kill_raspistill(*args): """Kill any previously running raspistill process..""" subprocess.Popen(['killall', 'raspistill'], stdout=subprocess.DEVNULL,
from homeassistant.helpers import config_validation as cv from homeassistant.helpers.aiohttp_client import async_get_clientsession DEPENDENCIES = ['doorbird'] _CAMERA_LIVE = "DoorBird Live" _CAMERA_LAST_VISITOR = "DoorBird Last Ring" _LIVE_INTERVAL = datetime.timedelta(seconds=1) _LAST_VISITOR_INTERVAL = datetime.timedelta(minutes=1) _LOGGER = logging.getLogger(__name__) _TIMEOUT = 10 # seconds CONF_SHOW_LAST_VISITOR = 'last_visitor' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_SHOW_LAST_VISITOR, default=False): cv.boolean }) @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Set up the DoorBird camera platform.""" device = hass.data.get(DOORBIRD_DOMAIN) _LOGGER.debug("Adding DoorBird camera %s", _CAMERA_LIVE) entities = [DoorBirdCamera(device.live_image_url, _CAMERA_LIVE, _LIVE_INTERVAL)] if config.get(CONF_SHOW_LAST_VISITOR): _LOGGER.debug("Adding DoorBird camera %s", _CAMERA_LAST_VISITOR) entities.append(DoorBirdCamera(device.history_image_url(1),
PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_HOST): cv.string, vol.Required(CONF_TOKEN): vol.All(str, vol.Length(min=32, max=32)), vol.Required(CONF_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Required(CONF_COUNTRY): vol.In(CONF_AVAILABLE_COUNTRIES), vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_AUTO_UPDATE, default=True): cv.boolean, vol.Optional(CONF_COLORS, default={}): vol.Schema({vol.In(CONF_AVAILABLE_COLORS): COLOR_SCHEMA}), vol.Optional(CONF_ROOM_COLORS, default={}): vol.Schema({cv.positive_int: COLOR_SCHEMA}), vol.Optional(CONF_DRAW, default=[]): vol.All(cv.ensure_list, [vol.In(CONF_AVAILABLE_DRAWABLES)]), vol.Optional(CONF_MAP_TRANSFORM, default={ CONF_SCALE: 1, CONF_ROTATE: 0, CONF_TRIM: DEFAULT_TRIMS }): vol.Schema({ vol.Optional(CONF_SCALE, default=1): vol.All(vol.Coerce(float), vol.Range(min=0)), vol.Optional(CONF_ROTATE, default=0): vol.In([0, 90, 180, 270]), vol.Optional(CONF_TRIM, default=DEFAULT_TRIMS): vol.Schema({ vol.Optional(CONF_LEFT, default=0): PERCENT_SCHEMA, vol.Optional(CONF_RIGHT, default=0): PERCENT_SCHEMA, vol.Optional(CONF_TOP, default=0): PERCENT_SCHEMA, vol.Optional(CONF_BOTTOM, default=0): PERCENT_SCHEMA }), }), vol.Optional(CONF_ATTRIBUTES, default=[]): vol.All(cv.ensure_list, [vol.In(CONF_AVAILABLE_ATTRIBUTES)]), vol.Optional(CONF_TEXTS, default=[]): vol.All(cv.ensure_list, [ vol.Schema({ vol.Required(CONF_TEXT): cv.string, vol.Required(CONF_X): vol.Coerce(float), vol.Required(CONF_Y): vol.Coerce(float), vol.Optional(CONF_COLOR, default=(0, 0, 0)): COLOR_SCHEMA, vol.Optional(CONF_FONT, default=""): cv.string, vol.Optional(CONF_FONT_SIZE, default=0): cv.positive_int }) ]) })
import voluptuous as vol from homeassistant.core import callback from homeassistant.const import CONF_NAME from homeassistant.components.camera import PLATFORM_SCHEMA, Camera from homeassistant.helpers import config_validation as cv from homeassistant.helpers.dispatcher import async_dispatcher_connect _LOGGER = logging.getLogger(__name__) CONF_SIGNAL = 'signal' DEFAULT_NAME = 'Dispatcher Camera' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_SIGNAL): cv.slugify, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, }) @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Setup a dispatcher camera.""" if discovery_info: config = PLATFORM_SCHEMA(discovery_info) async_add_devices( [DispatcherCamera(config[CONF_NAME], config[CONF_SIGNAL])]) class DispatcherCamera(Camera): """A dispatcher implementation of an camera."""
import voluptuous as vol from homeassistant.const import CONF_NAME from homeassistant.components.camera import Camera, PLATFORM_SCHEMA from homeassistant.helpers import config_validation as cv _LOGGER = logging.getLogger(__name__) CONF_FILE_PATH = 'file_path' DEFAULT_NAME = 'Local File' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_FILE_PATH): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string }) def setup_platform(hass, config, add_devices, discovery_info=None): """Set up the Camera that works with local files.""" file_path = config[CONF_FILE_PATH] # check filepath given is readable if not os.access(file_path, os.R_OK): _LOGGER.warning("Could not read camera %s image from file: %s", config[CONF_NAME], file_path) add_devices([LocalFile(config[CONF_NAME], file_path)])
DEPENDENCIES = ['skybell'] _LOGGER = logging.getLogger(__name__) SCAN_INTERVAL = timedelta(seconds=90) IMAGE_AVATAR = 'avatar' IMAGE_ACTIVITY = 'activity' CONF_ACTIVITY_NAME = 'activity_name' CONF_AVATAR_NAME = 'avatar_name' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_MONITORED_CONDITIONS, default=[IMAGE_AVATAR]): vol.All(cv.ensure_list, [vol.In([IMAGE_AVATAR, IMAGE_ACTIVITY])]), vol.Optional(CONF_ACTIVITY_NAME): cv.string, vol.Optional(CONF_AVATAR_NAME): cv.string, }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up the platform for a Skybell device.""" cond = config[CONF_MONITORED_CONDITIONS] names = {} names[IMAGE_ACTIVITY] = config.get(CONF_ACTIVITY_NAME) names[IMAGE_AVATAR] = config.get(CONF_AVATAR_NAME) skybell = hass.data.get(SKYBELL_DOMAIN) sensors = [] for device in skybell.get_devices(): for camera_type in cond:
from homeassistant.helpers import config_validation as cv _LOGGER = logging.getLogger(__name__) CONF_ZCAMERA_HOST = "zcamera_host" CONF_ZCAMERA_PORT = "zcamera_port" CONF_ZCAMERA_QUALITY = "zcamera_quality" CONTENT_TYPE_HEADER = "Content-Type" DEFAULT_NAME = "Zortrax Plus Camera" PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_ZCAMERA_HOST): cv.string, vol.Optional(CONF_ZCAMERA_PORT, default=8002): cv.port, vol.Optional(CONF_ZCAMERA_QUALITY, default=80): vol.Coerce(int), vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, }) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """Set up a Zortrax Plus Printer Camera.""" if discovery_info: config = PLATFORM_SCHEMA(discovery_info) async_add_entities([ZortraxCamera(config)])
from homeassistant.core import callback import homeassistant.components.mqtt as mqtt from homeassistant.const import CONF_NAME from homeassistant.components.camera import Camera, PLATFORM_SCHEMA from homeassistant.helpers import config_validation as cv _LOGGER = logging.getLogger(__name__) CONF_TOPIC = 'topic' DEFAULT_NAME = 'MQTT Camera' DEPENDENCIES = ['mqtt'] PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_TOPIC): mqtt.valid_subscribe_topic, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string }) @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Set up the MQTT Camera.""" topic = config[CONF_TOPIC] async_add_devices([MqttCamera(config[CONF_NAME], topic)]) class MqttCamera(Camera): """representation of a MQTT camera.""" def __init__(self, name, topic):
""" camera """ # pylint: disable=unused-argument import logging from homeassistant.components.camera import PLATFORM_SCHEMA, Camera from . import DOMAIN from .app.conga import Conga _LOGGER = logging.getLogger(__name__) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({}) async def async_setup_platform(hass, config, async_add_entities, discovery_info=None): """ async_setup_platform """ if 'instance' in hass.data[DOMAIN] and discovery_info is not None: async_add_entities([CongaCamera(hass.data[DOMAIN]['instance'])]) class CongaCamera(Camera): """ CongaCamera """ def __init__(self, instance: Conga): super().__init__() self.content_type = 'image/png' self.instance = instance self.instance.client.on('update_map', self.schedule_update_ha_state) self.instance.client.on('update_position', self.schedule_update_ha_state)
from . import ATTRIBUTION, DATA_RING, NOTIFICATION_ID CONF_FFMPEG_ARGUMENTS = 'ffmpeg_arguments' DEPENDENCIES = ['ring', 'ffmpeg'] FORCE_REFRESH_INTERVAL = timedelta(minutes=45) _LOGGER = logging.getLogger(__name__) NOTIFICATION_TITLE = 'Ring Camera Setup' SCAN_INTERVAL = timedelta(seconds=90) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_FFMPEG_ARGUMENTS): cv.string, vol.Optional(CONF_SCAN_INTERVAL, default=SCAN_INTERVAL): cv.time_period, }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up a Ring Door Bell and StickUp Camera.""" ring = hass.data[DATA_RING] cams = [] cams_no_plan = [] for camera in ring.doorbells: if camera.has_subscription: cams.append(RingCam(hass, camera, config)) else: cams_no_plan.append(camera)
SERVICE_DISABLE_RECORDING = 'disable_recording' SERVICE_ENABLE_MOTION_DETECTION = 'enable_motion_detection' SERVICE_DISABLE_MOTION_DETECTION = 'disable_motion_detection' SERVICE_GOTO_PTZ_POSITION = 'goto_ptz_position' SERVICE_CONTROL_PTZ= 'control_ptz' DEFAULT_BRAND = 'Reolink' DOMAIN_DATA = 'reolink_devices' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Required(CONF_HOST): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Required(CONF_USERNAME): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_STREAM, default=DEFAULT_STREAM): vol.In(["main", "sub"]), vol.Optional(CONF_PROTOCOL, default=DEFAULT_PROTOCOL): vol.In(["rtmp", "rtsp"]), vol.Optional(CONF_CHANNEL, default=DEFAULT_CHANNEL): cv.positive_int, } ) @asyncio.coroutine async def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Set up a Reolink IP Camera.""" host = config.get(CONF_HOST) username = config.get(CONF_USERNAME) password = config.get(CONF_PASSWORD) stream = config.get(CONF_STREAM) protocol = config.get(CONF_PROTOCOL)
ATTR_POWERSAVE = 'power_save_mode' ATTR_SIGNAL_STRENGTH = 'signal_strength' ATTR_UNSEEN_VIDEOS = 'unseen_videos' ATTR_LAST_REFRESH = 'last_refresh' CONF_FFMPEG_ARGUMENTS = 'ffmpeg_arguments' DEFAULT_ARGUMENTS = '-pred 1' POWERSAVE_MODE_MAPPING = { 1: 'best_battery_life', 2: 'optimized', 3: 'best_video' } PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_FFMPEG_ARGUMENTS, default=DEFAULT_ARGUMENTS): cv.string, }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up an Arlo IP Camera.""" arlo = hass.data[DATA_ARLO] cameras = [] for camera in arlo.cameras: cameras.append(ArloCam(hass, camera, config)) add_entities(cameras) class ArloCam(Camera):
from homeassistant.helpers.aiohttp_client import async_get_clientsession from homeassistant.helpers import config_validation as cv from homeassistant.util.async import run_coroutine_threadsafe _LOGGER = logging.getLogger(__name__) CONF_LIMIT_REFETCH_TO_URL_CHANGE = 'limit_refetch_to_url_change' CONF_STILL_IMAGE_URL = 'still_image_url' DEFAULT_NAME = 'Generic Camera' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_STILL_IMAGE_URL): cv.template, vol.Optional(CONF_AUTHENTICATION, default=HTTP_BASIC_AUTHENTICATION): vol.In([HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION]), 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, }) @asyncio.coroutine # pylint: disable=unused-argument def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Setup a generic IP Camera.""" async_add_devices([GenericCamera(hass, config)]) class GenericCamera(Camera): """A generic implementation of an IP camera."""
DEFAULT_IMAGE_QUALITIY = 7 DEFAULT_IMAGE_ROTATION = 0 DEFAULT_IMAGE_WIDTH = 640 DEFAULT_NAME = 'Raspberry Pi Camera' DEFAULT_TIMELAPSE = 1000 DEFAULT_VERTICAL_FLIP = 0 PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_FILE_PATH): cv.isfile, vol.Optional(CONF_HORIZONTAL_FLIP, default=DEFAULT_HORIZONTAL_FLIP): vol.All(vol.Coerce(int), vol.Range(min=0, max=1)), vol.Optional(CONF_IMAGE_HEIGHT, default=DEFAULT_HORIZONTAL_FLIP): vol.Coerce(int), vol.Optional(CONF_IMAGE_QUALITY, default=DEFAULT_IMAGE_QUALITIY): vol.All(vol.Coerce(int), vol.Range(min=0, max=100)), vol.Optional(CONF_IMAGE_ROTATION, default=DEFAULT_IMAGE_ROTATION): vol.All(vol.Coerce(int), vol.Range(min=0, max=359)), vol.Optional(CONF_IMAGE_WIDTH, default=DEFAULT_IMAGE_WIDTH): vol.Coerce(int), vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_TIMELAPSE, default=1000): vol.Coerce(int), vol.Optional(CONF_VERTICAL_FLIP, default=DEFAULT_VERTICAL_FLIP): vol.All(vol.Coerce(int), vol.Range(min=0, max=1)), }) def setup_platform(hass, config, add_devices, discovery_info=None): """Setup the Raspberry Camera.""" if shutil.which("raspistill") is None: _LOGGER.error("'raspistill' was not found") return False
ATTR_INFRARED_LIGHT = "INFRARED_LIGHT" ATTR_PRIVACY = "PRIVACY" ATTR_SLEEP = "SLEEP" ATTR_MOBILE_TRACKING = "MOBILE_TRACKING" CAMERA_SCHEMA = vol.Schema({ vol.Required(CONF_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string }) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Optional(CONF_REGION, default=DEFAULT_REGION): cv.string, vol.Optional(ATTR_CAMERAS, default={}): { cv.string: CAMERA_SCHEMA } }) SERVICE_SET_SWITCH_SCHEMA = vol.Schema({ vol.Required(ATTR_SERIAL): cv.string, vol.Required(ATTR_SWITCH): vol.In([ ATTR_LIGHT, ATTR_SOUND, ATTR_INFRARED_LIGHT, ATTR_PRIVACY, ATTR_SLEEP, ATTR_MOBILE_TRACKING ]), vol.Optional(ATTR_ENABLE):
_LOGGER = logging.getLogger(__name__) REQUIREMENTS = ['libpyfoscam==1.0'] CONF_IP = 'ip' DEFAULT_NAME = 'Foscam Camera' DEFAULT_PORT = 88 FOSCAM_COMM_ERROR = -8 PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_IP): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Required(CONF_USERNAME): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Optional(CONF_PORT, default=DEFAULT_PORT): cv.port, }) # pylint: disable=unused-argument def setup_platform(hass, config, add_devices, discovery_info=None): """Set up a Foscam IP Camera.""" add_devices([FoscamCam(config)]) class FoscamCam(Camera): """An implementation of a Foscam IP camera.""" def __init__(self, device_info):
from homeassistant.const import CONF_NAME from homeassistant.components.camera import Camera, PLATFORM_SCHEMA from homeassistant.components.ffmpeg import (DATA_FFMPEG, CONF_INPUT, CONF_EXTRA_ARGUMENTS) import homeassistant.helpers.config_validation as cv from homeassistant.helpers.aiohttp_client import (async_aiohttp_proxy_stream) _LOGGER = logging.getLogger(__name__) DEPENDENCIES = ['ffmpeg'] DEFAULT_NAME = 'FFmpeg' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_INPUT): cv.string, vol.Optional(CONF_EXTRA_ARGUMENTS): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, }) @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Set up a FFmpeg camera.""" if not hass.data[DATA_FFMPEG].async_run_test(config.get(CONF_INPUT)): return async_add_devices([FFmpegCamera(hass, config)]) class FFmpegCamera(Camera): """An implementation of an FFmpeg camera."""
STREAMING_API = 'SYNO.SurveillanceStation.VideoStream' SESSION_ID = '0' WEBAPI_PATH = '/webapi/' AUTH_PATH = 'auth.cgi' CAMERA_PATH = 'camera.cgi' STREAMING_PATH = 'SurveillanceStation/videoStreaming.cgi' CONTENT_TYPE_HEADER = 'Content-Type' SYNO_API_URL = '{0}{1}{2}' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, vol.Required(CONF_USERNAME): cv.string, vol.Required(CONF_PASSWORD): cv.string, vol.Required(CONF_URL): cv.string, vol.Optional(CONF_TIMEOUT, default=DEFAULT_TIMEOUT): cv.positive_int, vol.Optional(CONF_WHITELIST, default=[]): cv.ensure_list, vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, }) @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Setup a Synology IP Camera.""" verify_ssl = config.get(CONF_VERIFY_SSL) timeout = config.get(CONF_TIMEOUT) websession_init = async_get_clientsession(hass, verify_ssl) # Determine API to use for authentication syno_api_url = SYNO_API_URL.format(
RTSP_TRANSPORTS, ) _LOGGER = logging.getLogger(__name__) PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend( { vol.Required(vol.Any(CONF_STILL_IMAGE_URL, CONF_STREAM_SOURCE)): cv.template, vol.Optional(vol.Any(CONF_STILL_IMAGE_URL, CONF_STREAM_SOURCE)): cv.template, vol.Optional(CONF_AUTHENTICATION, default=HTTP_BASIC_AUTHENTICATION): vol.In( [HTTP_BASIC_AUTHENTICATION, HTTP_DIGEST_AUTHENTICATION] ), 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, vol.Optional(CONF_CONTENT_TYPE, default=DEFAULT_CONTENT_TYPE): cv.string, vol.Optional(CONF_FRAMERATE, default=2): vol.Any( cv.small_float, cv.positive_int ), vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, vol.Optional(CONF_RTSP_TRANSPORT): vol.In(RTSP_TRANSPORTS.keys()), } ) async def async_setup_platform( hass: HomeAssistant, config: ConfigType, async_add_entities: AddEntitiesCallback,
from homeassistant.components.camera import Camera, PLATFORM_SCHEMA from homeassistant.components.ffmpeg import ( async_run_test, get_binary, CONF_INPUT, CONF_EXTRA_ARGUMENTS) import homeassistant.helpers.config_validation as cv from homeassistant.const import CONF_NAME from homeassistant.util.async import run_coroutine_threadsafe DEPENDENCIES = ['ffmpeg'] _LOGGER = logging.getLogger(__name__) DEFAULT_NAME = 'FFmpeg' PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Required(CONF_INPUT): cv.string, vol.Optional(CONF_EXTRA_ARGUMENTS): cv.string, vol.Optional(CONF_NAME, default=DEFAULT_NAME): cv.string, }) @asyncio.coroutine def async_setup_platform(hass, config, async_add_devices, discovery_info=None): """Setup a FFmpeg Camera.""" if not async_run_test(hass, config.get(CONF_INPUT)): return yield from async_add_devices([FFmpegCamera(hass, config)]) class FFmpegCamera(Camera): """An implementation of an FFmpeg camera."""
from . import CameraData _LOGGER = logging.getLogger(__name__) CONF_HOME = 'home' CONF_CAMERAS = 'cameras' CONF_QUALITY = 'quality' DEFAULT_QUALITY = 'high' VALID_QUALITIES = ['high', 'medium', 'low', 'poor'] PLATFORM_SCHEMA = PLATFORM_SCHEMA.extend({ vol.Optional(CONF_VERIFY_SSL, default=True): cv.boolean, vol.Optional(CONF_HOME): cv.string, vol.Optional(CONF_CAMERAS, default=[]): vol.All(cv.ensure_list, [cv.string]), vol.Optional(CONF_QUALITY, default=DEFAULT_QUALITY): vol.All(cv.string, vol.In(VALID_QUALITIES)), }) def setup_platform(hass, config, add_entities, discovery_info=None): """Set up access to Netatmo cameras.""" home = config.get(CONF_HOME) verify_ssl = config.get(CONF_VERIFY_SSL, True) quality = config.get(CONF_QUALITY, DEFAULT_QUALITY) import pyatmo auth = hass.data[DATA_NETATMO_AUTH] try: