ESPHome  2024.10.2
mqtt_component.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "esphome/core/defines.h"
4 
5 #ifdef USE_MQTT
6 
7 #include <memory>
8 
12 #include "mqtt_client.h"
13 
14 namespace esphome {
15 namespace mqtt {
16 
19  bool state_topic{true};
20  bool command_topic{true};
21 };
22 
23 #define LOG_MQTT_COMPONENT(state_topic, command_topic) \
24  if (state_topic) { \
25  ESP_LOGCONFIG(TAG, " State Topic: '%s'", this->get_state_topic_().c_str()); \
26  } \
27  if (command_topic) { \
28  ESP_LOGCONFIG(TAG, " Command Topic: '%s'", this->get_command_topic_().c_str()); \
29  }
30 
31 #define MQTT_COMPONENT_CUSTOM_TOPIC_(name, type) \
32  protected: \
33  std::string custom_##name##_##type##_topic_{}; \
34 \
35  public: \
36  void set_custom_##name##_##type##_topic(const std::string &topic) { this->custom_##name##_##type##_topic_ = topic; } \
37  std::string get_##name##_##type##_topic() const { \
38  if (this->custom_##name##_##type##_topic_.empty()) \
39  return this->get_default_topic_for_(#name "/" #type); \
40  return this->custom_##name##_##type##_topic_; \
41  }
42 
43 #define MQTT_COMPONENT_CUSTOM_TOPIC(name, type) MQTT_COMPONENT_CUSTOM_TOPIC_(name, type)
44 
61 class MQTTComponent : public Component {
62  public:
64  explicit MQTTComponent();
65 
67  void call_setup() override;
68 
69  void call_loop() override;
70 
71  void call_dump_config() override;
72 
74  virtual void send_discovery(JsonObject root, SendDiscoveryConfig &config) = 0;
75 
76  virtual bool send_initial_state() = 0;
77 
78  virtual bool is_internal();
79 
81  void set_qos(uint8_t qos);
82  uint8_t get_qos() const;
83 
85  void set_retain(bool retain);
86  bool get_retain() const;
87 
89  void disable_discovery();
90  bool is_discovery_enabled() const;
91 
93  virtual std::string component_type() const = 0;
94 
96  void set_custom_state_topic(const char *custom_state_topic);
98  void set_custom_command_topic(const char *custom_command_topic);
100  void set_command_retain(bool command_retain);
101 
103  float get_setup_priority() const override;
104 
109  void set_availability(std::string topic, std::string payload_available, std::string payload_not_available);
110  void disable_availability();
111 
113  void schedule_resend_state();
114 
120  bool publish(const std::string &topic, const std::string &payload);
121 
127  bool publish_json(const std::string &topic, const json::json_build_t &f);
128 
135  void subscribe(const std::string &topic, mqtt_callback_t callback, uint8_t qos = 0);
136 
146  void subscribe_json(const std::string &topic, const mqtt_json_callback_t &callback, uint8_t qos = 0);
147 
148  protected:
150  std::string get_discovery_topic_(const MQTTDiscoveryInfo &discovery_info) const;
151 
157  std::string get_default_topic_for_(const std::string &suffix) const;
158 
162  virtual const EntityBase *get_entity() const = 0;
163 
169  virtual std::string unique_id();
170 
172  virtual std::string friendly_name() const;
173 
175  virtual std::string get_icon() const;
176 
178  virtual bool is_disabled_by_default() const;
179 
181  std::string get_state_topic_() const;
182 
184  std::string get_command_topic_() const;
185 
186  bool is_connected_() const;
187 
189  bool send_discovery_();
190 
191  // ========== INTERNAL METHODS ==========
192  // (In most use cases you won't need these)
194  std::string get_default_object_id_() const;
195 
196  StringRef custom_state_topic_{};
197  StringRef custom_command_topic_{};
198 
199  std::unique_ptr<Availability> availability_;
200 
201  bool has_custom_state_topic_{false};
202  bool has_custom_command_topic_{false};
203 
204  bool command_retain_{false};
205  bool retain_{true};
206  uint8_t qos_{0};
207  bool discovery_enabled_{true};
208  bool resend_state_{false};
209 };
210 
211 } // namespace mqtt
212 } // namespace esphome
213 
214 #endif // USE_MQTt
Internal struct for MQTT Home Assistant discovery.
Definition: mqtt_client.h:80
std::function< void(const std::string &, const std::string &)> mqtt_callback_t
Callback for MQTT subscriptions.
Definition: mqtt_client.h:35
bool state_topic
If the state topic should be included. Defaults to true.
StringRef is a reference to a string owned by something else.
Definition: string_ref.h:21
bool command_topic
If the command topic should be included. Default to true.
Simple Helper struct used for Home Assistant MQTT send_discovery().
std::function< void(JsonObject)> json_build_t
Callback function typedef for building JsonObjects.
Definition: json_util.h:20
std::unique_ptr< Availability > availability_
Implementation of SPI Controller mode.
Definition: a01nyub.cpp:7
std::function< void(const std::string &, JsonObject)> mqtt_json_callback_t
Definition: mqtt_client.h:36
MQTTComponent is the base class for all components that interact with MQTT to expose certain function...