1
0
mirror of https://github.com/esphome/esphome.git synced 2025-03-14 06:38:17 +00:00

Merge 0c99f034c18eb027870532b78f0f0dcebf71835c into 755b0bbfc7d404d9ce1a4a02ee8c99c4c838e63f

This commit is contained in:
Dusan Cervenka 2025-02-23 17:43:07 +01:00 committed by GitHub
commit cbce096999
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 48 additions and 12 deletions

View File

@ -382,23 +382,23 @@ async def to_code(config):
if not birth_message:
cg.add(var.disable_birth_message())
else:
cg.add(var.set_birth_message(exp_mqtt_message(birth_message)))
cg.add(var.set_birth_message(exp_mqtt_message(birth_message), CORE.name))
will_message = config[CONF_WILL_MESSAGE]
if not will_message:
cg.add(var.disable_last_will())
else:
cg.add(var.set_last_will(exp_mqtt_message(will_message)))
cg.add(var.set_last_will(exp_mqtt_message(will_message), CORE.name))
shutdown_message = config[CONF_SHUTDOWN_MESSAGE]
if not shutdown_message:
cg.add(var.disable_shutdown_message())
else:
cg.add(var.set_shutdown_message(exp_mqtt_message(shutdown_message)))
cg.add(var.set_shutdown_message(exp_mqtt_message(shutdown_message), CORE.name))
log_topic = config[CONF_LOG_TOPIC]
if not log_topic:
cg.add(var.disable_log_message())
else:
cg.add(var.set_log_message_template(exp_mqtt_message(log_topic)))
cg.add(var.set_log_message_template(exp_mqtt_message(log_topic), CORE.name))
if CONF_LEVEL in log_topic:
cg.add(var.set_log_level(logger.LOG_LEVELS[log_topic[CONF_LEVEL]]))

View File

@ -22,6 +22,9 @@
#include "esphome/components/dashboard_import/dashboard_import.h"
#endif
#include <iostream>
#include <sstream>
namespace esphome {
namespace mqtt {
@ -84,6 +87,29 @@ void MQTTClientComponent::setup() {
}
}
void MQTTClientComponent::parse_topic_(const std::string &topic, std::string &top_name, std::string &rest) {
std::stringstream ss(topic);
// Extract the first part
if (std::getline(ss, top_name, '/')) {
// Extract the rest of the string
std::getline(ss, rest); // Reads everything after the first '/'
rest = "/" + rest;
} else {
top_name = topic; // If no delimiter, the whole string is the first name
rest = ""; // No rest part
}
}
void MQTTClientComponent::fix_topic_(std::string &topic, const std::string &check_topic_prefix) {
if (App.is_name_add_mac_suffix_enabled()) {
std::string top_name(""), rest("");
parse_topic_(topic, top_name, rest);
if (top_name == check_topic_prefix) {
topic = str_sanitize(App.get_name()) + rest;
}
}
}
void MQTTClientComponent::send_device_info_() {
if (!this->is_connected() or !this->is_discovery_ip_enabled()) {
return;
@ -604,7 +630,10 @@ void MQTTClientComponent::set_reboot_timeout(uint32_t reboot_timeout) { this->re
void MQTTClientComponent::register_mqtt_component(MQTTComponent *component) { this->children_.push_back(component); }
void MQTTClientComponent::set_log_level(int level) { this->log_level_ = level; }
void MQTTClientComponent::set_keep_alive(uint16_t keep_alive_s) { this->mqtt_backend_.set_keep_alive(keep_alive_s); }
void MQTTClientComponent::set_log_message_template(MQTTMessage &&message) { this->log_message_ = std::move(message); }
void MQTTClientComponent::set_log_message_template(MQTTMessage &&message, const std::string &check_topic_prefix) {
this->log_message_ = std::move(message);
fix_topic_(this->log_message_.topic, check_topic_prefix);
}
const MQTTDiscoveryInfo &MQTTClientComponent::get_discovery_info() const { return this->discovery_info_; }
void MQTTClientComponent::set_topic_prefix(const std::string &topic_prefix, const std::string &check_topic_prefix) {
if (App.is_name_add_mac_suffix_enabled() && (topic_prefix == check_topic_prefix)) {
@ -639,17 +668,22 @@ void MQTTClientComponent::recalculate_availability_() {
this->availability_.payload_not_available = this->last_will_.payload;
}
void MQTTClientComponent::set_last_will(MQTTMessage &&message) {
void MQTTClientComponent::set_last_will(MQTTMessage &&message, const std::string &check_topic_prefix) {
this->last_will_ = std::move(message);
fix_topic_(this->last_will_.topic, check_topic_prefix);
this->recalculate_availability_();
}
void MQTTClientComponent::set_birth_message(MQTTMessage &&message) {
void MQTTClientComponent::set_birth_message(MQTTMessage &&message, const std::string &check_topic_prefix) {
this->birth_message_ = std::move(message);
fix_topic_(this->birth_message_.topic, check_topic_prefix);
this->recalculate_availability_();
}
void MQTTClientComponent::set_shutdown_message(MQTTMessage &&message) { this->shutdown_message_ = std::move(message); }
void MQTTClientComponent::set_shutdown_message(MQTTMessage &&message, const std::string &check_topic_prefix) {
this->shutdown_message_ = std::move(message);
fix_topic_(this->shutdown_message_.topic, check_topic_prefix);
}
void MQTTClientComponent::set_discovery_info(std::string &&prefix, MQTTDiscoveryUniqueIdGenerator unique_id_generator,
MQTTDiscoveryObjectIdGenerator object_id_generator, bool retain,

View File

@ -101,16 +101,16 @@ class MQTTClientComponent : public Component {
MQTTClientComponent();
/// Set the last will testament message.
void set_last_will(MQTTMessage &&message);
void set_last_will(MQTTMessage &&message, const std::string &check_topic_prefix);
/// Remove the last will testament message.
void disable_last_will();
/// Set the birth message.
void set_birth_message(MQTTMessage &&message);
void set_birth_message(MQTTMessage &&message, const std::string &check_topic_prefix);
/// Remove the birth message.
void disable_birth_message();
void set_shutdown_message(MQTTMessage &&message);
void set_shutdown_message(MQTTMessage &&message, const std::string &check_topic_prefix);
void disable_shutdown_message();
/// Set the keep alive time in seconds, every 0.7*keep_alive a ping will be sent.
@ -170,7 +170,7 @@ class MQTTClientComponent : public Component {
const std::string &get_topic_prefix() const;
/// Manually set the topic used for logging.
void set_log_message_template(MQTTMessage &&message);
void set_log_message_template(MQTTMessage &&message, const std::string &check_topic_prefix);
void set_log_level(int level);
/// Get the topic used for logging. Defaults to "<topic_prefix>/debug" and the value is cached for speed.
void disable_log_message();
@ -268,6 +268,8 @@ class MQTTClientComponent : public Component {
bool is_publish_nan_as_none() const;
protected:
void parse_topic_(const std::string &topic, std::string &top_name, std::string &rest);
void fix_topic_(std::string &topic, const std::string &check_topic_prefix);
void send_device_info_();
/// Reconnect to the MQTT broker if not already connected.