async def connect(self, conn_id, connection_string):
        """Asynchronously connect to a device

        Args:
            conn_id (int): A unique identifer that will refer to this connection
            connection_string (string): A DeviceAdapter specific string that can be used to connect to
                a device using this DeviceAdapter.
            callback (callable): A function that will be called when the connection attempt finishes as
                callback(conection_id, adapter_id, success: bool, failure_reason: string or None)
        """

        id_number = int(connection_string)
        if id_number not in self.devices:
            raise DeviceAdapterError(conn_id, 'connect', 'device not found')

        if self._get_conn_id(connection_string) is not None:
            raise DeviceAdapterError(conn_id, 'connect', 'device already connected')

        dev = self.devices[id_number]

        if dev.connected:
            raise DeviceAdapterError(conn_id, 'connect', 'device already connected')

        dev.connected = True

        self._setup_connection(conn_id, connection_string)
        self._track_property(conn_id, 'device', dev)