Command retain option for MQTT component (#3078)

This commit is contained in:
VitaliyKurokhtin 2022-01-23 00:05:37 -08:00 committed by GitHub
parent 97681d142e
commit 8187a4bce9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 304 additions and 289 deletions

View file

@ -11,6 +11,7 @@ from esphome.const import (
CONF_BROKER, CONF_BROKER,
CONF_CLIENT_ID, CONF_CLIENT_ID,
CONF_COMMAND_TOPIC, CONF_COMMAND_TOPIC,
CONF_COMMAND_RETAIN,
CONF_DISCOVERY, CONF_DISCOVERY,
CONF_DISCOVERY_PREFIX, CONF_DISCOVERY_PREFIX,
CONF_DISCOVERY_RETAIN, CONF_DISCOVERY_RETAIN,
@ -392,6 +393,8 @@ async def register_mqtt_component(var, config):
cg.add(var.set_custom_state_topic(config[CONF_STATE_TOPIC])) cg.add(var.set_custom_state_topic(config[CONF_STATE_TOPIC]))
if CONF_COMMAND_TOPIC in config: if CONF_COMMAND_TOPIC in config:
cg.add(var.set_custom_command_topic(config[CONF_COMMAND_TOPIC])) cg.add(var.set_custom_command_topic(config[CONF_COMMAND_TOPIC]))
if CONF_COMMAND_RETAIN in config:
cg.add(var.set_command_retain(config[CONF_COMMAND_RETAIN]))
if CONF_AVAILABILITY in config: if CONF_AVAILABILITY in config:
availability = config[CONF_AVAILABILITY] availability = config[CONF_AVAILABILITY]
if not availability: if not availability:

View file

@ -92,6 +92,8 @@ bool MQTTComponent::send_discovery_() {
root[MQTT_STATE_TOPIC] = this->get_state_topic_(); root[MQTT_STATE_TOPIC] = this->get_state_topic_();
if (config.command_topic) if (config.command_topic)
root[MQTT_COMMAND_TOPIC] = this->get_command_topic_(); root[MQTT_COMMAND_TOPIC] = this->get_command_topic_();
if (this->command_retain_)
root[MQTT_COMMAND_RETAIN] = true;
if (this->availability_ == nullptr) { if (this->availability_ == nullptr) {
if (!global_mqtt_client->get_availability().topic.empty()) { if (!global_mqtt_client->get_availability().topic.empty()) {
@ -165,6 +167,7 @@ void MQTTComponent::set_custom_state_topic(const std::string &custom_state_topic
void MQTTComponent::set_custom_command_topic(const std::string &custom_command_topic) { void MQTTComponent::set_custom_command_topic(const std::string &custom_command_topic) {
this->custom_command_topic_ = custom_command_topic; this->custom_command_topic_ = custom_command_topic;
} }
void MQTTComponent::set_command_retain(bool command_retain) { this->command_retain_ = command_retain; }
void MQTTComponent::set_availability(std::string topic, std::string payload_available, void MQTTComponent::set_availability(std::string topic, std::string payload_available,
std::string payload_not_available) { std::string payload_not_available) {

View file

@ -91,6 +91,8 @@ class MQTTComponent : public Component {
void set_custom_state_topic(const std::string &custom_state_topic); void set_custom_state_topic(const std::string &custom_state_topic);
/// Set a custom command topic. Set to "" for default behavior. /// Set a custom command topic. Set to "" for default behavior.
void set_custom_command_topic(const std::string &custom_command_topic); void set_custom_command_topic(const std::string &custom_command_topic);
/// Set whether command message should be retained.
void set_command_retain(bool command_retain);
/// MQTT_COMPONENT setup priority. /// MQTT_COMPONENT setup priority.
float get_setup_priority() const override; float get_setup_priority() const override;
@ -188,6 +190,7 @@ class MQTTComponent : public Component {
std::string custom_state_topic_{}; std::string custom_state_topic_{};
std::string custom_command_topic_{}; std::string custom_command_topic_{};
bool command_retain_{false};
bool retain_{true}; bool retain_{true};
bool discovery_enabled_{true}; bool discovery_enabled_{true};
std::unique_ptr<Availability> availability_; std::unique_ptr<Availability> availability_;

View file

@ -45,6 +45,7 @@ constexpr const char *const MQTT_CLEANING_TEMPLATE = "cln_tpl";
constexpr const char *const MQTT_COMMAND_OFF_TEMPLATE = "cmd_off_tpl"; constexpr const char *const MQTT_COMMAND_OFF_TEMPLATE = "cmd_off_tpl";
constexpr const char *const MQTT_COMMAND_ON_TEMPLATE = "cmd_on_tpl"; constexpr const char *const MQTT_COMMAND_ON_TEMPLATE = "cmd_on_tpl";
constexpr const char *const MQTT_COMMAND_TOPIC = "cmd_t"; constexpr const char *const MQTT_COMMAND_TOPIC = "cmd_t";
constexpr const char *const MQTT_COMMAND_RETAIN = "ret";
constexpr const char *const MQTT_COMMAND_TEMPLATE = "cmd_tpl"; constexpr const char *const MQTT_COMMAND_TEMPLATE = "cmd_tpl";
constexpr const char *const MQTT_CODE_ARM_REQUIRED = "cod_arm_req"; constexpr const char *const MQTT_CODE_ARM_REQUIRED = "cod_arm_req";
constexpr const char *const MQTT_CODE_DISARM_REQUIRED = "cod_dis_req"; constexpr const char *const MQTT_CODE_DISARM_REQUIRED = "cod_dis_req";
@ -297,6 +298,7 @@ constexpr const char *const MQTT_CLEANING_TEMPLATE = "cleaning_template";
constexpr const char *const MQTT_COMMAND_OFF_TEMPLATE = "command_off_template"; constexpr const char *const MQTT_COMMAND_OFF_TEMPLATE = "command_off_template";
constexpr const char *const MQTT_COMMAND_ON_TEMPLATE = "command_on_template"; constexpr const char *const MQTT_COMMAND_ON_TEMPLATE = "command_on_template";
constexpr const char *const MQTT_COMMAND_TOPIC = "command_topic"; constexpr const char *const MQTT_COMMAND_TOPIC = "command_topic";
constexpr const char *const MQTT_COMMAND_RETAIN = "retain";
constexpr const char *const MQTT_COMMAND_TEMPLATE = "command_template"; constexpr const char *const MQTT_COMMAND_TEMPLATE = "command_template";
constexpr const char *const MQTT_CODE_ARM_REQUIRED = "code_arm_required"; constexpr const char *const MQTT_CODE_ARM_REQUIRED = "code_arm_required";
constexpr const char *const MQTT_CODE_DISARM_REQUIRED = "code_disarm_required"; constexpr const char *const MQTT_CODE_DISARM_REQUIRED = "code_disarm_required";

View file

@ -17,6 +17,7 @@ from esphome.const import (
ALLOWED_NAME_CHARS, ALLOWED_NAME_CHARS,
CONF_AVAILABILITY, CONF_AVAILABILITY,
CONF_COMMAND_TOPIC, CONF_COMMAND_TOPIC,
CONF_COMMAND_RETAIN,
CONF_DISABLED_BY_DEFAULT, CONF_DISABLED_BY_DEFAULT,
CONF_DISCOVERY, CONF_DISCOVERY,
CONF_ENTITY_CATEGORY, CONF_ENTITY_CATEGORY,
@ -1591,6 +1592,7 @@ MQTT_COMPONENT_SCHEMA = Schema(
MQTT_COMMAND_COMPONENT_SCHEMA = MQTT_COMPONENT_SCHEMA.extend( MQTT_COMMAND_COMPONENT_SCHEMA = MQTT_COMPONENT_SCHEMA.extend(
{ {
Optional(CONF_COMMAND_TOPIC): All(requires_component("mqtt"), subscribe_topic), Optional(CONF_COMMAND_TOPIC): All(requires_component("mqtt"), subscribe_topic),
Optional(CONF_COMMAND_RETAIN): All(requires_component("mqtt"), boolean),
} }
) )

View file

@ -106,6 +106,7 @@ CONF_COLOR_MODE = "color_mode"
CONF_COLOR_TEMPERATURE = "color_temperature" CONF_COLOR_TEMPERATURE = "color_temperature"
CONF_COLORS = "colors" CONF_COLORS = "colors"
CONF_COMMAND = "command" CONF_COMMAND = "command"
CONF_COMMAND_RETAIN = "command_retain"
CONF_COMMAND_TOPIC = "command_topic" CONF_COMMAND_TOPIC = "command_topic"
CONF_COMMENT = "comment" CONF_COMMENT = "comment"
CONF_COMMIT = "commit" CONF_COMMIT = "commit"

File diff suppressed because it is too large Load diff