Example #1
0
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
Example #2
0
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
Example #3
0
    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))
Example #4
0
    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))