docs: def needs_sync(self):
          """
          Check if enough time has elapsed to perform a sync().
  
          A call to sync() should be performed every now and then, no matter what
          has_state_changed() says. This is really just a safety thing to enforce
          consistency in case the state gets messed up.
  
          :rtype: boolean
          """
          if self.lastforce is None:
              self.lastforce = time.time()
          return time.time() - self.lastforce >= self.forceipchangedetection_sleep