'Start running function every interval seconds.
This overloads the LoopingCall default by offering the
start_delay keyword and ability to repeat.
Args:
interval (int): Repeat interval in seconds.
now (bool, optional): Whether to start immediately or after
`start_delay` seconds.
start_delay (int): The number of seconds before starting.
If None, wait interval seconds. Only valid if `now` is `False`.
It is used as a way to start with a variable start time
after a pause.
count_start (int): Number of repeats to start at. The  count
goes up every time the system repeats. This is used to
implement something repeating `N` number of times etc.
Raises:
AssertError: if trying to start a task which is already running.
ValueError: If interval is set to an invalid value < 0.
Notes:
As opposed to Twisted\'s inbuilt count mechanism, this
system will count also if force_repeat() was called rather
than just the number of `interval` seconds since the start.
This allows us to force-step through a limited number of
steps if we want.'

def start(self, interval, now=True, start_delay=None, count_start=0):

    assert (not self.running), 'Tried    to    start    an    already    running    ExtendedLoopingCall.'
    if (interval < 0):
        raise ValueError('interval    must    be    >=    0')
    self.running = True
    deferred = self._deferred = Deferred()
    self.starttime = self.clock.seconds()
    self.interval = interval
    self._runAtStart = now
    self.callcount = max(0, count_start)
    self.start_delay = (start_delay if (start_delay is None) else max(0, start_delay))
    if now:
        self()
    elif ((start_delay is not None) and (start_delay >= 0)):
        (real_interval, self.interval) = (self.interval, start_delay)
        self._scheduleFrom(self.starttime)
        self.interval = real_interval
    else:
        self._scheduleFrom(self.starttime)
    return deferred
