docs: def open(self, baudrate=BAUDRATE, no_reader_thread=False):
          """
          Opens the device.
  
          :param baudrate: baudrate to use
          :type baudrate: int
          :param no_reader_thread: whether or not to automatically start the
                                   reader thread.
          :type no_reader_thread: bool
  
          :raises: :py:class:`~alarmdecoder.util.NoDeviceError`
          """
          # Set up defaults
          if baudrate is None:
              baudrate = USBDevice.BAUDRATE
  
          self._read_thread = Device.ReadThread(self)
  
          # Open the device and start up the thread.
          try:
              self._device.open(self._vendor_id,
                                self._product_id,
                                self._endpoint,
                                self._device_number,
                                self._serial_number,
                                self._description)
  
              self._device.set_baudrate(baudrate)
  
              if not self._serial_number:
                  self._serial_number = self._get_serial_number()
  
              self._id = self._serial_number
  
          except (usb.core.USBError, FtdiError) as err:
              raise NoDeviceError('Error opening device: {0}'.format(str(err)), err)
  
          except KeyError as err:
              raise NoDeviceError('Unsupported device. ({0:04x}:{1:04x})  You probably need a newer version of pyftdi.'.format(err[0][0], err[0][1]))
  
          else:
              self._running = True
              self.on_open()
  
              if not no_reader_thread:
                  self._read_thread.start()
  
          return self