mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-20 18:53:47 +01:00 
			
		
		
		
	feat(MQTT): Add subscribe QoS to discovery (#7648)
This commit is contained in:
		| @@ -41,6 +41,7 @@ from esphome.const import ( | ||||
|     CONF_SHUTDOWN_MESSAGE, | ||||
|     CONF_SSL_FINGERPRINTS, | ||||
|     CONF_STATE_TOPIC, | ||||
|     CONF_SUBSCRIBE_QOS, | ||||
|     CONF_TOPIC, | ||||
|     CONF_TOPIC_PREFIX, | ||||
|     CONF_TRIGGER_ID, | ||||
| @@ -518,6 +519,8 @@ async def register_mqtt_component(var, config): | ||||
|         cg.add(var.set_qos(config[CONF_QOS])) | ||||
|     if CONF_RETAIN in config: | ||||
|         cg.add(var.set_retain(config[CONF_RETAIN])) | ||||
|     if CONF_SUBSCRIBE_QOS in config: | ||||
|         cg.add(var.set_subscribe_qos(config[CONF_SUBSCRIBE_QOS])) | ||||
|     if not config.get(CONF_DISCOVERY, True): | ||||
|         cg.add(var.disable_discovery()) | ||||
|     if CONF_STATE_TOPIC in config: | ||||
|   | ||||
| @@ -16,6 +16,8 @@ static const char *const TAG = "mqtt.component"; | ||||
|  | ||||
| void MQTTComponent::set_qos(uint8_t qos) { this->qos_ = qos; } | ||||
|  | ||||
| void MQTTComponent::set_subscribe_qos(uint8_t qos) { this->subscribe_qos_ = qos; } | ||||
|  | ||||
| void MQTTComponent::set_retain(bool retain) { this->retain_ = retain; } | ||||
|  | ||||
| std::string MQTTComponent::get_discovery_topic_(const MQTTDiscoveryInfo &discovery_info) const { | ||||
| @@ -76,6 +78,10 @@ bool MQTTComponent::send_discovery_() { | ||||
|         config.command_topic = true; | ||||
|  | ||||
|         this->send_discovery(root, config); | ||||
|         // Set subscription QoS (default is 0) | ||||
|         if (this->subscribe_qos_ != 0) { | ||||
|           root[MQTT_QOS] = this->subscribe_qos_; | ||||
|         } | ||||
|  | ||||
|         // Fields from EntityBase | ||||
|         if (this->get_entity()->has_own_name()) { | ||||
|   | ||||
| @@ -89,6 +89,9 @@ class MQTTComponent : public Component { | ||||
|   void disable_discovery(); | ||||
|   bool is_discovery_enabled() const; | ||||
|  | ||||
|   /// Set the QOS for subscribe messages (used in discovery). | ||||
|   void set_subscribe_qos(uint8_t qos); | ||||
|  | ||||
|   /// Override this method to return the component type (e.g. "light", "sensor", ...) | ||||
|   virtual std::string component_type() const = 0; | ||||
|  | ||||
| @@ -204,6 +207,7 @@ class MQTTComponent : public Component { | ||||
|   bool command_retain_{false}; | ||||
|   bool retain_{true}; | ||||
|   uint8_t qos_{0}; | ||||
|   uint8_t subscribe_qos_{0}; | ||||
|   bool discovery_enabled_{true}; | ||||
|   bool resend_state_{false}; | ||||
| }; | ||||
|   | ||||
| @@ -180,6 +180,7 @@ constexpr const char *const MQTT_PRESET_MODE_COMMAND_TOPIC = "pr_mode_cmd_t"; | ||||
| constexpr const char *const MQTT_PRESET_MODE_STATE_TOPIC = "pr_mode_stat_t"; | ||||
| constexpr const char *const MQTT_PRESET_MODE_VALUE_TEMPLATE = "pr_mode_val_tpl"; | ||||
| constexpr const char *const MQTT_PRESET_MODES = "pr_modes"; | ||||
| constexpr const char *const MQTT_QOS = "qos"; | ||||
| constexpr const char *const MQTT_RED_TEMPLATE = "r_tpl"; | ||||
| constexpr const char *const MQTT_RETAIN = "ret"; | ||||
| constexpr const char *const MQTT_RGB_COMMAND_TEMPLATE = "rgb_cmd_tpl"; | ||||
| @@ -441,6 +442,7 @@ constexpr const char *const MQTT_PRESET_MODE_COMMAND_TOPIC = "preset_mode_comman | ||||
| constexpr const char *const MQTT_PRESET_MODE_STATE_TOPIC = "preset_mode_state_topic"; | ||||
| constexpr const char *const MQTT_PRESET_MODE_VALUE_TEMPLATE = "preset_mode_value_template"; | ||||
| constexpr const char *const MQTT_PRESET_MODES = "preset_modes"; | ||||
| constexpr const char *const MQTT_QOS = "qos"; | ||||
| constexpr const char *const MQTT_RED_TEMPLATE = "red_template"; | ||||
| constexpr const char *const MQTT_RETAIN = "retain"; | ||||
| constexpr const char *const MQTT_RGB_COMMAND_TEMPLATE = "rgb_command_template"; | ||||
|   | ||||
| @@ -40,6 +40,7 @@ from esphome.const import ( | ||||
|     CONF_SECOND, | ||||
|     CONF_SETUP_PRIORITY, | ||||
|     CONF_STATE_TOPIC, | ||||
|     CONF_SUBSCRIBE_QOS, | ||||
|     CONF_TOPIC, | ||||
|     CONF_TYPE, | ||||
|     CONF_TYPE_ID, | ||||
| @@ -1893,9 +1894,10 @@ MQTT_COMPONENT_AVAILABILITY_SCHEMA = Schema( | ||||
|  | ||||
| MQTT_COMPONENT_SCHEMA = Schema( | ||||
|     { | ||||
|         Optional(CONF_QOS): All(requires_component("mqtt"), int_range(min=0, max=2)), | ||||
|         Optional(CONF_QOS): All(requires_component("mqtt"), mqtt_qos), | ||||
|         Optional(CONF_RETAIN): All(requires_component("mqtt"), boolean), | ||||
|         Optional(CONF_DISCOVERY): All(requires_component("mqtt"), boolean), | ||||
|         Optional(CONF_SUBSCRIBE_QOS): All(requires_component("mqtt"), mqtt_qos), | ||||
|         Optional(CONF_STATE_TOPIC): All(requires_component("mqtt"), publish_topic), | ||||
|         Optional(CONF_AVAILABILITY): All( | ||||
|             requires_component("mqtt"), Any(None, MQTT_COMPONENT_AVAILABILITY_SCHEMA) | ||||
|   | ||||
| @@ -819,6 +819,7 @@ CONF_STOP = "stop" | ||||
| CONF_STOP_ACTION = "stop_action" | ||||
| CONF_STORE_BASELINE = "store_baseline" | ||||
| CONF_SUBNET = "subnet" | ||||
| CONF_SUBSCRIBE_QOS = "subscribe_qos" | ||||
| CONF_SUBSTITUTIONS = "substitutions" | ||||
| CONF_SUM = "sum" | ||||
| CONF_SUPPLEMENTAL_COOLING_ACTION = "supplemental_cooling_action" | ||||
|   | ||||
| @@ -227,6 +227,7 @@ datetime: | ||||
|     type: date | ||||
|     state_topic: some/topic/date | ||||
|     qos: 2 | ||||
|     subscribe_qos: 2 | ||||
|     set_action: | ||||
|       - logger.log: "set_value" | ||||
|     on_value: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user