mirror of
https://github.com/esphome/esphome.git
synced 2024-11-25 08:28:12 +01:00
Command retain option for MQTT component (#3078)
This commit is contained in:
parent
97681d142e
commit
8187a4bce9
7 changed files with 304 additions and 289 deletions
|
@ -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:
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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_;
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
|
|
577
tests/test1.yaml
577
tests/test1.yaml
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue