docs: def job_add(self, callback, parameters=None, hours=0, minutes=0, seconds=0, tolerate_exceptions=True, expiration=None):
  		"""
  		Add a job to the job manager.
  
  		:param function callback: The function to run asynchronously.
  		:param parameters: The parameters to be provided to the callback.
  		:type parameters: list, tuple
  		:param int hours: Number of hours to sleep between running the callback.
  		:param int minutes: Number of minutes to sleep between running the callback.
  		:param int seconds: Number of seconds to sleep between running the callback.
  		:param bool tolerate_execptions: Whether to continue running a job after it has thrown an exception.
  		:param expiration: When to expire and remove the job. If an integer
  			is provided, the job will be executed that many times.  If a
  			datetime or timedelta instance is provided, then the job will
  			be removed after the specified time.
  		:type expiration: int, :py:class:`datetime.timedelta`, :py:class:`datetime.datetime`
  		:return: The job id.
  		:rtype: :py:class:`uuid.UUID`
  		"""
  		if not self._thread_running.is_set():
  			raise RuntimeError('the JobManager is not running')
  		parameters = (parameters or ())
  		if not isinstance(parameters, (list, tuple)):
  			parameters = (parameters,)
  		job_desc = {}
  		job_desc['job'] = JobRun(callback, parameters)
  		job_desc['last_run'] = None
  		job_desc['run_every'] = datetime.timedelta(0, ((hours * 60 * 60) + (minutes * 60) + seconds))
  		job_desc['callback'] = callback
  		job_desc['parameters'] = parameters
  		job_desc['enabled'] = True
  		job_desc['tolerate_exceptions'] = tolerate_exceptions
  		job_desc['run_count'] = 0
  		if isinstance(expiration, int):
  			job_desc['expiration'] = expiration
  		elif isinstance(expiration, datetime.timedelta):
  			job_desc['expiration'] = self.now() + expiration
  		elif isinstance(expiration, datetime.datetime):
  			job_desc['expiration'] = expiration
  		else:
  			job_desc['expiration'] = None
  		job_id = uuid.uuid4()
  		self.logger.info('adding new job with id: ' + str(job_id) + ' and callback function: ' + callback.__name__)
  		with self._job_lock:
  			self._jobs[job_id] = job_desc
  		return job_id