From 76a6c39f25f187d9b9209c857df2c6a5881d761e Mon Sep 17 00:00:00 2001 From: Anthony Uk <1492471+dataway@users.noreply.github.com> Date: Thu, 8 Apr 2021 14:21:42 +0200 Subject: [PATCH] mqtt_client: Added MQTTClientComponent::unsubscribe() (#1672) Co-authored-by: Otto Winter --- esphome/components/mqtt/mqtt_client.cpp | 20 ++++++++++++++++++++ esphome/components/mqtt/mqtt_client.h | 9 +++++++++ 2 files changed, 29 insertions(+) diff --git a/esphome/components/mqtt/mqtt_client.cpp b/esphome/components/mqtt/mqtt_client.cpp index 2eb1c52153..190df0b2f3 100644 --- a/esphome/components/mqtt/mqtt_client.cpp +++ b/esphome/components/mqtt/mqtt_client.cpp @@ -347,6 +347,26 @@ void MQTTClientComponent::subscribe_json(const std::string &topic, mqtt_json_cal this->subscriptions_.push_back(subscription); } +void MQTTClientComponent::unsubscribe(const std::string &topic) { + uint16_t ret = this->mqtt_client_.unsubscribe(topic.c_str()); + yield(); + if (ret != 0) { + ESP_LOGV(TAG, "unsubscribe(topic='%s')", topic.c_str()); + } else { + delay(5); + ESP_LOGV(TAG, "Unsubscribe failed for topic='%s'.", topic.c_str()); + this->status_momentary_warning("unsubscribe", 1000); + } + + auto it = subscriptions_.begin(); + while (it != subscriptions_.end()) { + if (it->topic == topic) + it = subscriptions_.erase(it); + else + ++it; + } +} + // Publish bool MQTTClientComponent::publish(const std::string &topic, const std::string &payload, uint8_t qos, bool retain) { return this->publish(topic, payload.data(), payload.size(), qos, retain); diff --git a/esphome/components/mqtt/mqtt_client.h b/esphome/components/mqtt/mqtt_client.h index 2bbebff845..885f4a9a96 100644 --- a/esphome/components/mqtt/mqtt_client.h +++ b/esphome/components/mqtt/mqtt_client.h @@ -159,6 +159,15 @@ class MQTTClientComponent : public Component { */ void subscribe_json(const std::string &topic, mqtt_json_callback_t callback, uint8_t qos = 0); + /** Unsubscribe from an MQTT topic. + * + * If multiple existing subscriptions to the same topic exist, all of them will be removed. + * + * @param topic The topic to unsubscribe from. + * Must match the topic in the original subscribe or subscribe_json call exactly. + */ + void unsubscribe(const std::string &topic); + /** Publish a MQTTMessage * * @param message The message.