diff --git a/homeassistant/components/mqtt/client.py b/homeassistant/components/mqtt/client.py index 164632cdd10..2f6c6dc648c 100644 --- a/homeassistant/components/mqtt/client.py +++ b/homeassistant/components/mqtt/client.py @@ -818,25 +818,29 @@ class MQTT: @callback def _mqtt_handle_message(self, msg: mqtt.MQTTMessage) -> None: + topic = msg.topic + # msg.topic is a property that decodes the topic to a string + # every time it is accessed. Save the result to avoid + # decoding the same topic multiple times. _LOGGER.debug( "Received%s message on %s (qos=%s): %s", " retained" if msg.retain else "", - msg.topic, + topic, msg.qos, msg.payload[0:8192], ) timestamp = dt_util.utcnow() - subscriptions = self._matching_subscriptions(msg.topic) + subscriptions = self._matching_subscriptions(topic) for subscription in subscriptions: if msg.retain: retained_topics = self._retained_topics.setdefault(subscription, set()) # Skip if the subscription already received a retained message - if msg.topic in retained_topics: + if topic in retained_topics: continue # Remember the subscription had an initial retained message - self._retained_topics[subscription].add(msg.topic) + self._retained_topics[subscription].add(topic) payload: SubscribePayloadType = msg.payload if subscription.encoding is not None: @@ -846,7 +850,7 @@ class MQTT: _LOGGER.warning( "Can't decode payload %s on %s with encoding %s (for %s)", msg.payload[0:8192], - msg.topic, + topic, subscription.encoding, subscription.job, ) @@ -854,7 +858,7 @@ class MQTT: self.hass.async_run_hass_job( subscription.job, ReceiveMessage( - msg.topic, + topic, payload, msg.qos, msg.retain,