docs: def subscribe(self, topic, qos=0):
          # type: (str, int) -> Tuple[int, int]
          """
          Subscribe to a certain topic.
  
          :param topic: a string specifying the subscription topic to
              subscribe to.
          :param qos: the desired quality of service level for the subscription.
                      Defaults to 0.
  
          :rtype: (int, int)
          :result: (result, mid)
  
          A topic is a UTF-8 string, which is used by the broker to filter
          messages for each connected client. A topic consists of one or more
          topic levels. Each topic level is separated by a forward slash
          (topic level separator).
  
          The function returns a tuple (result, mid), where result is
          MQTT_ERR_SUCCESS to indicate success or (MQTT_ERR_NO_CONN, None) if the
          client is not currently connected.  mid is the message ID for the
          subscribe request. The mid value can be used to track the subscribe
          request by checking against the mid argument in the on_subscribe()
          callback if it is defined.
  
          **Topic example:** `myhome/groundfloor/livingroom/temperature`
  
          """
          # TODO: add support for list of topics
  
          # don't subscribe if already subscribed
          # try to subscribe
          result, mid = self.client.subscribe(topic=topic, qos=qos)
  
          # if successful add to topics
          if result == MQTT_ERR_SUCCESS:
              self.topics[topic] = TopicQos(topic=topic, qos=qos)
              logger.debug('Subscribed to topic: {0}, qos: {1}'
                           .format(topic, qos))
          else:
              logger.error('Error {0} subscribing to topic: {1}'
                           .format(result, topic))
  
          return (result, mid)