async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up Android IP Webcam from a config entry.""" websession = async_get_clientsession(hass) cam = PyDroidIPCam( websession, entry.data[CONF_HOST], entry.data[CONF_PORT], username=entry.data.get(CONF_USERNAME), password=entry.data.get(CONF_PASSWORD), ssl=False, ) coordinator = AndroidIPCamDataUpdateCoordinator(hass, entry, cam) await coordinator.async_config_entry_first_refresh() hass.data.setdefault(DOMAIN, {})[entry.entry_id] = coordinator await hass.config_entries.async_forward_entry_setups(entry, PLATFORMS) return True
async def validate_input(hass: HomeAssistant, data: dict[str, Any]) -> dict[str, str]: """Validate the user input allows us to connect.""" websession = async_get_clientsession(hass) cam = PyDroidIPCam( websession, data[CONF_HOST], data[CONF_PORT], username=data.get(CONF_USERNAME), password=data.get(CONF_PASSWORD), ssl=False, ) errors = {} try: await cam.update() except Unauthorized: errors[CONF_USERNAME] = "invalid_auth" errors[CONF_PASSWORD] = "invalid_auth" except PyDroidIPCamException: errors["base"] = "cannot_connect" return errors
async def async_setup_ipcamera(cam_config): """Set up an IP camera.""" host = cam_config[CONF_HOST] username = cam_config.get(CONF_USERNAME) password = cam_config.get(CONF_PASSWORD) name = cam_config[CONF_NAME] interval = cam_config[CONF_SCAN_INTERVAL] switches = cam_config.get(CONF_SWITCHES) sensors = cam_config.get(CONF_SENSORS) motion = cam_config.get(CONF_MOTION_SENSOR) # Init ip webcam cam = PyDroidIPCam(hass.loop, websession, host, cam_config[CONF_PORT], username=username, password=password, timeout=cam_config[CONF_TIMEOUT]) if switches is None: switches = [ setting for setting in cam.enabled_settings if setting in SWITCHES ] if sensors is None: sensors = [ sensor for sensor in cam.enabled_sensors if sensor in SENSORS ] sensors.extend(['audio_connections', 'video_connections']) if motion is None: motion = 'motion_active' in cam.enabled_sensors async def async_update_data(now): """Update data from IP camera in SCAN_INTERVAL.""" await cam.update() async_dispatcher_send(hass, SIGNAL_UPDATE_DATA, host) async_track_point_in_utc_time(hass, async_update_data, utcnow() + interval) await async_update_data(None) # Load platforms webcams[host] = cam mjpeg_camera = { CONF_PLATFORM: 'mjpeg', CONF_MJPEG_URL: cam.mjpeg_url, CONF_STILL_IMAGE_URL: cam.image_url, CONF_NAME: name, } if username and password: mjpeg_camera.update({ CONF_USERNAME: username, CONF_PASSWORD: password }) hass.async_create_task( discovery.async_load_platform(hass, 'camera', 'mjpeg', mjpeg_camera, config)) if sensors: hass.async_create_task( discovery.async_load_platform(hass, 'sensor', DOMAIN, { CONF_NAME: name, CONF_HOST: host, CONF_SENSORS: sensors, }, config)) if switches: hass.async_create_task( discovery.async_load_platform(hass, 'switch', DOMAIN, { CONF_NAME: name, CONF_HOST: host, CONF_SWITCHES: switches, }, config)) if motion: hass.async_create_task( discovery.async_load_platform(hass, 'binary_sensor', DOMAIN, { CONF_HOST: host, CONF_NAME: name, }, config))
async def async_setup_ipcamera(cam_config): """Set up an IP camera.""" host = cam_config[CONF_HOST] username: str | None = cam_config.get(CONF_USERNAME) password: str | None = cam_config.get(CONF_PASSWORD) name: str = cam_config[CONF_NAME] interval = cam_config[CONF_SCAN_INTERVAL] switches = cam_config.get(CONF_SWITCHES) sensors = cam_config.get(CONF_SENSORS) motion = cam_config.get(CONF_MOTION_SENSOR) # Init ip webcam cam = PyDroidIPCam( websession, host, cam_config[CONF_PORT], username=username, password=password, timeout=cam_config[CONF_TIMEOUT], ssl=False, ) if switches is None: switches = [ setting for setting in cam.enabled_settings if setting in SWITCHES ] if sensors is None: sensors = [ sensor for sensor in cam.enabled_sensors if sensor in SENSORS ] sensors.extend(["audio_connections", "video_connections"]) if motion is None: motion = "motion_active" in cam.enabled_sensors async def async_update_data(now): """Update data from IP camera in SCAN_INTERVAL.""" await cam.update() async_dispatcher_send(hass, SIGNAL_UPDATE_DATA, host) async_track_point_in_utc_time(hass, async_update_data, utcnow() + interval) await async_update_data(None) # Load platforms webcams[host] = cam mjpeg_camera = { CONF_MJPEG_URL: cam.mjpeg_url, CONF_STILL_IMAGE_URL: cam.image_url, } if username and password: mjpeg_camera.update({ CONF_USERNAME: username, CONF_PASSWORD: password }) # Remove incorrect config entry setup via mjpeg platform discovery. mjpeg_config_entry = next( (config_entry for config_entry in hass.config_entries.async_entries("mjpeg") if all( config_entry.options.get(key) == val for key, val in mjpeg_camera.items())), None, ) if mjpeg_config_entry: await hass.config_entries.async_remove(mjpeg_config_entry.entry_id) mjpeg_camera[CONF_NAME] = name hass.async_create_task( discovery.async_load_platform(hass, Platform.CAMERA, DOMAIN, mjpeg_camera, config)) if sensors: hass.async_create_task( discovery.async_load_platform( hass, Platform.SENSOR, DOMAIN, { CONF_NAME: name, CONF_HOST: host, CONF_SENSORS: sensors }, config, )) if switches: hass.async_create_task( discovery.async_load_platform( hass, Platform.SWITCH, DOMAIN, { CONF_NAME: name, CONF_HOST: host, CONF_SWITCHES: switches }, config, )) if motion: hass.async_create_task( discovery.async_load_platform( hass, Platform.BINARY_SENSOR, DOMAIN, { CONF_HOST: host, CONF_NAME: name }, config, ))
def async_setup_ipcamera(cam_config): """Setup a ip camera.""" host = cam_config[CONF_HOST] username = cam_config.get(CONF_USERNAME) password = cam_config.get(CONF_PASSWORD) name = cam_config[CONF_NAME] interval = cam_config[CONF_SCAN_INTERVAL] switches = cam_config[CONF_SWITCHES] sensors = cam_config[CONF_SENSORS] motion = cam_config[CONF_MOTION_SENSOR] # init ip webcam cam = PyDroidIPCam(hass.loop, websession, host, cam_config[CONF_PORT], username=username, password=password, timeout=cam_config[CONF_TIMEOUT]) @asyncio.coroutine def async_update_data(now): """Update data from ipcam in SCAN_INTERVAL.""" yield from cam.update() async_dispatcher_send(hass, SIGNAL_UPDATE_DATA, host) async_track_point_in_utc_time(hass, async_update_data, utcnow() + interval) yield from async_update_data(None) # use autodiscovery to detect sensors/configs if cam_config[CONF_AUTO_DISCOVERY]: if not cam.available: _LOGGER.error("Android webcam %s not found for discovery!", cam.base_url) return sensors = [ sensor for sensor in cam.enabled_sensors if sensor in SENSORS ] switches = [ setting for setting in cam.enabled_settings if setting in SWITCHES ] motion = True if 'motion_active' in cam.enabled_sensors else False sensors.extend(['audio_connections', 'video_connections']) # load platforms webcams[host] = cam mjpeg_camera = { CONF_PLATFORM: 'mjpeg', CONF_MJPEG_URL: cam.mjpeg_url, CONF_STILL_IMAGE_URL: cam.image_url, CONF_NAME: name, } if username and password: mjpeg_camera.update({ CONF_USERNAME: username, CONF_PASSWORD: password }) hass.async_add_job( discovery.async_load_platform(hass, 'camera', 'mjpeg', mjpeg_camera, config)) if sensors: hass.async_add_job( discovery.async_load_platform(hass, 'sensor', DOMAIN, { CONF_NAME: name, CONF_HOST: host, CONF_SENSORS: sensors, }, config)) if switches: hass.async_add_job( discovery.async_load_platform(hass, 'switch', DOMAIN, { CONF_NAME: name, CONF_HOST: host, CONF_SWITCHES: switches, }, config)) if motion: hass.async_add_job( discovery.async_load_platform(hass, 'binary_sensor', DOMAIN, { CONF_HOST: host, CONF_NAME: name, }, config))